5.1.3 MC控制信号设置
MC控制信号设置实现了多输入源统一管理,确保机器人始终响应优先级最高的控制信号。
控制信号设置是智元机器人X2 AimDK的核心功能之一,支持多个控制源的统一管理和优先级仲裁。该功能确保机器人在面对多个控制源时能够安全、可靠地响应最高优先级的控制指令。
核心特性
动态管理:运行时可灵活增删与启停控制输入源
冲突仲裁:多源并发时自动按优先级裁决,确保控制权唯一
失效保护:当前输入源异常或超时时自动切换,保障控制连续性
系统预置的输入源
系统内的既有控制输入源情况如下:
|
说明 |
优先级 |
超时门限(单位: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,灵动平台专用)进行添加、修改、删除、启用、禁用等任何操作,也不得在控制消息的输入源字段中使用系统预置的输入源。 直接操作或使用系统预置的输入源会导致控制权冲突、机器人失控等不可预期行为,后果自负。
仲裁流程
输入源仲裁和管理规则:
无效输入源:未注册或未启用的输入源发送的指令被丢弃
零指令处理:所有输入源(包括当前源)发送的零指令(控制量全零)都被接受,但不重置超时计时器
超时机制:超时基于最后一次非零指令计算。超时后指令数据被清零(机器人停止),但输入源保持不变
输入源切换:新输入源必须同时满足以下条件才能接管控制权:
输入源已注册且启用
发送了有效(非零)指令
且满足以下任一情况:
无当前输入源
当前输入源已超时
新输入源优先级高于当前源
指令执行:当前输入源的有效(非零)指令被应用到机器人控制
注意:系统重启后输入源优先级状态将重置
警告
上述优先级仲裁机制仅适用于连续控制命令(如走跑、姿态控制)。
以下命令类型不适用优先级仲裁:
离散动作命令(如
SetMcPresetMotion):行为取决于interrupt参数(详见 预设动作的优先级与打断机制)interrupt = false:先到先得,后到被拒interrupt = true:打断当前动作(无优先级比较)
运动模式命令(如
SetMcAction):受安全保护机制约束,详见 安全保护机制
输入源管理服务
备注
linkswarm 具有排他性,灵动平台启用后无视优先级排他选定,期间其他输入源(含二开注册源)发送的控制指令均被丢弃。二开注册的输入源在灵动平台启用期间无法抢占控制权,详见系统预置的输入源。
服务名称 |
数据类型 |
描述 |
|---|---|---|
|
|
查询当前控制输入源 |
|
|
设置输入源 |
GetCurrentInputSourceros2-srv @ mc/motion/srv/GetCurrentInputSource.srv# 获取当前控制输入源 # 服务名称: /aimdk_5Fmsgs/srv/GetCurrentInputSource # 请求 CommonRequest request # 公共请求头 --- # 响应 CommonTaskResponse response # 公共任务响应, response.header.code为0表成功 McInputSource input_source # 输入源
McInputSourceros2-msg @ mc/motion/msg/McInputSource.msgstring name # 当前选定的输入源名称,如 rc / vr / app_proxy / ... int32 priority # 配置状态:优先级(0-100) int32 timeout # 配置状态:超时时间(单位:ms)
SetMcInputSourceros2-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,timeoutMODIFY (1002)
修改现有输入源
name,priority,timeoutDELETE (1003)
删除输入源
nameENABLE (2001)
启用输入源
nameDISABLE (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), 查询当前输入源可能为空