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% 的情况。

  1. 第一步:过滤关键行 —— 用 grep 或手动搜索 PreArm、FAIL、ERR、EKF。
  2. 第二步:按优先级排查 —— 先看 PreArm 失败的具体原因,再看 EKF 报错。PreArm 失败通常更直接。
  3. 第三步:检查参数与仿真环境 —— 如果日志没有明确错误,但就是解锁不了,检查一下 ARMING_CHECK 参数是否设为了 0(跳过所有检查),或者仿真环境是否缺少必要的传感器数据。
核心原则: 日志不会骗人。如果它说「Bad GPS Position」,那就别怀疑是遥控器的问题。先解决 GPS,再谈其他。

2.5 一张图看懂诊断逻辑

下面这张流程图,把刚才说的诊断思路串起来了。你可以把它贴在工位旁边,遇到问题照着走一遍。

电机解锁失败诊断流程图 电机解锁失败诊断流程图 解锁失败 检查终端日志 PreArm 失败 EKF 报错 常见原因 • Bad GPS Position • Compass not healthy • Throttle not zero 常见原因 • EKF check failed • Variance too high • Origin not set 对症下药,解决问题

2.6 避坑指南:我踩过的几个坑

最后分享几个实战中容易忽略的点,希望能帮你少走弯路。

  • 仿真启动顺序很重要。 先启动 SITL,等飞控初始化完成(看到 Ready to fly 或类似信息),再连接地面站和遥控器。我曾经一启动就急着解锁,结果 PreArm 报了一堆错,其实只是飞控还没准备好。
  • 参数 ARMING_CHECK 别乱改。 有些教程为了省事,让你把这个参数设为 0 来跳过所有检查。嗯,这里要注意:这相当于拆掉了飞控的安全带。调试时可以临时用一下,但千万别养成习惯。
  • 日志里没有错误,但就是解锁不了? 检查一下遥控器的解锁通道设置。我遇到过好几次,解锁开关映射的通道不对,飞控根本没收到解锁信号。用 rc --channel 5 之类的命令看看通道值变化,比瞎猜快得多。
个人经验: 每次遇到解锁失败,我都会先看一眼日志里有没有 PreArm: 开头的行。如果有,90% 的问题都能在 5 分钟内定位。剩下的 10%,再去看 EKF 和参数设置。这个习惯帮我省了不少时间。