基于 RK3588 开发板的四轮麦克纳姆轮机器人,支持同一 WiFi 下任意设备(手机、平板、电脑)通过网页浏览器远程控制,集成热成像温度采集、六轴 IMU 监测、USB 摄像头实时回传,前端页面适配移动端触屏。项目开源在 GitHub:Yu-Xiang-Yang/rk3588-multimodal-mecanum。



页面适配移动端,竖屏效果最佳。
1 项目背景
WHEELTEC 麦轮底盘原版固件存在停车失效问题——编码器返回值恒为 0,增量式 PI 静态变量不清零,停车指令无效。本项目针对该问题修改了 STM32 固件,并在 RK3588 上搭建了一套完整的多模态控制系统:
- 网页远程控制:HTTP + MJPEG 推流,任何浏览器都能操控
- 嵌入式固件修复:增加紧急停车标志,解决停车失效问题
- 热成像采集:海康 HM-TD2028T-7,输出 256×192 温度矩阵
- IMU 实时监测:板载 SH3001 六轴传感器
- USB 摄像头:实时 MJPEG 视频流
2 硬件清单
| 设备 | 说明 |
|---|---|
| RK3588 开发板 | 运行控制服务,ARM64 Linux (Buildroot) |
| WHEELTEC C12H 主控 | STM32,驱动麦轮电机,USB 连接 RK3588 |
| 麦轮底盘(D24A) | 四轮麦克纳姆轮 |
| SH3001 六轴 IMU | 板载,I2C-4,地址 0x36 |
| 海康 HM-TD2028T-7 | 热成像仪,256×192,网线连 eth0 |
| 振动 + 霍尔传感器 | /dev/ttyUSB0,921600 波特 |
| USB 摄像头 | /dev/video41 |
3 网络架构
WiFi 热点(任意热点,在 start.py 配置名称和密码)
│
├── 📱 手机 / 平板 → 浏览器打开 http://RK3588的IP:8080
├── 💻 电脑 → 浏览器打开 http://RK3588的IP:8080
└── 🤖 RK3588 → 运行 Flask 控制服务 :8080
│
├── wlan0 接入热点(控制信号走这里)
└── eth0 192.168.1.100(接热成像仪)
│
热成像仪 192.168.1.64
使用 iPhone 热点时板子 IP 固定为
172.20.10.3(iPhone 热点子网固定),其他热点以实际分配 IP 为准。
4 项目结构
rk3588-multimodal-mecanum/
├── README.md
├── host/ ← 首次部署时在 PC 上运行
│ ├── start.py ← 一键启动 ★(修改热点名/密码)
│ ├── connect_wifi.py ← 单独重连 WiFi
│ └── motor_web/ ← 推送到 RK3588 后台运行的服务
│ ├── server.py ← Flask 控制服务器(主程序)
│ └── daemon.py ← 守护进程包装器
│
├── firmware/ ← STM32 完整 Keil 工程(可直接编译)
│ ├── USER/Template.uvprojx ← 用 Keil μVision 5 打开
│ ├── BALANCE/CONCTRL/
│ │ ├── conctrl.c ← ★ 已修改:增加紧急停车机制
│ │ └── conctrl.h ← ★ 已修改:导出 Emergency_Stop 变量
│ ├── HAREWARE/ ← 外设驱动
│ ├── CORE/ ← 启动文件
│ ├── STM32F10x_FWLib/ ← ST 官方标准外设库
│ └── SYSTEM/
│
├── thermal/ ← 热成像采集(部署到 RK3588)
│ ├── thermal_save_local.py ← 温度矩阵采集主脚本 ★
│ ├── thermal_matrix_sdk.py ← SDK 抓图+附加数据方式
│ ├── thermal_sdk_probe.py ← 数据格式诊断工具
│ └── thermal_fps_test.c ← C 语言帧率测试(需交叉编译)
│
└── imu/ ← IMU 监测(部署到 RK3588)
├── sh3001_monitor.py ← SH3001 六轴实时监测
└── sh3001_calib.example.json ← 校准文件示例
5 快速开始
5.1 配置 WiFi 热点
整个项目里唯一需要修改的配置只有热点名和密码,且只在两个文件中。
打开 host/start.py,修改第 18-19 行:
# host/start.py
SSID = "Huawei 14 Pro 暗夜紫" # ← 改成你的热点名
PASSWORD = "00000000" # ← 改成你的热点密码
同样修改 host/connect_wifi.py 第 18-19 行(单独重连 WiFi 时用到):
# host/connect_wifi.py
SSID = "Huawei 14 Pro 暗夜紫"
PASSWORD = "00000000"
server.py、daemon.py及所有其他文件不需要改。
5.2 首次启动(USB 推送服务)
USB 连接 RK3588,然后在 PC 上运行:
python host/start.py
脚本自动完成:
- 检测 ADB USB 连接
- 将 RK3588 连接到你的热点
- 推送控制服务到板子
- 启动 Flask 服务器
- 打开浏览器
USB 线只在第一次或更新服务时需要,之后可以拔掉。
5.3 任意设备访问控制页面
同一热点下的任何设备都可以直接用浏览器打开:
http://172.20.10.3:8080
| 设备 | 操作 |
|---|---|
| 📱 iPhone / Android | Safari / Chrome 扫码或输入地址 |
| 💻 Windows / Mac | 浏览器直接访问 |
| 📟 平板 | 浏览器直接访问 |
6 控制页面布局
网页适配移动端触屏,四格布局:
┌──────────────────┬──────────────────┐
│ ⚙ 电机控制 │ 📡 传感器数据 │
│ ↖ ↑ ↗ │ 加速度 陀螺仪 │
│ ← ■ → │ 磁感应 振动 │
│ ↙ ↓ ↘ │ │
├──────────────────┼──────────────────┤
│ 📷 USB 摄像头 │ 🌡 热成像 │
│ 实时 MJPEG 流 │ 伪彩色温度图 │
└──────────────────┴──────────────────┘
电机控制方式(点击切换):
- 点一下方向键 → 开始移动
- 再点同一个键 / 点 ■ → 停止
- 切换方向时直接点新方向键
- 页面切到后台自动停车
7 嵌入式固件(STM32)
7.1 关键修改:紧急停车机制
原版 WHEELTEC 固件停车指令无效,核心改动在 BALANCE/CONCTRL/conctrl.c:
// 全局变量
u8 Emergency_Stop = 0;
// TIM6_IRQHandler 中
if(Move_X == 0 && Move_Y == 0 && Move_Z == 0) {
Emergency_Stop = 1; // 触发紧急停车
smooth_control.VX = 0;
smooth_control.VY = 0;
smooth_control.VZ = 0;
} else {
Emergency_Stop = 0;
Drive_Motor(Move_X, Move_Y, Move_Z);
}
// 每个 Incremental_PI 函数开头增加一行
if(Emergency_Stop) { Pwm=0; Bias=0; Last_bias=0; return 0; }
7.2 编译烧录
- 用 Keil μVision 5 打开
firmware/USER/Template.uvprojx - 按 F7 编译
- 用 FlyMcu 烧录
firmware/USER/OBJ/Template.hex- 烧录前:BOOT0 拨到 1,按复位键
- 烧录后:BOOT0 拨回 0,按复位键
7.3 通信协议
RK3588 通过 USB-CDC(/dev/ttyACM0,115200 baud)发 11 字节二进制帧:
7B 00 [Vx_H Vx_L] [Vy_H Vy_L] [Vz_H Vz_L] 00 [XOR] 7D
Vx = 前后速度(mm/s,int16 大端) 范围 ±500
Vy = 左右平移(mm/s,int16 大端) 范围 ±500
Vz = 旋转速度(mm/s,int16 大端) 范围 ±1500
麦轮运动学(逆解):
$$
\begin{aligned}
FL &= V_y + V_x - V_z \
FR &= -V_y + V_x + V_z \
RL &= V_y + V_x + V_z \
RR &= -V_y + V_x - V_z
\end{aligned}
$$
8 热成像(海康 HM-TD2028T-7)
8.1 连接方式
热成像仪 ──网线──▶ RK3588 eth0
IP:192.168.1.64 IP:192.168.1.100
账号:admin
密码:hk159753
需要 12V 外接电源(禁止用 USB 供电)
8.2 采集脚本
adb push thermal/thermal_save_local.py /userdata/hik_vision_project/
# 第一次运行(配置相机参数)
adb shell python3 /userdata/hik_vision_project/thermal_save_local.py --config --bench
# 之后正常采集
adb shell python3 /userdata/hik_vision_project/thermal_save_local.py
输出(RK3588 本地):
/tmp/thermal/latest.npy ← float32 矩阵,256×192,单位 °C
/tmp/thermal/latest.json ← 最高/最低/均值/热点坐标
帧率上限:~3fps(硬件限制,官方文档说明”每秒 1-4 张,无法达到实时帧率”)
9 六轴 IMU(SH3001)
adb push imu/sh3001_monitor.py /root/
adb shell python3 /root/sh3001_monitor.py # 首次运行进行零偏校准
| 字段 | 含义 | 说明 |
|---|---|---|
ax/ay/az |
加速度(m/s²) | 含重力,静止时 az ≈ 9.8 |
gx/gy/gz |
角速度(dps) | 已去除零偏 |
a_mag |
加速度模长 | 静止时 ≈ 9.8(即 g) |
10 常见问题
Q:换热点怎么办?
只改
host/start.py和host/connect_wifi.py开头的SSID和PASSWORD两行。
Q:用手机控制时页面显示不完整
页面已适配移动端,横屏效果更好。
Q:热点连接超时
确认热点名区分大小写,中文热点名确保编码正确(可复制粘贴)。
Q:RK3588 的 IP 是多少?
start.py运行时会打印出来。iPhone 热点固定为172.20.10.3,其他热点以打印为准。
Q:换了热点后 IP 变了,怎么连?
重新运行
python host/start.py,它会打印新 IP 并打开浏览器。
Q:电机不停
确认已烧录修改后的固件(
firmware/BALANCE/CONCTRL/conctrl.c)。
Q:热成像不显示
检查:①网线已插 ②热成像仪 12V 已供电 ③
adb shell ping 192.168.1.64通
Q:更新服务后需要 USB 吗?
是。改了
server.py后需要 USB 运行一次python host/start.py重新推送,之后可拔线。
11 技术栈
| 层 | 技术 |
|---|---|
| 控制入口 | 任意浏览器(手机/电脑/平板) |
| 传输协议 | HTTP + MJPEG 推流 |
| 板子 OS | Buildroot Linux ARM64 |
| 控制服务 | Python 3.10 + Flask |
| 嵌入式 MCU | STM32F1 / Keil μVision 5 |
| 电机协议 | USB-CDC UART 115200,私有二进制帧 |
| IMU | I2C / SH3001 |
| 热成像 SDK | 海康 HCNetSDK V6.1.9.45 ARM64 Linux |
12 项目地址
GitHub: https://github.com/Yu-Xiang-Yang/rk3588-multimodal-mecanum
相关阅读:
欢迎 Star 和提 Issue。