日志采集:传感器数据采集

飞行器的「感知」全靠传感器。IMU、GPS、气压计,这三个是核心。说白了,它们就是飞行器的眼睛、耳朵和平衡感。日志里记录的所有状态变化,源头都在这。

我刚开始做飞控的时候,总觉得传感器数据嘛,读出来就行了。后来摔过几次机,才明白——采集这步要是没做好,后面分析日志全是白搭。

IMU:惯性测量单元

IMU 包含加速度计和陀螺仪。加速度计测三轴加速度,陀螺仪测三轴角速度。这两个数据一结合,就能算出飞行器的姿态。

嗯,这里要注意:IMU 的数据是「相对变化」。它告诉你「现在比刚才转了多少度」,但不知道「现在绝对朝向哪」。所以需要融合其他传感器来修正漂移。

关键参数:

  • 加速度计量程:±2g / ±4g / ±8g / ±16g(选型看飞行器机动强度)
  • 陀螺仪量程:±250°/s / ±500°/s / ±1000°/s / ±2000°/s
  • 输出频率:常见 100Hz ~ 1000Hz

我在项目中遇到过一个问题:某款 IMU 在 200Hz 输出时,数据偶尔会跳变。查了半天,发现是 SPI 时钟线受电机干扰。后来加了屏蔽,问题解决。所以日志里看到 IMU 数据异常,别急着怀疑传感器坏了,先看看电气环境。

GPS:全球定位系统

GPS 提供位置、速度、时间。精度取决于卫星数量、信号质量、差分校正。

普通 GPS 定位精度在 2~5 米。RTK(实时动态差分)可以到厘米级。但 RTK 需要地面基站,不是所有场景都能用。

GPS 模式 水平精度 更新频率 适用场景
单点定位 2~5 m 1~10 Hz 普通飞行、航线规划
DGPS 0.5~1 m 1~10 Hz 农业、测绘
RTK 0.01~0.05 m 5~20 Hz 精密起降、建图

GPS 有个致命弱点:更新频率低。1Hz 的 GPS,两次数据间隔 1 秒。这 1 秒里飞行器能飞出去几十米。所以 GPS 不能单独用于姿态控制,必须和 IMU 融合。

避坑指南:我曾经在楼群密集区试飞,GPS 信号被遮挡,定位漂了 20 多米。日志里看位置数据,突然跳到一个完全不对的地方。后来我养成了习惯:每次起飞前先看 GPS 的 HDOP(水平精度因子),低于 1.0 才解锁。

气压计:高度测量

气压计通过测量大气压力推算高度。原理很简单:气压随高度增加而降低。但实际用起来,坑不少。

气压计精度受温度影响很大。太阳直射下,传感器温度升高,读数会漂。我见过一个案例:飞行器悬停时,气压计高度数据每分钟漂移 2 米。日志里看高度曲线,像波浪一样上下起伏。

解决办法?加遮光罩、做温度补偿、或者用卡尔曼滤波融合 IMU 的垂直加速度。

我的习惯:气压计数据一定要做滑动平均滤波。窗口大小取 5~10 个样本。这样能滤掉风噪和瞬时扰动,但不会过度平滑导致响应延迟。

采集频率与精度

采集频率决定了你能看到多快的变化。奈奎斯特定理说,采样频率至少是信号最高频率的两倍。但实际工程中,我一般取 5~10 倍。

举个例子:飞行器姿态震荡频率约 5~10Hz。IMU 采集频率至少要 50Hz,我通常设 200Hz。GPS 更新慢,1~10Hz 就够了。气压计 20~50Hz 比较合适。

精度方面,别盲目追求高精度。16 位 ADC 和 24 位 ADC 的差别,在普通飞行中根本体现不出来。反而高精度传感器对噪声更敏感,数据抖动更大。

传感器 推荐采集频率 典型精度 常见问题
IMU 100~400 Hz 加速度 0.01g,角速度 0.1°/s 零偏漂移、温度漂移
GPS 1~10 Hz 位置 2~5 m,速度 0.1 m/s 信号遮挡、多路径效应
气压计 20~50 Hz 高度 0.1~0.5 m 温度漂移、风压干扰

数据同步问题

这是个大坑。三个传感器采集时间不同步,融合出来的数据就是错的。

IMU 最快,GPS 最慢。假设 IMU 在 t=0 时刻采集,GPS 在 t=0.05 秒采集。融合时如果不做时间对齐,姿态和位置就对应不上。飞行器在转弯时,姿态已经变了,位置数据还是转弯前的。结果就是控制发散。

我常用的同步方法有两种:

  1. 硬件同步:用同一个时钟源触发所有传感器。精度最高,但硬件设计复杂。
  2. 软件插值:以 IMU 时间戳为基准,对 GPS 和气压计数据做线性插值或样条插值。简单实用,但精度取决于插值模型。

代码示例:GPS 数据插值到 IMU 时间戳

// 伪代码:线性插值
// gps_t1, gps_t2: GPS 前后两个时间戳
// gps_pos1, gps_pos2: 对应的位置
// imu_t: 当前 IMU 时间戳

float alpha = (imu_t - gps_t1) / (gps_t2 - gps_t1);
float interp_pos = gps_pos1 + alpha * (gps_pos2 - gps_pos1);

我曾经在日志里发现一个奇怪现象:飞行器明明在平飞,但融合后的高度却在波动。查了三天,发现是气压计和 IMU 的时间戳差了 20 毫秒。20 毫秒啊,在普通飞行中可能不明显,但在剧烈机动时,误差会被放大。

注意:时间戳本身也可能有误差。如果使用微秒级计时器,要确保时钟源稳定。我遇到过晶振温漂导致时间戳偏移的情况,后来换成了 TCXO(温度补偿晶振)。

知识体系总览

下面这张图,把传感器采集的核心逻辑串起来了。从原始数据到日志记录,每一步都有坑,每一步都需要你心里有数。

传感器数据采集知识体系 传感器数据采集核心逻辑 IMU 加速度 + 角速度 GPS 位置 + 速度 + 时间 气压计 气压 → 高度 100~400 Hz 1~10 Hz 20~50 Hz 数据同步 硬件同步 / 软件插值 传感器融合 → 日志记录 卡尔曼滤波 / 互补滤波 核心:采集频率决定时间分辨率,同步精度决定融合质量 日志里看到异常数据,先检查采集和同步环节

传感器采集这块,说白了就是三个字:快、准、齐。快——采集频率够高;准——精度满足需求;齐——数据时间对齐。任何一个环节出问题,日志分析都会走弯路。

我个人习惯是,每次拿到新飞行器的日志,先看传感器数据的时间戳是否连续、是否有跳变。这一步能筛掉 80% 的数据质量问题。剩下的,才是真正的飞行状态分析。