真机推理部署
当前 KMD 真机链路由三个进程组成:机器人端运行 vlahost,GPU 服务器运行 OpenPI 策略服务器和推理客户端。机器人端只负责提供状态、相机画面和动作接口,不需要安装完整的 OpenPI 训练环境。
部署架构
机器人(ROS 2) GPU 服务器
┌─────────────────────┐ GET /state ┌──────────────────────────┐
│ vlahost │ ◄───────────── │ OpenPI 推理客户端 │
│ - 关节与末端状态 │ 状态 + 图像 │ - 组装观测与语言指令 │
│ - 四宫格相机图像 │ ─────────────► │ - 调用策略服务器 │
│ - 动作话题发布 │ POST /action │ - 下发关节动作 │
└─────────────────────┘ ◄───────────── └────────────┬─────────────┘
│ WebSocket
┌─────────────▼─────────────┐
│ OpenPI 策略服务器 │
│ 加载 checkpoint 并推理 │
└───────────────────────────┘
数据接口
当前部署适配以下数据格式:
- 三路相机:
cam_high、cam_left_wrist、cam_right_wrist。 - 16 维关节状态:
[左臂 7 关节, 左夹爪, 右臂 7 关节, 右夹爪]。 - 16 维关节动作:维度和顺序与关节状态一致。
- 模型内部关节角使用角度制,机器人 ROS 反馈和动作使用弧度制,客户端负责单位转换。
vlahost 从四宫格图像中默认取用以下区域:
| 四宫格区域 | 模型相机字段 |
|---|---|
| 右上 | cam_left_wrist |
| 左下 | cam_right_wrist |
| 右下 | cam_high |
| 左上 | 忽略 |
如果实际相机排列不同,需要在推理客户端中调整映射或裁剪参数。
GET /state 响应
vlahost 将 ROS 2 话题中的最新状态和 JPEG 图像编码为 JSON:
{
"stamp": 123456789,
"joint_states": {
"positions": ["14 joint values"],
"velocities": ["14 joint values"],
"efforts": ["14 joint values"],
"est_joint_force": ["14 joint values"]
},
"eef_left": {
"position": {"x": 0, "y": 0, "z": 0},
"orientation": {"x": 0, "y": 0, "z": 0, "w": 1}
},
"eef_right": {
"position": {"x": 0, "y": 0, "z": 0},
"orientation": {"x": 0, "y": 0, "z": 0, "w": 1}
},
"quad_image": {"format": "jpeg", "data": "<base64>"}
}