5.1.7 灵创动作
备注
X2 EDU(人人造版)不支持本节功能。 本节内容仅适用于 X2 Ultra(旗舰版)与 X2 Ultra(new version)(旗舰焕新版)。
关于 LinkCraft
LinkCraft 是智元的动作创作和管理平台,用于创建、编辑、调试和部署机器人动作。在 LinkCraft 平台上创作的动作部署至机器人后,可通过本节所述的 ROS 接口获取已部署的资源列表,并触发单机播放或多机群控播放。
平台侧的使用请参阅 LinkCraft 使用手册。
接口说明
服务名称 |
数据类型 |
描述 |
|---|---|---|
|
|
获取机器人上的资源列表 |
|
|
播放指定的灵创动作资源 |
|
|
群控时间同步 |
GetRobotResourcesros2-srv @ app_proxy/srv/GetRobotResources.srv# 获取机器人上资源列表 # 服务名称: /aimdk_5Fmsgs/srv/GetRobotResources # 请求 CommonRequest header # 请求头 --- # 响应 CommonResponse header # 响应头 RobotResource[] robot_resources # 机上资源信息列表
RobotResourceros2-msg @ app_proxy/msg/RobotResource.msgstring resource_key # 资源唯一标识 CurrentVersion current_version # 当前版本信息
CurrentVersionros2-msg @ app_proxy/msg/CurrentVersion.msgstring version # 版本号 string name # 资源名称 string[] files # 资源文件列表 uint64 download_timestamp_seconds # 资源下载时间
ExecuteActionResourceros2-srv @ app_proxy/srv/ExecuteActionResource.srv# 播放灵创动作 # 服务名称: /aimdk_5Fmsgs/srv/ExecuteActionResource # 请求 CommonRequest header # 请求头 string resource_key # 资源唯一标识(从 GetRobotResources 获取) string resource_version # 资源版本号 SlaveDevice[] slaves # 从设备列表(群控时填写从机 IP,单机播放可为空) string meta # JSON 格式的扩展参数 --- CommonResponse header # 响应头,header.message 为结果信息(成功时为 "Play success")
SlaveDeviceros2-msg @ app_proxy/msg/SlaveDevice.msgstring ip # 从设备 IP 地址
meta字段格式:场景
meta 值
单机全身动作(onnx)
{"resource_type": "BODY_MONTION"}单机手臂动作
{"resource_type": "ARM_MONTION"}群控全身动作(onnx)
{"control_type": "GROUP_CONTROL","resource_type": "BODY_MONTION"}群控手臂动作
{"control_type": "GROUP_CONTROL","resource_type": "ARM_MONTION"}resource_key中包含onnx时为全身动作,否则为手臂动作。群控场景下,
meta还可携带以下可选字段:if_play_master(bool,默认true):是否播放主设备。设为false时仅播放从设备,主设备不动作。
通过
header.message判断实际结果,header.status.value不可用于判断成功与否。单机播放:
header.message说明
Play success播放成功
No valid resource files found资源目录下无有效文件
The robot is playing机器人正在播放,无法触发新任务
The robot is in a faulty state机器人处于故障状态
The robot is not in ready posture机器人未处于就绪姿态
MC ROS service not ready运控 ROS 服务未就绪
Audio ROS service not ready音频 ROS 服务未就绪
Face ROS service not ready表情 ROS 服务未就绪
Trigger MC ROS service error: <异常描述>运控 ROS 服务调用异常(
<异常描述>为运行时填充的具体异常信息)Trigger Audio ROS service error: <异常描述>音频 ROS 服务调用异常(同上)
Trigger Face ROS service error: <异常描述>表情 ROS 服务调用异常(同上)
Trigger interaction error调用交互播放接口失败
Bad request请求参数错误
Error processing play item <N>: <异常描述>处理播放项时内部异常(
<N>为播放项序号,<异常描述>为运行时填充的具体异常信息)No time sync result for slave device <ip>群控时从机未完成时间同步(
<ip>为从机 IP)<异常描述>处理过程中发生未预期异常(内容为 Python 异常的字符串表示,取决于具体异常类型,不可枚举)
群控播放(部分从机失败):
header.message为 JSON 字符串,包含各失败从机的详情,格式如下:{ "192.168.2.19": { "sn": "机器人序列号", "error_code": 412, "error_msg": "The robot is playing" } }
其中 key 为失败从机的 IP(由用户在
slaves字段中填写),sn为该从机的序列号,error_code和error_msg为该从机播放失败的具体错误码和描述。JSON 中
error_code的可能取值:error_code说明
400
请求参数错误
401
调用交互播放接口失败
402
机器人未处于就绪姿态
403
作品存在危险/损害机器人动作(预留)
404
作品不存在(预留)
405
机器人处于故障状态
406
运控 ROS 服务未就绪
407
音频 ROS 服务未就绪
408
表情 ROS 服务未就绪
409
运控 ROS 服务调用异常
410
音频 ROS 服务调用异常
411
表情 ROS 服务调用异常
412
机器人正在播放
413
存在未时间同步的从机(预留)
450
群控有任务失败(预留)
500
内部服务器错误
503
服务不可用(预留)
解析示例:
import json if header.message == "Play success": print("播放成功") else: try: details = json.loads(header.message) for ip, info in details.items(): print(f"从机 {ip}: 错误码 {info['error_code']}, {info['error_msg']}") except json.JSONDecodeError: print(f"播放失败: {header.message}")
GroupControlTimeSyncros2-srv @ app_proxy/srv/GroupControlTimeSync.srv# 群控时间同步 # 服务名称: /aimdk_5Fmsgs/srv/GroupControlTimeSync # 请求 CommonRequest header # 请求头 SlaveDevice[] slaves # 群控从节点列表 --- # 响应 CommonResponse header # 响应头,header.status.value 为状态码(1 (SUCCESS 成功), 2 (FAILURE 失败)) int32 error_code # 错误码,0 表示成功,1 表示失败 string error_msg # 错误信息
群控播放前需先调用此接口完成多机时间同步,
error_code为 0 表示同步成功,为 1 表示失败(error_msg含失败从机详情)。
编程示例
详细的编程示例和代码说明请参考:
小心
ROS的服务(service)机制在跨板通信时存在一些待优化问题, 二次开发时请参考例程添加异常处理、快速重试等保护机制
机器人处于稳定站立 / 走跑模式时, 请勿批量快速启动 ROS 节点(建议不超过 2 个/秒), 短时间内大量节点参与 DDS 发现会造成通信拥塞、影响运控实时性, 存在机器人失稳摔倒风险