A2 机器人提供了基本的预设动作播放能力,机器出厂自带部分预设动作(此外还可以通过遥操作设备进行动作录制,满足更多个性化需求,相关内容请查阅遥操作相关文档),自带预设动作列表如下:
右手拍照pose2-短/右手拍照pose2-短.mcap
简述6个要点_12s/简述6个要点_12s.mcap
右手拍照pose3-短/右手拍照pose3-短.mcap
做“自上而下”的示意_10s/做“自上而下”的示意_10s.mcap
强调2大要点_12s/强调2大要点_12s.mcap
快速强调5大要点_8s/快速强调5大要点_8s.mcap
对3个要点展开阐述_15s/对3个要点展开阐述_15s.mcap
强调3大要点_11s/强调3大要点_11s.mcap
右手拍照pose4-短/右手拍照pose4-短.mcap
右手拍照pose1-短/右手拍照pose1-短.mcap
用手指强调信息_09s/用手指强调信息_09s.mcap
强调4大要点_16s/强调4大要点_16s.mcap
对2个要点展开阐述_18s/对2个要点展开阐述_18s.mcap
用握拳强调2组信息_12s/用握拳强调2组信息_12s.mcap
右手强调“核心”_10s/右手强调“核心”_10s.mcap
对1个要点展开阐述_14s/对1个要点展开阐述_14s.mcap
双手强调“全局”_08s/双手强调“全局”_08s.mcap
右手拍照pose5-短/右手拍照pose5-短.mcap
以上动作文件位于 x86 的 /agibot/data/resources/default/motion 目录下,自定义录制的动作应放置于 /agibot/data/resources/custom/motion 目录下,以上列表通过在对应目录下指定如下命令获得
find . -type f -name "*.mcap" -printf "%P\n"
具体动作效果可以使用后续章节提供的运控仿真进行查看,或直接使用真机进行查看。
机上的动作播放由 motion_player 模块进行,该模块会在 JOINT_SERVO 模式下对手臂和脖子关节进行控制,基本控制原理为读取并解算指定的动作文件,按照 100 Hz 播放动作文件,发送 /motion/control/arm_joint_command 和 /motion/control/neck_joint_command 给到运动控制模块,由运控模块进行相应动作。
由于一些历史原因以及架构设计因素,我们提供了两套 RPC 接口用于调用动作播放,分别为 SendMotionCommand 以及 PlayerMotion 接口,其中 SendMotionCommand 是由 motion_player 模块直接提供的底层接口,功能更为丰富完善,推荐使用;而 PlayerMotion 接口则为 rc 遥控模块封装的上层动作播放模块,仅支持播放,不支持打断、暂停、状态查询等操作,新版本不推荐使用,保留仅为保持兼容性。
| 接口名 |
pb:/aimdk.protocol.MotionCommandService/SendMotionCommand |
| 功能概述 |
播放指定动作文件 |
| 接口类型 |
HTTP JSON RPC |
| URL |
http://192.168.100.100:56444/rpc/aimdk.protocol.MotionCommandService/SendMotionCommand |
| 入参 |
{
"motion_id": "/agibot/data/resources/default/motion/演讲10s/演讲10s.mcap",
"duration_ms": 10000,
"cmd_end": true,
"cmd_pause": false,
"cmd_reset": false
}
-
motion_id: 动作文件绝对路径,到最后一级 .mcap 文件,例如
- /agibot/data/resources/default/motion/演讲10s/演讲10s.mcap
-
duration_ms: 无效字段,保持不动即可
-
cmd_end: 是否在动作执行后自动恢复到初始姿态,true表示自动复位,false表示不自动复位
-
cmd_pause: 动作暂停标志,true表示暂停,将暂停向机器人发送控制信号,一般不使用
-
cmd_reset: 复位标志,true表示复位,false表示不复位。复位操作会将当前动作的状态重置至初始状态
|
| 出参 |
{
"header": {
"code": "0",
"msg": "",
"timestamp": {
"seconds": "1762851946",
"nanos": 693223585,
"ms_since_epoch": "0"
},
"trace_id": "",
"domin": ""
},
"state": "CommonState_SUCCESS"
}
|
| 示例脚本 |
examples/motion_player/send_motion_id.sh |
| 备注 |
|
| 接口名 |
pb:/aimdk.protocol.MotionCommandService/GetMotionStatus |
| 功能概述 |
获取动作播放状态 |
| 接口类型 |
HTTP JSON RPC |
| URL |
http://192.168.100.100:56444/rpc/aimdk.protocol.MotionCommandService/GetMotionStatus |
| 入参 |
{}
|
| 出参 |
{
"header": {
"code": "0",
"msg": "",
"timestamp": {
"seconds": "1762852836",
"nanos": 502608623,
"ms_since_epoch": "0"
},
"trace_id": "",
"domin": ""
},
"time_to_end_ms": "235",
"status": "MotionCommandStatus_OPERATING",
"is_neck_enable": true,
"motion_id": "1见面招手"
}
|
| 示例脚本 |
examples/motion_player/get_motion_status.sh |
| 备注 |
|
动作播放模块会在 JOINT_SREVO 模式下持续给运控发送 /motion/control/arm_joint_command 和 /motion/control/neck_joint_command 的控制指令,这时二开程序也发送指令会造成冲突问题,可以调用以下接口禁用和开启动作播放模块
| 接口名 |
pb:/aimdk.protocol.MotionCommandService/DisableMotionPlayer |
| 功能概述 |
禁用动作播放模块,进程不会退出,不发送指令给运动控制模块 |
| 接口类型 |
HTTP JSON RPC |
| URL |
http://192.168.100.100:56444/rpc/aimdk.protocol.MotionCommandService/DisableMotionPlayer |
| 入参 |
{}
|
| 出参 |
{
"state":"CommonState_SUCCESS"
}
|
| 示例脚本 |
examples/motion_player/disable_motion_player.sh |
| 备注 |
|
| 接口名 |
pb:/aimdk.protocol.MotionCommandService/EnableMotionPlayer |
| 功能概述 |
开启动作播放模块,开始持续发送指令给运动控制模块 |
| 接口类型 |
HTTP JSON RPC |
| URL |
http://192.168.100.100:56444/rpc/aimdk.protocol.MotionCommandService/EnableMotionPlayer |
| 入参 |
{}
|
| 出参 |
{
"state":"CommonState_SUCCESS"
}
|
| 示例脚本 |
examples/motion_player/enable_motion_player.sh |
| 备注 |
|
有些情况下需要单独禁用脖子的动作播放功能,从而将脖子的控制权交给二开程序进行头部跟随等,可以调用如下接口进行禁用和开启动作播放的脖子控制。
| 接口名 |
pb:/aimdk.protocol.MotionCommandService/DisableNeckMotionPlayer |
| 功能概述 |
禁用动作播放模块控制脖子电机,进程不会退出,不发送脖子指令给运动控制模块 |
| 接口类型 |
HTTP JSON RPC |
| URL |
http://192.168.100.100:56444/rpc/aimdk.protocol.MotionCommandService/DisableNeckMotionPlayer |
| 入参 |
{}
|
| 出参 |
{
"state":"CommonState_SUCCESS"
}
|
| 示例脚本 |
examples/motion_player/disable_neck_motion_player.sh |
| 备注 |
|
| 接口名 |
pb:/aimdk.protocol.MotionCommandService/EnableNeckMotionPlayer |
| 功能概述 |
开启动作播放模块控制脖子接口,开始持续发送脖子控制指令给运动控制模块 |
| 接口类型 |
HTTP JSON RPC |
| URL |
http://192.168.100.100:56444/rpc/aimdk.protocol.MotionCommandService/EnableNeckMotionPlayer |
| 入参 |
{}
|
| 出参 |
{
"state":"CommonState_SUCCESS"
}
|
| 示例脚本 |
examples/motion_player/enable_neck_motion_player.sh |
| 备注 |
|
| 接口名 |
pb:/aimdk.protocol.ResourceService/GetMotion |
| 功能概述 |
获取动作列表 rpc |
| 接口类型 |
HTTP JSON RPC |
| URL |
http://192.168.100.110:51049/rpc/aimdk.protocol.ResourceService/GetMotion |
| 入参 |
{}
|
| 出参 |
{
"motions": [
{
"motion_id": 10001,
"motion_name": "亮相A",
"motion_path": "/agibot/data/resources/custom/motion/亮相A/亮相A.db",
"description": "",
"display_name_zh": "",
"display_name_en": "",
"url": "",
"thumbnail_url": "",
"is_change": true,
"create_time_stamp": "0",
"update_time_stamp": "0",
"duration": 2,
"motion_type": "Untyped"
},
{
"motion_id": 10002,
"motion_name": "亮相B",
"motion_path": "/agibot/data/resources/custom/motion/亮相B/亮相B.db",
"description": "",
"display_name_zh": "",
"display_name_en": "",
"url": "",
"thumbnail_url": "",
"is_change": true,
"create_time_stamp": "0",
"update_time_stamp": "0",
"duration": 2,
"motion_type": "Untyped"
},
...
]
}
- motion_id:用于 PlayerMotion 播放动作接口的 id
其余字段可以不用管,路径可在 x86 上找到对应文件 |
| 示例脚本 |
examples/rc/a2_GetMotionList.sh |
| 备注 |
|
| 接口名 |
pb:/aimdk.protocol.RcMotionPlayerService/PlayerMotion |
| 功能概述 |
播放指定 id 动作 |
| 接口类型 |
HTTP JSON RPC |
| URL |
http://192.168.100.100:59001/rpc/aimdk.protocol.RcMotionPlayerService/PlayerMotion |
| 入参 |
{
"motion_id": "1"
}
|
| 出参 |
{
"state": "CommonState_UNKNOWN"
}
|
| 示例脚本 |
examples/rc/a2_PlayerMotion.sh |
| 备注 |
|