ROS2 消息定义
PND 人形机器人原生支持 ROS 2 通信,基于 CycloneDDS 实现 PC 与机器人之间的直接 msg 交互,无需 SDK 转发。
- 订阅话题
lowstate(类型:pnd_adam.msg.dds_.LowState_)获取 Adam 当前状态 - 订阅话题
handstate(类型:pnd_adam.msg.dds_.HandState_)获取手指当前状态 - 发布话题
lowcmd(类型:pnd_adam.msg.dds_.LowCmd_)控制全身关节电机(不含灵巧手)、电池等设备 - 发布话题
handcmd(类型:pnd_adam.msg.dds_.HandCmd_)控制手指关节电机
消息结构体定义与 DDS 层一致,详见下文。参考例程见 ROS2 底层运动参考例程。
获取与安装
完整工程发布于 GitHub:
🔗 仓库地址:pnd_ros2
系统要求
| 系统 | ROS 2 版本 |
|---|---|
| Ubuntu 22.04 | Humble(推荐) |
安装依赖
sudo apt install ros-humble-rmw-cyclonedds-cpp
sudo apt install ros-humble-rosidl-generator-dds-idl
sudo apt install libyaml-cpp-dev
sudo apt install python3-colcon-common-extensions
编译消息与工作空间
PND 机器人使用 cyclonedds 0.10.2,编译前请确保 ~/.bashrc 中未自动 source ROS 2 环境(如有 source /opt/ros/humble/setup.bash 请先注释)。
cd ~/pnd_ros2/cyclonedds_ws/src
git clone https://github.com/ros2/rmw_cyclonedds -b humble
git clone https://github.com/eclipse-cyclonedds/cyclonedds -b releases/0.10.x
cd ..
colcon build
编译完成后注册环境:
工程结构
| 目录 | 说明 |
|---|---|
cyclonedds_ws/ |
PNDbotics ROS 2 消息定义工作空间 |
example/ |
各机型 ROS 2 参考例程 |
运行例程、网络配置等详见 ROS2 底层运动参考例程 与 快速开发(仿真)。
接口说明
采用 ROS 2 订阅或发布话题。话题信息存储在由 IDL 定义的结构体中,常用结构体有:
| 结构体名称 | 说明 |
|---|---|
_BatteryData_.py |
电池状态(电压、电流、电量等) |
_HandCmd_.py |
灵巧手期望位置控制 |
_HandState_.py |
灵巧手实际状态反馈 |
_IMUState_.py |
Adam IMU 姿态及加速度数据 |
_LowCmd_.py |
Adam 底层全身控制命令 |
_LowState_.py |
Adam 底层全身状态汇总 |
_MotorCmd_.py |
单个电机控制参数(位置、速度、力矩及增益) |
_MotorState_.py |
单个电机状态反馈 |
消息字段定义
下发消息:lowcmd(身体期望位置)
| 字段 | 类型 | 维度 | 含义 |
|---|---|---|---|
mode_pr |
uint8 |
1 | 模式控制 |
motor_cmd |
MotorCmd_ |
* | 变长[1] |
reserve |
uint32 |
1 | 保留字段 |
[1] motor_cmd 说明:其长度根据本机型号而定
- Adam Pro:31 维度执行器数据
- Adam SP:29 维度执行器数据
- Adam Lite:23 维度执行器数据
订阅消息:lowstate(身体实际状态)
| 字段 | 类型 | 维度 | 含义 |
|---|---|---|---|
mode_pr |
uint8 |
1 | 当前模式状态 |
tick |
uint32 |
1 | 系统时间戳/滴答数 |
imu_state |
IMUState_ |
9 | IMU 姿态数据 |
motor_state |
MotorState_ |
* | 变长[1] |
wireless_remote |
short |
40 | 遥控器手柄数据[2] |
battery_data |
BatteryData_ |
1 | 电池电量与状态信息 |
reserve |
uint32 |
1 | 保留字段 |
[1] motor_state 说明:其长度根据本机型号而定
- Adam Pro:31 维度执行器数据
- Adam SP:29 维度执行器数据
- Adam Lite:23 维度执行器数据
[2] wireless_remote 说明:索引 20–40 为空,0–19 分别对应手柄按键:"lx", "ly", "rx", "ry", "lt", "rt", "xx", "yy", "a", "b", "x", "y", "lb", "rb", "back", "start", "home", "lo", "ro"
辅助结构体定义
电池状态类型:BatteryData_
| 字段 | 类型 | 含义 |
|---|---|---|
timestamp_ms |
int64 |
毫秒级时间戳 |
voltage |
float32 |
电压 (V) |
current |
float32 |
电流 (A) |
power |
float32 |
功率 (W) |
wh_accumulated |
float32 |
累计功耗 (Wh) |
status |
string |
电池状态描述 |
IMU 数据类型:IMUState_
| 字段 | 类型 | 维度 | 含义 |
|---|---|---|---|
quaternion |
float32 |
4 | 四元数 [w,x,y,z] |
gyroscope |
float32 |
3 | 角速度 [x,y,z] |
accelerometer |
float32 |
3 | 加速度 [x,y,z] |
ypr |
float32 |
3 | 姿态角 [yaw,pitch,roll] |
temperature |
int16 |
1 | 传感器温度 |
单个关节数据类型:MotorCmd_
| 字段 | 类型 | 含义 |
|---|---|---|
mode |
uint8 |
模式(默认 0) |
q |
float32 |
期望位置 (rad) |
dq |
float32 |
期望速度 (rad/s) |
tau |
float32 |
期望力矩 (Nm) |
kp |
float32 |
比例增益(刚度) |
kd |
float32 |
微分增益(阻尼) |
ki |
float32 |
积分增益 |
reserve |
uint32 |
保留字段 |
单个关节数据类型:MotorState_
| 字段 | 类型 | 含义 |
|---|---|---|
mode |
uint8 |
当前模式 |
q |
float32 |
实际位置 (rad) |
dq |
float32 |
实际速度 (rad/s) |
ddq |
float32 |
实际加速度 (\(\text{rad/s}^2\)) |
tau_est |
float32 |
估计力矩 (Nm) |
state |
uint32 |
电机运行状态码 |
reserve |
uint32 |
保留字段 |
灵巧手接口
下发消息:handcmd(手指期望位置)
| 字段 | 类型 | 维度 | 含义 |
|---|---|---|---|
position |
uint32 |
12 | 手部期望位置 |
reserve |
uint32 |
1 | 保留字段 |
订阅消息:handstate(手指实际状态)
| 字段 | 类型 | 维度 | 含义 |
|---|---|---|---|
position |
uint32 |
12 | 手部实际位置 |
reserve |
uint32 |
1 | 保留字段 |
相关文档
| 文档 | 说明 |
|---|---|
| ROS2 底层运动参考例程 | pnd_ros2/example 编译与运行 |
| 手臂控制例程 | 通过 DDS rt/lowcmd 控制上肢关节(推荐) |
| 灵巧手控制说明 | handcmd / handstate 专题 |
| 身体关节电机顺序 | 各机型 motor_cmd 索引 |
| DDS 消息定义 | DDS 层等价消息定义 |