Files
QT_wuhan_YT/README.md
T
2026-10-16 09:06:03 +08:00

210 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 图数一体机遥控端 QT 界面(wuhan)
覆盖 ③开机密码(含密码警告/密码管理登录/密码管理/密码重置)④自检 ⑤系统首页面 ⑥作业选择 ⑦机器人底盘
⑧机械臂 ⑨气体检测仪 ⑩消除作业 ⑪消毒作业 ⑫调试维护 ⑬故障查询 共 11 个界面,
并配套 **CAN 报文收发**的通信层(19 条报文经 UDP 收发,遥控器另占串口 `/dev/ttyS7`)。
## 环境与构建
- 目标运行环境:主板(Linux / aarch64),Qt 5.15.2。
- qmake 工程 `wuhan.pro`,依赖 Qt 模块 `core gui widgets network serialport`。
在主板本机构建:
```
qmake wuhan.pro
make -j4
```
## 运行说明
- 开机密码默认 **6789**(可在“忘记密码/修改密码 → 密码管理登录(管理员密码 **9527**)→ 密码管理 → 重置密码”中修改);管理员密码为固定值 **9527**,不可修改。
- 密码正确后进入自检,自检完成 2 秒自动进入“作业选择”;自检异常时可“忽略故障”继续。
- 底部状态条的模式徽标只作**显示**(不响应点击);行车模式操作底盘,机械臂模式操作机械臂。
模式由**遥控器报文**决定。
- 软急停由**遥控器 bit4** 下发:上升沿触发急停、下降沿复位,面板不提供急停/复位控件
触发后页面之上出现全屏红条“急停已触发,请用遥控器复位!”。
- ⑨⑩ 运行中“返回”无效(需先停止);调试维护页常显红色警告。
## 通信(19 条 CAN 报文,经 /dev/ttyS7 串口收发)
通信层位于 `comm/car.cpp`,按《洗消机器人遥控器通信协议20260810》sheet **RC** 实现全部
**19 条**报文(分类四标准帧 `DIDO/PWM/AI/BMS/MCU` 未实现)。所有报文均为 **29 位扩展帧、
信号一律 Intel(小端)位序**。
一个 UDP 数据报里可能塞多条帧,故线上帧统一为 **16 字节**,收发同一格式:
| 偏移 | 长度 | 含义 |
| --- | --- | --- |
| 0 | 1 | 帧头 `0xAA`(用于在数据报中定位报文起始) |
| 1 | 4 | CAN ID(29 位扩展帧),直接用于分流 |
| 5 | 1 | DLC,固定 `8` |
| 6 | 8 | CAN 数据段 |
| 14 | 1 | 校验和:帧头 + canId 四字节 + DLC + 数据八字节 + 帧尾求和取低 8 位 |
| 15 | 1 | 帧尾 `0xBB` |
收包时逐字节找帧头,帧头/帧尾/校验任一不过就右移一字节继续找,容忍粘包、拆包与杂包。
**上行 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 个告警位等),页面显示中文描述,**首次出现**的故障才写入故障历史,
避免周期报文重复刷屏。
各信号的起始位/位长/精度与协议表一致;界面量程与组帧取值统一按协议「信号值描述」列收口:
车速 0~5.00 km/h、发泡倍数 6~12 倍、泡沫比例 0~10%、空压机流量 0~340 L/min、柱塞泵流量
0~24 L/min;调试维护页三泵转速上限各按协议(空压机 3000 / 柱塞泵 1450 / 叶片泵 2000 rpm)。
顶部左区**固定**显示一行通信状态,不再轮播:`CarCommunication::updateCommText()` 按
`All_Comm_FaultCode` 与链路状态渲染进 `Telemetry::commText`,`TitleBar` 只决定配色——
正常为绿字「系统通信正常」,有码时用该码的文案(如「机械臂通信异常」),链路断且无码时为
「通信异常」;异常时整条指示器红色闪烁。
各项子系统故障的明细不在顶部,而是进对应卡片的**「故障」行**(`DataCard::setFaults`):
底盘、洗消、气体检测仪三张卡各一行,**无故障时整行隐藏**,有故障时显示并红色闪烁,
多条按 **1s** 轮流显示。机械臂卡没有这一行——协议里机械臂那四帧只有位置/姿态/关节角,
没有故障信号。洗消卡那一行是「洗消系统 + 泵」;气体检测仪的告警单独一份
(`Telemetry::detectorFaults`),不会再去点亮洗消页底栏的「系统故障」灯。
链路判定:连续 **2s** 未收到任何合法帧即判为异常(最慢的下行周期 1000ms),此时顶部那行
显示不带故障码的「通信异常」。UDP 端口绑定失败(如 9000 已被占用)时不启动定时器、不崩溃,
同样显示「通信异常」。
车端 CAN 走 UDP,地址在 `comm/car.cpp` 中以常量固定:本机绑 **AnyIPv4:9000** 收、上行命令发往
车端 **192.168.1.224:3001**(`kCanTxHost`,改车端 IP 只动这一处)。
遥控器仍走串口:`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 报文不再被接收。
### 已知缺口
- **自检 14 项里 0~9 项无对应 CAN 报文**(通信系统/各分系统通信取自 `All_Comm_FaultCode`,其余为
清水液位),`sendSelfCheckStart()` 暂由本端计时直接判过(见 `onSelfCheckTick` 的 TODO),
仅为维持 ④自检 → ⑤系统首页面 流程不中断;拿到真实报文后替换该本地驱动。
- **自检的球阀 4 项(D1/D2 开启、关闭)是真检查**:`onSelfCheckTick` 会置 `Decontam_DebugCmd`
的调试模式位并写目标阀位(命令帧由 100ms 周期定时器持续重发),再等 `MBV_D1_Sta` /
`MBV_D2_Sta` 反馈与指令一致才算通过;`kValveWaitTicks`(默认 18 拍 ≈ 8s)内未到位、
或车端根本没有反馈(通信异常)都判故障。自检结束后恢复原有的调试模式位。
- **行车/机械臂模式**没有对应的下行信号:协议 12 条反馈里没有该字段,`telemetry.driveMode`
无处可填,故模式只由遥控器报文决定(遥控器离线时保持上次值)。
- **`Vehi_spd` 按协议取 8 位**(bit24、精度 0.01 → 0~2.55 km/h)。协议表里该信号与其后的
`Vehi_RdyStatus`(32)/`Reserve`(34)/`All_Comm_FaultCode`(40) 起始位自洽,按 8 位读才对齐;
若实测车速需要 0~5 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/` 公共组件,对应关系如下:
| 组件 | 文件(.h / .cpp) | 类名 |
|---|---|---|
| 顶条(高 98px) | titlebar | TitleBar |
| 底部状态条 | statusstrip | StatusStrip |
| 指示灯(自绘圆形渐变 + 外发光) | ledindicator | LedIndicator |
| 数字键盘弹窗(模态) | numpaddialog | NumPadDialog |
| 确认弹窗 | confirmdialog | ConfirmDialog |
| 告警横幅 | alarmbanner | AlarmBanner |
| 参数调节控件 | paramcontrol | ParamControl |
| 数据卡片 | datacard | DataCard |
| 故障分页表格 | faulttable | 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 页面路由 + 全局急停横幅,横幅内含“复位”按钮)