跳转到内容

机器人与 DDS 接口

DR02 Pro SDK 通过 ROS 2 / DDS 中间件与机器人进行数据交互,提供关节控制、状态读取、IMU数据、外设监测等完整接口。

注意: 使用ROS2 工具接收话题、查看频率等前,需要source /opt/robot/scripts/setup_ros2.sh环境变量。

话题消息类型说明
/JOINTS_CMDdrdds/msg/JointsCmd关节控制命令(SDK → 机器人)
/JOINTS_DATAdrdds/msg/Joints关节状态反馈(机器人 → SDK)
/IMU_DATA_HEADsensor_msgs/msg/Imu头部 IMU 数据
/IMU_DATA_BASEsensor_msgs/msg/Imu基座 IMU 数据
/STEERdrdds/msg/Steer归一化速度指令
/REAL_STEERdrdds/msg/Steer实际速度指令
/GAMEPAD_KEYstd_msgs/msg/String手柄按键事件
/BATTERY_DATAdrdds/msg/BatteryData电池数据
/MOTION_STATE—运动状态切换命令
/MOTION_INFO—运动状态信息
/GAIT—步态切换命令
项目值
机器人名称DR2PRO(枚举值 0)
总自由度31
腰部自由度3(WaistX, WaistY, WaistZ)
单臂自由度7(ShoulderY, ShoulderX, ShoulderZ, Elbow, WristZ, WristY, WristX)
单腿自由度6(HipY, HipX, HipZ, Knee, AnkleY, AnkleX)
颈部自由度2

关节排列顺序: 腰部(3) → 左臂(7) → 右臂(7) → 左腿(6) → 右腿(6) → 颈部(2)

不同型号机器人的关节配置存在差异,下表定义了每个索引对应的关节名称:

索引区域DR02标准版关节名称DR02Pro版关节名称
0腰腰部偏航腰部偏航
1x腰部翻滚
2x腰部俯仰
3左手左肩俯仰左肩俯仰
4左肩翻滚左肩翻滚
5左肩偏航左肩偏航
6左手肘部左手肘部
7x左腕偏航
8x左腕俯仰
9x左腕翻滚
10右手右肩俯仰右肩俯仰
11右肩翻滚右肩翻滚
12右肩偏航右肩偏航
13右右手肘部右手肘部
14x右腕偏航
15x右腕俯仰
16x右腕翻滚
17左腿左髋俯仰左髋俯仰
18左髋翻滚左髋翻滚
19左髋偏航左髋偏航
20左腿膝关节左腿膝关节
21左踝俯仰左踝俯仰
22左踝翻滚左踝翻滚
23右腿右髋俯仰右髋俯仰
24右髋翻滚右髋翻滚
25右髋偏航右髋偏航
26右腿膝关节右腿膝关节
27右踝俯仰右踝俯仰
28右踝翻滚右踝翻滚
29头部x头部偏航
30x头部俯仰

注意: MotorStatus 参数组中,由于 STD 版本与 PRO 版本的关节数量不同,为便于 App 端进行一一对应展示,该数组固定长度为 31。其中,数值 10 表示该关节不存在。

RobotInterface 是机器人接入的基类,负责:

  • 创建 ROS 2 发布者/订阅者
  • 提供关节状态读取(位置、速度、力矩、温度)
  • 提供 IMU 数据读取(头部和基座双 IMU)
  • 发布关节命令
RobotInterface(robot_name, dof_num=31, leg_dof_num=6, arm_dof_num=7, waist_dof_num=3, neck_dof_num=2, node)
/JOINTS_CMD → 发布关节控制命令
/JOINTS_DATA ← 订阅关节状态反馈
/IMU_DATA_HEAD ← 订阅头部 IMU
/IMU_DATA_BASE ← 订阅基座 IMU

每个关节 5 个参数:kp、position、kd、velocity、torque

T=kp×(posgoal−posreal)+kd×(velgoal−velreal)+tffT = kp \times (pos_{goal} - pos_{real}) + kd \times (vel_{goal} - vel_{real}) + t_{ff}

DR2ProInterface 继承 RobotInterface,仅设置自由度参数:

DR2ProInterface(node, "DR2PRO") : RobotInterface("DR2PRO", 31, 12, 14, 3, 2, node)

不做额外的偏置或方向映射,直接使用原始值。

// 订阅关节数据
auto subscription = node->create_subscription<drdds::msg::Joints>(
"/JOINTS_DATA", 10,
[](const drdds::msg::Joints::SharedPtr msg) {
// 处理关节数据
for (size_t i = 0; i < msg->joint_position.size(); ++i) {
RCLCPP_INFO(node->get_logger(), "Joint %zu: pos=%.4f vel=%.4f",
i, msg->joint_position[i], msg->joint_velocity[i]);
}
});
// 创建关节命令发布者
auto publisher = node->create_publisher<drdds::msg::JointsCmd>(
"/JOINTS_CMD", 10);
// 构造关节命令
drdds::msg::JointsCmd cmd;
for (int i = 0; i < 31; ++i) {
cmd.kp.push_back(600); // PD增益Kp
cmd.position.push_back(0.0); // 目标位置
cmd.kd.push_back(6); // PD增益Kd
cmd.velocity.push_back(0.0); // 目标速度
cmd.torque.push_back(0.0); // 前馈力矩
}
// 发布命令
publisher->publish(cmd);
// 订阅头部IMU
auto imu_sub = node->create_subscription<sensor_msgs::msg::Imu>(
"/IMU_DATA_HEAD", 10,
[](const sensor_msgs::msg::Imu::SharedPtr msg) {
RCLCPP_INFO(node->get_logger(),
"IMU: lin_acc=[%.2f %.2f %.2f] ang_vel=[%.2f %.2f %.2f]",
msg->linear_acceleration.x,
msg->linear_acceleration.y,
msg->linear_acceleration.z,
msg->angular_velocity.x,
msg->angular_velocity.y,
msg->angular_velocity.z);
});

SDK 可在以下位置运行,只要 ROS 2 / DDS 网络互通:

位置IP说明
开发主机用户配置需通过网线连接机器人背部网口
AOS 主机10.21.33.103机器人端计算设备
NOS 主机10.21.33.106已预装消息接口库