图数一体机遥控端 QT 界面(wuhan)
依据《QT界面详细设计说明书.md》实现的“玉兔工业无线遥控器(YTZT6K8EART2-aL25)”遥控端界面,
覆盖 ③开机密码(含密码警告/密码管理登录/密码管理/密码重置)④自检 ⑤系统首页面 ⑥作业选择 ⑦机器人底盘
⑧机械臂 ⑨气体检测仪 ⑩消除作业 ⑪消毒作业 ⑫调试维护 ⑬故障查询 共 11 个界面,
并配套 CAN 报文收发的通信层(19 条报文经 /dev/ttyS7 串口收发,遥控器另占 /dev/ttyS5)。
环境与构建
- Qt 5.15.2 MinGW 32-bit(
F:\QT\5.15.2\mingw81_32),编译套件Desktop Qt 5.15.2 MinGW 32-bit。 - 用 Qt Creator 打开
wuhan.pro直接构建运行即可(qmake 工程,QT += serialport)。
命令行构建示例:
export PATH="/f/QT/Tools/mingw810_32/bin:/f/QT/5.15.2/mingw81_32/bin:$PATH"
mkdir -p build && cd build
qmake ../wuhan.pro -spec win32-g++ "CONFIG+=debug"
mingw32-make -j4
运行:debug/wuhan.exe(1920×1080 全屏无边框)。
运行说明
- 开机密码默认 6789(可在“忘记密码/修改密码 → 密码管理登录(管理员密码 9527)→ 密码管理 → 重置密码”中修改);管理员密码为固定值 9527,不可修改。
- 密码正确后进入自检,自检完成 2 秒自动进入“作业选择”;自检异常时可“忽略故障”继续。
- 底部状态条的模式徽标只作显示(不响应点击);行车模式操作底盘,机械臂模式操作机械臂。 演示用快捷键 M 可切换模式,但遥控器在线时模式由遥控器报文决定,M 被忽略。
- 软急停由遥控器 bit4 下发:上升沿触发急停、下降沿复位,面板不提供急停/复位控件 (顶条原有的“急停”按钮已移除)。触发后页面之上出现全屏红条“急停已触发,请用遥控器复位!”。
- ⑨⑩ 运行中“返回”无效(需先停止);调试维护页常显红色警告。
通信(19 条 CAN 报文,经 /dev/ttyS7 串口收发)
通信层位于 comm/car.cpp,按《洗消机器人遥控器通信协议20260810》sheet RC 实现全部
19 条报文(分类四标准帧 DIDO/PWM/AI/BMS/MCU 未实现)。所有报文均为 29 位扩展帧、
信号一律 Intel(小端)位序。
串口是字节流,故线上帧统一为 18 字节,收发同一格式:
| 偏移 | 长度 | 含义 |
|---|---|---|
| 0 | 4 | 帧头 0x5AA5FF00(线上字节序 00 FF A5 5A,用于在字节流中定位报文起始) |
| 4 | 4 | CAN ID(29 位扩展帧),直接用于分流 |
| 8 | 1 | DLC,固定 8 |
| 9 | 8 | CAN 数据段 |
| 17 | 1 | 校验和:canId 四字节 + DLC + 数据八字节求和取低 8 位 |
收包时逐字节找帧头、校验不过右移一字节继续找,容忍粘包、拆包与杂包。
上行 7 条(遥控器 → 车端)按协议「报文周期时间」列分三组重发:50ms 底盘 / 机械臂1 / 机械臂2 / 急停,100ms 洗消指令 / 洗消调试,1000ms 气体检测仪。界面上层只更新控制状态, 编码发送由定时器完成。
Chassis_ControlCmd 0x18208081、Arm_ControlCmd1 0x18218081、Arm_ControlCmd2 0x18228081、
Decontam_ControlCmd 0x18238081、Decontam_DebugCmd 0x18248081、Detector_ControlCmd 0x18258081、
Emergency_Cmd 0x18268081。
下行 12 条(车端 → 遥控器)按 canId 分流写入 Telemetry 供各页刷新:
| CAN ID | 报文 | 周期 | 主要信号 |
|---|---|---|---|
0x18308180 |
底盘状态1(BMS) | 100 | 总电压、SOC、MCU 故障码与等级、10 路 BMS 故障等级 |
0x18318180 |
底盘状态2(BMS) | 100 | 7 路故障等级、4 路继电器粘连、手刹、车速、ready、整系统通信故障码 |
0x18328180 |
机械臂状态1 | 100 | 末端位置 X/Y/Z |
0x18338180 |
机械臂状态2 | 100 | 末端姿态 RX/RY/RZ、末端速度 |
0x18348180 |
机械臂状态3 | 100 | 关节角 J1~J4 |
0x18358180 |
机械臂状态4 | 100 | 关节角 J5~J6 |
0x18368180 |
洗消工作状态1 | 200 | 模式、启停、三泵上电、D1/D2 到位、液位、A/B 流量、气体流量、发泡倍数 |
0x18378180 |
洗消工作状态2 | 200 | 管路/空压机压力、三泵流量反馈、空压机与柱塞泵故障码 |
0x18388180 |
检测仪结果状态1 | 1000 | 主机状态、毒物种类与等级、告警位 |
0x18398180 |
检测仪结果状态2 | 1000 | 40 位有毒物浓度(ppb) |
0x183A8180 |
底盘状态3 | 100 | EPS 22 位 + 制动 24 位故障标志、EPS 故障码 |
0x183B8180 |
底盘状态4 | 100 | 挡位、驻车、四驱模式、方向盘角度与对中、左右制动电机故障 |
故障码按协议“信号值描述”列查表转中文(MCU 29 条、空压机 31 条、柱塞泵 7 条、EPS/制动 46 个 标志位、检测仪 4 个告警位等),页面显示中文描述,首次出现的故障才写入故障历史, 避免周期报文重复刷屏。
各信号的起始位/位长/精度与协议表一致;界面量程与组帧取值统一按协议「信号值描述」列收口:
车速 05.00 km/h、发泡倍数 612 倍、泡沫比例 010%、空压机流量 0340 L/min、柱塞泵流量
0~24 L/min;调试维护页三泵转速上限各按协议(空压机 3000 / 柱塞泵 1450 / 叶片泵 2000 rpm)。
顶部「通信正常/异常」按收帧判定:连续 2s 未收到任何合法帧即判为异常(最慢的下行周期
1000ms)。串口打开失败(如开发机 Windows 上没有 /dev/ttyS7)时不启动定时器、不崩溃,
界面显示「通信异常」。
可在 config.ini(程序目录)中配置 car/device(默认 /dev/ttyS7)、car/baud(默认
500000)、rc/device(默认 /dev/ttyS5)、rc/baud(默认 115200)、net/selfcheck_fault
(自检故障演示)。
参数(车速、柱塞泵流量、发泡倍数、泡沫比例、空压机流量)与密码经 QSettings 持久化,上电自动读取。
tools/can_sender.py / tools/rc_sender.py 是旧的 UDP 联调工具,已不适用于当前串口通道,
留待需要时另写。
已知缺口
- 自检 10 项无对应 CAN 报文,
sendSelfCheckStart()暂由本端跑完序列(见onSelfCheckTick的 TODO),仅为维持 ④自检 → ⑤作业选择 流程不中断;拿到真实报文后替换该本地驱动。 - 行车/机械臂模式没有对应的下行信号:协议 12 条反馈里没有该字段,
telemetry.driveMode无处可填,故模式只由遥控器报文决定(遥控器离线时保持上次值,可用演示快捷键 M 切换)。 Vehi_spd按协议取 8 位(bit24、精度 0.01 → 02.55 km/h)。协议表里该信号与其后的5 km/h,说明该字段实为 16 位、其后信号整体后移 8 位,需同步调整。Vehi_RdyStatus(32)/Reserve(34)/All_Comm_FaultCode(40) 起始位自洽,按 8 位读才对齐; 若实测车速需要 0- 分类四(标准帧,
DIDO/PWM/AI/BMS/MCU)整体未实现。其Motorola LSB排列格式 = 大端字节序 + 起始位为 LSB 位置:16 位信号起始位 8/24/40/56 表示占字节对 (0,1)/(2,3)/(4,5)/(6,7),value = data[起/8-1]<<8 | data[起/8],恰好占满 64 位、 无溢出。实现分类四时勿按 Intel 连续位序去读。
遥控器(串口 /dev/ttyS5,24 字节二进制帧)
遥控器不走车端 CAN 通道,独立占一路串口:comm/uart.cpp 打开 rc/device
(默认 /dev/ttyS5,115200 / 8 数据位 / 1 停止位 / 无校验),与车端 /dev/ttyS7
(见 comm/car.cpp)互不干扰。
帧长 24 字节、1 字节对齐、多字节字段小端,发送周期 100ms。帧头 BYTE0=0x11、
帧尾 BYTE22=0x22、BYTE23 = BYTE0~BYTE22 之和的低 8 位;校验不过即丢弃。
串口是字节流,收包在缓冲区里按帧长滑窗重新对齐,容忍粘包与拆包。
| 字节 | 含义 |
|---|---|
| 0 | 帧头 0x11 |
| 1 | 标志位:bit0 行车模式 / bit1 机械臂模式 / bit2 机械臂使能 / bit3 底盘使能 / bit4 急停 |
| 2 | 预留 0x00 |
| 3-4 | 整车档位(底盘 Y):0 后 / 2048 中 / 4096 前 |
| 5-6 | 整车转向(底盘 X):0 左 / 2048 中 / 4096 右 |
| 7-8 | 末端位置上下(臂 Z) |
| 9-10 | 末端位置左右(臂 X) |
| 11-12 | 末端位置前后(臂 Y) |
| 13-14 | 末端姿态横滚 roll |
| 15-16 | 末端姿态俯仰 pitch |
| 17-18 | 末端姿态偏航 yaw |
| 19 | 遥控器电量 0~100 |
| 20-21 | 预留 0x00 |
| 22 | 帧尾 0x22 |
| 23 | 和校验 |
分工:RcCommunication 只负责收包、校验、解析与链路超时(连续 500ms 无合法帧判为断开);
模式/急停/动作的判定集中在 AppContext。
- 模式:bit1 机械臂模式须与 bit2 机械臂使能同时为 1 才切到机械臂模式,否则按 bit0
走行车模式。遥控器在线时模式由遥控器决定,离线时才回落到车载端
chassis报文的mode字段。 - 急停:bit4 上升沿触发急停、下降沿复位,两者都由遥控器下发(一并上行
estop/estop_reset),面板只显示红条提示、不提供复位控件。链路中断不会触发复位——超时导致的 bit4 读为 0 不算遥控器指令。 - 动作:摇杆以 ±10%(1638~2458)为中立死区,方向变化时才下发,命令复用现有
chassis_move/arm_move,并与界面按钮同一套安全联锁(模式 + 使能 + 未急停)。 档位与转向可同时下发(边前进/后退边转向);链路中断会立即撤销所有遥控器动作, 避免最后一条指令被一直挂住。 - 优先级:遥控器与界面都能操作,同时操作时遥控器优先——遥控器正在操作(链路在线且 有轴偏离中位)时,底盘页与机械臂页的动作按钮变灰,强行按下会提示“遥控器操作中”。
- 显示:顶条右侧为遥控器链路(●正常/断开)与电量;顶条不再显示时钟与急停按钮。
- 底盘页的方向按钮同样支持多键同按:按住“前进”再按住“左转向”,会下发
dir=fwd+turn=left,两键都松开才停车。
目录结构
app/全局常量、配色、应用上下文(AppContext)、QSS 样式、闪烁工具comm/车端 CAN 通信层(car,19 条报文经/dev/ttyS7)+ 遥控器串口通道(uart,/dev/ttyS5)widgets/公共组件:TitleBar / StatusStrip / LedIndicator / NumPadDialog / ConfirmDialog / AlarmBanner / ParamControl / DataCard / FaultTablepages/各界面(继承 BasePage),对应关系如下:
| 界面 | 文件(.h / .cpp) | 类名 |
|---|---|---|
| 页面基类 | base | BasePage |
| ③ 开机密码 | bootpassword | BootPasswordPage |
| ③ 密码警告 | warning | WarningPage |
| ③ 密码管理登录 | passwordmgmtlogin | PasswordMgmtLoginPage |
| ③ 密码管理 | passwordmgmt | PasswordMgmtPage |
| ③ 密码重置 | passwordreset | PasswordResetPage |
| ④ 自检 | selfcheck | SelfCheckPage |
| ⑤ 系统首页面 | home | HomePage |
| ⑥ 作业选择 | jobselect | JobSelectPage |
| ⑦ 机器人底盘 | chassis | ChassisPage |
| ⑧ 机械臂 | arm | ArmPage |
| ⑨ 气体检测仪 | gasdetector | GasDetectorPage |
| ⑩/⑪ 消除/消毒作业 | washpage | WashPage |
| ⑫ 调试维护 | debugmaintain | DebugMaintainPage |
| ⑬ 故障查询 | faultquery | FaultQueryPage |
mainwindow.h/.cpp主窗口(QStackedWidget 页面路由 + 全局急停横幅,横幅内含“复位”按钮)