跳转到内容

运动控制模块

本文档包含了运动控制模块(Motion Control, MC)包含的话题和服务的相关文档协议,以支持系统的运动控制功能。

本模块位于 x86 开发板上,http 后端监听的端口为 56322。

序号动作名称功能详细说明类型可调用接口
0DEFAULT默认模式运控启动之后的默认action
1GO_HOME_A2W复位到home模式
2PLANNING_MOVEmc规划执行模式
3ARM_PANEL_CONTROLA2W全身关节控制模式通过手动点按、长按控制关节运动和法兰末端笛卡尔控制运动
4STOP安全停止模式
接口调用码话题名话题描述订阅 or 发布消息类型备注通信后端
T2/body_drive/arm_joint_command手臂控制指令发布joint_msg_interface::msg::JointCommand需要传入 14 个关节角度值,前7个为左手,后7个为右手iceoryx
T3/body_drive/lift_joint_command腰部升降控制指令发布joint_msg_interface::msg::JointCommand腰部升降控制指令,位置控制iceoryx
T4/body_drive/waist_joint_command腰部俯仰控制指令发布joint_msg_interface::msg::JointCommand腰部俯仰控制指令,位置控制iceoryx
T*/body_drive/neck_joint_command头部控制指令发布joint_msg_interface::msg::JointCommand头部控制指令,位置控制iceoryx
T*/body_drive/claw_joint_command手爪控制指令发布aimdk::protocol::HandCommandChannel手爪控制指令, 主要为透传iceoryx
T*/body_drive/arm_joint_state手臂关节状态订阅joint_msg_interface::msg::JointStateposition、velocity字段为有效值;
发布频率为 125 hz
iceoryx
T*/body_drive/lift_joint_state腰部升降关节状态订阅joint_msg_interface::msg::JointStateposition、velocity字段为有效值;iceoryx
T*/body_drive/waist_joint_state腰部俯仰关节状态订阅joint_msg_interface::msg::JointStateposition、velocity字段为有效值;iceoryx
T*/body_drive/claw_joint_state手爪关节状态订阅aimdk::protocol::HandStateChannel手爪关节状态,position、velocity、effort 字段为有效值;iceoryx
T*/body_drive/arm_pose_stateJaka手臂6维力传感器状态订阅joint_msg_interface::msg::PoseStatesJaka手臂6维力传感器状态,包含左右臂法兰末端6维力传感器数据ros2

上肢关节控制的关节限位以及动态范围限制:

关节索引关节名称最小角度(rad)最大角度(rad)最大速度绝对值(rad/s)最大加速度绝对值(rad/s²)
idx09升降关节-0.2650.2650.110.50
idx10腰关节0.0532.331.351.396
idx11头关节-1.111.113.1440.00
idx12左臂 J1-6.266.261.576.97
idx13左臂 J2-2.072.071.576.97
idx14左臂 J3-6.266.262.096.97
idx15左臂 J4-2.511.022.096.97
idx16左臂 J5-6.266.262.626.97
idx17左臂 J6-1.771.772.626.97
idx18左臂 J7-6.266.262.616.97
idx19右臂 J1-6.266.261.576.97
idx20右臂 J2-2.072.071.576.97
idx21右臂 J3-6.266.262.096.97
idx22右臂 J4-2.511.022.096.97
idx23右臂 J5-6.266.262.626.97
idx24右臂 J6-1.771.772.626.97
idx25右臂 J7-6.266.262.626.97

考虑目前软件日志以及网络资源占用问题,所有 RPC 服务接口建议以 1Hz 及以下的频率调用。

SetAction/GetAction 操作规范:

  • SetAction 接口为异步接口,调用后会立即返回,返回成功不代表 Action 切换完成,需要通过 GetAction 接口轮询确认 Action 切换完成后,方可进行下一步操作
  • GetAction 轮询间隔建议设置为1秒(避免高频RPC调用),如认为 1s 延迟过大,可设置为 500ms,更小间隔不推荐
接口调用码接口名接口描述请求消息类型答复消息类型备注通信后端
S*pb:/aimdk.protocol.McActionService/SetAction设置Actionaimdk::protocol::McActionRequestaimdk::protocol::CommonResponsehttp
S*pb:/aimdk.protocol.McActionService/GetAction 获取Actionaimdk::protocol::CommonRequestaimdk::protocol::McActionResponsehttp
S*pb:/aimdk.protocol.McActionService/GetAvailableActions获取可用Action列表aimdk::protocol::CommonRequestaimdk::protocol::AvailableActionsResponsehttp
S*pb:/aimdk.protocol.McActionService/GetAvailableCommands获取Action切换命令aimdk::protocol::CommonRequestaimdk::protocol::AvailableCommandResponsehttp
S*pb:/aimdk.protocol.McDataService/GetTaskState获取任务状态aimdk::protocol::CommonTaskRequestaimdk::protocol::CommonTaskResponsehttp
S*pb:/aimdk.protocol.McDataService/GetJointState获取关节状态aimdk::protocol::CommonRequestaimdk::protocol::McJointStatesResponse获取当前Task状态http
S*pb:/aimdk.protocol.McDataService/GetJointAngle获取关节角度aimdk::protocol::CommonRequestaimdk::protocol::McJointAnglesResponse获取所有主动active关节角度信息http
S*pb:/aimdk.protocol.McMotionService/SetHandCommand设置手部命令aimdk::protocol::HandCommandRequestaimdk::protocol::CommonResponse暂时可以通过HalHandService设置命令http
S*pb:/aimdk.protocol.McDataService/GetHandState获取灵巧手状态aimdk::protocol::CommonRequestaimdk::protocol::HandStateResponse获取灵巧手状态http
S*pb:/aimdk.protocol.McMotionService/SetNeckCommand设置头部命令aimdk::protocol::NeckCommandRequestaimdk::protocol::CommonResponsehttp
S*pb:/aimdk.protocol.McDataService/GetNeckState获取头部状态aimdk::protocol::CommonRequestaimdk::protocol::NeckStateResponsehttp
S1pb:/aimdk.protocol.McMotionService/PlanningMove上肢规划运动aimdk::protocol::PlanningMoveRequestaimdk::protocol::CommonTaskResponse给上肢发送目标点,机器人自行规划路径并执行;
返回的任务ID,可用于查询任务状态;
有自碰撞检测,对环境的碰撞检测依赖于传感器数据,不能完全保证不与环境发生碰撞;
使用时必须指定需要运动的手臂和对应的位姿
http
S*pb:/aimdk.protocol.McMotionService/ActiveMotionControl主动动作暂停/继续aimdk::protocol::ActiveMotionControlRequestaimdk::protocol::CommonResponsemc主动动作暂停/继续rpc, 应用于task动作暂停/继续;http

通过rpc发给机器人期望的上肢目标点,目标点表是在机器人的base_link基坐标系下,左右臂法兰中心SE3位姿; 机器人会根据当前机器人状态进行规划,上肢包含1个头部关节,两个腰部关节,14个双臂关节。

PLANNING_MOVE主要负责上肢臂+腰的规划任务,任务类型包括:

  1. SE3规划:从当前state让末端运动到指定位姿,解水后进行Joint规划
  2. Joint规划:从当前state运动到指定关节角
  3. Grab:输入抓取物体信息,保存物体和左右未端的相对位置,将物体加入碰撞模型
  4. SE3闭链规划:前置Grab,根据输入的抓取物体位姿,计算期望末端位姿,解ik后进行Joint闭链规划
  5. Jointi闭链规划:规划在保持末端相对位姿不变的条件下到目标状态的运动
  6. LinearMove规划:与SE3规划类似,但需要保证末端在笛卡尔空间下是线性运动到期望位置
  1. 切换到PLANNING_MOVE Action

  2. 发送目标位置

    发送方式为rpc服务,接口为 pb:/aimdk.protocol.McMotionService/PlanningMove, 具体示例请参考examples/mc/planning_move_demo.py。

  3. 查询任务状态(可选)

    参见get_task_state.sh,调用rpc接口后会返回当前执行的任务状态,常见返回值和含义如下:

    序号状态描述
    0CommonState_UNKNOWN任务不存在
    1CommonState_SUCCESS规划运动成功完成
    2CommonState_FAILURE规划运动成功失败
    3CommonState_ABORTED当前状态不能进行规划运动,任务被取消
    4CommonState_PENDING前序任务规划或执行中,当前任务处于等待状态
    5CommonState_RUNNING任务规划或执行中

    若在轮巡查询任务状态时,已经返回了状态量1,2,3中任意一个,标志当前任务已经结束,运控将不再保存任务信息,所以如果后续继续查询同一任务,则会返回状态0,表示任务不存在。

NameNumberDescription
McActionStatus_UNKNOWN0未知状态
McActionStatus_PREPARE100准备中
McActionStatus_RUNNING200运行中
McActionStatus_DONE300完成
FieldTypeDescription
current_actionaimdk::protocol::McAction当前运行的Action
ext_actionstring扩展Action
statusaimdk::protocol::McActionStatusAction状态
FieldTypeDescription
actionaimdk::protocol::McActionAction
ext_actionstring扩展Action

机器人Action命令请求

FieldTypeDescription
headeraimdk::protocol::RequestHeader请求头
commandaimdk::protocol::McActionCommand

机器人Action命令响应

FieldTypeDescription
headeraimdk::protocol::ResponseHeader响应头
infoaimdk::protocol::McActionInfo
FieldTypeDescription
headeraimdk::protocol::ResponseHeader响应头
actionsstring[]
FieldTypeDescription
headeraimdk::protocol::ResponseHeader响应头
commandsaimdk::protocol::McActionCommand[]

运控公共状态响应

FieldTypeDescription
headeraimdk::protocol::ResponseHeader响应头
statesaimdk::protocol::JointState[]关节状态,包括角度和速度、扭矩
FieldTypeDescription
namestring关节名称
positiondouble关节角度

运控公共角度响应

FieldTypeDescription
headeraimdk::protocol::ResponseHeader响应头
jointsaimdk::protocol::McJointPosition[]关节角度,单位:弧度 or m

设置机器人手部控制请求

FieldTypeDescription
headeraimdk::protocol::RequestHeader请求头
dataaimdk::protocol::HandCommand手部控制
FieldTypeDescription
leftaimdk::protocol::SingleHandCommand左手指令
rightaimdk::protocol::SingleHandCommand右手指令

A2W 机器人应使用 agi_hand。

FieldTypeDescription
handoneof {InspireHand inspire} {ClawHand claw} {AgiClawHandCommand agi_claw_cmd} {AgibotHandState agi_hand}
FieldTypeDescription
fingeraimdk::protocol::FingerState手指
FieldTypeDescription
posaimdk::protocol::FingerPos
toqaimdk::protocol::FingerToq
FieldTypeDescription
thumb_pos_0int32拇指第一关节,取值范围:0-2000
thumb_pos_1int32拇指第二关节,取值范围:0-2000
index_posint32食指,取值范围:0-2000
middle_posint32中指,取值范围:0-2000
ring_posint32无名指,取值范围:0-2000
pinky_posint32小指,取值范围:0-2000
FieldTypeDescription
thumb_toq_0int32拇指第一关节,取值范围:0-5700(5700代表57N)
thumb_toq_1int32拇指第二关节,取值范围:0-5700(5700代表57N)
index_toqint32食指,取值范围:0-5700(5700代表57N)
middle_toqint32中指,取值范围:0-5700(5700代表57N)
ring_toqint32无名指,取值范围:0-5700(5700代表57N)
pinky_toqint32小指,取值范围:0-5700(5700代表57N)

获取机器人手部状态响应

FieldTypeDescription
headeraimdk::protocol::ResponseHeader响应头
dataaimdk::protocol::HandState手部状态
FieldTypeDescription
leftaimdk::protocol::SingleHandState左手状态
rightaimdk::protocol::SingleHandState右手状态

A2W 机器人应使用 agi_hand。

FieldTypeDescription
handoneof {InspireHand inspire} {ClawHand claw} {AgiClawHandState agi_claw_state} {AgibotHandCommand agi_hand}

Agibot手部

FieldTypeDescription
fingeraimdk::protocol::FingerCommand手指

手指

FieldTypeDescription
posaimdk::protocol::FingerPos
toqaimdk::protocol::FingerToq

脖子关节状态

FieldTypeDescription
shakeaimdk::protocol::JointState
nodaimdk::protocol::JointState

脖子关节控制指令

FieldTypeDescription
shakeaimdk::protocol::JointCommand
nodaimdk::protocol::JointCommand

获取机器人脖子状态响应

FieldTypeDescription
headeraimdk::protocol::ResponseHeader响应头
dataaimdk::protocol::NeckState脖子状态

设置机器人脖子控制请求

FieldTypeDescription
headeraimdk::protocol::RequestHeader请求头
dataaimdk::protocol::NeckCommand脖子控制
FieldTypeDescription
headeraimdk::protocol::RequestHeader请求头
world_modelaimdk::protocol::McPlanningWorldModel
groupaimdk::protocol::McPlanningGroup规划组
modeaimdk::protocol::McPlanningMode模式
targetaimdk::protocol::PlanningTarget目标位置
targetsaimdk::protocol::PlanningTarget[]多目标位置
referenceaimdk::protocol::PlanningReference参考位置
obj_infoaimdk::protocol::PlanningMoveObjectInfo
paramaimdk::protocol::MotionParam运动参数
NameNumberDescription
McPlanningMode_DEFAULT0默认避障规划。left_target right_target
McPlanningMode_CLOSURE100闭链规划,抓物体后调用,obj_center
McPlanningMode_GRAB200抓取,obj_center
McPlanningMode_PLACE300放置
McPlanningMode_LINEAR_MOVE400线性运动
FieldTypeDescription
namestring
poseaimdk::protocol::SE3Pose
typeaimdk::protocol::PlanningMoveObjectInfo::GeometryType
parent_framestring

aimdk::protocol::PlanningMoveObjectInfo::GeometryType

Section titled “aimdk::protocol::PlanningMoveObjectInfo::GeometryType”
NameNumberDescription
UNKNOWN0
BOX1
CYLINDER2
SPHERE3
FieldTypeDescription
typeaimdk::protocol::PlanningTarget::Type
leftaimdk::protocol::SE3Pose
rightaimdk::protocol::SE3Pose
jointsdouble[]
NameNumberDescription
UNKNOWN0
SE31
JOINT2
EE3
FieldTypeDescription
joint_positiondouble[]参考的关节角度,数量需要与group的关节数量一致
trajectoryaimdk::protocol::ScalarTrajectory

规划组

NameNumberDescription
McPlanningGroup_UNKNOWN0未知
McPlanningGroup_LEFT_ARM1左臂
McPlanningGroup_LEFT_ARM_WAIST2左臂腰部
McPlanningGroup_LEFT_ARM_WAIST_WHEEL3左臂腰部轮子
McPlanningGroup_RIGHT_ARM4右臂
McPlanningGroup_RIGHT_ARM_WAIST5右臂腰部
McPlanningGroup_RIGHT_ARM_WAIST_WHEEL6右臂腰部轮子
McPlanningGroup_DUAL_ARM7双臂
McPlanningGroup_DUAL_ARM_WAIST8双臂腰部
McPlanningGroup_DUAL_ARM_WAIST_WHEEL9双臂腰部轮子
McPlanningGroup_DUAL_ARM_WAIST_HEAD10双臂腰部头部
McPlanningGroup_WAIST_LIFT11腰部升降
McPlanningGroup_WAIST_PITCH12腰部俯仰
McPlanningGroup_HEAD13头部
NameNumberDescription
McPlanningMode_DEFAULT0默认避障规划。left_target right_target
McPlanningMode_CLOSURE100闭链规划,抓物体后调用,obj_center
McPlanningMode_GRAB200抓取,obj_center
McPlanningMode_PLACE300放置
McPlanningMode_LINEAR_MOVE400线性运动

任务规划世界模型

本类型无字段

任务规划场景

本类型无字段

运动参数

FieldTypeDescription
velocity_scaledouble
acceleration_scaledouble

运动控制服务

运动控制模块的主要RPC服务接口,包含手部控制、头部控制和路径规划等功能。

Action控制服务

提供机器人Action状态的设置、获取和查询功能。

数据查询服务

提供机器人各种状态数据的查询接口,包括关节状态、任务状态等。

伺服控制服务

提供机器人关节伺服控制相关的接口。

仿真控制服务

提供仿真环境下的机器人控制接口。

安全控制服务

提供机器人安全相关的控制和监控接口。

远程控制服务

提供机器人远程控制相关的接口。

力控服务

提供机器人力控制相关的接口。

运动学服务

提供机器人运动学计算相关的接口。

基础服务

提供机器人基础控制功能的接口。

测试服务

提供测试和调试相关的接口。

工具服务

提供各种工具和辅助功能的接口。

运动控制模块接口提供了多种运动控制功能,为此提供了一些示例脚本,位于 AimDK 包中 examples/mc 路径下,可以参考这些脚本进行运动控制相关的开发,一些脚本的说明如下:

名称功能备注
planning_move_demo.py上肢规划demo包含了mc的不同规划接口
set_action.py设置 Action按照状态机切换机器人动作
get_joint_state.py获取上肢关节state数据
get_tf.py通过rpc查询TF
active_motion_control.pymc主动动作暂停/继续rpc, 应用于task动作暂停/继续