第 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_POINT
pointId = meeting_room_01
也就是说,Android 关心的是:
机器人要做什么
而不是:
电机具体怎么转
这两个层级一定要分开。
因此在你的这套系列规划里,Android 被明确定位为业务与交互控制端,而不是底盘控制器。
三、Linux 主控:机器人的“大脑”
Android 下面通常还有一块真正的机器人主控。
很多机器人主控运行 Linux。
这一层可以理解为:
机器人的核心控制中心。
比如 Android 发出:
导航到 A 点
真正处理这个任务的通常不是 Android。
而是 Linux 主控。
它可能需要协调:
地图
定位
导航
底盘
传感器
任务状态
异常状态
整个过程可能类似:
Android
│
│ GO_TO_POINT
↓
Linux 主控
│
├── 查询当前定位
├── 获取地图
├── 计算/调用导航
├── 控制底盘移动
├── 检测障碍物
└── 判断任务是否完成
然后主控再把状态告诉 Android:
NAVIGATION_START
NAVIGATING
ARRIVED
NAVIGATION_FAILED
Android 根据这些状态更新 UI。
所以两者的职责其实非常清楚:
Android
负责:
用户想让机器人做什么
Linux 主控
负责:
机器人怎么把这件事情完成
四、MCU:真正贴近硬件的一层
再往下,就是 MCU。
例如:
STM32
ESP32
其他单片机
MCU 更接近真实硬件。
它可能负责:
电机
编码器
灯光
传感器
柜门
锁控
托盘
急停
电源
这些设备往往通过:
UART
RS485
CAN
GPIO
之类的方式连接。
所以机器人里面很常见的一条链路就是:
Android
↓ TCP
Linux 主控
↓ 串口 / CAN
MCU
↓
硬件
例如用户在 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_POINT
pointId = FRONT_DESK
↓
③ TCP
发送给机器人主控
↓
④ Linux 主控
接收指令
↓
创建导航任务
↓
启动定位 / 导航
↓
控制机器人移动
↓
⑤ MCU / 底盘
控制电机
读取传感器
↓
⑥ Linux 主控
持续产生状态
NAVIGATING
ARRIVED
↓
⑦ TCP
状态回传 Android
↓
⑧ Android
更新页面:
正在前往前台
↓
已到达前台
从这个过程就能看到:
Android 并没有控制电机。
它做的是:
用户交互
↓
业务指令
↓
状态展示
Linux 主控负责:
真正执行任务
MCU负责:
真正驱动硬件
九、理解这套分层以后,很多机器人问题都会变简单
以前看机器人项目,很容易感觉:
TCP
MQTT
CAN
串口
Android
Linux
MCU
云端
东西特别多。
但把它们放进软件分层以后,其实就清楚了。
用户 / 运维人员
↓
┌─────────────────────┐
│ 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 长连接?》
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)