M20 ErrorCode 触发条件与返回链路(1.1.8.7 基线)

1. 使用范围与结论口径

  • 本文基于 M20 1.1.8.7 软件包中的静态实现与配置整理,关键版本为:
    • AOS 103:basic_server 1.2.65
    • NOS 106:planner 3.0.14
    • NOS 106:global_planner 1.0.10
    • NOS 106:localization 3.4.0
  • “产生模块”分成两层:
    • 最终赋码/返回模块:把 0xAxxx 写入任务结果并返回 App 的模块。
    • 原始状态产生模块:最先发现点云、定位、规划等异常并发布内部状态的模块。
  • 目前多数导航错误码是 Basic_server/NavWorker 根据 Planner、GlobalPlanner、Localization 等模块的状态二次映射后返回,不能把错误码名称直接理解为下游模块自己返回了同一个 0xAxxx
  • “已确认”表示在该版本二进制逻辑或配置中能够落到具体条件;“待确认”表示只能确认高层映射,尚缺下游源码中的原始判断条件。
  • 本文是静态版本知识,不等同于某台现场机器的实际故障证据。

2. 该版本已确认的公共参数

参数 1.1.8.7 配置/实现
导航任务监控周期 约 200 ms
持续停障 30 s
持续定位丢失 30 s
持续 Planner 异常 30 s(实现中硬编码)
导航速度未刷新 30 s(最终报错阈值;另有“20周期未刷新”日志/预警逻辑,需研发解释两者关系)
服务调用次数 二进制循环显示最多 3 次调用;配置 retryTimes=3 的注释写作“失败后重新调用次数”,文字口径存在歧义
发送目标超时 每次 5 s
取消目标超时 每次 5 s
设置参数超时 每次 5 s
切图超时 每次 10 s
移动到点超时 配置为 30 s、0.5 m,但该版本 enable=false

3. 逐错误码说明

3.1 默认值、完成与取消

错误码 最终产生模块 业务阶段 检测对象与具体条件 时间/次数 返回前动作 容易混淆的含义 结论
0 Basic_server 任务数据结构 初始化、清码 错误码字段的默认值,尚未赋予成功、取消或异常码 0 只能说明当前字段未记录异常,未必等于任务已经成功完成 默认值已确认;何时统一清零待研发确认
0x2300 Basic_server/NavWorker 单点任务收尾 当前点位导航及点位后处理完成,任务队列到达本次单点任务末尾 无固定时间 标记任务完成、退出任务态并上报结果 不是 Planner 单独规划完成,而是高层业务任务完成 已确认
0x2302 Basic_server/NavWorker 用户取消、模式切换或充电流程取消 高层取消标志成立,或取消路径被调用 无固定时间 一般先向 Planner 取消,再向 GlobalPlanner 取消;充电流程中会发送充电停止/复位指令,然后结束任务 表示业务任务被取消,不保证机器人在返回瞬间已经物理停车;若取消服务失败还可能先出现 A402/A403 主路径已确认

3.2 任务下发前的状态检查

错误码 最终产生模块 / 原始来源 业务阶段 检测对象与具体条件 时间/次数 返回前动作 容易混淆的含义 结论
0xA301 Basic_server/NavWorker / MotionStatus 下发前检查、导航执行监控 运动状态为 JointDamping(2),即软急停状态 当前周期立即;执行中约每 200 ms 检查 拒绝或终止任务;软急停本身通常已由运动/异常保护链执行 代码直接看到的是“软急停状态”,没有直接看到“摔倒”;摔倒是否先触发软急停需研发确认 条件已确认,摔倒链路待确认
0xA302 Basic_server/NavWorker / BatteryData、单电池状态 下发前检查、执行监控 该版本实现为所有电池电量均 ≤5%,或进入单电池异常状态 当前周期立即 拒绝或终止任务;电池保护链可能另行趴下 与现有表“低于20%”冲突;5% 是本版本静态实现,不排除其他版本或上层在 20% 提前拦截 版本冲突,必须确认
0xA303 Basic_server/NavWorker / ExceptionHandle、关节 status_word 下发前检查、执行监控 mHasMotorFault_ 为真;知识资料显示任一关节 status_word 异常都可能置位 当前周期立即 拒绝或终止任务;异常保护链根据具体位可能软急停或趴下 不一定只代表“电机过温”,还可能是过压、欠压、过流、驱动过温、CAN 超时等 高层条件已确认,码值范围待研发确认
0xA305 Basic_server/NavWorker / 雷达状态、ExceptionHandle 下发前检查、执行监控 前后雷达运行状态不是都为 1,等待后复查仍异常;或雷达异常标志已置位 首次异常后等待 2 s,再检查 1 次 拒绝或终止导航任务 不一定是雷达硬件损坏,也可能是雷达未启动、状态未更新、点云链路中断或异常标志未恢复 高层条件已确认,状态字段语义待确认
0xA312 Basic_server/NavWorker / Planner、GlobalPlanner 状态 下发目标前的软件状态检查 Planner 状态不等于正常值 999,或 GlobalPlanner 状态不等于 0 当前检查立即,无 30 s 延时 不下发任务 代码判断的是模块状态“不满足可下发条件”,并非直接测量 DDS 通讯;“通讯异常”只是可能原因 高层条件已确认,原始枚举待确认
0xA313 Basic_server/NavWorker / Localization 状态 下发前检查;导航执行 下发前:定位状态等于异常值 1 时立即失败;执行中:定位状态 >2 持续异常 下发前立即;执行中持续 30 s 拒绝或取消导航,进入统一异常后处理 同一码存在“下发前立即异常”和“执行中持续30秒异常”两条路径;不一定是定位进程崩溃 两条高层路径已确认,状态枚举待确认
0xA314 Basic_server/NavWorker / VMap(地形图)状态 下发目标前的软件状态检查 地形图/VMap 状态字段非 0 当前检查立即 不下发任务 只确认“地形图状态非正常”,不能仅凭该码区分地图未加载、数据异常或模块异常 高层条件已确认,原始枚举待确认
0xA341 Basic_server/NavWorker 新任务下发前 Tasking 标志已经为真,说明已有导航任务占用执行器 当前检查立即 拒绝新任务,原任务继续 不是新目标规划失败,而是高层任务互斥 已确认
0xA34E Basic_server/NavWorker / ChargeManager 状态 新导航任务下发前 自主充电状态处于进桩或退桩阶段(内部状态 13 当前检查立即 拒绝新导航任务 不是“向自主充电模块下发任务调用失败”,而是充电流程占用期间不允许下发普通导航 已确认

3.3 导航执行中的持续监控

错误码 最终产生模块 / 原始来源 业务阶段 检测对象与具体条件 时间/次数 返回前动作 容易混淆的含义 结论
0x8605 Basic_server/NavWorker / 里程计位置 移动到点、导航执行 功能开启时,机器人在判定窗口内移动距离小于配置阈值 0.5 m 持续 30 s 终止当前到点任务,进入异常处理 该版本配置 enable=false,正常情况下不会由此逻辑产生;它判断“位移不足”,不等于目标点整体超时 逻辑与参数已确认,现场是否覆盖配置待确认
0xA327 Basic_server/NavWorker / MotionStatus.gait 导航执行、切换目标步态后 当前步态未被确认成目标导航步态;在运动状态数据新鲜度检查通过后仍不匹配 未发现明确连续次数;监控周期约 200 ms 终止任务,后续统一取消/异常处理 不是 Planner 步态规划失败,而是运动控制侧最终步态状态不满足 高层条件已确认,等待/重试策略待研发确认
0xA328 Basic_server/NavWorker、VelControl / 控制模式 导航执行、模式切换 控制使用模式不再是 AUTO(1);或活动任务期间主动切离 AUTO 当前周期立即 取消当前导航任务 既可能是任务开始时不在导航模式,也可能是执行中被其他指令切走 已确认
0xA34B Basic_server/NavWorker / 障碍标志或 Planner 状态 导航执行 路径持续处于停障;或 Planner 原始状态 2004 持续存在 持续 30 s 结束/取消导航,进入异常后处理 表示持续不能通行,不一定是传感器故障,也不等于全局规划失败 高层条件已确认,2004 原始语义待确认
0xA34C Basic_server/NavWorker / Planner 状态 局部规划、导航执行 Planner 原始状态 11011102,或被持续异常分支兜底映射的状态(包括观察到的 2005)持续存在 持续 30 s 结束/取消导航,进入异常后处理 是局部 Planner 状态映射;1101/1102/2005 分别代表何种规划失败、内部重试几次,尚不能从 Basic_server 得出 高层映射已确认,Planner 内部条件待确认
0xA34D Basic_server/NavWorker / NavCmd 速度更新标志 导航执行 未收到新的导航速度指令,速度“新鲜”标志持续不刷新 最终报错阈值 30 s 结束/取消导航,进入异常后处理 不一定是速度数值为零;核心是“没有新速度消息/更新时间未刷新”。资料另记有 20 周期日志逻辑,需研发解释 最终阈值已确认,预警逻辑待确认
0xA40F Basic_server/NavWorker / /ODOM 更新时间 导航执行 在 AUTO 导航且可通行域、累计点云状态满足检查前提时,里程计最后更新时间距当前超过约 500 ms 超过 500 ms 结束/取消导航,进入异常后处理 判断的是里程计消息发布时间/新鲜度,不是里程计位置数值精度,也不一定是 Localization 本身错误 已确认

3.4 目标、取消、参数与切图服务调用

错误码 最终产生模块 / 调用对象 业务阶段 检测对象与具体条件 时间/次数 返回前动作 容易混淆的含义 结论
0xA400 Basic_server/NavWorker → Planner 下发目标 GlobalPlanner 目标已下发成功,但向局部 Planner 发送目标的服务调用/应答失败 每次 5 s,最多 3 次调用 返回失败;外层异常流程再决定取消和处置 是“发送局部目标服务失败”,不等于局部路径已经计算并失败 已确认
0xA401 Basic_server/NavWorker → GlobalPlanner 下发目标 向 GlobalPlanner 发送目标的服务调用/应答失败 每次 5 s,最多 3 次调用 不再向局部 Planner 下发,直接返回失败 是调用链失败,不等于 GlobalPlanner 已返回“无路径” 已确认
0xA402 Basic_server/NavWorker → Planner 取消导航 向局部 Planner 发送取消请求失败/超时 每次 5 s,最多 3 次调用 返回取消失败;该路径下可能不再继续取消 GlobalPlanner 不表示机器人一定仍在运动,只表示取消服务没有按期成功应答 已确认
0xA403 Basic_server/NavWorker → GlobalPlanner 取消导航 局部 Planner 已取消成功,但向 GlobalPlanner 取消失败/超时 每次 5 s,最多 3 次调用 返回取消失败 不等于局部控制未停止;失败发生在全局规划取消环节 已确认
0xA404 Basic_server/NavWorker → Planner 导航参数设置 设置 Planner 参数的服务调用连续失败/超时 每次 5 s,最多 3 次调用 不继续正常下发任务 表示参数服务调用失败,不能直接推断具体哪个参数非法 调用链已确认,参数校验细节待确认
0xA349 Basic_server/NavWorker → 地图切换服务 切图 请求地图 ID 不在本地地图表中;或切图服务多次调用仍失败/超时 未找到地图 ID 时立即;服务调用每次 10 s、最多 3 次 保持原地图并返回失败 同一码合并了“地图 ID 不存在”和“切图服务异常/超时”两种不同原因 已确认

3.5 Planner、GlobalPlanner 与 Localization 状态映射

错误码 最终产生模块 / 原始来源 业务阶段 Basic_server 已确认的映射条件 时间/次数 返回前动作 仍缺少的真实产生条件 / 易混淆点 结论
0xA405 Basic_server/NavWorker / Planner 导航执行 Planner 原始状态 1003 未发现高层持续阈值,当前监控周期触发 终止任务并进入统一异常处理 “局部模块异常、已重启”是状态含义;谁发起重启、几次心跳丢失、重启成功还是失败后置状态,需 Planner 研发说明 映射已确认,源条件待确认
0xA406 Basic_server/NavWorker / Planner 导航执行 Planner 原始状态 1001 高层未确认额外持续时间 终止或进入恢复/异常路径 只能确认高层含义为“无实时障碍地图”;是未收到点云、地图时间戳超时、地图为空还是构建失败,需 Planner 研发说明 映射已确认,源条件待确认
0xA407 Basic_server/NavWorker / Planner 导航执行 Planner 原始状态 1002 持续存在 30 s 终止任务并进入统一异常处理 表示 Planner 没有可用定位输入,不一定是 Localization 模块整体故障;具体订阅 Topic 和超时阈值待确认 映射与高层持续时间已确认
0xA408 Basic_server/NavWorker / GlobalPlanner 导航执行 GlobalPlanner 原始状态 1004 当前周期触发 终止任务并进入统一异常处理 “全局导航模块异常、已重启”的重启监控者、失联阈值和重启次数未知;Basic_server 此分支只做状态映射 映射已确认,源条件待确认
0xA409 Basic_server/NavWorker / GlobalPlanner 全局规划、导航执行 GlobalPlanner 原始状态 1001 当前周期触发 终止任务并进入统一异常处理 “无栅格地图”可能是未加载、订阅超时、地图 ID 不匹配或数据无效,不能仅凭高层码区分 映射已确认,源条件待确认
0xA40A Basic_server/NavWorker / GlobalPlanner 全局规划、导航执行 GlobalPlanner 原始状态 1002 当前周期触发 终止任务并进入统一异常处理 表示 GlobalPlanner 没有可用定位数据,不一定等于 Localization 进程崩溃 映射已确认,源条件待确认
0xA40B Basic_server/NavWorker / GlobalPlanner 全局规划 GlobalPlanner 状态非 0 且未命中 1001/1002/1003/1004 时,落入默认“全局规划失败”映射 当前周期触发 终止任务并进入统一异常处理 高层是兜底码;真正的“搜索无路径、超时、起点非法、算法异常”要看 GlobalPlanner 原始状态和日志 兜底映射已确认,源条件待确认
0xA40C Basic_server/NavWorker / GlobalPlanner 全局规划 GlobalPlanner 原始状态 1003 当前周期触发 终止任务并进入统一异常处理 目标在障碍中的判定依据、膨胀半径、地图层和允许重试次数均在下游,Basic_server 无法回答 映射已确认,源条件待确认
0xA40D 待确认,推测为 Basic_server 映射 Localization/看门狗状态 定位运行、模块监控 现有静态表中有该文案,但本次已定位的 NavWorker 主状态映射中尚未找到可靠触发分支 待确认 文案称“已重启”,但动作执行者未知 不能据文案认定是 Basic_server 主动重启 Localization,也不知道报错在重启前还是重启后产生 待研发回答
0xA40E 待确认,可能来自 Localization 或其传感器状态汇总 定位运行、输入监控 尚未确认具体传感器字段和异常枚举 待确认 待确认 可能涉及雷达、IMU、腿里程计、RTK 等任一定位输入;不能简单等同于雷达硬件故障 待研发回答

3.6 自主充电

错误码 最终产生模块 / 原始来源 业务阶段 检测对象与具体条件 时间/次数 返回前动作 容易混淆的含义 结论
0xA343 Basic_server/NavWorker / ChargeManager 状态 退出自主充电、退桩 发送退出充电后,充电状态未进入空闲 0,或进入异常状态 4 最长等待约 300 s,约 10 ms 轮询 若成功还会等待运动状态回到 17(最长约 6 s),切回 AUTO 并恢复可通行域;失败则返回该码 既可能是退桩失败,也可能是状态未回空闲或流程超时 高层流程已确认
0xA344 Basic_server/NavWorker / ChargeManager 状态 启动自主充电、进入进桩流程 发送进桩指令后,状态未进入 goToPile(1),或先进入异常状态 4 最长等待约 10 s,约 10 ms 轮询 返回进入流程失败 它是“未成功进入进桩状态”,不是机器人已经走到桩前后充电失败 已确认
0xA345 Basic_server/NavWorker / ChargeManager 状态 进桩执行、等待充电 已进入 goToPile(1),但未到达 charging(2),或进入异常状态 4 最长等待约 300 s,约 10 ms 轮询 返回进桩/充电执行失败 该高层码不能区分反光柱、障碍、进桩超时、无充电电流等具体 ChargeManager 子错误 已确认高层流程,子错误待关联

4. 待解释的问题

  1. A302 阈值冲突
    1.1.8.7 的 basic_server 1.2.65 实现是“所有电池 ≤5%”,现有错误码表写“低于20%”。20% 是其他版本、App 预检查、任务策略阈值,还是文档错误?

  2. A301 中“摔倒”的真实链路
    Basic_server 直接判断的是 MotionStatus == JointDamping(2)。摔倒是否由 Motion 模块先识别并切成状态 2?摔倒的原始条件、持续时间和次数分别是什么?

  3. A303 是否只指电机过温
    当前看到的是 mHasMotorFault_,而它可能由多个关节 status_word 异常置位。哪些 bit 会让导航返回 A303?是否所有电机故障都映射此码,还是仅过温?

  4. A305 两个雷达状态字段的确切含义
    代码要求两个状态都为 1,失败后等 2 秒再查一次。两个字段分别对应前/后雷达运行态、点云接收态,还是电源态?ExceptionHandle 的雷达异常标志又由什么条件、连续多少帧置位和清除?

  5. A312 的原始枚举
    Planner 正常值 999、GlobalPlanner 正常值 0。所有非正常值都报 A312 吗?哪些值代表“通讯异常”,哪些只是模块未就绪、无地图或任务状态未复位?

  6. A314 的 VMap 状态枚举
    0 就在下发前失败。各非零值分别是什么,来自哪个 Topic/模块,是否有内部重试或超时?

  7. A327 的步态确认策略
    切换目标步态后等待多久、检查多少次?是否重发步态命令?什么条件才认定“未切换到目标步态”?

  8. A34B/A34C 的 Planner 原始状态
    请给出 1001/1002/1003/1101/1102/2004/2005/999 的完整枚举名、产生函数、具体判断条件、内部规划次数和时间阈值。尤其需要解释 110111022005 的区别。

  9. A34D 的“20周期”与“30秒”关系
    静态资料存在“20周期未收到 NavCmd”的日志描述,而最终报错分支是持续 30 秒。20周期只是打印日志/早期预警,还是另一个版本的最终阈值?

  10. A405/A408/A40D 的“已重启”责任模块
    谁检测进程/心跳异常,多久未响应,重启几次?错误码是在开始重启时、重启成功后,还是重启失败后返回?Basic_server 当前可见分支只负责映射状态。

  11. A406/A407/A409/A40A/A40E 的源端看门狗条件
    请分别提供监控的 Topic/数据、时间戳阈值、连续次数、恢复清零条件,以及返回状态前是否会清图、暂停规划或重启进程。

  12. A40B/A40C 的全局规划内部条件
    全局规划无路径尝试几次、每次超时多久?目标在障碍物中的判定使用哪张地图、哪个代价值和膨胀半径?是否尝试目标点投影/搜索邻近可达点?

  13. A343/A344/A345 与 ChargeManager 子错误的映射
    ChargeManager 的反光柱超时、进桩障碍、无电流等子错误,最终哪些统一变成 A344,哪些变成 A345?返回前是否发送停止充电、退桩或复位指令?

  14. 00x2302 的状态语义
    ErrorCode 在新任务、取消完成、任务结束后分别何时清零?取消服务失败时最终对 App 保留 A402/A403,还是会被 0x2302 覆盖?