第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 六面法的操作步骤

操作本身不复杂,但精度完全取决于你摆放的姿态是否标准。我见过有人随手一放就开始校准,结果校准完比没校还差——嗯,这属于典型的“操作不规范,队友两行泪”。

下面是标准流程:

  1. 准备工作:把飞控(或整机)放在一个水平的台面上。最好用水平仪确认一下。
  2. 第一个面:Z轴向上(水平放置):此时加速度计感受到的是 +1g 在 Z 轴,X 和 Y 轴为 0g。记录 100~200 个数据点,取平均。
  3. 第二个面:Z轴向下(翻转180°):此时 Z 轴感受到 -1g。同样记录并取平均。
  4. 第三个面:X轴向上(右侧朝下):把飞机竖起来,让 X 轴指向正上方。记录数据。
  5. 第四个面:X轴向下(左侧朝下):翻转 180°,X 轴指向地面。记录数据。
  6. 第五个面:Y轴向上(机头朝上):让 Y 轴指向正上方。记录数据。
  7. 第六个面: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 六面法知识体系

下面这张图帮你把六面法的整体逻辑串起来:

六面法校准知识体系 六面法校准知识体系 为什么要校准? 误差来源:零偏 | 比例因子 | 轴间非正交 核心原理:静止时合加速度 = g 操作流程:六面摆放 + 数据采集 数据处理:最小二乘解算参数 验证:合加速度 ≈ 9.81 ± 0.05 六面法只校准零偏和比例因子,轴间非正交误差需要椭球拟合

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

# 按照提示依次摆放六个面
# 每个面摆好后,按任意键继续

# 校准完成后,系统会自动保存参数

我的建议:如果你在室内校准,尽量远离金属物体和强磁场源(比如大功率电源、电机)。虽然加速度计不受磁场影响,但很多飞控把加速度计和磁力计集成在一起,磁力计的干扰会通过温度串扰影响加速度计。