跳到主要内容

DDS 通信与远程开发

Roban2 C++ SDK 使用 Cyclone DDS 传输 Topic 和 DDS-RPC。SDK 已封装底层消息,业务程序应优先调用 publish...()、subscribe...() 和状态/控制服务,不直接依赖内部生成的 DDS 类型。

通信模式​

场景CYCLONEDDS_URI说明
本机普通 DDSfile://<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
IMUsubscribeImuData()/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

常见问题的排查顺序:

  1. 确认所有终端的 ROBOT_VERSION 一致。
  2. 确认发布端和订阅端的 CYCLONEDDS_URI 指向期望配置。
  3. 使用共享内存时确认 leju-roudi.service 正常。
  4. 跨机时确认 XML 未绑定 lo,两端网络可达。
  5. 再运行已编译示例 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