3、传感器标定与校准:加速度计、陀螺仪、磁力计的六面校准方法;气压计温度补偿;传感器数据融合前的预处理

各位同学,大家好。今天我们聊一个非常实在的话题——传感器标定与校准。

说实话,飞控系统里最容易被忽视的就是这一步。很多人拿到传感器,焊好板子,上电就开始调PID。结果飞机在天上乱飘,还以为是控制参数没调好。其实啊,八成是传感器数据本身就有问题。

我个人习惯是:先校准,再调参。这个顺序千万别搞反了。

3.1 加速度计六面校准

加速度计校准,说白了就是让传感器知道「哪个方向是向下」。

为什么要做六面校准?因为加速度计有零偏和尺度因子误差。你想想看,如果传感器静止时输出不是1g,那你的姿态解算从一开始就是错的。

六面校准的具体做法:

  1. 把飞控水平放置,Z轴朝上,记录数据
  2. 翻转180度,Z轴朝下,记录数据
  3. 依次让X轴朝上、X轴朝下、Y轴朝上、Y轴朝下
  4. 每个面保持静止3-5秒

嗯,这里要注意:每次翻转后要等数据稳定再记录。我见过有人手速太快,数据还没稳定就切换了,结果校准出来全是错的。

核心公式:

// 加速度计校准模型
acc_calibrated = (acc_raw - bias) * scale_factor

// 六面法求解bias和scale
// 理想情况下:|acc| = 1g
// 实际测量:|acc_raw - bias| * scale = 1g

我在项目中遇到过一个问题:某款IMU的加速度计在低温下零偏会漂移。后来我加了一个温度补偿表,才把问题解决。这个后面会讲到。

3.2 陀螺仪零偏校准

陀螺仪校准比加速度计简单一些。核心就是一句话:静止时输出应该为零

具体做法:

  • 飞控静止不动,采集100-200个样本
  • 取平均值作为零偏值
  • 后续每个数据减去这个零偏

我的经验:陀螺仪零偏会随温度变化。如果你在25℃的室内校准,拿到40℃的室外飞,零偏可能已经变了。建议做温度补偿,或者上电后等几分钟让传感器温度稳定。

我曾经有一次在冬天调试,陀螺仪零偏校准后直接起飞,结果飞机缓慢自旋。查了半天,原来是传感器还没预热,零偏一直在漂。从那以后,我每次上电都会等30秒再校准。

3.3 磁力计校准

磁力计校准,嗯,这个比较麻烦。因为磁场环境太复杂了。

硬磁干扰 vs 软磁干扰:

干扰类型 来源 表现 校准方法
硬磁干扰 电机、扬声器、铁磁材料 数据整体偏移 减去偏移量
软磁干扰 PCB走线、附近金属 数据椭圆变形 椭球拟合校正

标准校准流程:

  1. 找一个空旷的地方,远离金属和磁场源
  2. 手持飞控,做「∞」字形旋转
  3. 确保覆盖所有姿态
  4. 采集数据后做椭球拟合

警告:不要在室内校准磁力计!钢筋水泥会严重干扰磁场。我见过有人在校准后飞航线,结果航向偏差了20度,差点炸机。

磁力计校准的代码实现:

// 椭球拟合校准
// 输入:原始磁力计数据 (mx, my, mz)
// 输出:校准后的数据

// 1. 计算偏移量
offset_x = (max_x + min_x) / 2;
offset_y = (max_y + min_y) / 2;
offset_z = (max_z + min_z) / 2;

// 2. 计算缩放因子
scale_x = (max_x - min_x) / 2;
scale_y = (max_y - min_y) / 2;
scale_z = (max_z - min_z) / 2;

// 3. 校准
mx_cal = (mx - offset_x) / scale_x;
my_cal = (my - offset_y) / scale_y;
mz_cal = (mz - offset_z) / scale_z;

3.4 气压计温度补偿

气压计这个东西,对温度极其敏感。你用手摸一下,读数就能跳好几米。

温度补偿的原理:

大多数气压计芯片内部都有温度传感器。我们可以利用它来做补偿。

我常用的方法:

  • 在静止状态下,记录不同温度下的气压值
  • 拟合出温度-气压偏移曲线
  • 实时根据温度查表或计算补偿值

实用技巧:如果你用的是MS5611或BMP280这类芯片,芯片手册里通常有温度补偿公式。直接套用就好,比自己拟合准确得多。

我曾经在无人机上遇到过一个问题:起飞前气压计高度稳定,飞到空中后高度开始缓慢漂移。排查后发现是飞控板上的电源芯片发热,导致气压计温度升高。后来我在气压计上方加了一个隔热海绵,问题就解决了。

3.5 传感器数据融合前的预处理

数据预处理,说白了就是「把脏数据洗干净」。这一步做不好,后面的卡尔曼滤波、互补滤波都是白搭。

预处理流程:

  1. 异常值剔除:用3σ原则或中值滤波,去掉明显错误的数据点
  2. 低通滤波:去除高频噪声,尤其是加速度计和陀螺仪
  3. 时间对齐:不同传感器的采样频率不同,需要插值或同步
  4. 坐标系对齐:确保所有传感器数据在同一坐标系下

嗯,这里我特别想强调一下时间对齐的问题。很多飞控代码里,IMU数据是1000Hz,磁力计是100Hz,气压计是50Hz。如果你不做时间对齐,融合出来的姿态会有滞后。

我的做法:用一个环形缓冲区存储IMU数据,当磁力计或气压计数据到来时,取时间戳最接近的IMU数据做融合。这样能最大程度减少时间错位带来的误差。

预处理代码示例:

// 一阶低通滤波
float lowpass_filter(float input, float prev_output, float alpha) {
    return alpha * input + (1 - alpha) * prev_output;
}

// 异常值检测(3σ原则)
bool is_outlier(float value, float mean, float std) {
    return fabs(value - mean) > 3 * std;
}

// 时间对齐(线性插值)
float linear_interp(float t1, float v1, float t2, float v2, float t) {
    return v1 + (v2 - v1) * (t - t1) / (t2 - t1);
}

3.6 本章知识体系

下面这张图总结了传感器标定与校准的完整流程。你可以把它当作一个检查清单,每次调试时对照着做一遍。

传感器标定与校准知识体系 传感器标定与校准 加速度计六面校准 陀螺仪零偏校准 磁力计椭球校准 气压计温度补偿 零偏校准 尺度因子校准 六面翻转法 静止采集 均值计算 温度补偿 硬磁补偿 软磁补偿 椭球拟合 温度-气压曲线 查表补偿 隔热措施 数据融合前预处理 异常值剔除 低通滤波 时间对齐 坐标系对齐

好了,这一章的内容就到这里。传感器标定是飞控调试的基石,千万别图省事跳过。下一章我们会聊姿态解算,到时候这些校准好的数据就要派上用场了。


公众号:蓝海资料掘金营,微信deep3321