4. 关键日志消息解读:VEHICLE_GLOBAL_POSITION、POSITION_TARGET_GLOBAL_INT、ATTITUDE、LOCAL_POSITION_NED

日志分析的核心,就是读懂飞控在「想什么」和「看到了什么」。今天咱们把这四个最常用的消息彻底讲透。我个人习惯,排查航线执行问题时,先看这四类消息,基本能定位 80% 的故障。

一句话总结:VEHICLE_GLOBAL_POSITION 是飞控的「自认为位置」,POSITION_TARGET_GLOBAL_INT 是飞控的「目标位置」,ATTITUDE 是飞控的「姿态状态」,LOCAL_POSITION_NED 是飞控的「局部坐标系位置」。

4.1 VEHICLE_GLOBAL_POSITION:飞控的「自认为位置」

这个 topic 是飞控融合 GPS、IMU、气压计等传感器后,输出的最佳估计位置。说白了,就是飞控「觉得」自己在哪里。

关键字段:

  • lat / lon:纬度、经度(度 × 1e7)。注意单位!QGC 日志里存的是整数,要除以 1e7 才是标准度数。
  • alt:海拔高度(米)。通常是椭球高,不是相对起飞点高度。
  • relative_alt:相对起飞点高度(米)。这个在航线执行中更常用。
  • vx / vy / vz:地速在 NED 坐标系下的分量(m/s)。
  • eph / epv:水平/垂直位置估计误差(米)。数值越大,说明飞控对当前位置越「没信心」。
我的经验:排查航线偏离问题时,先看 eph 和 epv。如果 eph > 5 米,那飞控的位置本身就有几米误差,航线偏离 2-3 米是正常的。我曾经遇到一个案例,eph 飙到 15 米,飞控还在执行航线,结果飞机直接偏到隔壁地块去了。

4.2 POSITION_TARGET_GLOBAL_INT:飞控的「目标位置」

这个 topic 记录了飞控当前正在追踪的目标点。在航线模式下,它就是下一个航点。在返航模式下,它就是返航点。

关键字段:

  • lat_int / lon_int:目标纬度、经度(度 × 1e7)。
  • alt:目标海拔高度(米)。
  • type_mask:位掩码,指示哪些维度被忽略。比如 bit 0 表示忽略位置,bit 6 表示忽略速度。
  • vx / vy / vz:目标速度(m/s)。
  • afx / afy / afz:目标加速度(m/s²)。
注意:type_mask 的值很关键。如果 type_mask 显示忽略位置(bit 0 = 1),那飞控其实没有在追踪这个目标点,而是在做其他事情(比如悬停、降落)。我见过有人误以为飞控在飞航线,结果 type_mask 显示位置被忽略,飞控其实在悬停。

对比这两个 topic,就能判断飞控是否在「按计划飞行」:

对比项 VEHICLE_GLOBAL_POSITION POSITION_TARGET_GLOBAL_INT
含义 飞控认为的当前位置 飞控要去的目标位置
数据来源 传感器融合(EKF) 航线规划器 / 任务管理器
典型用途 判断飞控是否偏航 判断飞控是否在按航线飞行
异常表现 eph 大、位置跳变 目标点不更新、type_mask 异常

4.3 ATTITUDE:飞控的「姿态状态」

ATTITUDE 消息记录了飞控当前的姿态四元数和角速度。虽然它不直接告诉你位置,但姿态异常往往是位置问题的根源。

关键字段:

  • roll / pitch / yaw:欧拉角(弧度)。注意单位!QGC 日志里是弧度,要转成度才直观。
  • rollspeed / pitchspeed / yawspeed:角速度(rad/s)。
  • time_boot_ms:时间戳(毫秒)。
实战技巧:当飞机出现「画龙」或「震荡」时,先看 ATTITUDE 的 roll 和 pitch 曲线。如果 roll 在 ±5° 内快速抖动,说明飞控在努力保持水平,但可能受风或振动影响。如果 roll 持续偏 10° 以上,那飞控可能已经失控了。

我遇到过最典型的案例:一架六轴在航线中突然偏航 90°,然后开始绕圈。看 ATTITUDE 发现 yaw 在 2 秒内从 0° 跳变到 90°,但 roll 和 pitch 正常。后来发现是 GPS 罗盘受干扰,导致航向估计错误。

4.4 LOCAL_POSITION_NED:飞控的「局部坐标系位置」

这个 topic 把全球坐标转换到了以起飞点为原点的 NED(北东地)坐标系。在分析相对运动时,比全球坐标更直观。

关键字段:

  • x / y / z:北、东、地方向的位置(米)。x 正北,y 正东,z 正下。
  • vx / vy / vz:速度(m/s)。
我的习惯:分析航线执行问题时,我通常把 VEHICLE_GLOBAL_POSITION 和 LOCAL_POSITION_NED 一起看。全球坐标用来判断是否到达航点,局部坐标用来分析飞行轨迹是否平滑。如果全球坐标显示到了航点,但局部坐标的 x/y 还在变化,说明飞控在航点附近「犹豫」。

4.5 四类消息的协同分析

单独看一个 topic 意义不大,关键是把它们串起来。下面这张图展示了它们之间的关系:

四类日志消息协同分析框架 GPS + IMU + 气压计 磁力计 + 空速 EKF 状态估计 (融合 + 预测) 输出:位置/速度/姿态 VEHICLE_GLOBAL_POSITION LOCAL_POSITION_NED ATTITUDE 任务管理器 (航线/返航/悬停) POSITION_TARGET_GLOBAL_INT 对比:实际 vs 目标 分析流程: 1. 看 VEHICLE_GLOBAL_POSITION.eph/epv → 判断位置可信度 2. 看 POSITION_TARGET_GLOBAL_INT.type_mask → 判断飞控是否在追踪目标 3. 对比实际位置与目标位置 → 判断是否偏航 4. 看 ATTITUDE → 判断姿态是否异常导致偏航 5. 看 LOCAL_POSITION_NED → 分析局部轨迹平滑度

4.6 实战案例:一次航线偏离的日志分析

去年有个用户反馈,飞机在执行植保航线时,每次到地头转弯都会偏出去 5-8 米。我让他把日志发过来,按以下步骤分析:

  1. 看 VEHICLE_GLOBAL_POSITION.eph:发现 eph 在转弯时从 1.5 米飙升到 4.8 米。说明 GPS 信号在转弯时变差。
  2. 看 POSITION_TARGET_GLOBAL_INT:目标点正常更新,type_mask 显示位置有效。说明航线规划没问题。
  3. 对比实际位置和目标位置:在转弯点,实际位置比目标位置滞后约 3 米。说明飞控响应慢了。
  4. 看 ATTITUDE:发现 roll 在转弯时达到 35°,但角速度限制被设得很低。说明飞控不敢快速转弯。
结论:问题出在角速度限制参数(MC_YAWRATE_MAX)设置过低,导致转弯太慢,加上 GPS 信号变差,最终偏航。把参数从 45°/s 调到 90°/s 后,问题解决。

你看,四个消息串起来看,问题就清晰了。单独看任何一个,都只能看到冰山一角。