5.1.6 预设动作控制

预设动作控制用于触发并控制机器人执行一系列常见的预定义动作,如挥手、握手、举手等。该接口通过简单的调用,能迅速控制机器人执行特定的动作,适用于常见的交互场景和任务。

预设动作控制服务

服务名称

数据类型

描述

/aimdk_5Fmsgs/srv/SetMcPresetMotion

SetMcPresetMotion

执行预设动作(请先进入稳定站立模式)

  • SetMcPresetMotion ros2-srv @ mc/motion/srv/SetMcPresetMotion.srv

    # 执行预设动作
    # 服务名称: /aimdk_5Fmsgs/srv/SetMcPresetMotion
    
    # 请求
    RequestHeader header             # 请求头(stamp 用于指定播放时刻(UTC),为 0 时立即播放)
    McInputSource input_source       # 输入源(预留)
    McControlArea area               # 控制区域
    McPresetMotion motion            # 预设动作
    bool interrupt                   # 是否打断前一个动作
    string ani_path                  # 自定义动作地址 (待开放)
    uint64 play_timestamp            # 预留
    
    ---
    
    # 响应
    CommonTaskResponse response      # 任务响应
    

    其中

    • McControlArea ros2-msg @ mc/motion/msg/McControlArea.msg

      # 控制区域定义
      int32 value                      # 区域值
      
    • McPresetMotion ros2-msg @ mc/motion/msg/McPresetMotion.msg

      # 预设动作定义
      int32 value                      # 动作值
      

    注意: v0.8.0开始area原有的分区概念已经弱化, 仅和motion联合使用映射具体动作,目前提供如下组合供预设动作控制:

    动作名称

    motion

    area

    说明

    右手挥手

    1002

    2

    稳定站立模式下执行

    左手挥手

    1002

    1

    同上

    右手握手

    1003

    2

    同上

    左手握手

    1003

    1

    同上

    右手举手

    1001

    2

    同上

    左手举手

    1001

    1

    同上

    右手飞吻

    1004

    2

    同上

    左手飞吻

    1004

    1

    同上

    鼓掌

    3017

    11

    同上

    右手敬礼

    1013

    2

    同上

    左手敬礼

    1013

    1

    同上

    双手比心

    1007

    3

    同上

    右手比心

    1007

    2

    同上

    左手比心

    1007

    1

    同上

    拥抱

    3008

    11

    同上

    加油

    3011

    11

    同上

    双手平举

    1010

    3

    同上

    右手平举

    1010

    2

    同上

    左手平举

    1010

    1

    同上

    拜拜

    3031

    11

    同上

    动感光波

    3007

    11

    同上

    右手击掌

    1008

    2

    同上

    左手击掌

    1008

    1

    同上

    双手打叉

    3009

    11

    同上

    胸前右手挥手

    1011

    2

    同上

    胸前左手挥手

    1011

    1

    同上

    鞠躬

    3001

    11

    同上

    挠头

    3024

    11

    同上

    抓屁股

    3025

    11

    同上

    • CommonTaskResponse ros2-msg @ common/msg/CommonTaskResponse.msg

      # 内嵌response msg
      
      ResponseHeader header  # 响应头
      uint64 task_id  # 任务ID
      CommonState state  # 状态
      
      • ResponseHeader ros2-msg @ common/msg/ResponseHeader.msg

        builtin_interfaces/Time stamp
        int64 code  # 响应码,0 表示成功,其他表示失败
        

      基于response.header.code判断请求成功与否

预设动作状态查询服务

服务名称

数据类型

描述

/aimdk_5Fmsgs/srv/GetMcPresetMotionState

GetMcPresetMotionState

查询当前预设动作状态

  • GetMcPresetMotionState ros2-srv @ mc/motion/srv/GetMcPresetMotionState.srv

    # 查询当前预设动作状态
    # 服务名称: /aimdk_5Fmsgs/srv/GetMcPresetMotionState
    
    # 请求
    CommonTaskRequest request
    
    ---
    
    # 响应
    CommonTaskResponse response
    

    response.state.value 为 RUNNING(400) 表示动作执行中,为 SUCCESS(1) 表示已完成。

备注

状态查询限制:

GetMcPresetMotionState 仅能区分"执行中"和"已完成"两种状态,无法反映细粒度状态(如正在播放、被打断、失败等)。如需更详细的动作状态,建议通过订阅 /aima/mc/common/state 话题获取。

预设动作的优先级与打断机制

与连续控制命令(如走跑、姿态控制)不同,SetMcPresetMotion 没有优先级保护机制,行为取决于 interrupt 参数:

interrupt

当前无动作

当前有动作

false

执行新动作

新请求被拒绝(先到先得)

true

执行新动作

打断当前动作(无优先级比较)

警告

注意:您无法通过 GetCurrentInputSource 查询谁在控制预设动作。建议调用后通过 GetMcPresetMotionState 确认动作状态。

编程示例

详细的编程示例和代码说明请参考:

安全注意事项

警告

动作执行限制

  • 某些动作可能需要特定的机器人姿态,请确保机器人处于安全状态

小心

ROS的服务(service)机制在跨板通信时存在一些待优化问题, 二次开发时请参考例程添加异常处理、快速重试等保护机制

机器人处于稳定站立 / 走跑模式时, 请勿批量快速启动 ROS 节点(建议不超过 2 个/秒), 短时间内大量节点参与 DDS 发现会造成通信拥塞、影响运控实时性, 存在机器人失稳摔倒风险

备注

最佳实践

  • 使用interrupt=true可以打断当前正在执行的动作

  • 建议根据交互场景选择合适的动作和区域