7.1 运动控制部分
7.1 运动控制部分
7.1.1 整体介绍
A2 青春款机器人出厂预搭载了运动控制程序,用户只需发送高层线速度和角速度指令即可直接控制机器人行走,无需开发行走等功能的底层控制模型,同时上肢、脖子等关节接口开放了直通 HAL 层的硬件接口。
默认情况下不开放下肢关节电机的底层控制接口,仅能通过高层速度指令进行整体控制,如需自行开发运动控制算法替换智元出厂自带算法,请联系商务或客户项目经理获取运控开发部署指南。
智元运控程序内部设计了状态机,在不同状态下会切换不同的模型,同时开放不同的上肢控制接口等。状态机如下图所示:

对于各个状态说明如下:
| Action 类型 | Action 代码 | 中文名称 | 详细说明 | 可调用接口 |
|---|---|---|---|---|
| 安全 Action | DEFAULT | 默认模式 | 运控启动之后的默认 action | |
| 位控 Action | RL_JOINT_DEFAULT | 强化位控站立模式 | 上机器人强化位控站立,直腿站立 | |
| 位控 Action | PASSIVE_UPPER_BODY_JOINT_SERVO | 下肢被动上肢伺服模式 | 下肢不使能,手臂可以接收外部关节伺服指令 | T2 |
| 位控 Action | SIT_DOWN | 位控坐下模式 | 下肢动作,上肢保持不动,配合椅子实现坐下 | |
| 位控 Action | STAND_UP | 位控站起模式 | 下肢动作,上肢保持不动,配合椅子实现站起 | |
| 力控 Action | RL_LOCOMOTION_DEFAULT | 强化行走模式 | 强化学习训练的拟人行走模式,走路时手臂会摆动 | T1 |
| 力控 Action | RL_LOCOMOTION_ARM_EXT_JOINT_SERVO | 强化行走上肢伺服模式 | 下肢拟人行走或站立,上肢接受外部关节伺服指令,行走或站立时做动作(使用全身控制的强化模型,更具有稳定性) | T1、T2 |
| 力控 Action | RL_WHOLE_BODY_EXT_JOINT_SERVO | 全身动作上肢伺服模式 | 与 RL_LOCOMOTION_ARM_EXT_JOINT_SERVO 类似,额外可控制腰部动作,A2 机器人腰部无实际自由度,腰部动作是通过腿部电机配合实现 | T1、T2、T3 |
| 力控 Action | RL_WHOLE_BODY_DANCE | 全身舞蹈模式 | 可运行指定的全身舞蹈动作 | S1 |
一般情况下不推荐使用程序进行力控之外的切换,仅推荐程序在各个力控状态下切换,其余切换因涉及机器人吊起放下等操作仅可手动操作。
7.1.2 状态机切换、查询 RPC 接口
| 接口名 | pb:/aimdk.protocol.McActionService/SetAction |
|---|---|
| 功能概述 | 切换运动控制状态机 |
| 接口类型 | HTTP JSON RPC |
| URL | http://127.0.0.1:56322/rpc/aimdk.protocol.McActionService/SetAction |
| 入参 | text
|
| 出参 | text
|
| 示例脚本 | examples/motion_control/SetAction.py |
| 备注 |
|
| 接口名 | pb:/aimdk.protocol.McActionService/GetAction |
|---|---|
| 功能概述 | 查询运动控制状态机 |
| 接口类型 | HTTP JSON RPC |
| URL | http://127.0.0.1:56322/rpc/aimdk.protocol.McActionService/GetAction |
| 入参 | text |
| 出参 | text
|
| 示例脚本 | example/mc/actions.py |
| 备注 |
|
一般上述两个接口会配合使用,如下代码示例
python
def ensure_action(action_name: str, retries=3, retry_interval=1.0, mc_ip: str = "127.0.0.1"):
try:
for i in range(retries):
if get_action(mc_ip) == action_name:
return True
set_action(action_name, mc_ip)
time.sleep(0.1 if i == 0 else retry_interval)
except Exception as e:
print(f"Failed to set action: {e}")
return False
return False
7.1.3 行走控制指令 Topic 接口
| 接口名 | /motion/control/locomotion_velocity |
|---|---|
| 功能概述 | 行走控制指令 |
| 接口类型 | ROS2 Topic |
| 入参 | text
|
| 示例脚本 | examples/motion_control/walk.py |
| 备注 |
|
7.1.4 腰部控制指令 Topic 接口
| 接口名 | /motion/control/move_waist |
|---|---|
| 功能概述 | 腰部控制指令 |
| 接口类型 | ROS2 Topic |
| 入参 | text
|
| 示例脚本 | examples/motion_control/move_waist.py |
| 备注 |
|
7.1.5 脖子控制指令、状态 Topic 接口
| 接口名 | /motion/control/neck_joint_command |
|---|---|
| 功能概述 | 脖子控制指令 |
| 接口类型 | ROS2 Topic |
| 入参 | sensor_msgs::msg::JointState
|
| 示例脚本 | examples/motion_control/neck.py |
| 备注 |
|
| 接口名 | /motion/control/neck_joint_state |
|---|---|
| 功能概述 | 脖子状态话题 |
| 接口类型 | ROS2 Topic |
| 出参 | sensor_msgs::msg::JointState
|
| 示例脚本 | examples/motion_control/joint_state.py |
| 备注 |
|
7.1.6 脖子控制指令、状态 RPC 接口
上述脖子控制话题接口适用于需要持续精确控制脖子角度,例如遥操作等场景,且仅可在 JOINT_SERVO 模式下调用,某些场景下仅需简单控制到特定角度,可以使用如下 RPC 接口
| 接口名 | pb:/aimdk.protocol.McMotionService/SetNeckCommand |
|---|---|
| 功能概述 | 设置脖子命令 |
| 接口类型 | HTTP JSON RPC |
| URL | http://127.0.0.1:56322/rpc/aimdk.protocol.McMotionService/SetNeckCommand |
| 入参 | text
|
| 出参 | text
|
| 示例脚本 | examples/motion_control/SetNeckCommand.py |
| 备注 |
|
| 接口名 | pb:/aimdk.protocol.McMotionService/GetNeckState |
|---|---|
| 功能概述 | 获取脖子状态 |
| 接口类型 | HTTP JSON RPC |
| URL | http://127.0.0.1:56322/rpc/aimdk.protocol.McMotionService/GetNeckState |
| 入参 | text |
| 出参 | text
|
| 示例脚本 | examples/motion_control/GetNeckState.py |
| 备注 | 本接口无 Action 限制 |
7.1.7 手臂控制指令、状态 Topic 接口
| 接口名 | /motion/control/arm_joint_command |
|---|---|
| 功能概述 | 手臂关节控制指令 |
| 接口类型 | ROS2 Topic |
| 入参 | sensor_msgs::msg::JointState
|
| 示例脚本 | examples/motion_control/arm.py |
| 备注 |
|
| 接口名 | /motion/control/arm_joint_state |
|---|---|
| 功能概述 | 手臂关节状态话题 |
| 接口类型 | ROS2 Topic |
| 出参 | sensor_msgs::msg::JointState
|
| 示例脚本 | examples/motion_control/joint_state.py |
| 备注 | 本接口无 Action 限制 |
7.1.8 上下肢关节状态 RPC 接口
| 接口名 | pb:/aimdk.protocol.McDataService/GetJointState |
|---|---|
| 功能概述 | 获取上下肢关节状态 |
| 接口类型 | HTTP JSON RPC |
| URL | http://127.0.0.1:56322/rpc/aimdk.protocol.McMotionService/GetJointState |
| 入参 | text |
| 出参 | text
|
| 示例脚本 | examples/motion_control/GetJointState.py |
| 备注 | 本接口无 Action 限制 |
7.1.9 全身舞蹈列表获取 RPC 接口
| 接口名 | pb:/aimdk.protocol.McMotionService/GetDanceTypeList |
|---|---|
| 功能概述 | 获取支持的全身舞蹈列表 |
| 接口类型 | HTTP JSON RPC |
| URL | http://127.0.0.1:56322/rpc/aimdk.protocol.McMotionService/GetDanceTypeList |
| 入参 | text |
| 出参 | text
|
| 示例脚本 | examples/motion_control/GetDanceTypeList.py |
| 备注 |
|
7.1.10 全身舞蹈播放 RPC 接口
| 接口名 | pb:/aimdk.protocol.McMotionService/SelectDanceType |
|---|---|
| 功能概述 | 全身舞蹈播放 |
| 接口类型 | HTTP JSON RPC |
| URL | http://127.0.0.1:56322/rpc/aimdk.protocol.McMotionService/SelectDanceType |
| 入参 | text
|
| 出参 | text
|
| 示例脚本 | examples/motion_control/SelectDanceType.py |
| 备注 |
|