154 lines
2.8 KiB
Markdown
154 lines
2.8 KiB
Markdown
## ROS2 Teleop over OmniSocket UDP/KCP
|
|
|
|
这个文档对应 `ros-control-py/udp_teleop_bridge` 的当前实现。
|
|
|
|
核心变化:
|
|
|
|
- `transport:=udp` 现在表示 OmniSocket UDP
|
|
- `transport:=kcp` 表示 OmniSocket KCP
|
|
- 不再使用原来的裸 `socket` UDP 实现
|
|
|
|
控制接口保持不变:
|
|
|
|
- topic: `/hric/robot/cmd_vel`
|
|
- type: `geometry_msgs/msg/TwistStamped`
|
|
- frame_id: `pelvis`
|
|
- payload: fixed 24-byte little-endian `<6f>`
|
|
|
|
负载顺序:
|
|
|
|
`lx, ly, lz, ax, ay, az`
|
|
|
|
### 构建顺序
|
|
|
|
```bash
|
|
make python-ext
|
|
make python-install
|
|
```
|
|
|
|
```bash
|
|
colcon build --packages-select udp_teleop_bridge
|
|
source install/setup.bash
|
|
```
|
|
|
|
### 启动 Hub
|
|
|
|
OmniSocket UDP:
|
|
|
|
```bash
|
|
./bin/udpserver -listen :9001
|
|
```
|
|
|
|
OmniSocket KCP:
|
|
|
|
```bash
|
|
./bin/kcpserver -listen :9002
|
|
```
|
|
|
|
### 机器人端 Receiver
|
|
|
|
```bash
|
|
ros2 launch udp_teleop_bridge robot_udp_receiver.launch.py \
|
|
transport:=udp \
|
|
server_addr:=127.0.0.1:9001 \
|
|
peer_id:=ros-bridge-ctrl \
|
|
output_topic:=/hric/robot/cmd_vel \
|
|
frame_id:=pelvis \
|
|
watchdog_timeout:=0.5
|
|
```
|
|
|
|
KCP 只需把 `transport` 和 `server_addr` 改成:
|
|
|
|
```bash
|
|
transport:=kcp server_addr:=127.0.0.1:9002
|
|
```
|
|
|
|
如果控制命令来自本机 `b_side_omnid`,可以改为:
|
|
|
|
```bash
|
|
transport:=unix_dgram local_socket_path:=/tmp/omnisocket-b-side-cmd.sock
|
|
```
|
|
|
|
只接受指定 sender:
|
|
|
|
```bash
|
|
expected_sender:=ros-keyboard-ctrl
|
|
```
|
|
|
|
### 键盘 Sender
|
|
|
|
```bash
|
|
ros2 launch udp_teleop_bridge keyboard_sender.launch.py \
|
|
transport:=udp \
|
|
server_addr:=127.0.0.1:9001 \
|
|
peer_id:=ros-keyboard-ctrl \
|
|
target_peer:=ros-bridge-ctrl
|
|
```
|
|
|
|
```bash
|
|
ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args \
|
|
--remap cmd_vel:=/teleop/cmd_vel \
|
|
-p stamped:=true \
|
|
-p frame_id:=pelvis \
|
|
-p speed:=0.20 \
|
|
-p turn:=0.60
|
|
```
|
|
|
|
### Xbox Sender
|
|
|
|
```bash
|
|
ros2 launch udp_teleop_bridge xbox_to_udp.launch.py \
|
|
transport:=udp \
|
|
server_addr:=127.0.0.1:9001 \
|
|
peer_id:=ros-gamepad-ctrl \
|
|
target_peer:=ros-bridge-ctrl \
|
|
joy_dev:=/dev/input/js0 \
|
|
frame_id:=pelvis
|
|
```
|
|
|
|
### 参数语义
|
|
|
|
- sender:
|
|
- `transport`
|
|
- `server_addr`
|
|
- `relay_via`
|
|
- `peer_id`
|
|
- `target_peer`
|
|
- `input_topic`
|
|
- `send_rate_hz`
|
|
- `input_timeout`
|
|
- receiver:
|
|
- `transport`
|
|
- `server_addr`
|
|
- `relay_via`
|
|
- `peer_id`
|
|
- `expected_sender`
|
|
- `output_topic`
|
|
- `frame_id`
|
|
- `watchdog_timeout`
|
|
- `publish_rate_hz`
|
|
|
|
`server_addr` 省略时,会按 transport 自动选择:
|
|
|
|
- `udp` -> `127.0.0.1:9001`
|
|
- `kcp` -> `127.0.0.1:9002`
|
|
|
|
### 数据流
|
|
|
|
```text
|
|
teleop_twist_keyboard / teleop_twist_joy
|
|
-> /teleop/cmd_vel (TwistStamped)
|
|
-> cmd_vel_udp_sender
|
|
-> OmniSocket UDP/KCP binary message
|
|
-> udp_cmd_vel_receiver
|
|
-> /hric/robot/cmd_vel
|
|
```
|
|
|
|
### 安全与约束
|
|
|
|
- sender 默认 20 Hz 重发
|
|
- sender 输入超时后改发零速
|
|
- receiver watchdog 超时后发零速 stop
|
|
- receiver 只接受 24 字节 binary 负载
|
|
- `relay_via` 只在 KCP 模式有效
|