ROS2 Interface 开发No.0 章概述与开发准备

ROS2 接口开发

更新于:2026年8月17日

1.1 文档适用范围与 ROS 版本

本文档适用于 EngineAI PM01 系列与 T800 系列人形机器人的 ROS2 二次开发,基于 ROS2 Humble 版本编写。

文档将原有的《ROS2 协议说明》与各示例文档内容统筹合并,按接口特性分章节阐述,开发者可按章节顺序逐步上手,也可按需跳转查阅。

1.2 开发环境搭建

EngineAI ROS2 Interface 提供一组 ROS2 消息,受益于 ROS2 生态,用户只需要一个标准 ROS2 开发环境加一些配置就能调用 EngineAI 提供的机器人服务。ROS2 仓库地址:engineai_ros2_workspace

开发者可以通过以下两种方式搭建开发环境。

2.1 方法一:使用机器人内置开发环境(推荐)

EngineAI 在机器人应用计算单元上内置了一个 Web 集成开发环境,用户不需要配置任何环境,只需要 Web 访问服务就可以开始运行示例并开发。

连接机器人内置 WIFI(密码 e12345678),通过浏览器访问机载 Web IDE(地址通常为 http://192.168.0.162,详见机器人机身标签或产品手册)即可开始使用。

2.2 方法二:自行搭建 PC 开发环境

系统环境要求

项目要求
操作系统Ubuntu 22.04
ROS 版本ROS2 Humble
编译器GCC >= 11
构建工具CMake >= 3.22
Python>= 3.10

安装软件依赖

Bash
sudo apt update
sudo apt install rsync sshpass openssh-client libglfw3-dev libxinerama-dev libxcursor-dev
sudo apt install ros-dev-tools ros-humble-rmw-cyclonedds-cpp ros-humble-ros-base

ROS2 通信配置

必须正确配置以下环境变量,否则无法与机器人通信:

Bash
# 一定要匹配的 ROS_DOMAIN_ID
export ROS_DOMAIN_ID=69
# 设置多机通信
export ROS_LOCALHOST_ONLY=0
# 使用 rmw_cyclonedds_cpp
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

可通过以下脚本一键写入 ~/.bashrc

Bash
echo -e '\nexport ROS_DOMAIN_ID=69\nexport ROS_LOCALHOST_ONLY=0\nexport RMW_IMPLEMENTATION=rmw_cyclonedds_cpp' >> ~/.bashrc && source ~/.bashrc

2.3 访问机器人

克隆仓库:环境准备好后,可直接 clone ROS2 仓库并进入工作空间:

Bash
git clone https://github.com/engineai-robotics/engineai_ros2_workspace.git
cd engineai_ros2_workspace

硬件连接:通过机器人背后的网口连接机器人,即可通过 ROS2 多机和机器人通信。

手柄遥控提示:PM01 机身有两个 USB 插槽,手柄的 USB 接收器需插入下方接口才能正常遥控,插上方接口无效。

SSH 登录信息:机器人内置了两款计算单元,用户可通过 SSH 登录访问:

计算单元IP 地址用户名密码
应用计算单元192.168.0.162ubuntuubuntu
运控计算单元192.168.0.163user1

开发前确认事项

  • ROS2 Humble 环境可用,ros2 topic list 能正常列出系统话题
  • engineai_ros2_workspace 已编译,interface_protocolinterface_example 包可被找到
  • 机器人硬件接口节点已启动(可通过 ros2 topic echo /hardware/joint_state 验证)

2.4 构建与部署

安装第三方依赖:在编译节点或仿真环境前,请先运行仓库提供的第三方依赖安装脚本,否则部分消息包/示例可能缺少依赖。

Bash
# 在 engineai_ros2_workspace 根目录执行
./src/third_party/install.sh

编译 workspace(来自 ROS2 仓库):

Bash
# 在主机上编译全部节点和示例
./scripts/build_nodes.sh example

# 编译仿真环境
./scripts/build_nodes.sh sim

# 在机器人端编译(先装第三方依赖 → 编译 → 配置环境)
./src/third_party/install.sh
./scripts/build_nodes.sh
source install/setup.bash

同步代码到机器人 Orin 主板

Bash
./scripts/sync_src.sh orin

同步后 SSH 登录 Orin 主板,进入 workspace 目录编译即可使用,用法与主机一致。

2.5 仿真器(无需实体机器人,建议先在仿真验证后再上真机)

ROS2 仓库提供了 MuJoCo 仿真器,可以在没有实体机器人的情况下调试关节桥接模式:

Bash
# 安装第三方依赖
./src/third_party/install.sh

# 编译仿真节点
./scripts/build_nodes.sh sim
source install/setup.bash

# 启动仿真器
ros2 launch mujoco_simulator mujoco_simulator.launch.py

仿真器启动后,按手柄 [BACK, A] 进入关节透传(joint_bridge)模式,再运行示例程序。

使用仿真器时,不要连接实体机器人,或将 ROS_LOCALHOST_ONLY=1 设置为仅本地通信,防止误连实体机器人。

1.3 消息文件位置

所有自定义 ROS2 消息定义位于 interface_protocol 包中,目录结构如下:

PLAIN
src/interface_protocol/msg/(共 19 个,核心 9 个如下)
├── BodyVelCmd.msg
├── JointCommand.msg
├── JointMotionPlanRequest.msg
├── JointMotionPlanState.msg
├── JointOverrideCommand.msg
├── JointState.msg
├── LedControl.msg
├── MotionState.msg
└── MotionStateRequest.msg

核心消息定义源码(点击文件名可跳转 GitHub):BodyVelCmd.msg · JointCommand.msg · JointMotionPlanRequest.msg · JointMotionPlanState.msg · JointOverrideCommand.msg · JointState.msg · LedControl.msg · MotionState.msg · MotionStateRequest.msg

其余传感器/调试消息(Alert、GamepadKeys、Heartbeat、ImuInfo、MotorCommand、MotorDebug、MotorState、ParallelParserType、PowerInfo、Tts)完整定义见 GitHub 消息目录。开发时可在代码中通过 from interface_protocol.msg import XxxMsg 引入所需消息类型。

1.4 通用约定

以下约定适用于所有接口,在各章节中不再重复说明:

约定项说明
单位制角度统一使用弧度(rad),速度使用 m/s,角速度使用 rad/s。角度转弧度:rad = deg × π / 180
关节索引从 0 开始顺序编号,可通过 /hardware/joint_state 查看关节数量
数组长度所有关节相关数组的长度必须等于机器人总关节数(num_total_joints
QoS 策略不同接口使用不同 QoS:关节命令类建议 Best Effort 以减少延迟;状态切换类需匹配 Reliable 配置,否则消息接收失败
控制频率各接口有推荐频率,频率过低可能导致运动不连续或控制不稳定
运动模式前置大多数接口需要先切换到指定运动模式才能生效,详见第1章

1.5 接口总览

下表汇总了所有 ROS2 接口的 topic、消息类型和方向,方便快速定位:

接口模块Topic消息类型方向
关节命令/hardware/joint_commandJointCommand.msg客户端 → 关节控制器
关节状态/hardware/joint_stateJointState.msg关节控制器 → 客户端
运动状态/motion/motion_stateMotionState.msg运动管理服务 → 客户端
运动状态切换/motion/set_motion_stateMotionStateRequest.msg客户端 → 运动管理服务
LED 控制/hardware/led_controlLedControl.msg客户端 → 灯光控制服务
关节运动规划-请求/motion/joint_motion_plan/requestJointMotionPlanRequest.msg客户端 → 规划器
关节运动规划-状态/motion/joint_motion_plan/stateJointMotionPlanState.msg规划器 → 客户端
关节覆盖控制/motion/joint_override_commandJointOverrideCommand.msg客户端 → 规划器
机体速度控制/motion/body_vel_cmdBodyVelCmd.msg客户端 → 行走服务
手柄按键/hardware/gamepad_keysGamepadKeys.msg传感器 → 客户端
IMU 数据/hardware/imu_infoImuInfo.msg传感器 → 客户端
电源/电池数据/hardware/power_infoPowerInfo.msg传感器 → 客户端
电机调试数据/hardware/motor_debugMotorDebug.msg传感器 → 客户端

1.6 QoS 配置参考

不同接口的 QoS 配置要求不同,配置不匹配会导致消息接收失败。下表汇总了各接口的 QoS 要求,信息来自 GitHub 示例脚本中的 QoSProfile 定义:

Topic发布/订阅ReliabilityDurability
/motion/set_motion_state发布RELIABLEVOLATILE
/motion/motion_state订阅BEST_EFFORTVOLATILE
/hardware/joint_command发布BEST_EFFORTVOLATILE
/hardware/joint_state订阅BEST_EFFORTVOLATILE

运动状态切换的发布者必须使用 RELIABLE,而订阅运动状态使用 BEST_EFFORT。如果 QoS 不匹配,消息将无法接收。

1.7 机型规格对比

下表对比了三款机型的关键规格差异,信息来自飞书 wiki「关于PM01」「关于T800(开发版)」「关于T800(Pro版)」页面:

规格PM01T800 开发版T800 Pro
总自由度242543(含灵巧手)
单腿自由度666
腰部自由度111
单手臂自由度557(含手腕)
灵巧手有(每手 7 自由度)
头部自由度1(偏航)2(俯仰+偏航)2(俯仰+偏航)
运动规划关节索引[12~23][12~24][12,13,14,15,16,17,27,28,29,30,31,41,42]
应用计算单元Jetson Orin NX (16G)Jetson Orin NXJetson Orin NX
运控计算单元Nezha N97Nezha N97Nezha N97

1.8 关节索引对照表

关节索引从 0 开始,命名格式为 J[序号]_[部位]_[动作]_[左右]。控制接口(如 joint_indices、YAML 配置)中使用的索引为关节命名中的 J 编号,即 ROS 关节索引。下表中的「序号」列为原文档/硬件编号,可能与 J 编号不一致,使用时请以关节命名中的 J 编号为准。以下为 PM01 的完整关节索引表,来自飞书 wiki「关于PM01」页面。以下依次为 PM01、T800 开发版、T800 Pro 的完整关节索引表。

8.1 PM01 关节索引(24 自由度)

序号关节命名部位电机型号角度下限 (rad)角度上限 (rad)
0J00_HIP_PITCH_L左髋俯仰Q90H-3.1412.443
1J01_HIP_ROLL_L左髋横滚Q90H-0.4362.094
2J02_HIP_YAW_L左髋偏航Q25H-L-1.574.014
3J03_KNEE_PITCH_L左膝俯仰Q90H-0.26182.3562
4J04_ANKLE_PITCH_L左踝俯仰Q25H-0.68070.7243
5J05_ANKLE_ROLL_L左踝横滚Q25H-0.26180.2618
6J06_HIP_PITCH_R右髋俯仰Q90H-3.1412.443
7J07_HIP_ROLL_R右髋横滚Q90H-2.0940.436
8J08_HIP_YAW_R右髋偏航Q25H-L-4.0141.57
9J09_KNEE_PITCH_R右膝俯仰Q90H-0.26182.3562
10J10_ANKLE_PITCH_R右踝俯仰Q25H-0.68070.7243
11J11_ANKLE_ROLL_R右踝横滚Q25H-0.26180.2618
12J12_WAIST_YAW腰偏航Q25H-L-4.0141.57
13J13_SHOULDER_PITCH_L左肩俯仰Q25H-2.96712.7925
14J14_SHOULDER_ROLL_L左肩横滚Q25H-0.61082.3562
15J15_SHOULDER_YAW_L左肩偏航Q25H-2.6182.618
16J16_ELBOW_PITCH_L左肘俯仰Q25H-2.19480.7374
17J17_ELBOW_YAW_L左肘偏航Q25H-2.6182.618
18J18_SHOULDER_PITCH_R右肩俯仰Q25H-2.96712.7925
19J19_SHOULDER_ROLL_R右肩横滚Q25H-2.35620.6108
20J20_SHOULDER_YAW_R右肩偏航Q25H-2.6182.618
21J21_ELBOW_PITCH_R右肘俯仰Q25H-2.19480.7374
22J22_ELBOW_YAW_R右肘偏航Q25H-2.6182.618
23J23_HEAD_YAW头偏航Q25H-0.61090.6109

T800 开发版(25 自由度)关节索引

序号部位连杆命名关节命名运动范围 (rad)
1左髋俯仰LINK_HIP_PITCH_LJ00_HIP_PITCH_L-2.88 ~ 2.181
2左髋横滚LINK_HIP_ROLL_LJ01_HIP_ROLL_L-0.2618 ~ 1.7444
3左髋偏航LINK_HIP_YAW_LJ02_HIP_YAW_L-1.4137 ~ 3.8921
4左膝俯仰LINK_KNEE_PITCH_LJ03_KNEE_PITCH_L-0.261667 ~ 2.355
5左踝俯仰LINK_ANKLE_PITCH_LJ04_ANKLE_PITCH_L-0.68068 ~ 0.68068
6左踝横滚LINK_ANKLE_ROLL_LJ05_ANKLE_ROLL_L-0.3491 ~ 0.1745
7右髋俯仰LINK_HIP_PITCH_RJ06_HIP_PITCH_R-2.879 ~ 2.181
8右髋横滚LINK_HIP_ROLL_RJ07_HIP_ROLL_R-1.7444 ~ 0.2618
9右髋偏航LINK_HIP_YAW_RJ08_HIP_YAW_R-3.8921 ~ 1.4137
10右膝俯仰LINK_KNEE_PITCH_RJ09_KNEE_PITCH_R-0.261667 ~ 2.355
11右踝俯仰LINK_ANKLE_PITCH_RJ10_ANKLE_PITCH_R-0.68068 ~ 0.68068
12右踝横滚LINK_ANKLE_ROLL_RJ11_ANKLE_ROLL_R-0.1745 ~ 0.3491
13腰偏航LINK_TORSO_YAWJ12_TORSO_YAW-2.81 ~ 2.81
14左肩俯仰LINK_SHOULDER_PITCH_LJ13_SHOULDER_PITCH_L-3.229 ~ 2.443
15左肩横滚LINK_SHOULDER_ROLL_LJ14_SHOULDER_ROLL_L-0.436 ~ 2.487
16左肩偏航LINK_SHOULDER_YAW_LJ15_SHOULDER_YAW_L-2.618 ~ 2.618
17左肘俯仰LINK_ELBOW_PITCH_LJ16_ELBOW_PITCH_L-2.295 ~ 0.288
18左肘偏航LINK_ELBOW_YAW_LJ17_ELBOW_YAW_L-2.618 ~ 2.618
19右肩俯仰LINK_SHOULDER_PITCH_RJ18_SHOULDER_PITCH_R-3.229 ~ 2.443
20右肩横滚LINK_SHOULDER_ROLL_RJ19_SHOULDER_ROLL_R-2.487 ~ 0.436
21右肩偏航LINK_SHOULDER_YAW_RJ20_SHOULDER_YAW_R-2.618 ~ 2.618
22右肘俯仰LINK_ELBOW_PITCH_RJ21_ELBOW_PITCH_R-2.295 ~ 0.288
23右肘偏航LINK_ELBOW_YAW_RJ22_ELBOW_YAW_R-2.618 ~ 2.618
24头俯仰LINK_HEAD_PITCHJ23_HEAD_PITCH-0.523 ~ 0.523
25头偏航LINK_HEAD_YAWJ24_HEAD_YAW-1.222 ~ 1.222

T800 Pro(43 自由度,含灵巧手)关节索引

序号部位连杆命名关节命名运动范围 (rad)
1左髋俯仰LINK_HIP_PITCH_LJ00_HIP_PITCH_L-2.88 ~ 2.181
2左髋横滚LINK_HIP_ROLL_LJ01_HIP_ROLL_L-0.2618 ~ 1.7444
3左髋偏航LINK_HIP_YAW_LJ02_HIP_YAW_L-1.4137 ~ 3.8921
4左膝俯仰LINK_KNEE_PITCH_LJ03_KNEE_PITCH_L-0.261667 ~ 2.355
5左踝俯仰LINK_ANKLE_PITCH_LJ04_ANKLE_PITCH_L-0.68068 ~ 0.68068
6左踝横滚LINK_ANKLE_ROLL_LJ05_ANKLE_ROLL_L-0.3491 ~ 0.1745
7右髋俯仰LINK_HIP_PITCH_RJ06_HIP_PITCH_R-2.879 ~ 2.181
8右髋横滚LINK_HIP_ROLL_RJ07_HIP_ROLL_R-1.7444 ~ 0.2618
9右髋偏航LINK_HIP_YAW_RJ08_HIP_YAW_R-3.8921 ~ 1.4137
10右膝俯仰LINK_KNEE_PITCH_RJ09_KNEE_PITCH_R-0.261667 ~ 2.355
11右踝俯仰LINK_ANKLE_PITCH_RJ10_ANKLE_PITCH_R-0.68068 ~ 0.68068
12右踝横滚LINK_ANKLE_ROLL_RJ11_ANKLE_ROLL_R-0.1745 ~ 0.3491
23腰偏航LINK_TORSO_YAWJ12_TORSO_YAW-2.81 ~ 2.81
26左肩俯仰LINK_SHOULDER_PITCH_LJ13_SHOULDER_PITCH_L-3.229 ~ 2.443
27左肩横滚LINK_SHOULDER_ROLL_LJ14_SHOULDER_ROLL_L-0.436 ~ 2.487
28左肩偏航LINK_SHOULDER_YAW_LJ15_SHOULDER_YAW_L-2.618 ~ 2.618
29左肘俯仰LINK_ELBOW_PITCH_LJ16_ELBOW_PITCH_L-2.295 ~ 0.288
30左肘偏航LINK_ELBOW_YAW_LJ17_ELBOW_YAW_L-2.618 ~ 2.618
31左手腕俯仰LINK_WRIST_PITCH_LJ18_WRIST_PITCH_L-0.436 ~ 0.436
32左手腕横滚LINK_WRIST_ROLL_LJ19_WRIST_ROLL_L-1.047 ~ 0.611
34左手拇指根关节LINK_THUMB_BASE_LJ20_THUMB_BASE_L-2.007 ~ 0
35左手拇指中节LINK_THUMB_MID_LJ21_THUMB_MID_L0 ~ 1.5708
36左手拇指指尖LINK_THUMB_TIP_LJ22_THUMB_TIP_L0 ~ 1.5708
37左手食指根关节LINK_INDEX_BASE_LJ23_INDEX_BASE_L-1.6929 ~ 0
38左手食指指尖LINK_INDEX_TIP_LJ24_INDEX_TIP_L-1.85 ~ 0
39左手中指根关节LINK_MIDDLE_BASE_LJ25_MIDDLE_BASE_L-1.6929 ~ 0
40左手中指指尖LINK_MIDDLE_TIP_LJ26_MIDDLE_TIP_L-1.85 ~ 0
41右肩俯仰LINK_SHOULDER_PITCH_RJ27_SHOULDER_PITCH_R-3.229 ~ 2.443
42右肩横滚LINK_SHOULDER_ROLL_RJ28_SHOULDER_ROLL_R-2.487 ~ 0.436
43右肩偏航LINK_SHOULDER_YAW_RJ29_SHOULDER_YAW_R-2.618 ~ 2.618
44右肘俯仰LINK_ELBOW_PITCH_RJ30_ELBOW_PITCH_R-2.295 ~ 0.288
45右肘偏航LINK_ELBOW_YAW_RJ31_ELBOW_YAW_R-2.618 ~ 2.618
46右手腕俯仰LINK_WRIST_PITCH_RJ32_WRIST_PITCH_R-0.436 ~ 0.436
47右手腕横滚LINK_WRIST_ROLL_RJ33_WRIST_ROLL_R-0.611 ~ 1.047
49右手拇指根关节LINK_THUMB_BASE_RJ34_THUMB_BASE_R0 ~ 2.007
50右手拇指中节LINK_THUMB_MID_RJ35_THUMB_MID_R0 ~ 1.5708
51右手拇指指尖LINK_THUMB_TIP_RJ36_THUMB_TIP_R0 ~ 1.5708
52右手食指根关节LINK_INDEX_BASE_RJ37_INDEX_BASE_R0 ~ 1.6929
53右手食指指尖LINK_INDEX_TIP_RJ38_INDEX_TIP_R0 ~ 1.85
54右手中指根关节LINK_MIDDLE_BASE_RJ39_MIDDLE_BASE_R0 ~ 1.6929
55右手中指指尖LINK_MIDDLE_TIP_RJ40_MIDDLE_TIP_R0 ~ 1.85
56头俯仰LINK_HEAD_PITCHJ41_HEAD_PITCH-0.523 ~ 0.523
58头偏航LINK_HEAD_YAWJ42_HEAD_YAW-1.222 ~ 1.222