第3章 传感器校准(一):加速度计校准——六面法详解与实操
飞控里最容易被忽视、却又最要命的一步,就是传感器校准。我见过太多新手调了半天PID飞机还是乱飘,最后发现是加速度计根本没校准——说白了,飞控连“水平”是什么都不知道,你让它怎么稳?
这一章我们专门讲加速度计的校准。最经典、最可靠的方法就是六面法。名字听着玄乎,其实原理很简单:让加速度计在六个标准姿态下分别采样,然后反算出它的零偏和比例因子。
核心结论:六面法校准后,加速度计在静态下的测量误差可以从 0.1~0.3g 降到 0.01g 以内。这是后续所有姿态解算和位置控制的基础。
3.1 为什么要校准加速度计?
加速度计出厂时其实已经做过一次校准了。但焊接应力、温度漂移、安装误差,都会让它的零偏和比例因子发生变化。你想想看,一个标称 1g 的加速度,实际输出可能是 1.02g 或 0.98g——这点误差在悬停时可能感觉不到,但一飞航线,位置积分就会越偏越远。
我在一个农业植保项目里遇到过:飞机在 GPS 模式下直线飞行,结果每飞 100 米就偏出去 3~4 米。查了两天,最后发现是加速度计 Z 轴零偏大了 0.05g。校准完,问题直接消失。
加速度计需要校准的参数主要有三个:
- 零偏(Bias):每个轴在 0g 输入时的输出值
- 比例因子(Scale Factor):实际加速度与测量值之间的比例关系
- 轴间非正交误差(Misalignment):三个敏感轴不是完美的 90° 正交
六面法可以同时校准前两个参数。轴间非正交误差通常需要更复杂的椭球拟合,我们后面会单独讲。
3.2 六面法的数学原理
六面法的核心假设是:在静止状态下,加速度计测量的合加速度必须等于重力加速度 g。这个约束条件给了我们六个方程(六个面),解六个未知数(三轴零偏 + 三轴比例因子)。
加速度计的测量模型可以写成:
a_measured = S * (a_true + b) + n
其中:
a_measured —— 传感器原始输出(ADC值或已转成m/s²)
S —— 比例因子矩阵(对角阵)
a_true —— 真实加速度(在静止时等于重力加速度的分量)
b —— 零偏向量
n —— 测量噪声(校准时可忽略)
把六个面的测量值代入,就能解出 S 和 b。具体推导我就不展开了,你只需要记住:六面法本质上是在解一个线性方程组。
我的习惯:在实际代码里,我不会直接解 6x6 矩阵,而是用最小二乘法做一次拟合。这样即使某个面采的数据有点偏差,整体结果也更鲁棒。
3.3 六面法的操作步骤
操作本身不复杂,但精度完全取决于你摆放的姿态是否标准。我见过有人随手一放就开始校准,结果校准完比没校还差——嗯,这属于典型的“操作不规范,队友两行泪”。
下面是标准流程:
- 准备工作:把飞控(或整机)放在一个水平的台面上。最好用水平仪确认一下。
- 第一个面:Z轴向上(水平放置):此时加速度计感受到的是 +1g 在 Z 轴,X 和 Y 轴为 0g。记录 100~200 个数据点,取平均。
- 第二个面:Z轴向下(翻转180°):此时 Z 轴感受到 -1g。同样记录并取平均。
- 第三个面:X轴向上(右侧朝下):把飞机竖起来,让 X 轴指向正上方。记录数据。
- 第四个面:X轴向下(左侧朝下):翻转 180°,X 轴指向地面。记录数据。
- 第五个面:Y轴向上(机头朝上):让 Y 轴指向正上方。记录数据。
- 第六个面:Y轴向下(机头朝下):翻转 180°,Y 轴指向地面。记录数据。
每个面采集时,保持静止 2~3 秒。不要手抖,不要呼吸太重——开玩笑的,但确实要等数据稳定了再采。
注意:六面法要求每个面都尽量精确对准重力方向。偏差 1°,就会引入约 0.017g 的误差。如果你用的是泡沫手抛机或者软轴机架,建议把飞控拆下来单独校准,否则机架变形会影响精度。
3.4 数据处理与参数计算
采集完六个面的数据后,我们来做计算。假设六个面的平均测量值分别为:
| 姿态 | X轴测量值 | Y轴测量值 | Z轴测量值 |
|---|---|---|---|
| Z轴向上 | ax_up | ay_up | az_up |
| Z轴向下 | ax_down | ay_down | az_down |
| X轴向上 | ax_right | ay_right | az_right |
| X轴向下 | ax_left | ay_left | az_left |
| Y轴向上 | ax_nose_up | ay_nose_up | az_nose_up |
| Y轴向下 | ax_nose_down | ay_nose_down | az_nose_down |
然后按下面的公式计算零偏和比例因子:
// 计算零偏(单位:与测量值相同)
bias_x = (ax_up + ax_down) / 2
bias_y = (ay_up + ay_down) / 2
bias_z = (az_up + az_down) / 2
// 计算比例因子(无量纲)
scale_x = (ax_up - ax_down) / 2 // 理想情况下应为 1g
scale_y = (ay_up - ay_down) / 2
scale_z = (az_up - az_down) / 2
// 校准后的加速度值
a_calibrated_x = (a_raw_x - bias_x) / scale_x
a_calibrated_y = (a_raw_y - bias_y) / scale_y
a_calibrated_z = (a_raw_z - bias_z) / scale_z
注意:这里的 scale 计算出来的是实际比例因子,单位是 (测量值/g)。如果你的传感器输出已经是 m/s²,那 scale 应该接近 9.81。
我曾经踩过的坑:第一次写校准代码时,我直接把 scale_x 当成了 1.0,只校准了零偏。结果飞机在急加速时姿态解算明显滞后。后来加上比例因子校准,动态响应才正常。所以——零偏和比例因子,一个都不能少。
3.5 校准效果验证
校准完别急着飞。先做一次简单的验证:
- 把飞控水平放置,看 Z 轴输出是否接近 9.81 m/s²(或 1g),X 和 Y 轴是否接近 0
- 把飞控竖起来(X 轴向上),看 X 轴输出是否接近 9.81,其他轴接近 0
- 计算合加速度:sqrt(ax² + ay² + az²),在任何静止姿态下都应该等于 9.81 ± 0.05
如果合加速度偏差超过 0.05g,说明校准精度不够。常见原因:
- 摆放姿态不标准(偏差超过 2°)
- 数据采集时飞控有振动(比如电机还在转)
- 传感器本身有温度漂移(刚上电和稳定后的数据不一样)
我的建议是:校准前先让飞控通电预热 3~5 分钟,等温度稳定了再操作。
3.6 六面法知识体系
下面这张图帮你把六面法的整体逻辑串起来:
3.7 常见问题与避坑指南
Q:六面法校准后,为什么合加速度还是不准?
A:最常见的原因是轴间非正交误差没有被校准。六面法假设三个轴是完美的 90°,但实际传感器芯片在封装时就有 ±1° 的偏差。如果你需要更高精度,建议做椭球拟合校准。
Q:能不能只校准三个面?
A:理论上三个面也能解,但精度会差很多。六个面相当于做了冗余测量,能有效抑制噪声。我建议不要偷懒,六个面都做一遍,总共也就几分钟的事。
Q:校准参数需要保存到飞控的什么位置?
A:通常保存在飞控的 EEPROM 或参数文件中。以 PX4 为例,校准参数对应的是 CAL_ACC0_XOFFS、CAL_ACC0_XSCALE 等参数。ArduPilot 则保存在 INS_ACC0_OFFS_X 和 INS_ACC0_SCAL_X。
我曾经犯过的错:有一次校准完忘记保存参数,直接断电重启了。结果飞控还是用旧参数飞,飞机一解锁就往一边偏。所以——校准完一定要执行保存命令(比如 PX4 的 param save),别问我怎么知道的。
3.8 实操:在 PX4 中执行六面法校准
如果你用的是 PX4 固件,校准加速度计其实很简单。地面站(QGroundControl)里有图形化引导,你只需要按照提示摆放飞机就行。但如果你想手动触发校准,可以用以下命令:
# 进入命令行(通过 MAVLink 或直接连 USB)
# 启动加速度计校准
accel start
# 系统会提示你依次摆放六个面
# 每个面摆好后,输入:
accel accept
# 六个面都完成后,系统会自动计算并保存参数
# 可以用以下命令查看校准结果
param show CAL_ACC0*
如果你用的是 ArduPilot,校准命令稍有不同:
# 进入命令行
# 启动加速度计校准
accelcal
# 按照提示依次摆放六个面
# 每个面摆好后,按任意键继续
# 校准完成后,系统会自动保存参数
我的建议:如果你在室内校准,尽量远离金属物体和强磁场源(比如大功率电源、电机)。虽然加速度计不受磁场影响,但很多飞控把加速度计和磁力计集成在一起,磁力计的干扰会通过温度串扰影响加速度计。