1. 传感器校准基础:为什么需要校准?校准的物理意义与数学原理
1.1 校准到底在解决什么问题?
说实话,我刚入行那会儿,觉得传感器校准就是个形式。把飞控往桌上一放,点个校准按钮,完事。直到有一次,我组装了一台四轴,所有传感器读数都正常,但一解锁起飞,飞机就像喝醉了酒一样往一边偏。折腾了两天,最后发现是加速度计的一个轴偏了0.3度。
嗯,0.3度,听起来不大对吧?但换算成位置误差,飞10米就偏了5厘米。再叠加积分,几分钟后你的飞机就不知道飞哪去了。
校准的核心目的,说白了就是让传感器告诉你真实的世界。传感器不是完美的,它有自己的脾气——有偏差、有尺度误差、有安装误差。校准就是把这些误差找出来,然后补偿掉。
1.2 传感器的“原罪”——误差从哪来?
我习惯把传感器误差分成三类,这样排查问题的时候思路特别清晰:
| 误差类型 | 物理含义 | 典型来源 |
|---|---|---|
| 零偏(Bias) | 输入为零时,输出不为零 | 制造工艺、温度漂移 |
| 尺度因子(Scale Factor) | 输出变化量与输入变化量的比例不准确 | 敏感度差异、电路增益误差 |
| 交叉耦合(Cross-axis) | 一个轴的输入影响了另一个轴的输出 | 安装不正、PCB应力 |
举个例子你就明白了。假设一个加速度计,静止时应该输出0g(水平方向)和1g(垂直方向)。但实际读出来是:X轴0.05g,Y轴-0.03g,Z轴0.98g。这就是零偏和尺度因子在作怪。
我在项目中遇到过最离谱的一次,是一个IMU的Z轴尺度因子偏差了5%。这意味着飞机悬停时,高度估计会持续漂移。你想想看,飞控以为自己在平飞,实际上已经在慢慢下降了。
1.3 校准的数学原理——最小二乘法
校准的数学基础,其实不复杂。我们用一个线性模型来描述传感器:
传感器输出 = 真实值 × 尺度因子 + 零偏 + 噪声
写成数学形式:
y = k × x + b + ε
其中:
- y:传感器读到的原始值
- x:真实的物理量(我们想知道的)
- k:尺度因子(理想情况下k=1)
- b:零偏(理想情况下b=0)
- ε:随机噪声(无法消除,只能降低影响)
校准的任务,就是通过已知的输入(比如静止、旋转90度等),反推出k和b。最常用的方法就是最小二乘法。
对于更复杂的传感器(比如磁力计),模型会变成椭球拟合:
(x - b)ᵀ · A · (x - b) = 1
这里A是一个3×3的矩阵,包含了尺度因子和交叉耦合。校准就是通过采集空间中的多个点,拟合出这个椭球的参数。嗯,这个在ArduPilot里叫“磁力计椭球校准”,后面我们会详细讲。
1.4 不校准的后果——血的教训
我曾经帮一个朋友调试他的无人机。他说飞机老是往右偏,调了PID也没用。我一看日志,发现他的陀螺仪零偏是0.5度/秒。这意味着即使飞机完全静止,飞控也以为它在缓慢旋转。
你想想看,飞控为了对抗这个“假旋转”,会一直给电机输出修正信号。结果就是:飞机在悬停时不断抖动,而且越修正越偏。这就是典型的“传感器误差被控制器放大”的例子。
另一个常见问题是磁力计。如果不校准,航向角误差可能达到20-30度。在GPS信号好的时候还能凑合,一旦进入GPS失效模式(比如飞过桥底),飞控会瞬间失去方向,直接进入“失控保护”。
1.5 ArduPilot中的校准流程
ArduPilot的校准流程,其实就是在帮你做上面说的这些数学运算。它的内部实现是这样的:
// 伪代码示意
void calibrate_accel() {
// 1. 采集6个姿态的数据
for each orientation {
collect_samples();
compute_mean();
}
// 2. 用最小二乘法解算参数
solve_least_squares();
// 3. 保存校准参数到参数系统
save_to_params();
}
我个人习惯在每次更换飞控硬件、或者更换机架后,都重新做一次完整的传感器校准。别偷懒,这个步骤省不了。
1.6 知识体系总览
下面这张图,是我自己总结的传感器校准知识框架。你可以把它当作一个“导航图”,后面每个章节都会对应到其中的一个模块。
1.7 本章小结
校准不是可有可无的步骤,它是飞控稳定工作的基石。记住三点:
- 误差不可避免——每个传感器都有零偏和尺度误差
- 数学可解——用最小二乘法就能求出补偿参数
- 实践要勤——换硬件、换机架、甚至换环境温度,都建议重新校准
下一章,我们会深入加速度计的校准细节,包括ArduPilot的具体操作步骤和日志分析方法。到时候我会分享一个我踩过的坑——关于加速度计校准顺序的,保证让你少走弯路。