跳转至

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:

git clone https://github.com/pndbotics/pnd_ros2.git
cd pnd_ros2

🔗 仓库地址: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

编译完成后注册环境:

source /opt/ros/humble/setup.bash
source ~/pnd_ros2/cyclonedds_ws/install/setup.bash

工程结构

目录 说明
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 层等价消息定义