3. 关键消息类型(上):HEARTBEAT、STATUSTEXT、SYS_STATUS,解读飞控健康状态

拿到日志文件,别急着翻到最后看错误码。我个人的习惯是,先看飞控的“心电图”——也就是 HEARTBEAT 消息。它就像人的脉搏,有没有在跳、跳得规不规律,直接告诉你飞控是不是还活着。

这一章,咱们就聚焦三个最基础、也最关键的消息类型。你把这三种消息看懂了,飞控的“生老病死”基本就能摸个七七八八。

3.1 HEARTBEAT:飞控的“心跳”信号

HEARTBEAT 是 MAVLink 协议里最基础的消息,没有之一。飞控只要上电正常运行,就会以固定频率(通常是 1Hz,也就是每秒一次)往外广播这条消息。

它的核心作用就两个:宣告存在 和 报告状态。

咱们来看看它的关键字段:

字段名 含义 常见值(解锁失败场景)
type 飞控类型 MAV_TYPE_QUADROTOR (2) 或 MAV_TYPE_HELICOPTER (3)
autopilot 飞控固件类型 MAV_AUTOPILOT_ARDUPILOTMEGA (3) 或 PX4 (12)
system_status 飞控系统状态 MAV_STATE_STANDBY (3) 或 MAV_STATE_ACTIVE (4)
mavlink_version 协议版本 2

这里最值得你盯住的,就是 system_status 字段。

解锁失败的关键线索:

如果日志里飞控一直在广播 MAV_STATE_STANDBY (3),而不是你期望的 MAV_STATE_ACTIVE (4),那基本可以断定——飞控根本没进入解锁后的“活跃”状态。

说白了,它还在待机,等着你解决某个前置条件。

我记得有一次排查一个客户的日志,HEARTBEAT 里的 system_status 一直在 STANDBY 和 CALIBRATING 之间来回跳。我当时就纳闷,这飞控怎么在反复校准?后来一查,原来是加速度计 Z 轴数据飘得离谱,飞控每次自检都过不去,又退回到校准状态。你看,一个 HEARTBEAT 就能把问题范围缩小很多。

3.2 STATUSTEXT:飞控的“自言自语”

HEARTBEAT 告诉你飞控“活着”,但没告诉你它“在想什么”。这时候就需要 STATUSTEXT 消息登场了。

STATUSTEXT 就是飞控的日志输出。它把内部运行时的关键信息、警告、错误,以文本形式发出来。你想想看,这就像飞控在跟你说话:“GPS 搜星中”、“磁罗盘干扰过大”、“EKF 定位精度不足”……

它的结构很简单:

字段名 含义 说明
severity 严重等级 EMERGENCY (0) 到 DEBUG (7),数字越小越严重
text 文本内容 最长 50 个字符的字符串

在解锁失败的分析中,STATUSTEXT 是绝对的“破案主力”。

我的分析习惯:

拿到日志后,我会先用工具过滤出所有 severity 小于等于 3(WARNING)的 STATUSTEXT 消息。然后按时间顺序排列,看看在解锁指令发出前后,飞控到底抱怨了什么。

这比漫无目的地翻看几百 MB 的日志高效得多。

举个例子,你可能会看到这样的文本:

Pre-arm: Compass not healthy
Pre-arm: AHRS not ready
Pre-arm: GPS 3D fix required
EKF check: variance too high
Baro calibration required

这些信息几乎直接告诉了你解锁失败的原因。我曾经遇到过一个案例,日志里反复出现 Pre-arm: Check FS_THR_VALUE。客户百思不得其解,油门值明明设对了。我仔细一看,原来是他在参数列表里把 FS_THR_VALUE

注意:

STATUSTEXT 的文本内容是固件开发者写的,不同固件(ArduPilot、PX4)的提示语可能不一样。比如 ArduPilot 喜欢用 Pre-arm: 开头,而 PX4 可能直接写 Arming denied: ...。你需要熟悉你所用固件的“说话方式”。

3.3 SYS_STATUS:飞控的“体检报告”

如果说 HEARTBEAT 是心跳,STATUSTEXT 是抱怨,那 SYS_STATUS 就是一份全面的体检报告。它把飞控各个子系统的健康状况用数字量化出来。

这个消息里有两个位掩码字段,非常关键:

字段名 含义 如何解读
onboard_control_sensors_present 飞控上安装了哪些传感器 每个 bit 代表一种传感器,1 表示存在
onboard_control_sensors_enabled 哪些传感器被启用 每个 bit 代表一种传感器,1 表示启用
onboard_control_sensors_health 哪些传感器健康 每个 bit 代表一种传感器,1 表示健康

你想想看,这三个字段一组合,就能回答三个问题:

  • 装了啥?(present)
  • 开了啥?(enabled)
  • 啥是好的?(health)

在解锁失败时,我通常会重点关注 onboard_control_sensors_health 这个字段。如果某个传感器的 health bit 是 0,那它很可能就是“罪魁祸首”。

常见的传感器 bit 定义如下:

Bit 位置 传感器 解锁失败常见原因
0 陀螺仪 校准数据丢失、硬件故障
1 加速度计 校准数据丢失、数值超出范围
2 磁罗盘 干扰过大、未校准
3 气压计 数据异常、未校准
4 GPS 未搜到星、3D 定位失败
5 光流 硬件故障、数据无效
10 GPS 罗盘 GPS 航向未收敛

嗯,这里要注意,不同固件对 health 的判断逻辑略有差异。比如 ArduPilot 在 GPS 未锁定前,会把 GPS 的 health bit 置 0,这是正常的。但 PX4 可能会在 EKF 初始化完成前,把多个传感器的 health 都置 0。你需要结合 STATUSTEXT 一起看,才能准确判断。

3.4 三剑客联动:一个完整的分析案例

光讲理论没意思。咱们来模拟一个真实的排查过程。

假设你收到一份日志,解锁失败。你会怎么做?

  1. 先看 HEARTBEAT: 确认飞控在跑,system_status 是 STANDBY。嗯,没死机,但也没解锁。
  2. 再看 STATUSTEXT: 过滤出 WARNING 级别以上的消息。你看到一条:Pre-arm: Compass health poor。好,问题指向磁罗盘。
  3. 最后查 SYS_STATUS: 找到对应时间点的 onboard_control_sensors_health 字段。你发现 bit 2(磁罗盘)是 0。确认了,就是磁罗盘不健康。

整个过程不到 5 分钟。你不需要看任何曲线,不需要复杂的数学计算。三个消息一联动,问题就锁定了。

下面这张图,就是这三个消息在分析流程中的关系:

HEARTBEAT、STATUSTEXT、SYS_STATUS 联动分析流程 获取解锁失败日志 第一步:检查 HEARTBEAT.system_status 状态 = STANDBY? 是 第二步:过滤 STATUSTEXT 警告 第三步:验证 SYS_STATUS.health 否(ACTIVE) 排查其他原因 飞控已解锁,但电机不转? 检查油门、电调、电池

你看,整个流程非常清晰。从 HEARTBEAT 确认状态,到 STATUSTEXT 定位方向,再到 SYS_STATUS 验证细节。这三板斧下去,大部分解锁失败问题都能找到头绪。

我个人建议,你在分析日志时,把这三种消息的窗口固定在你的分析工具里。它们是你和飞控沟通的“第一语言”。