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 状态 |
新导航任务下发前 |
自主充电状态处于进桩或退桩阶段(内部状态 1 或 3) |
当前检查立即 |
拒绝新导航任务 |
不是“向自主充电模块下发任务调用失败”,而是充电流程占用期间不允许下发普通导航 |
已确认 |
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 原始状态 1101、1102,或被持续异常分支兜底映射的状态(包括观察到的 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. 待解释的问题
A302 阈值冲突
1.1.8.7 的 basic_server 1.2.65 实现是“所有电池 ≤5%”,现有错误码表写“低于20%”。20% 是其他版本、App 预检查、任务策略阈值,还是文档错误?
A301 中“摔倒”的真实链路
Basic_server 直接判断的是 MotionStatus == JointDamping(2)。摔倒是否由 Motion 模块先识别并切成状态 2?摔倒的原始条件、持续时间和次数分别是什么?
A303 是否只指电机过温
当前看到的是 mHasMotorFault_,而它可能由多个关节 status_word 异常置位。哪些 bit 会让导航返回 A303?是否所有电机故障都映射此码,还是仅过温?
A305 两个雷达状态字段的确切含义
代码要求两个状态都为 1,失败后等 2 秒再查一次。两个字段分别对应前/后雷达运行态、点云接收态,还是电源态?ExceptionHandle 的雷达异常标志又由什么条件、连续多少帧置位和清除?
A312 的原始枚举
Planner 正常值 999、GlobalPlanner 正常值 0。所有非正常值都报 A312 吗?哪些值代表“通讯异常”,哪些只是模块未就绪、无地图或任务状态未复位?
A314 的 VMap 状态枚举
非 0 就在下发前失败。各非零值分别是什么,来自哪个 Topic/模块,是否有内部重试或超时?
A327 的步态确认策略
切换目标步态后等待多久、检查多少次?是否重发步态命令?什么条件才认定“未切换到目标步态”?
A34B/A34C 的 Planner 原始状态
请给出 1001/1002/1003/1101/1102/2004/2005/999 的完整枚举名、产生函数、具体判断条件、内部规划次数和时间阈值。尤其需要解释 1101、1102、2005 的区别。
A34D 的“20周期”与“30秒”关系
静态资料存在“20周期未收到 NavCmd”的日志描述,而最终报错分支是持续 30 秒。20周期只是打印日志/早期预警,还是另一个版本的最终阈值?
A405/A408/A40D 的“已重启”责任模块
谁检测进程/心跳异常,多久未响应,重启几次?错误码是在开始重启时、重启成功后,还是重启失败后返回?Basic_server 当前可见分支只负责映射状态。
A406/A407/A409/A40A/A40E 的源端看门狗条件
请分别提供监控的 Topic/数据、时间戳阈值、连续次数、恢复清零条件,以及返回状态前是否会清图、暂停规划或重启进程。
A40B/A40C 的全局规划内部条件
全局规划无路径尝试几次、每次超时多久?目标在障碍物中的判定使用哪张地图、哪个代价值和膨胀半径?是否尝试目标点投影/搜索邻近可达点?
A343/A344/A345 与 ChargeManager 子错误的映射
ChargeManager 的反光柱超时、进桩障碍、无电流等子错误,最终哪些统一变成 A344,哪些变成 A345?返回前是否发送停止充电、退桩或复位指令?
0 和 0x2302 的状态语义
ErrorCode 在新任务、取消完成、任务结束后分别何时清零?取消服务失败时最终对 App 保留 A402/A403,还是会被 0x2302 覆盖?