乐于分享
好东西不私藏

第 1 篇:服务型机器人整体软件架构:Android、Linux 主控、MCU 与云端到底如何分工?

第 1 篇:服务型机器人整体软件架构:Android、Linux 主控、MCU 与云端到底如何分工?

做 Android App 的时候,我们通常面对的系统比较简单:

Android App    ↓HTTPS / WebSocket    ↓云端服务器

但是到了服务机器人项目里,系统一下子就变复杂了。

机器人里面不仅有 Android,还有 Linux 主控、MCU、底盘、电机、传感器;机器人外面还有手机 App 和云端平台。

一个比较典型的服务机器人,整体可能是这样的:

                    云端平台                       ↑            MQTT / HTTPS / WebSocket                       ↓                 Linux 机器人主控                  ↑             ↓                TCP          串口 / CAN                  ↑             ↓           Android 控制屏      MCU                                ↓                     电机 / 灯光 / 柜门                     传感器 / 底盘 / 执行器

理解这张图,基本就理解了服务机器人软件架构的一半。

这也是这一季首先要解决的问题:

一台服务机器人里面,到底有哪些计算单元,它们分别负责什么?


一、为什么机器人里面会同时存在 Android、Linux 和 MCU?

刚开始接触机器人项目的时候,很容易产生一个疑问:

既然机器人上已经有 Android 平板了,为什么不能所有功能都直接由 Android 来控制?

比如:

Android  ↓控制电机  ↓读取传感器  ↓控制灯光  ↓控制柜门

理论上不是完全做不到。

但在真正的机器人系统里,一般不会这么设计。

原因在于:

机器人不同的软件模块,对实时性、稳定性、硬件访问能力和业务复杂度的要求完全不同。

所以通常会把系统拆成不同层级。

业务交互层Android机器人控制层Linux 主控硬件控制层MCU物理设备电机 / 传感器 / 灯光 / 柜门 / 底盘

每一层解决不同的问题。

而不是让一个系统把所有事情全干了。


二、Android:机器人的业务与交互控制端

服务机器人上最容易看到的部分,通常就是机身上的 Android 屏幕。

比如:

  • 首页
  • 任务选择
  • 地图展示
  • 视频画面
  • 设备状态
  • 用户交互
  • 设置页面
  • 运维页面

这些功能非常适合 Android。

所以在整个机器人架构里,Android 更像是:

机器人上层业务控制端 + 人机交互端。

它负责的是“业务”。

例如用户点击:

前往会议室

Android 并不会直接告诉左轮:

左轮转速 120rpm右轮转速 115rpm

它更可能发送的是:

GO_TO_POINTpointId = meeting_room_01

也就是说,Android 关心的是:

机器人要做什么

而不是:

电机具体怎么转

这两个层级一定要分开。

因此在你的这套系列规划里,Android 被明确定位为业务与交互控制端,而不是底盘控制器


三、Linux 主控:机器人的“大脑”

Android 下面通常还有一块真正的机器人主控。

很多机器人主控运行 Linux。

这一层可以理解为:

机器人的核心控制中心。

比如 Android 发出:

导航到 A 点

真正处理这个任务的通常不是 Android。

而是 Linux 主控。

它可能需要协调:

地图定位导航底盘传感器任务状态异常状态

整个过程可能类似:

Android    │    │ GO_TO_POINT    ↓Linux 主控    │    ├── 查询当前定位    ├── 获取地图    ├── 计算/调用导航    ├── 控制底盘移动    ├── 检测障碍物    └── 判断任务是否完成

然后主控再把状态告诉 Android:

NAVIGATION_STARTNAVIGATINGARRIVEDNAVIGATION_FAILED

Android 根据这些状态更新 UI。

所以两者的职责其实非常清楚:

Android负责:用户想让机器人做什么Linux 主控负责:机器人怎么把这件事情完成

四、MCU:真正贴近硬件的一层

再往下,就是 MCU。

例如:

STM32ESP32其他单片机

MCU 更接近真实硬件。

它可能负责:

电机编码器灯光传感器柜门锁控托盘急停电源

这些设备往往通过:

UARTRS485CANGPIO

之类的方式连接。

所以机器人里面很常见的一条链路就是:

Android   ↓ TCPLinux 主控   ↓ 串口 / CANMCU   ↓硬件

例如用户在 Android 上点击:

打开柜门

真正的执行链路可能是:

Android    ↓OPEN_DOOR    ↓Linux 主控    ↓转换成底层硬件指令    ↓MCU    ↓驱动锁控模块    ↓柜门打开

执行完成以后,再逐层回传:

MCU  ↓Linux 主控  ↓Android

最终界面显示:

柜门已打开

这就是一个非常典型的机器人控制链路。


五、为什么 Android 不直接控制 MCU?

看到这里,很容易想到:

既然 Android 最后还是要控制 MCU,那能不能直接变成:

Android   ↓串口   ↓MCU

有些简单设备确实可以这么做。

但对于完整机器人来说,一般还是会保留 Linux 主控这一层。

因为一旦系统复杂起来,Android 很快就会承担过多职责。

例如:

地图导航定位底盘传感器任务硬件协议UI视频网络云端

全部堆到 Android 上,系统会变得非常难维护。

而引入 Linux 主控以后,就可以形成非常清晰的职责边界。

┌──────────────────────┐│      Android         ││ UI / 业务 / 用户交互 │└──────────┬───────────┘           │ TCP┌──────────▼───────────┐│      Linux 主控      ││ 导航 / 任务 / 设备控制│└──────────┬───────────┘           │ CAN / 串口┌──────────▼───────────┐│         MCU          ││ 实时硬件控制 / IO    │└──────────┬───────────┘           ↓        真实硬件

这样每一层只负责自己擅长的事情。


六、云端在机器人系统里负责什么?

除了机器人本体,还有一个非常重要的部分:

云端平台。

云端和机器人本体的职责又不一样。

比如:

设备管理用户管理机器人绑定远程任务历史记录告警OTA日志远程状态

这些能力通常不会只存在机器人本地。

而是放到云端。

因此整个系统开始变成:

                    手机 App                       │                    HTTPS                       │                       ↓                    云平台                       │                  MQTT / HTTPS                       │                       ↓                 Linux 主控                       │              ┌────────┴────────┐              │                 │             TCP            串口 / CAN              │                 │              ↓                 ↓        Android 控制屏          MCU                                │                                ↓                              硬件

这时候实际上已经出现了三个控制入口:

机身 Android 屏手机 App云端平台

后面甚至还会有:

机器人自主任务

所以服务机器人并不是简单的:

App → 机器人

而是一个多端协同系统


七、服务机器人实际上存在三条控制链路

从整体架构来看,可以把机器人控制大致理解成三条链路。

第一条是:

1. 本地控制

Android 控制屏       ↓ TCP   Linux 主控       ↓    机器人

例如:

点击开始巡航打开柜门回充停止任务切换模式

特点是:

距离近、实时性高、不依赖公网。


第二条是:

2. 机器人自主运行

Linux 主控    ↓任务系统    ↓导航 / 底盘 / 传感器

例如:

自主巡航自动回充自动避障执行预设路线

这时候即使 Android 页面退出了,机器人也不应该停止工作。

因为真正执行任务的是机器人主控。


第三条是:

3. 远程云控

手机 App    ↓云端    ↓机器人主控

例如:

远程查看状态远程创建任务远程查看视频远程控制设备

这三条链路,也是你这份第二季规划里第一篇要先建立起来的整体认知。


八、一个完整指令到底是怎么跑起来的?

例如用户站在机器人面前,在 Android 屏幕点击:

“前往前台”

整个过程可能是:

① Android用户点击:前往前台② Android 业务层构造指令:GO_TO_POINTpointId = FRONT_DESK③ TCP发送给机器人主控④ Linux 主控接收指令创建导航任务启动定位 / 导航控制机器人移动⑤ MCU / 底盘控制电机读取传感器⑥ Linux 主控持续产生状态NAVIGATINGARRIVED⑦ TCP状态回传 Android⑧ Android更新页面:正在前往前台已到达前台

从这个过程就能看到:

Android 并没有控制电机。

它做的是:

用户交互业务指令状态展示

Linux 主控负责:

真正执行任务

MCU负责:

真正驱动硬件

九、理解这套分层以后,很多机器人问题都会变简单

以前看机器人项目,很容易感觉:

TCPMQTTCAN串口AndroidLinuxMCU云端

东西特别多。

但把它们放进软件分层以后,其实就清楚了。

                    用户 / 运维人员                         ↓            ┌─────────────────────┐            │ Android / 手机 App  │            │   业务与交互层       │            └──────────┬──────────┘                       ↓            ┌─────────────────────┐            │     Linux 主控      │            │ 机器人核心控制层     │            └──────────┬──────────┘                       ↓            ┌─────────────────────┐            │        MCU          │            │    硬件控制层        │            └──────────┬──────────┘                       ↓        电机 / 底盘 / 灯光 / 柜门 / 传感器

云端则在机器人之外,为整个机器人系统提供:

设备任务状态数据远程控制

能力。

这也是为什么服务机器人软件不能只从 Android App 的角度去理解。

真正的软件架构,是:

Android + Linux 主控 + MCU + 云端共同组成的一套系统。


十、总结

这一篇最重要的不是记住某一种协议。

而是先建立服务机器人软件的分层模型:

Android负责业务与人机交互Linux 主控负责机器人任务与核心控制MCU负责实时硬件控制硬件负责真正执行动作

同时:

云端负责设备、任务、状态和远程管理

因此,一台完整的服务机器人,本质上并不是一个 Android 设备。

它更像一个由多个计算单元组成的分布式小型系统。

而 Android,只是其中非常重要的一层。

理解了这一层关系以后,下一个问题自然就出现了:

Android 控制屏和 Linux 机器人主控之间,到底应该怎么通信?

在实际服务机器人项目里,一个非常典型的方案就是:

Android   ↕TCP 长连接   ↕Linux 主控

那么问题来了:

为什么这里经常选择原生 TCP,而不是 HTTP、WebSocket 或 MQTT?

这就是下一篇要讲的内容:

下一篇

《Android 控制屏为什么与机器人主控使用 TCP 长连接?》