5.3.1 故障处理
故障处理子模块由健康诊断系统(HDS, Health Diagnostic System)实现,提供机器人运行时的诊断码、告警码、后处理信号的实时订阅能力,以及历史事件的查询接口。
核心功能
实时订阅当前诊断码信息
实时订阅当前告警码信息
实时订阅后处理信号信息
查询历史告警/诊断事件记录
完整的对二开用户开放的诊断码清单见 诊断码参考表。
话题接口
诊断码信息
话题名称 |
数据类型 |
描述 |
QoS |
频率 |
|---|---|---|---|---|
|
|
当前诊断码列表 |
|
20Hz |
DiagnosticInfoArrayros2-msg @ hds/msg/DiagnosticInfoArray.msg# 当前诊断码列表 # 话题名称: /aima/hds/diag_code_list MessageHeader header # 消息头 DiagnosticInfo[] diagnostics
DiagnosticInforos2-msg @ hds/msg/DiagnosticInfo.msguint64 timestamp # 时间戳(单位:ns) uint64 first_timestamp # 异常类型首次发生的时间戳(单位:ns) DiagnosticType type # 异常类型(type.value:0 (NORMAL 常规-周期上报), 1 (TRIGGER_APPEAR 正触发-出现时上报), 2 (TRIGGER_DISAPPEAR 负触发-消失时上报)) uint8 module_id # 模块ID uint32 code # 模块诊断码 uint64 diag_code # 完整诊断码(module_id + code 组合) string info # 诊断信息描述
告警码信息
话题名称 |
数据类型 |
描述 |
QoS |
频率 |
|---|---|---|---|---|
|
|
当前告警码列表 |
|
20Hz |
AlertCodeArrayros2-msg @ hds/msg/AlertCodeArray.msg# 当前告警码列表 # 话题名称: /aima/hds/alert_code_list MessageHeader header # 消息头 AlertCode[] list
AlertCoderos2-msg @ hds/msg/AlertCode.msguint64 timestamp # 时间戳(单位:ns) uint64 first_timestamp # 告警第一次发生的时间戳(单位:ns) string code # 告警码,字符串形式
alert_code_list 是 diag_code_list 的子集,仅包含达到一定严重程度的诊断码:越紧急、越危险的故障越不会被过滤掉,而预留级和更低优先级事件只出现在 diag_code_list 中,不会进入 alert_code_list。
后处理信号信息
话题名称 |
数据类型 |
描述 |
QoS |
频率 |
|---|---|---|---|---|
|
|
后处理信号列表 |
|
事件驱动(见下方说明) |
PostProcSigArrayros2-msg @ hds/msg/PostProcSigArray.msg# 后处理信号列表 # 话题名称: /aima/hds/post_proc/signal MessageHeader header # 消息头 PostProcSig[] post_proc_sig
PostProcSigros2-msg @ hds/msg/PostProcSig.msguint64 timestamp # 时间戳 uint64 diag_code # 诊断码 SigSet sig_set # 信号集合
SigSetros2-msg @ hds/msg/SigSet.msgint32 robot_sig # 整机行为后处理信号(255 (恢复默认), 其他值见下表) uint8 motion_sig # 运动行为信号(预留,始终为 0) uint8 sound_sig # 声音行为信号(预留,始终为 0) uint8 led_sig # 灯行为信号(预留,始终为 0) uint8 facial_sig # 表情行为信号(预留,始终为 0) uint32 reserve # 预留信号(始终为 0) uint64 funcdisable_sig # 功能禁用信号
robot_sig取值参考(X2 Ultra 旗舰版/旗舰焕新版):robot_sig 值
十六进制
含义
触发动作
17
0x11
PMU 急停
PMU 触发急停,机器人下电
19
0x13
SDCU 急停
SDCU 对关节执行掉电 + TTS 提示:“当前已处于安全急停模式,机器人关节已卸力,请注意安全”
18
0x12
SDCU 急停恢复中
关节上电,机器人正在初始化
26
0x1A
PMU 急停恢复完成
HAL_EtherCAT、DCU、关节上电
31
0x1F
急停恢复完成
TTS 提示:“当前安全急停已恢复,机器人进入阻尼模式”
42
0x2A
阻尼倒地保护
运控进入阻尼模式(仅重启恢复)+ TTS 提示:“抱歉,我没办法站立了,请立即关机并前往客户端查看故障原因”
52
0x34
摔倒保护
机器人停止运动 + TTS 提示:“检测到机器摔倒,已切换到摔倒保护模式,请注意周边安全”
90
0x5A
上肢失能
上肢关节掉使能(仅重启恢复),下肢仍可站立 + TTS 提示:“抱歉,我没办法做动作,请暂停使用并前往客户端查看故障原因”
131
0x83
下肢一级过温
限制高负载功能和性能,禁止高负载动作,可能打断当前动作 + TTS 提示下肢过温
132
0x84
腰部一级过温
限制高负载功能和性能,禁止高负载动作,可能打断当前动作 + TTS 提示腰部过温
136
0x88
电池一级过温
限制高负载功能和性能,禁止高负载动作,可能打断当前动作 + TTS 提示电池过温
154
0x9A
停止导航应用
导航任务被中断 + TTS 提示:“抱歉,检测到系统存在故障,不能进行自主导航任务了。请前往客户端查看故障原因”
161
0xA1
电量异常提醒
TTS 提示:“电量显示异常,请在使用完成后检查电池连接线”(每 300 秒重复)
193
0xC1
灵创数据异常
灵创平台文件加载失败或数据异常,运控无法响应 + TTS 提示动作文件异常
209
0xD1
交互相机遮挡
TTS 提示:“我的摄像头好像被遮挡了,视觉功能将会有影响,请帮我检查一下吧”
210
0xD2
内置麦异常
TTS 提示:“我的内置麦克风故障了,没办法听到声音,请及时联系售后”
255
0xFF
恢复默认
恢复默认状态(所有告警清除后发送一次)
该话题为事件驱动,发布规则如下:
当存在触发后处理的告警时(
robot_sig≠0的告警存活),以约 20Hz 持续下发对应后处理信号;当所有后处理告警全部消失时,发送一帧
robot_sig=255的恢复信号(仅一次);其余时间(无后处理告警且已发送过恢复信号)保持静默,不发布数据。
注意:当
robot_sig=154时,正在执行的导航任务会被自动中断。如需程序化获知,请订阅/aima/pnc/pnc_task_response话题,观察task_status是否变为FAILED;或订阅/task_master/state话题,观察main_state是否从PILOT变为IDLE。
服务接口
查询历史事件
服务名称 |
数据类型 |
描述 |
|---|---|---|
|
|
查询历史告警/诊断事件记录 |
GetHdsEventHistoryros2-srv @ hds/srv/GetHdsEventHistory.srv# 查询历史告警/诊断事件记录 # 服务名称: /aimdk_5Fmsgs/srv/GetHdsEventHistory RequestHeader header # 请求头 HdsEventQuery query # 过滤条件 --- ResponseHeader header # 响应头 HdsEventRecord[] records # 历史事件记录 uint32 total_count # 满足过滤条件的总记录数 bool has_more # 是否还有更多数据
HdsEventQueryros2-msg @ hds/msg/HdsEventQuery.msguint64 start_time # 起始时间戳(单位:ns), 0=不限制 uint64 end_time # 结束时间戳(单位:ns), 0=不限制 uint64[] diag_codes # 按诊断码过滤 string[] alert_codes # 按告警码过滤 string[] alert_locations # 按告警部位过滤 uint8 state # 状态过滤(0 (STATE_ALL 全部), 1 (STATE_ACTIVE 活跃中), 2 (STATE_RECOVERED 已恢复)) bool order_desc # 是否按时间倒序 uint32 offset # 分页偏移 uint32 limit # 分页条数
HdsEventRecordros2-msg @ hds/msg/HdsEventRecord.msguint64 id # 历史事件记录 ID uint64 diag_code # 诊断码 string alert_code # 告警码 string alert_location # 告警部位(预留) uint64 first_timestamp # 首次发生时间戳(单位:ns) uint64 last_timestamp # 最近发生时间戳(单位:ns) uint64 recover_timestamp # 恢复时间戳(单位:ns), 0=未恢复 uint64 duration_ns # 持续时长(单位:ns) bool recovered # 是否已恢复
历史记录仅含诊断码、时间戳与恢复状态,不含告警级别、故障描述、处理方案等详情;如需这些信息,请按 diag_code 查阅 诊断码参考表。
历史事件默认保留 30 天,存储总量不超过 1024 MB / 1000 万条记录,超限自动清理;查询超出保留范围的历史事件将返回空结果。
编程示例
详细的编程示例和代码说明请参考:
C++ 示例:订阅 HDS 诊断信息 / 查询历史事件
Python 示例:订阅 HDS 诊断信息 / 查询历史事件
小心
ROS的服务(service)机制在跨板通信时存在一些待优化问题, 二次开发时请参考例程添加异常处理、快速重试等保护机制
机器人处于稳定站立 / 走跑模式时, 请勿批量快速启动 ROS 节点(建议不超过 2 个/秒), 短时间内大量节点参与 DDS 发现会造成通信拥塞、影响运控实时性, 存在机器人失稳摔倒风险