Files
QT_wuhan_YT/README.md
T
2026-10-14 10:33:58 +08:00

12 KiB
Raw Blame History

图数一体机遥控端 QT 界面(wuhan)

依据《QT界面详细设计说明书.md》实现的“玉兔工业无线遥控器(YTZT6K8EART2-aL25)”遥控端界面, 覆盖 ③开机密码(含密码警告/密码管理登录/密码管理/密码重置)④自检 ⑤系统首页面 ⑥作业选择 ⑦机器人底盘 ⑧机械臂 ⑨气体检测仪 ⑩消除作业 ⑪消毒作业 ⑫调试维护 ⑬故障查询 共 11 个界面, 并配套 CAN 报文收发的通信层(19 条报文经 UDP 收发,遥控器另占串口 /dev/ttyS7)。

环境与构建

  • 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)。UDP 端口绑定失败(如 9000 已被占用)时不启动定时器、不崩溃,界面显示「通信异常」。

车端 CAN 走 UDP,端口在 comm/car.cpp 中以常量固定:本机 9000 收、上行命令发往 127.0.0.1:9001。 遥控器仍走串口:comm/uart.cpp 打开 rc/device(默认 /dev/ttyS7)、rc/baud(默认 115200)。 config.ini(程序目录)中与通信相关的配置还有 net/selfcheck_fault(自检故障演示)。 参数(车速、柱塞泵流量、发泡倍数、泡沫比例、空压机流量)与密码经 QSettings 持久化,上电自动读取。

tools/can_sender.py 是车端 CAN 的 UDP 联调工具(给 UI 发反馈时目标端口用 9000); 遥控器已回到串口,tools/rc_sender.py 发送的 UDP 报文不再被接收。

已知缺口

  • 自检 10 项无对应 CAN 报文,sendSelfCheckStart() 暂由本端跑完序列(见 onSelfCheckTick 的 TODO),仅为维持 ④自检 → ⑤作业选择 流程不中断;拿到真实报文后替换该本地驱动。
  • 行车/机械臂模式没有对应的下行信号:协议 12 条反馈里没有该字段,telemetry.driveMode 无处可填,故模式只由遥控器报文决定(遥控器离线时保持上次值,可用演示快捷键 M 切换)。
  • Vehi_spd 按协议取 8 位(bit24、精度 0.01 → 02.55 km/h)。协议表里该信号与其后的 Vehi_RdyStatus(32)/Reserve(34)/All_Comm_FaultCode(40) 起始位自洽,按 8 位读才对齐; 若实测车速需要 05 km/h,说明该字段实为 16 位、其后信号整体后移 8 位,需同步调整。
  • 分类四(标准帧,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/ttyS7,24 字节二进制帧)

遥控器不走车端 CAN 通道,独立占一路串口:comm/uart.cpp 打开 rc/device (默认 /dev/ttyS7,115200 / 8 数据位 / 1 停止位 / 无校验),与改走 UDP 的车端 CAN (comm/car.cpp,收 9000 / 发 9001)互不干扰。

帧长 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 条报文经 UDP 收 9000 / 发 9001)+ 遥控器串口通道(uart,/dev/ttyS7)
  • widgets/ 公共组件:TitleBar / StatusStrip / LedIndicator / NumPadDialog / ConfirmDialog / AlarmBanner / ParamControl / DataCard / FaultTable
  • pages/ 各界面(继承 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 页面路由 + 全局急停横幅,横幅内含“复位”按钮)