Files
QT_wuhan_YT/README.md
T
2026-10-14 09:59:42 +08:00

185 lines
12 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)
依据《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`)。
命令行构建示例:
```bash
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 个告警位等),页面显示中文描述,**首次出现**的故障才写入故障历史,
避免周期报文重复刷屏。
各信号的起始位/位长/精度与协议表一致;界面量程与组帧取值统一按协议「信号值描述」列收口:
车速 0~5.00 km/h、发泡倍数 6~12 倍、泡沫比例 0~10%、空压机流量 0~340 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 → 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/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 / 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 页面路由 + 全局急停横幅,横幅内含“复位”按钮)