增加通讯协议
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
# 图数一体机遥控端 QT 界面(wuhan)
|
||||
|
||||
依据《QT界面详细设计说明书.md》实现的“玉兔工业无线遥控器(YTZT6K8EART2-aL25)”遥控端界面,
|
||||
覆盖 ③开机密码(含密码警告/密码管理登录/密码管理/密码重置)④自检 ⑤作业选择 ⑥机器人底盘
|
||||
⑦机械臂 ⑧气体检测仪 ⑨手动消除 ⑩手动消毒 ⑪调试维护 ⑫故障查询 共 10 个界面,
|
||||
并配套 **UDP 收包 / 发包通信** 与内置模拟车载端。
|
||||
覆盖 ③开机密码(含密码警告/密码管理登录/密码管理/密码重置)④自检 ⑤系统首页面 ⑥作业选择 ⑦机器人底盘
|
||||
⑧机械臂 ⑨气体检测仪 ⑩消除作业 ⑪消毒作业 ⑫调试维护 ⑬故障查询 共 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 += network`)。
|
||||
- 用 Qt Creator 打开 `wuhan.pro` 直接构建运行即可(qmake 工程,`QT += serialport`)。
|
||||
|
||||
命令行构建示例:
|
||||
|
||||
@@ -23,35 +23,141 @@ mingw32-make -j4
|
||||
|
||||
## 运行说明
|
||||
|
||||
- 开机密码默认 **6789**(可在“忘记密码/修改密码 → 密码管理登录(管理员密码 6789)→ 密码管理 → 重置密码”中修改)。
|
||||
- 开机密码默认 **6789**(可在“忘记密码/修改密码 → 密码管理登录(管理员密码 **9527**)→ 密码管理 → 重置密码”中修改);管理员密码为固定值 **9527**,不可修改。
|
||||
- 密码正确后进入自检,自检完成 2 秒自动进入“作业选择”;自检异常时可“忽略故障”继续。
|
||||
- 底部状态条上的**模式徽标可点击**(或按键盘 **M**)在“行车模式 / 机械臂模式”间切换;
|
||||
行车模式操作底盘,机械臂模式操作机械臂。
|
||||
- 软急停:各页顶条右上角“急停”按钮,或按键盘 **E**;急停后需点击“复位”恢复。
|
||||
- 底部状态条的模式徽标只作**显示**(不响应点击);行车模式操作底盘,机械臂模式操作机械臂。
|
||||
演示用快捷键 **M** 可切换模式,但**遥控器在线时模式由遥控器报文决定,M 被忽略**。
|
||||
- 软急停由**遥控器 bit4** 下发:上升沿触发急停、下降沿复位,面板不提供急停/复位控件
|
||||
(顶条原有的“急停”按钮已移除)。触发后页面之上出现全屏红条“急停已触发,请用遥控器复位!”。
|
||||
- ⑨⑩ 运行中“返回”无效(需先停止);调试维护页常显红色警告。
|
||||
|
||||
## 通信(UDP 收包 / 发包)
|
||||
## 通信(19 条 CAN 报文,经 /dev/ttyS7 串口收发)
|
||||
|
||||
通信层位于 `comm/udpcommunication.cpp`,协议为 **JSON 文本**(`QJsonDocument`):
|
||||
通信层位于 `comm/car.cpp`,按《洗消机器人遥控器通信协议20260810》sheet **RC** 实现全部
|
||||
**19 条**报文(分类四标准帧 `DIDO/PWM/AI/BMS/MCU` 未实现)。所有报文均为 **29 位扩展帧、
|
||||
信号一律 Intel(小端)位序**。
|
||||
|
||||
- 遥控端绑定本地端口 `9000`,向 `127.0.0.1:9001` 发包;
|
||||
- 内置模拟车载端 `comm/mockvehicle.cpp` 绑定 `9001`,向 `9000` 回传遥测,并对命令作出响应。
|
||||
串口是字节流,故线上帧统一为 **18 字节**,收发同一格式:
|
||||
|
||||
上行命令(UI→车载端,`{"t":...}`):`chassis_move` `arm_move` `arm_return` `arm_pause`
|
||||
`gas_start` `gas_stop` `wash_start` `wash_stop` `ball_valve` `pump_power` `pump_rpm`
|
||||
`set_param` `selfcheck_start` `estop` `estop_reset`。
|
||||
| 偏移 | 长度 | 含义 |
|
||||
| --- | --- | --- |
|
||||
| 0 | 4 | 帧头 `0x5AA5FF00`(线上字节序 `00 FF A5 5A`,用于在字节流中定位报文起始) |
|
||||
| 4 | 4 | CAN ID(29 位扩展帧),直接用于分流 |
|
||||
| 8 | 1 | DLC,固定 `8` |
|
||||
| 9 | 8 | CAN 数据段 |
|
||||
| 17 | 1 | 校验和:canId 四字节 + DLC + 数据八字节求和取低 8 位 |
|
||||
|
||||
下行遥测(车载端→UI):`heartbeat` `chassis` `arm` `wash` `tank` `gas` `valve` `pump`
|
||||
`estop` `selfcheck` `selfcheck_done`。
|
||||
收包时逐字节找帧头、校验不过右移一字节继续找,容忍粘包、拆包与杂包。
|
||||
|
||||
可在 `config.ini`(程序目录)中配置 `net/local_port`、`net/remote_host`、`net/remote_port`、
|
||||
`net/mock`(true 启用内置模拟端,false 连接真实车载端)、`net/selfcheck_fault`(自检故障演示)。
|
||||
**上行 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/` UDP 通信层 + 内置模拟车载端
|
||||
- `comm/` 车端 CAN 通信层(`car`,19 条报文经 `/dev/ttyS7`)+ 遥控器串口通道(`uart`,`/dev/ttyS5`)
|
||||
- `widgets/` 公共组件:TitleBar / StatusStrip / LedIndicator / NumPadDialog /
|
||||
ConfirmDialog / AlarmBanner / ParamControl / DataCard / FaultTable
|
||||
- `pages/` 各界面(继承 BasePage),对应关系如下:
|
||||
@@ -65,15 +171,14 @@ mingw32-make -j4
|
||||
| ③ 密码管理 | passwordmgmt | PasswordMgmtPage |
|
||||
| ③ 密码重置 | passwordreset | PasswordResetPage |
|
||||
| ④ 自检 | selfcheck | SelfCheckPage |
|
||||
| ⑤ 作业选择 | jobselect | JobSelectPage |
|
||||
| ⑥ 机器人底盘 | chassis | ChassisPage |
|
||||
| ⑦ 机械臂 | arm | ArmPage |
|
||||
| ⑧ 气体检测仪 | gasdetector | GasDetectorPage |
|
||||
| ⑨/⑩ 共用基类 | washbase | WashBasePage |
|
||||
| ⑨ 手动消除 | manualclean | ManualCleanPage |
|
||||
| ⑩ 手动消毒 | manualdisinfect | ManualDisinfectPage |
|
||||
| ⑪ 调试维护 | debugmaintain | DebugMaintainPage |
|
||||
| ⑫ 故障查询 | faultquery | FaultQueryPage |
|
||||
| ⑤ 系统首页面 | home | HomePage |
|
||||
| ⑥ 作业选择 | jobselect | JobSelectPage |
|
||||
| ⑦ 机器人底盘 | chassis | ChassisPage |
|
||||
| ⑧ 机械臂 | arm | ArmPage |
|
||||
| ⑨ 气体检测仪 | gasdetector | GasDetectorPage |
|
||||
| ⑩/⑪ 消除/消毒作业 | washpage | WashPage |
|
||||
| ⑫ 调试维护 | debugmaintain | DebugMaintainPage |
|
||||
| ⑬ 故障查询 | faultquery | FaultQueryPage |
|
||||
|
||||
- `mainwindow.h/.cpp` 主窗口(QStackedWidget 页面路由 + 全局急停横幅)
|
||||
- `mainwindow.h/.cpp` 主窗口(QStackedWidget 页面路由 + 全局急停横幅,横幅内含“复位”按钮)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user