MQTT 协议:VDA5050 Topic 映射(EGO 自定义扩展)
本文档说明当前 MQTT 控制下发与状态上报的报文格式。
注意:
当前 JSON 结构为 EGO 自定义格式,不是标准 VDA5050 官方 JSON Schema。
建议在论坛中使用“源码模式”或“纯文本粘贴”。
本文档已避免使用表格,减少论坛渲染异常。
1. Topic 总览
- 下发控制 Topic:`vda5050/order`
- 状态上报 Topic:`vda5050/agvstate`
---
2. 下发控制(Topic:`vda5050/order`)
2.1 发送路线:`talk \= “runline”`
- 方向:上位机/客户端 -> 控制端
- 是否回包:不回包
- 用途:下发一条路线(节点数组),控制端解析到 `lineTempnodes[i]`,满足条件后保存到 `linenodes`,进入 `motion_generateline`
约束与建议
- `nodes` 至少 2 个节点,否则路线不生效
- `theta` 与 `vel` 建议使用 number,不要使用字符串
- `action` 枚举:
- `0` 开始升降
- `1` 结束升降
- `2` 静止升降
- `3` 开始动作
- `4` 结束动作
- `5` 静止动作
- `6` 无动作
- `pathType` 枚举:
- `0` 直线
- `1` 圆弧(弃用)
- `2` 直线圆弧(仅叉车)
- `3` 曲率渐变线(仅 AMR)
请求 JSON 示例
{
"talk": "runline",
"isResetRoute": false,
"nodes": \[
{
"id": 0,
"x": 0.0,
"y": 0.0,
"theta": 0.0,
"high": 0.0,
"action": 6,
"pathType": 0,
"vel": 1.0,
"event": ""
},
{
"id": 1,
"x": 1.0,
"y": 0.0,
"theta": 0.0,
"high": 0.0,
"action": 6,
"pathType": 0,
"vel": 1.0,
"event": ""
}
\]
}
字段说明
- `talk`
- 类型:string
- 必填:是
- 固定值:`runline`
- `isResetRoute`
- 类型:bool
- 必填:否
- 默认值:`false`
- 说明:是否需要重载路线,连续发路线一般为 `false`
- `nodes`
- 类型:array
- 必填:是
- 说明:路线节点数组,至少 2 个节点
nodes[i] 字段说明
- `id`
- 类型:int
- 必填:是
- 说明:点位 ID
- `x`
- 类型:number
- 必填:是
- 说明:X 坐标,建议单位 m
- `y`
- 类型:number
- 必填:是
- 说明:Y 坐标,建议单位 m
- `theta`
- 类型:number
- 必填:是
- 说明:朝向角,建议单位 rad
- `high`
- 类型:number
- 必填:否
- 默认值:0.0
- 说明:举升高度,单位建议统一为 mm 或 m
- `action`
- 类型:int
- 必填:是
- 默认值:6
- 说明:动作类型,见上方 action 枚举
- `pathType`
- 类型:int
- 必填:是
- 默认值:0
- 说明:路径类型,见上方 pathType 枚举
- `vel`
- 类型:number
- 必填:否
- 默认值:1.0
- 说明:运行速度,建议单位 m/s;若小于最小速度会被钳制到最小速度
- `event`
- 类型:string
- 必填:否
- 默认值:空字符串
- 说明:该点执行的动作或事件名;长度超限会截断
---
2.2 取消路线:`talk \= “clearAction”`
- 方向:上位机/客户端 -> 控制端
- 是否回包:不回包
- 用途:取消当前路线或动作
请求 JSON 示例
```json
{
“talk”: “clearAction”,
“way”: 1
}
```
字段说明
- `talk`
- 类型:string
- 必填:是
- 固定值:`clearAction`
- `way`
- 类型:int
- 必填:是
- 默认值:0
- 说明:取消方式,传入 `cancelLine(way)`,具体值由业务定义
---
2.3 暂停或恢复:`talk \= “pause”`
- 方向:上位机/客户端 -> 控制端
- 是否回包:不回包
- 用途:暂停或恢复运行
请求 JSON 示例
```json
{
“talk”: “pause”,
“enable”: true
}
```
字段说明
- `talk`
- 类型:string
- 必填:是
- 固定值:`pause`
- `enable`
- 类型:bool
- 必填:是
- 默认值:false
- 说明:
\- \`true\` 表示暂停
\- \`false\` 表示恢复
行为说明
- 当 `enable \= true` 时:
- `FSetTableRegInt8(0×231, 0)`
- `moveStu \= false`
- 当 `enable \= false` 时:
- `FSetTableRegInt8(0×231, 1)`
- `moveStu \= true`
---
3. 状态上报(Topic:`vda5050/agvstate`)
- 方向:控制端 -> 上位机/客户端
- 上报方式:主动周期上报
- `talk` 建议固定为:`status`
3.1 状态字段分组说明
A. base(基础状态)
- `battery`
- 电量,单位百分比
- `mapname`
- 当前地图名称
- `mode`
- 当前模式
- 示例约定:
\- \`1\` 手动模式
\- \`2\` 自动模式
- `stop_reason`
- 停止原因
- 示例约定:
\- \`1\` 防撞
\- \`2\` 动作
\- \`3\` 坐标超时
\- \`4\` 速度设置有误
\- \`5\` 脱轨相关
\- \`6\` 等待停稳
- `motorControlStu`
- 电机控制字状态数组
- `motorErrorCode`
- 电机错误码数组
- `is* / close*`
- 各类防撞、关闭、锁定状态
B. 位姿与速度
- `curpos`
- 当前坐标,通常为 SLAM 坐标
- `globalSlampos`
- SLAM 全局坐标
- `globalCodepos`
- 二维码全局坐标
- `curvel`
- 当前速度
- `controlvel`
- 当前控制速度
- `lastcontrolvel`
- 上一次控制速度
- `maxvel`
- 当前最大速度限制
- `minvel`
- 当前最小速度限制
- `minStartvel`
- 起步最小速度
C. 路线与控制器
- `line`
- 当前运行路线
- `linecontrol`
- 线控参数与运行状态,例如 Kp、误差、分段、等待时间等
- `path`
- 路径跟踪相关索引与最近点信息
3.2 状态上报 JSON 示例(节选)
{
"talk": "status",
"alphaVel\_accel": 0.8,
"alphaVel\_decel": 0,
"base": {
"action": 0,
"arriveID": 0,
"battery": 100,
"close3DAnt": 0,
"closeBaffleAnt": 0,
"closeForkAnt": 0,
"closeScanAnt": 0,
"closeStopAnt": 0,
"closeTouchAnt": 0,
"derail": 0,
"is3DAnt": 0,
"isActionLock": 0,
"isAntLock": 1,
"isBaffleAnt": 0,
"isForkAnt": 0,
"isScanAnt": 0,
"isStopAnt": 0,
"isTouchAnt": 0,
"mapname": "EGO\_1",
"mode": 0,
"motorControlStu": \[0, 0, 0, 0, 0, 0, 0, 0\],
"motorErrorCode": \[0, 0, 0, 0, 0, 0, 0, 0\],
"poseError": 0,
"stop\_reason": 0,
"voltage": 50.95000076293945
},
"curpos": {
"id": 0,
"theta": \-0.02623891830444336,
"x": 21.80147933959961,
"y": \-1.553675651550293
},
"curvel": {
"alpha": 0,
"thetavel": \-0.000614966761940202,
"upthetavel": 0,
"xvel": 1.7204336273485034e-21
}
}
---
4. 推荐给客户的写法建议
- 建议统一使用 number 类型,不要把数值写成字符串
- 建议在文档中固定单位:
- `x / y` 使用 m
- `theta` 使用 rad
- `vel / xvel` 使用 m/s
- `thetavel` 使用 rad/s
- `high` 使用 m,并保持统一
- 建议后续增加顶层字段 `protoVer`,例如:
```json
{
“protoVer”: 1,
“talk”: “runline”
}
```