5.1.3 MC控制信号设置

MC控制信号设置实现了多输入源统一管理,确保机器人始终响应优先级最高的控制信号。

控制信号设置是智元机器人X2 AimDK的核心功能之一,支持多个控制源的统一管理和优先级仲裁。该功能确保机器人在面对多个控制源时能够安全、可靠地响应最高优先级的控制指令。

核心特性

  • 动态管理:运行时可灵活增删与启停控制输入源

  • 冲突仲裁:多源并发时自动按优先级裁决,确保控制权唯一

  • 失效保护:当前输入源异常或超时时自动切换,保障控制连续性

系统预置的输入源

系统内的既有控制输入源情况如下:

source

说明

优先级

超时门限(单位:ms)

linkswarm

灵动平台群控(灵动平台专用,启用后无视优先级排他选定为当前输入源)

90

1000

rc

遥控手柄

80

1000

app_proxy

移动APP端Agibot Go

60

1000

vr

遥操模块 (预留)

70

1000

interaction

智元灵犀交互模块

50

1000

pnc

智元灵犀Planner模块

40

1000

注意

linkswarm 具有排他性:灵动平台启用后,无视优先级排他选定为当前输入源,期间其他所有输入源(含二开注册的高优先级源)发送的控制指令均被丢弃,直至灵动平台退出。

警告

严禁对系统预置的输入源(特别是 linkswarm,灵动平台专用)进行添加、修改、删除、启用、禁用等任何操作,也不得在控制消息的输入源字段中使用系统预置的输入源。 直接操作或使用系统预置的输入源会导致控制权冲突、机器人失控等不可预期行为,后果自负。

仲裁流程

输入源仲裁和管理规则:

  1. 无效输入源:未注册或未启用的输入源发送的指令被丢弃

  2. 零指令处理:所有输入源(包括当前源)发送的零指令(控制量全零)都被接受,但不重置超时计时器

  3. 超时机制:超时基于最后一次非零指令计算。超时后指令数据被清零(机器人停止),但输入源保持不变

  4. 输入源切换:新输入源必须同时满足以下条件才能接管控制权:

    • 输入源已注册且启用

    • 发送了有效(非零)指令

    • 且满足以下任一情况:

      • 无当前输入源

      • 当前输入源已超时

      • 新输入源优先级高于当前源

  5. 指令执行:当前输入源的有效(非零)指令被应用到机器人控制

注意:系统重启后输入源优先级状态将重置

警告

上述优先级仲裁机制仅适用于连续控制命令(如走跑、姿态控制)。

以下命令类型不适用优先级仲裁:

  • 离散动作命令(如 SetMcPresetMotion):行为取决于 interrupt 参数(详见 预设动作的优先级与打断机制)

    • interrupt = false:先到先得,后到被拒

    • interrupt = true:打断当前动作(无优先级比较)

  • 运动模式命令(如 SetMcAction):受安全保护机制约束,详见 安全保护机制

输入源管理服务

备注

linkswarm 具有排他性,灵动平台启用后无视优先级排他选定,期间其他输入源(含二开注册源)发送的控制指令均被丢弃。二开注册的输入源在灵动平台启用期间无法抢占控制权,详见系统预置的输入源。

服务名称

数据类型

描述

/aimdk_5Fmsgs/srv/GetCurrentInputSource

GetCurrentInputSource

查询当前控制输入源

/aimdk_5Fmsgs/srv/SetMcInputSource

SetMcInputSource

设置输入源

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

    # 获取当前控制输入源
    # 服务名称: /aimdk_5Fmsgs/srv/GetCurrentInputSource
    
    # 请求
    CommonRequest request        # 公共请求头
    
    ---
    
    # 响应
    CommonTaskResponse response  # 公共任务响应, response.header.code为0表成功
    McInputSource input_source  # 输入源
    
    • McInputSource ros2-msg @ mc/motion/msg/McInputSource.msg

      string name               # 当前选定的输入源名称,如 rc / vr / app_proxy / ...
      int32 priority              # 配置状态:优先级(0-100)
      int32 timeout               # 配置状态:超时时间(单位:ms)
      
  • SetMcInputSource ros2-srv @ mc/motion/srv/SetMcInputSource.srv

    # 服务名称: /aimdk_5Fmsgs/srv/SetMcInputSource
    
    # 请求
    CommonRequest request        # 公共请求头
    McInputAction action         # 操作类型(action.value:
                                 #   1001 (INPUTACTION_ADD 添加输入源)
                                 #   1002 (INPUTACTION_MODIFY 修改输入源)
                                 #   1003 (INPUTACTION_DELETE 删除输入源)
                                 #   2001 (INPUTACTION_ENABLE 使能输入源)
                                 #   2002 (INPUTACTION_DISABLE 下使能输入源))
    McInputSource input_source   # 输入源
    
    ---
    
    # 响应
    
    CommonTaskResponse response  # response.header.code 0表成功
    

    操作类型(值)

    说明

    input_source必须参数

    ADD (1001)

    添加新输入源

    name, priority, timeout

    MODIFY (1002)

    修改现有输入源

    name, priority, timeout

    DELETE (1003)

    删除输入源

    name

    ENABLE (2001)

    启用输入源

    name

    DISABLE (2002)

    禁用输入源

    name

二次开发的模块应通过 SetMcInputSource 注册自定义控制源并设置优先级,避免与系统既有输入源重名。

命名规则:为与系统预置的输入源(如 rc、app_proxy、linkswarm 等,无前缀)区分,二开输入源建议以 sdk_ 为前缀(如 sdk_my_app、sdk_keyboard_ctrl),从命名上即避免与系统预置源冲突。

优先级参考:

优先级范围

用途

100-81

系统级控制(紧急停止、安全模式)

80-60

高级控制(遥控器、APP)

59-40

中级控制(语音、手势)

39-20

低级控制(二次开发)

19-0

备用控制(调试、测试)

二开输入源默认落点为 20-39(低级控制);如需超过 APP(优先级 60)或遥控器(优先级 80)抢占控制权,可在 40-100 范围内设置更高优先级。

编程示例

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

注意事项

重要

MC控制信号设置功能仅在 X2_AimDK v0.7 及之后的版本中可用,不支持 v0.6 及之前的版本。

小心

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

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

备注

运控系统未获取任何有效输入前(如刚上电启动未操作移动, 下发速度控制量全为0), 查询当前输入源可能为空