169 lines
7.9 KiB
Markdown
169 lines
7.9 KiB
Markdown
# 天工 3.0 `joystick_bridge` 与 `/sbus_data` 证据记录
|
||
|
||
记录时间:2026-08-07
|
||
|
||
本文只区分三类结论:SDK 文档明确说明、机器人运行时直接观测、尚未证明。不能用 ROS
|
||
节点存在某个订阅或发布端,代替对其内部算法的证明。
|
||
|
||
## 1. 对此前说法的证据审计
|
||
|
||
|此前说法|目前证据|结论|
|
||
|---|---|---|
|
||
|`joystick_bridge` 处理按键|它订阅 `/sbus_data`;SDK 定义 A~H 语义;实机 `bridge_config.yaml` 给出 A~H 的规则|已证明|
|
||
|它处理“持续按住”条件|实机 YAML 配置 `a/b/c` 长按阈值分别为 `1.0/1.0/0.5 s`,并给出 `press_state` 规则|已证明厂商遥控器长按机制;与本地 xTELE 的 3 秒保护不是同一机制|
|
||
|它进行 `/robot_state` 状态检查|运行中的节点确实订阅 `/robot_state`|只证明订阅;如何检查、检查哪些字段尚未证明|
|
||
|它进行速度缩放和方向映射|已只读取得 `/home/ubuntu/data/param/bridge_config.yaml`,其中包含状态速度上限、偏置和速度处理流水线参数|已证明配置能力;核心算法在编译包中|
|
||
|它发布 `/fsm_state_cmd`、`/fsm_resume_cmd`、`/stand_cmd`|运行中的 `ros2 node info /joystick_bridge` 直接列出这三个发布端|已证明发布能力;触发条件和消息内容尚未证明|
|
||
|它有特定行走启停顺序|YAML 的 `fsm_command_bindings` 明确列出状态规则和持续速度动作|已证明配置规则;未做带运动的完整时序采样|
|
||
|
||
因此可以准确地说:`joystick_bridge` 是厂商 SBUS 遥控器适配器,包含按键规则、状态命令
|
||
和速度计算配置。但二次开放文档同时提供独立的 `/hric/robot/cmd_vel` topic 接口,本地
|
||
xTELE 桥不必伪装成 SBUS 遥控器。
|
||
|
||
## 2. SDK 文档证据
|
||
|
||
来源:`具身天工3.0+SDK+文档(26.04.x)+(1).md` 第 299~319 行。
|
||
|
||
文档明确规定:
|
||
|
||
- `/sbus_data` 类型为 `sensor_msgs/msg/Joy`;
|
||
- `axes` 包含 12 个 `float32`,取值范围 `[-1.0, 1.0]`;
|
||
- `buttons` 为空,不使用;
|
||
- `/sbus_data/event` 类型为 `bodyctrl_msgs/msg/SbusData`;
|
||
- 事件消息包含 A~H 的状态,以及 `x1/y1/x2/y2` 四个摇杆轴;
|
||
- 四个摇杆轴范围为 `[-1.0, 1.0]`,直接透传、不滤波。
|
||
|
||
文档没有给出 `/sbus_data.axes[0..11]` 与 `x1/y1/x2/y2/A..H` 的逐项下标映射,
|
||
因此不能只根据字段数量猜测 12 个下标。
|
||
|
||
## 3. 机器人运行时证据
|
||
|
||
在 Nvidia 侧加载机器人 ROS 环境后执行:
|
||
|
||
```bash
|
||
ros2 node info /joystick_bridge
|
||
ros2 param get /joystick_bridge config_file
|
||
ros2 param get /joystick_bridge joy_topic
|
||
ros2 topic info -v /sbus_data
|
||
```
|
||
|
||
观测结果:
|
||
|
||
```text
|
||
/joystick_bridge subscribers:
|
||
/robot_state: ros2_bridge_msgs/msg/RobotState
|
||
/sbus_data: sensor_msgs/msg/Joy
|
||
|
||
/joystick_bridge publishers:
|
||
/hric/robot/cmd_vel: geometry_msgs/msg/TwistStamped
|
||
/hric/robot/fsm_resume_cmd: std_msgs/msg/String
|
||
/hric/robot/fsm_state_cmd: std_msgs/msg/String
|
||
/hric/robot/stand_cmd: geometry_msgs/msg/TwistStamped
|
||
(另有双臂、头、腰和双手控制话题)
|
||
|
||
config_file = /home/ubuntu/data/param/bridge_config.yaml
|
||
joy_topic = /sbus_data
|
||
```
|
||
|
||
`/sbus_data` 当前只有一个发布者 `/joystick`,QoS 为 `RELIABLE/VOLATILE`。空闲帧实测为:
|
||
|
||
```yaml
|
||
axes: [-0.0, -0.0, -0.0, -0.0, -1.0, -0.0, -1.0, -0.0,
|
||
-1.0, -1.0, -1.0, -1.0]
|
||
buttons: []
|
||
```
|
||
|
||
对应时刻 `/sbus_data/event` 的语义状态为:
|
||
|
||
```yaml
|
||
button_a: -1
|
||
button_b: -1
|
||
button_c: -1
|
||
button_d: -1
|
||
button_e: -1
|
||
button_f: 0
|
||
button_g: 0
|
||
button_h: -1
|
||
x1: -0.0
|
||
y1: -0.0
|
||
x2: -0.0
|
||
y2: -0.0
|
||
```
|
||
|
||
这组同时采样可作为空闲状态基准,但不足以单独反推出所有按键下标和状态编码;需要读取
|
||
`bridge_config.yaml`,或对原遥控器逐键采样。
|
||
|
||
## 4. 同构臂侧是否具备生成 SBUS 输入的数据
|
||
|
||
EAI 上 xTELE 原始流 `tcp://127.0.0.1:5003` 的一帧实测包含:
|
||
|
||
```text
|
||
joystick = {'left': [-0.009, 0.012], 'right': [-0.059, 0.011]}
|
||
button = {'left': [0, 0, 0, 0, 0], 'right': [0, 0, 0, 0, 0]}
|
||
```
|
||
|
||
同一帧还包含 `button_joystick`、`button_wheel`、`scroll`、`trigger` 等输入。因此:
|
||
|
||
- 如果“灵巧手”指同构臂手柄:可以取得左右摇杆和实体按键原始数据,数据源足够构造
|
||
`sensor_msgs/msg/Joy`;
|
||
- 如果“灵巧手”指机器人 BrainCo 灵巧手:不可以。灵巧手只提供电机位置/状态和触觉等,
|
||
不会产生遥控器摇杆与 A~H 开关数据;
|
||
- xTELE 按键是布尔输入,而 SBUS 中含二档、三档开关语义。需要通过明确映射或本地状态机
|
||
转换,不能把布尔数组直接当成 12 个 SBUS 轴发布。
|
||
|
||
## 5. 本地桥不再发布 FSM 命令
|
||
|
||
已从 `tg3_local_teleop.py` 删除:
|
||
|
||
- `std_msgs/msg/String` FSM 发布器;
|
||
- `gotoHBWALK` 消息构造与重复发布;
|
||
- FSM burst、间隔和等待参数。
|
||
|
||
当前桥只在机器人已经报告 `HBWALK/running` 且安全门通过时发布
|
||
`/hric/robot/cmd_vel`,释放操作后仍发送限量零速度帧。
|
||
|
||
本地公网链路的唯一 3 秒门控现位于 EAI:左 Z + 右 C 产生 START/STOP 会话,待机不发送
|
||
xTELE 业务帧。会话启动后,右 C + 左摇杆在机器人端即时映射到 `/hric/robot/cmd_vel`;
|
||
松开立即零速,再次操作不重新计时。
|
||
|
||
部署后运行时检查 `/hric/robot/fsm_state_cmd` 只有厂商节点
|
||
`control_forward` 与 `joystick_bridge` 两个发布者,不再包含 `tg3_local_teleop`;状态文件同时显示:
|
||
|
||
```text
|
||
locomotion_fsm_publish_enabled = false
|
||
```
|
||
|
||
## 6. 最终采用 direct topic,而不是模拟 `/sbus_data`
|
||
|
||
`twice dev.pdf` 明确规定 `/hric/robot/cmd_vel` 为
|
||
`geometry_msgs/msg/TwistStamped`,其中 `linear.x/linear.y/angular.z` 分别控制前后、侧移和
|
||
转向。运行中的 `/hric_topic_bridge` 也直接订阅该话题。因此本项目继续使用 direct topic,
|
||
不增加第二个 `/sbus_data` 发布者,避免与原 `/joystick` 的约 43 Hz 数据交错。
|
||
|
||
实机 xmigcs `dex_config.yaml` 原先把 HBWALK 的四个速度上限全部设为零,这才是 HBWALK
|
||
topic 无法行走的关键配置。2026-08-07 已按文档把 HBWALK 上限改为当前 NAVIGATE 同值,
|
||
并保留原配置备份。`twice dev.pdf` 第 1 页规定半身行走 Topic 的 `linear.x` 范围为
|
||
`[-0.8, 1.0] m/s`、`angular.z` 范围为 `[-0.8, 0.8] rad/s`;本地桥现按这组官方 Topic
|
||
范围做前进/后退非对称限幅,不发布 `linear.y`。
|
||
|
||
## 7. xmigcs 配置的加载与重启边界
|
||
|
||
`dex_config.yaml` 只在 xmigcs 初始化时由 `robot_interface.init()` 读取,当前节点没有动态
|
||
reload 参数、service 或 action。现场固件的 `/proc_manager/config/notify` 也不是进程
|
||
启停接口:其回调只记录 String 内容并重新读取 proc_manager 自身的固定
|
||
`proc_manager.json`。曾尝试向该话题发送 `CMD_STOP_PROC/CMD_START_PROC` JSON,实测
|
||
xmigcs PID 始终为 `3269`,日志也没有任何启停记录;该用法已确认无效并从部署说明删除。
|
||
|
||
当前固件没有启用内部遗留 `OnRequest` 的 fd 通道,也没有单进程 ROS service、action、
|
||
监听端口或 CLI。因此加载新 YAML 应使用厂商真实生命周期:先退出遥操,按原流程切到
|
||
`48V Off`,由 proc_manager 停止 `rl` 与 `robot_control`,再恢复 48V 并完成原有物理启动
|
||
动作。只有 xmigcs 出现新的 PID/启动时间,才表示新配置已经进入运行态。不要直接 kill
|
||
xmigcs,也不要伪造 `/robotcontrol_state`。
|
||
|
||
2026-08-07 14:32 的实际重启结果为 PID `3125`。新日志明确打印 HBWALK 已加载
|
||
`max_x_plus=1.2`、`max_x_minus=0.6`、`max_y=0.6`、`max_yaw=1.0`,随后完成
|
||
Robot interface、SHM RPC 与 100 Hz 控制线程初始化,并进入 `HBWALK`。该进程会把
|
||
Linux `comm` 名称设为 `xmigcs`,因此 `ps -C python3` 可能无输出;应使用
|
||
`ps -C xmigcs -o pid,lstart,cmd` 或上述精确 `pgrep`。本机切断动力电源时 Ubuntu/网络也
|
||
可能同时离线,断电期间 SSH 失败属于正常现象,应在重新上电并完成启动后检查。
|