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 |
ROS2 通信配置:
必须正确配置以下环境变量,否则无法与机器人通信:
Bash |
可通过以下脚本一键写入 ~/.bashrc:
Bash |
2.3 访问机器人
克隆仓库:环境准备好后,可直接 clone ROS2 仓库并进入工作空间:
Bash |
硬件连接:通过机器人背后的网口连接机器人,即可通过 ROS2 多机和机器人通信。
手柄遥控提示:PM01 机身有两个 USB 插槽,手柄的 USB 接收器需插入下方接口才能正常遥控,插上方接口无效。
SSH 登录信息:机器人内置了两款计算单元,用户可通过 SSH 登录访问:
| 计算单元 | IP 地址 | 用户名 | 密码 |
|---|---|---|---|
| 应用计算单元 | 192.168.0.162 | ubuntu | ubuntu |
| 运控计算单元 | 192.168.0.163 | user | 1 |
开发前确认事项:
- ROS2 Humble 环境可用,
ros2 topic list能正常列出系统话题 - engineai_ros2_workspace 已编译,
interface_protocol和interface_example包可被找到 - 机器人硬件接口节点已启动(可通过
ros2 topic echo /hardware/joint_state验证)
2.4 构建与部署
安装第三方依赖:在编译节点或仿真环境前,请先运行仓库提供的第三方依赖安装脚本,否则部分消息包/示例可能缺少依赖。
Bash |
编译 workspace(来自 ROS2 仓库):
Bash |
同步代码到机器人 Orin 主板:
Bash |
同步后 SSH 登录 Orin 主板,进入 workspace 目录编译即可使用,用法与主机一致。
2.5 仿真器(无需实体机器人,建议先在仿真验证后再上真机)
ROS2 仓库提供了 MuJoCo 仿真器,可以在没有实体机器人的情况下调试关节桥接模式:
Bash |
仿真器启动后,按手柄 [BACK, A] 进入关节透传(joint_bridge)模式,再运行示例程序。
使用仿真器时,不要连接实体机器人,或将 ROS_LOCALHOST_ONLY=1 设置为仅本地通信,防止误连实体机器人。
1.3 消息文件位置
所有自定义 ROS2 消息定义位于 interface_protocol 包中,目录结构如下:
PLAIN |
核心消息定义源码(点击文件名可跳转 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_command | JointCommand.msg | 客户端 → 关节控制器 |
| 关节状态 | /hardware/joint_state | JointState.msg | 关节控制器 → 客户端 |
| 运动状态 | /motion/motion_state | MotionState.msg | 运动管理服务 → 客户端 |
| 运动状态切换 | /motion/set_motion_state | MotionStateRequest.msg | 客户端 → 运动管理服务 |
| LED 控制 | /hardware/led_control | LedControl.msg | 客户端 → 灯光控制服务 |
| 关节运动规划-请求 | /motion/joint_motion_plan/request | JointMotionPlanRequest.msg | 客户端 → 规划器 |
| 关节运动规划-状态 | /motion/joint_motion_plan/state | JointMotionPlanState.msg | 规划器 → 客户端 |
| 关节覆盖控制 | /motion/joint_override_command | JointOverrideCommand.msg | 客户端 → 规划器 |
| 机体速度控制 | /motion/body_vel_cmd | BodyVelCmd.msg | 客户端 → 行走服务 |
| 手柄按键 | /hardware/gamepad_keys | GamepadKeys.msg | 传感器 → 客户端 |
| IMU 数据 | /hardware/imu_info | ImuInfo.msg | 传感器 → 客户端 |
| 电源/电池数据 | /hardware/power_info | PowerInfo.msg | 传感器 → 客户端 |
| 电机调试数据 | /hardware/motor_debug | MotorDebug.msg | 传感器 → 客户端 |
1.6 QoS 配置参考
不同接口的 QoS 配置要求不同,配置不匹配会导致消息接收失败。下表汇总了各接口的 QoS 要求,信息来自 GitHub 示例脚本中的 QoSProfile 定义:
| Topic | 发布/订阅 | Reliability | Durability |
|---|---|---|---|
/motion/set_motion_state | 发布 | RELIABLE | VOLATILE |
/motion/motion_state | 订阅 | BEST_EFFORT | VOLATILE |
/hardware/joint_command | 发布 | BEST_EFFORT | VOLATILE |
/hardware/joint_state | 订阅 | BEST_EFFORT | VOLATILE |
运动状态切换的发布者必须使用 RELIABLE,而订阅运动状态使用 BEST_EFFORT。如果 QoS 不匹配,消息将无法接收。
1.7 机型规格对比
下表对比了三款机型的关键规格差异,信息来自飞书 wiki「关于PM01」「关于T800(开发版)」「关于T800(Pro版)」页面:
| 规格 | PM01 | T800 开发版 | T800 Pro |
|---|---|---|---|
| 总自由度 | 24 | 25 | 43(含灵巧手) |
| 单腿自由度 | 6 | 6 | 6 |
| 腰部自由度 | 1 | 1 | 1 |
| 单手臂自由度 | 5 | 5 | 7(含手腕) |
| 灵巧手 | 无 | 无 | 有(每手 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 NX | Jetson Orin NX |
| 运控计算单元 | Nezha N97 | Nezha N97 | Nezha 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) |
|---|---|---|---|---|---|
| 0 | J00_HIP_PITCH_L | 左髋俯仰 | Q90H | -3.141 | 2.443 |
| 1 | J01_HIP_ROLL_L | 左髋横滚 | Q90H | -0.436 | 2.094 |
| 2 | J02_HIP_YAW_L | 左髋偏航 | Q25H-L | -1.57 | 4.014 |
| 3 | J03_KNEE_PITCH_L | 左膝俯仰 | Q90H | -0.2618 | 2.3562 |
| 4 | J04_ANKLE_PITCH_L | 左踝俯仰 | Q25H | -0.6807 | 0.7243 |
| 5 | J05_ANKLE_ROLL_L | 左踝横滚 | Q25H | -0.2618 | 0.2618 |
| 6 | J06_HIP_PITCH_R | 右髋俯仰 | Q90H | -3.141 | 2.443 |
| 7 | J07_HIP_ROLL_R | 右髋横滚 | Q90H | -2.094 | 0.436 |
| 8 | J08_HIP_YAW_R | 右髋偏航 | Q25H-L | -4.014 | 1.57 |
| 9 | J09_KNEE_PITCH_R | 右膝俯仰 | Q90H | -0.2618 | 2.3562 |
| 10 | J10_ANKLE_PITCH_R | 右踝俯仰 | Q25H | -0.6807 | 0.7243 |
| 11 | J11_ANKLE_ROLL_R | 右踝横滚 | Q25H | -0.2618 | 0.2618 |
| 12 | J12_WAIST_YAW | 腰偏航 | Q25H-L | -4.014 | 1.57 |
| 13 | J13_SHOULDER_PITCH_L | 左肩俯仰 | Q25H | -2.9671 | 2.7925 |
| 14 | J14_SHOULDER_ROLL_L | 左肩横滚 | Q25H | -0.6108 | 2.3562 |
| 15 | J15_SHOULDER_YAW_L | 左肩偏航 | Q25H | -2.618 | 2.618 |
| 16 | J16_ELBOW_PITCH_L | 左肘俯仰 | Q25H | -2.1948 | 0.7374 |
| 17 | J17_ELBOW_YAW_L | 左肘偏航 | Q25H | -2.618 | 2.618 |
| 18 | J18_SHOULDER_PITCH_R | 右肩俯仰 | Q25H | -2.9671 | 2.7925 |
| 19 | J19_SHOULDER_ROLL_R | 右肩横滚 | Q25H | -2.3562 | 0.6108 |
| 20 | J20_SHOULDER_YAW_R | 右肩偏航 | Q25H | -2.618 | 2.618 |
| 21 | J21_ELBOW_PITCH_R | 右肘俯仰 | Q25H | -2.1948 | 0.7374 |
| 22 | J22_ELBOW_YAW_R | 右肘偏航 | Q25H | -2.618 | 2.618 |
| 23 | J23_HEAD_YAW | 头偏航 | Q25H | -0.6109 | 0.6109 |
T800 开发版(25 自由度)关节索引
| 序号 | 部位 | 连杆命名 | 关节命名 | 运动范围 (rad) |
|---|---|---|---|---|
| 1 | 左髋俯仰 | LINK_HIP_PITCH_L | J00_HIP_PITCH_L | -2.88 ~ 2.181 |
| 2 | 左髋横滚 | LINK_HIP_ROLL_L | J01_HIP_ROLL_L | -0.2618 ~ 1.7444 |
| 3 | 左髋偏航 | LINK_HIP_YAW_L | J02_HIP_YAW_L | -1.4137 ~ 3.8921 |
| 4 | 左膝俯仰 | LINK_KNEE_PITCH_L | J03_KNEE_PITCH_L | -0.261667 ~ 2.355 |
| 5 | 左踝俯仰 | LINK_ANKLE_PITCH_L | J04_ANKLE_PITCH_L | -0.68068 ~ 0.68068 |
| 6 | 左踝横滚 | LINK_ANKLE_ROLL_L | J05_ANKLE_ROLL_L | -0.3491 ~ 0.1745 |
| 7 | 右髋俯仰 | LINK_HIP_PITCH_R | J06_HIP_PITCH_R | -2.879 ~ 2.181 |
| 8 | 右髋横滚 | LINK_HIP_ROLL_R | J07_HIP_ROLL_R | -1.7444 ~ 0.2618 |
| 9 | 右髋偏航 | LINK_HIP_YAW_R | J08_HIP_YAW_R | -3.8921 ~ 1.4137 |
| 10 | 右膝俯仰 | LINK_KNEE_PITCH_R | J09_KNEE_PITCH_R | -0.261667 ~ 2.355 |
| 11 | 右踝俯仰 | LINK_ANKLE_PITCH_R | J10_ANKLE_PITCH_R | -0.68068 ~ 0.68068 |
| 12 | 右踝横滚 | LINK_ANKLE_ROLL_R | J11_ANKLE_ROLL_R | -0.1745 ~ 0.3491 |
| 13 | 腰偏航 | LINK_TORSO_YAW | J12_TORSO_YAW | -2.81 ~ 2.81 |
| 14 | 左肩俯仰 | LINK_SHOULDER_PITCH_L | J13_SHOULDER_PITCH_L | -3.229 ~ 2.443 |
| 15 | 左肩横滚 | LINK_SHOULDER_ROLL_L | J14_SHOULDER_ROLL_L | -0.436 ~ 2.487 |
| 16 | 左肩偏航 | LINK_SHOULDER_YAW_L | J15_SHOULDER_YAW_L | -2.618 ~ 2.618 |
| 17 | 左肘俯仰 | LINK_ELBOW_PITCH_L | J16_ELBOW_PITCH_L | -2.295 ~ 0.288 |
| 18 | 左肘偏航 | LINK_ELBOW_YAW_L | J17_ELBOW_YAW_L | -2.618 ~ 2.618 |
| 19 | 右肩俯仰 | LINK_SHOULDER_PITCH_R | J18_SHOULDER_PITCH_R | -3.229 ~ 2.443 |
| 20 | 右肩横滚 | LINK_SHOULDER_ROLL_R | J19_SHOULDER_ROLL_R | -2.487 ~ 0.436 |
| 21 | 右肩偏航 | LINK_SHOULDER_YAW_R | J20_SHOULDER_YAW_R | -2.618 ~ 2.618 |
| 22 | 右肘俯仰 | LINK_ELBOW_PITCH_R | J21_ELBOW_PITCH_R | -2.295 ~ 0.288 |
| 23 | 右肘偏航 | LINK_ELBOW_YAW_R | J22_ELBOW_YAW_R | -2.618 ~ 2.618 |
| 24 | 头俯仰 | LINK_HEAD_PITCH | J23_HEAD_PITCH | -0.523 ~ 0.523 |
| 25 | 头偏航 | LINK_HEAD_YAW | J24_HEAD_YAW | -1.222 ~ 1.222 |
T800 Pro(43 自由度,含灵巧手)关节索引
| 序号 | 部位 | 连杆命名 | 关节命名 | 运动范围 (rad) |
|---|---|---|---|---|
| 1 | 左髋俯仰 | LINK_HIP_PITCH_L | J00_HIP_PITCH_L | -2.88 ~ 2.181 |
| 2 | 左髋横滚 | LINK_HIP_ROLL_L | J01_HIP_ROLL_L | -0.2618 ~ 1.7444 |
| 3 | 左髋偏航 | LINK_HIP_YAW_L | J02_HIP_YAW_L | -1.4137 ~ 3.8921 |
| 4 | 左膝俯仰 | LINK_KNEE_PITCH_L | J03_KNEE_PITCH_L | -0.261667 ~ 2.355 |
| 5 | 左踝俯仰 | LINK_ANKLE_PITCH_L | J04_ANKLE_PITCH_L | -0.68068 ~ 0.68068 |
| 6 | 左踝横滚 | LINK_ANKLE_ROLL_L | J05_ANKLE_ROLL_L | -0.3491 ~ 0.1745 |
| 7 | 右髋俯仰 | LINK_HIP_PITCH_R | J06_HIP_PITCH_R | -2.879 ~ 2.181 |
| 8 | 右髋横滚 | LINK_HIP_ROLL_R | J07_HIP_ROLL_R | -1.7444 ~ 0.2618 |
| 9 | 右髋偏航 | LINK_HIP_YAW_R | J08_HIP_YAW_R | -3.8921 ~ 1.4137 |
| 10 | 右膝俯仰 | LINK_KNEE_PITCH_R | J09_KNEE_PITCH_R | -0.261667 ~ 2.355 |
| 11 | 右踝俯仰 | LINK_ANKLE_PITCH_R | J10_ANKLE_PITCH_R | -0.68068 ~ 0.68068 |
| 12 | 右踝横滚 | LINK_ANKLE_ROLL_R | J11_ANKLE_ROLL_R | -0.1745 ~ 0.3491 |
| 23 | 腰偏航 | LINK_TORSO_YAW | J12_TORSO_YAW | -2.81 ~ 2.81 |
| 26 | 左肩俯仰 | LINK_SHOULDER_PITCH_L | J13_SHOULDER_PITCH_L | -3.229 ~ 2.443 |
| 27 | 左肩横滚 | LINK_SHOULDER_ROLL_L | J14_SHOULDER_ROLL_L | -0.436 ~ 2.487 |
| 28 | 左肩偏航 | LINK_SHOULDER_YAW_L | J15_SHOULDER_YAW_L | -2.618 ~ 2.618 |
| 29 | 左肘俯仰 | LINK_ELBOW_PITCH_L | J16_ELBOW_PITCH_L | -2.295 ~ 0.288 |
| 30 | 左肘偏航 | LINK_ELBOW_YAW_L | J17_ELBOW_YAW_L | -2.618 ~ 2.618 |
| 31 | 左手腕俯仰 | LINK_WRIST_PITCH_L | J18_WRIST_PITCH_L | -0.436 ~ 0.436 |
| 32 | 左手腕横滚 | LINK_WRIST_ROLL_L | J19_WRIST_ROLL_L | -1.047 ~ 0.611 |
| 34 | 左手拇指根关节 | LINK_THUMB_BASE_L | J20_THUMB_BASE_L | -2.007 ~ 0 |
| 35 | 左手拇指中节 | LINK_THUMB_MID_L | J21_THUMB_MID_L | 0 ~ 1.5708 |
| 36 | 左手拇指指尖 | LINK_THUMB_TIP_L | J22_THUMB_TIP_L | 0 ~ 1.5708 |
| 37 | 左手食指根关节 | LINK_INDEX_BASE_L | J23_INDEX_BASE_L | -1.6929 ~ 0 |
| 38 | 左手食指指尖 | LINK_INDEX_TIP_L | J24_INDEX_TIP_L | -1.85 ~ 0 |
| 39 | 左手中指根关节 | LINK_MIDDLE_BASE_L | J25_MIDDLE_BASE_L | -1.6929 ~ 0 |
| 40 | 左手中指指尖 | LINK_MIDDLE_TIP_L | J26_MIDDLE_TIP_L | -1.85 ~ 0 |
| 41 | 右肩俯仰 | LINK_SHOULDER_PITCH_R | J27_SHOULDER_PITCH_R | -3.229 ~ 2.443 |
| 42 | 右肩横滚 | LINK_SHOULDER_ROLL_R | J28_SHOULDER_ROLL_R | -2.487 ~ 0.436 |
| 43 | 右肩偏航 | LINK_SHOULDER_YAW_R | J29_SHOULDER_YAW_R | -2.618 ~ 2.618 |
| 44 | 右肘俯仰 | LINK_ELBOW_PITCH_R | J30_ELBOW_PITCH_R | -2.295 ~ 0.288 |
| 45 | 右肘偏航 | LINK_ELBOW_YAW_R | J31_ELBOW_YAW_R | -2.618 ~ 2.618 |
| 46 | 右手腕俯仰 | LINK_WRIST_PITCH_R | J32_WRIST_PITCH_R | -0.436 ~ 0.436 |
| 47 | 右手腕横滚 | LINK_WRIST_ROLL_R | J33_WRIST_ROLL_R | -0.611 ~ 1.047 |
| 49 | 右手拇指根关节 | LINK_THUMB_BASE_R | J34_THUMB_BASE_R | 0 ~ 2.007 |
| 50 | 右手拇指中节 | LINK_THUMB_MID_R | J35_THUMB_MID_R | 0 ~ 1.5708 |
| 51 | 右手拇指指尖 | LINK_THUMB_TIP_R | J36_THUMB_TIP_R | 0 ~ 1.5708 |
| 52 | 右手食指根关节 | LINK_INDEX_BASE_R | J37_INDEX_BASE_R | 0 ~ 1.6929 |
| 53 | 右手食指指尖 | LINK_INDEX_TIP_R | J38_INDEX_TIP_R | 0 ~ 1.85 |
| 54 | 右手中指根关节 | LINK_MIDDLE_BASE_R | J39_MIDDLE_BASE_R | 0 ~ 1.6929 |
| 55 | 右手中指指尖 | LINK_MIDDLE_TIP_R | J40_MIDDLE_TIP_R | 0 ~ 1.85 |
| 56 | 头俯仰 | LINK_HEAD_PITCH | J41_HEAD_PITCH | -0.523 ~ 0.523 |
| 58 | 头偏航 | LINK_HEAD_YAW | J42_HEAD_YAW | -1.222 ~ 1.222 |
