1. 课程导入
做飞控这么多年,我见过太多新手上来就急着调PID、改参数,结果飞机一起飞就偏航、漂移,甚至直接翻车。其实问题的根源往往不在控制算法,而在传感器——你给飞控的“眼睛”本身就是歪的,它怎么可能飞得直?
说白了,传感器校准就是给飞控配一副度数准确的眼镜。今天这章,我们就来聊聊校准这件事到底有多重要,以及那些藏在传感器里的“误差”到底从哪来。
核心观点:未经校准的传感器,数据误差可能高达 5%-10%。对于需要厘米级定位的无人机来说,这足以让一切控制算法失效。
1.1 为什么校准是飞控的第一道门槛?
我个人的习惯是:拿到一块新的飞控板,第一件事不是通电,而是先看传感器型号和 datasheet。为什么?因为每个传感器出厂时都有个体差异,温度特性、零偏、灵敏度都不一样。校准的目的,就是把这些“个性”抹掉,让飞控看到一个统一的、真实的世界。
举个例子。加速度计如果没校准,悬停时飞控会以为自己在倾斜,于是它拼命调整电机转速去“纠正”这个不存在的倾斜。结果就是飞机来回晃,越调越乱。你想想看,这跟一个人戴着歪眼镜走路有什么区别?
校准的重要性可以归纳为三点:
- 消除系统误差:让传感器输出接近真实物理量
- 提高控制精度:减少姿态估计的偏差,让PID控制有可靠输入
- 保障飞行安全:避免因传感器数据异常导致的失控、炸机
我的经验:在 ArduPilot 里,每次固件升级后我都建议重新做一次传感器校准。别偷懒,我踩过这个坑——升级后忘了校准,结果第一次试飞就偏了 15 度,差点炸机。
1.2 传感器误差从哪来?三大元凶
传感器的误差不是凭空产生的。搞懂它们的来源,你才能知道校准到底在“校”什么。我把最常见的误差归纳为三类:零偏、尺度因子、正交误差。
1.2.1 零偏(Bias)
零偏是最常见、也最直观的误差。简单说就是:传感器在没有任何输入时,输出不为零。
比如加速度计平放在桌面上,理论上 Z 轴应该输出 1g(9.8 m/s²),X、Y 轴输出 0。但实际读出来可能是 X=0.05、Y=-0.03、Z=0.98。这多出来的 0.05 和 -0.03 就是零偏。
为什么会这样?传感器内部的电路噪声、制造公差、温度漂移都会导致零偏。我记得有一次在冬天做户外测试,零偏值比室内高了将近一倍——温度对 MEMS 传感器的影响真的很大。
| 传感器类型 | 典型零偏范围 | 校准后残余 |
|---|---|---|
| 加速度计 | ±50 mg | < 5 mg |
| 陀螺仪 | ±5 °/s | < 0.1 °/s |
| 磁力计 | ±100 mGauss | < 10 mGauss |
1.2.2 尺度因子(Scale Factor)
尺度因子误差,说白了就是“放大倍数不准”。传感器内部会把物理量转换成电信号,再通过 ADC 变成数字量。这个转换比例如果偏离了设计值,就会产生尺度因子误差。
举个例子。理论上 1g 的加速度应该对应 1000 个 LSB(数字量),但实际可能是 1020 或 980。这意味着你读到的数值和真实值之间有一个固定的比例偏差。
在 ArduPilot 里,尺度因子校准通常通过六面校准法来完成——让传感器在六个标准姿态下采集数据,然后反算出真实的尺度因子。嗯,这里要注意:如果传感器安装有倾斜,六面校准的结果会包含安装误差,需要额外处理。
避坑指南:我曾经遇到过一块飞控板,加速度计尺度因子偏差达到 8%。查了半天才发现是焊接时温度过高,导致传感器内部结构发生了微变形。所以,焊接传感器时一定要控制温度和时间。
1.2.3 正交误差(Orthogonality Error)
正交误差这个概念,很多新手容易忽略。理想情况下,传感器的 X、Y、Z 三个轴应该是互相垂直的。但实际制造中,三个轴不可能做到绝对 90° 正交,总会有一点点偏差——这就是正交误差。
正交误差的影响有多大?我算给你看:如果 Z 轴和 X 轴之间有 1° 的偏差,当 Z 轴感受到 1g 时,X 轴会串扰进来大约 17.5 mg 的虚假信号。对于需要高精度姿态估计的应用,这个误差已经不可接受了。
正交误差的校准比较复杂,通常需要转台或高精度参考设备。在 ArduPilot 里,加速度计的正交校准时通过“旋转法”来完成的——让飞控绕每个轴旋转,采集数据后通过最小二乘法拟合出正交矩阵。
// ArduPilot 中加速度计正交校准的核心代码片段
// 通过采集多个姿态下的数据,构建超定方程求解
// 校准矩阵 = inv(测量值矩阵) * 真实值矩阵
void AP_AccelCal::calculate_calibration() {
// 构建观测矩阵 H
// H * [scale_x, scale_y, scale_z, bias_x, bias_y, bias_z]^T = [1, 1, 1]^T
// 使用最小二乘法求解
for (uint8_t i = 0; i < _num_samples; i++) {
// 每个样本对应一个姿态
// 理想情况下,加速度模长应为 1g
// 实际测量值包含零偏、尺度因子、正交误差
}
}
1.3 三种误差的叠加效应
这三种误差不是独立存在的。它们会叠加、耦合,最终让传感器输出严重偏离真实值。我画了一张图,帮你理清它们之间的关系。
从这张图可以看得很清楚:真实物理量经过传感器后,被零偏、尺度因子、正交误差三重“污染”,最终输出的数据已经面目全非。校准的任务,就是建立一个逆模型,把这些污染一一去除。
1.4 校准的数学本质
从数学角度看,传感器校准其实是在求解一个线性方程组。对于三轴传感器,校准模型可以写成:
真实值 = 校准矩阵 × (测量值 - 零偏)
其中:
- 校准矩阵是一个 3×3 矩阵,包含尺度因子和正交校正
- 零偏是一个 3×1 向量
- 测量值是传感器原始输出
说白了,我们需要找到 12 个未知数(3 个零偏 + 9 个矩阵元素)。这就是为什么校准需要采集多个姿态下的数据——方程数量必须大于未知数数量,才能用最小二乘法求解。
实用技巧:在 ArduPilot 里做加速度计校准时,我建议每个面至少停留 2 秒,让数据稳定。采集 6 个面(上、下、左、右、前、后)的数据就够用了。如果条件允许,再加 4 个对角姿态,精度会更好。
1.5 什么时候需要重新校准?
校准不是一劳永逸的。根据我的经验,以下情况必须重新校准:
- 飞控硬件更换或维修后——哪怕只是换了一颗螺丝
- 固件版本大版本升级后——校准算法可能变了
- 环境温度变化超过 20°C——MEMS 传感器对温度敏感
- 飞行中出现异常偏航、漂移——先别调 PID,先检查校准
- 每次炸机修复后——结构变形可能导致传感器位置偏移
我曾经犯过的错:有一次飞控在低温环境下(-10°C)飞得好好的,回到室内(25°C)再飞就开始漂。我折腾了两天,最后发现是温度变化导致零偏漂移了。从那以后,我每次跨温度区间飞行前都会重新做一次快速校准。
1.6 本章小结
传感器校准是飞控系统最基础、也最容易被忽视的一环。零偏、尺度因子、正交误差这三座大山,如果不搬走,后面的所有控制算法都是在沙子上盖楼。
记住一句话:校准不是可选项,是必选项。花 5 分钟做校准,可能帮你省下 5 小时的排故时间。这笔账,怎么算都划算。