DDS 通信与远程开发
Roban2 C++ SDK 使用 Cyclone DDS 传输 Topic 和 DDS-RPC。SDK 已封装底层消息,业务程序应优先调用 publish...()、subscribe...() 和状态/控制服务,不直接依赖内部生成的 DDS 类型。
通信模式
| 场景 | CYCLONEDDS_URI | 说明 |
|---|---|---|
| 本机普通 DDS | file://<Lejulab_ARM>/src/leju_launch/config/cyclonedds.xml | 禁用共享内存,启动脚本的 --no-shm 使用此模式 |
| 本机共享内存 | file:///etc/cyclonedds/cyclonedds_shm.xml | 通过 iceoryx RouDi 降低同机数据拷贝,需要先部署配置 |
| 跨主机 DDS | 两端使用同一网络配置 | 开发机和机器人必须网络互通,且 DDS 接口、组播和域配置一致 |
cyclonedds.xml 和仓库中未部署的 cyclonedds_shm.xml 默认绑定 lo,只能发现本机进程。不要把默认 lo 配置当作跨机配置。
本机普通 DDS
在不使用共享内存时,可显式选择仓库配置:
cd <Lejulab_ARM>
export ROBOT_VERSION=17
source installed/setup.bash
export CYCLONEDDS_URI="file://$PWD/src/leju_launch/config/cyclonedds.xml"
使用启动脚本时,--no-shm 会为该启动链路选择同一份普通 DDS 配置。自己的 SDK 程序也必须使用同一配置,否则可能无法发现对方。
本机共享内存
仓库提供的部署脚本会安装 RouDi 系统服务、DDS 配置和环境变量:
cd <Lejulab_ARM>
sudo bash src/leju_launch/scripts/setup_cyclonedds_config.sh
部署后需要重新登录,或按脚本给出的提示刷新 iceoryx 组身份。确认服务和环境:
systemctl status leju-roudi.service --no-pager
echo "$CYCLONEDDS_URI"
bash src/leju_launch/scripts/check_shm.sh
未显式传入 --no-shm 时,启动脚本优先使用 /etc/cyclonedds/cyclonedds_shm.xml;若该文件不存在,才使用仓库自带的共享内存配置。
跨主机通信
setup_cyclonedds_config.sh 部署时会检查本机是否存在 192.168.26.1 地址:
- 如果存在,部署后的共享内存配置会把 DDS 网络接口从
lo改为192.168.26.1。 - 如果不存在,保持
lo,此时只能本机通信。
在其他网段部署时,需要修改实际使用的 Cyclone DDS XML,将 <NetworkInterface> 指向本机与机器人通信的网卡或 IP。两端还需要满足:
- IP 可互相访问,防火墙未阻断 DDS 流量。
- 参与同一通信的程序使用相容的 Cyclone DDS 配置。
- 不依赖 iceoryx 传输跨机数据;共享内存只对同机进程生效。
SDK 话题速查
| 功能 | SDK 方法 | DDS 话题 |
|---|---|---|
| 硬件状态 | subscribeHardwareState() | /rt/hardware/state |
| IMU | subscribeImuData() | /rt/imu_state |
| 关节状态 | subscribeRobotState() | /rt/joint_state |
| 普通手柄 | subscribeJoyData() | /rt/joy |
| 底层关节指令 | publishRobotCmd() | /rt/joint_cmd |
| 双手指令 | publishHandCmd() | /rt/hand_cmd |
| 姿态高度 | publishPostureHeightCmd() | /rt/posture_height_cmd |
| 停止指令 | publishStopRobot() | /rt/hardware/stop |
| 手臂/头部/腰部轨迹 | publish...JointCmd() | /rt/arm_trajectory、/rt/head_trajectory、/rt/waist_trajectory |
| 控制器速度 | publishVelocityCmd() | /rt/cmd_vel |
| VR 输入速度 | publishVrVelocityCmd() | /rt/vr/cmd_vel |
| Quest 骨骼位姿 | publishQuestBonePoses() / subscribeQuestBonePoses() | /rt/quest/bone_poses |
| Quest 手柄 | publishQuestJoystickData() / subscribeQuestJoystickData() | /rt/quest/joysticks |
Topic 用于持续数据流;控制器切换、模式设置、状态查询、runtime 启停和动作播放由 lejusdk-vr 内部封装为 DDS-RPC。
通信检查
cd <Lejulab_ARM>
export ROBOT_VERSION=17
source installed/setup.bash
echo "$ROBOT_VERSION"
echo "$CYCLONEDDS_URI"
bash scripts/diagnostics/check_dds.sh
常见问题的排查顺序:
- 确认所有终端的
ROBOT_VERSION一致。 - 确认发布端和订阅端的
CYCLONEDDS_URI指向期望配置。 - 使用共享内存时确认
leju-roudi.service正常。 - 跨机时确认 XML 未绑定
lo,两端网络可达。 - 再运行已编译示例
hw_state_subscriber或joint_state_subscriber验证数据链路。
对应仓库文件
- 普通 DDS 配置:
src/leju_launch/config/cyclonedds.xml - 共享内存配置:
src/leju_launch/config/cyclonedds_shm.xml - 系统部署脚本:
src/leju_launch/scripts/setup_cyclonedds_config.sh - 启动脚本的 DDS 选择逻辑:
src/leju_launch/scripts/_launch_common.sh - DDS 检查:
scripts/diagnostics/check_dds.sh - 共享内存检查:
src/leju_launch/scripts/check_shm.sh