2. 电机解锁失败的初步诊断:检查仿真终端输出日志,识别关键错误码
仿真跑起来了,遥控器也连上了,解锁开关一拨——电机纹丝不动。这时候别急着怀疑硬件,也别反复重启。我个人的习惯是:先看终端日志。说白了,SITL 的终端输出就是飞控的「黑匣子」,它已经把失败原因写在脸上了。
这一节我们就来聊聊,怎么从一堆滚屏信息里,快速揪出导致解锁失败的真凶。
2.1 终端日志里到底有什么?
启动 SITL 后,终端会持续输出大量调试信息。你可能会觉得眼花缭乱,但其实只需要关注几个关键区域。我把日志内容大致分成了三类:
| 日志类型 | 典型前缀 | 说明 |
|---|---|---|
| 系统初始化 | [INFO]、[SYS] |
飞控启动、传感器校准、参数加载 |
| 状态切换 | [STATUS]、[ARMING] |
解锁/上锁、飞行模式切换 |
| 错误与警告 | [FAIL]、[ERR]、PreArm: |
解锁失败的直接原因、EKF 报错 |
当你拨动解锁开关后,如果看到 [FAIL] 或 PreArm: 开头的行,恭喜你,找到线索了。
小技巧: 在终端里用
grep 过滤关键词,能省不少时间。比如 ./sim_vehicle.py -v ArduCopter | grep -E "PreArm|FAIL|EKF",这样只显示关键行。
2.2 最常见的「PreArm 失败」
PreArm 是飞控解锁前的最后一道安检。它检查的项目很多,任何一个不通过,都会直接阻止解锁。我遇到过最多次的,就是下面这几个:
- Bad GPS Position —— GPS 定位无效或精度太低。仿真里经常因为模拟 GPS 信号没稳定就急着解锁。
- Compass not healthy —— 磁力计数据异常。检查一下仿真参数里是否启用了磁力计,或者磁场干扰设置是否合理。
- Accels not healthy —— 加速度计自检失败。通常是仿真启动时加速度计初始化没完成,等几秒再试。
- Throttle not zero —— 油门不在最低位。检查遥控器校准,或者仿真里油门通道的初始值。
- RC not calibrated —— 遥控器通道未校准。这个在 SITL 里很容易忽略,记得先跑一遍
rc_calibration。
日志里会直接打印出具体是哪一项失败,比如:
PreArm: Bad GPS Position
PreArm: Compass not healthy
看到这种信息,直接对症下药就行。
注意: 有时候 PreArm 失败会连续报好几条。别只看第一条,后面的可能才是根因。我曾经被一条「Bad GPS Position」误导了半天,结果发现后面跟着的「EKF check failed」才是真问题。
2.3 EKF 报错:飞控的「内伤」
EKF(扩展卡尔曼滤波器)是飞控的状态估计核心。它一旦报错,说明飞控对自己的位置、速度、姿态都没信心了。这种情况下,飞控绝对不会允许解锁。
常见的 EKF 报错信息有:
| 日志信息 | 含义 | 常见原因 |
|---|---|---|
EKF check failed |
EKF 内部一致性检查不通过 | 传感器数据冲突,比如 GPS 和 IMU 打架 |
EKF variance too high |
状态估计方差过大,飞控认为不可信 | 初始化阶段、传感器噪声过大、缺少观测数据 |
EKF origin not set |
EKF 原点未初始化 | GPS 定位失败或仿真启动顺序不对 |
我记得有一次做仿真,GPS 信号明明显示正常,但 EKF 就是报方差过高。折腾了半天,发现是仿真里 IMU 的噪声参数设得太离谱了。你想想看,飞控觉得自己的加速度计数据都是「抖」的,它怎么敢解锁?
2.4 诊断流程:三步定位法
面对一堆日志,别慌。我总结了一个简单的三步流程,基本能覆盖 90% 的情况。
- 第一步:过滤关键行 —— 用
grep或手动搜索PreArm、FAIL、ERR、EKF。 - 第二步:按优先级排查 —— 先看 PreArm 失败的具体原因,再看 EKF 报错。PreArm 失败通常更直接。
- 第三步:检查参数与仿真环境 —— 如果日志没有明确错误,但就是解锁不了,检查一下
ARMING_CHECK参数是否设为了 0(跳过所有检查),或者仿真环境是否缺少必要的传感器数据。
核心原则: 日志不会骗人。如果它说「Bad GPS Position」,那就别怀疑是遥控器的问题。先解决 GPS,再谈其他。
2.5 一张图看懂诊断逻辑
下面这张流程图,把刚才说的诊断思路串起来了。你可以把它贴在工位旁边,遇到问题照着走一遍。
2.6 避坑指南:我踩过的几个坑
最后分享几个实战中容易忽略的点,希望能帮你少走弯路。
- 仿真启动顺序很重要。 先启动 SITL,等飞控初始化完成(看到
Ready to fly或类似信息),再连接地面站和遥控器。我曾经一启动就急着解锁,结果 PreArm 报了一堆错,其实只是飞控还没准备好。 - 参数
ARMING_CHECK别乱改。 有些教程为了省事,让你把这个参数设为 0 来跳过所有检查。嗯,这里要注意:这相当于拆掉了飞控的安全带。调试时可以临时用一下,但千万别养成习惯。 - 日志里没有错误,但就是解锁不了? 检查一下遥控器的解锁通道设置。我遇到过好几次,解锁开关映射的通道不对,飞控根本没收到解锁信号。用
rc --channel 5之类的命令看看通道值变化,比瞎猜快得多。
个人经验: 每次遇到解锁失败,我都会先看一眼日志里有没有
PreArm: 开头的行。如果有,90% 的问题都能在 5 分钟内定位。剩下的 10%,再去看 EKF 和参数设置。这个习惯帮我省了不少时间。