4. 确定性误差标定方法:六位置法标定加速度计,速率法标定陀螺仪,多位置法联合标定,转台标定流程与数据处理

各位,咱们今天聊点实在的。标定,说白了就是给传感器“找毛病”。

IMU 出厂时,厂家会给一份参数表。但你信不信?我从来不敢直接拿来用。为什么?因为温度、安装应力、甚至运输过程中的震动,都会让这些参数漂移。我见过一个项目,IMU 刚上电时零偏还正常,跑了半小时后,陀螺仪的零偏直接翻了一倍。嗯,这就是不标定的后果。

所以,确定性误差标定是组合导航系统入门的必修课。今天咱们就拆开揉碎了讲:加速度计的六位置法、陀螺仪的速率法、以及联合标定的多位置法。

4.1 加速度计标定:六位置法

加速度计标定,核心思路很简单:利用重力加速度这个已知量。你想想看,在地球上,重力加速度 g 是已知的(约 9.8 m/s²),方向垂直向下。如果我们把加速度计摆到不同的姿态,理论上它每个轴感受到的重力分量是确定的。

六位置法,就是让加速度计的每个轴分别朝上和朝下,一共 6 个位置。每个位置采集一组数据,然后解算出零偏和标度因数。

我个人习惯用下面的表格来记录数据:

位置序号 X轴朝向 Y轴朝向 Z轴朝向 理论值 (g)
1 水平 水平 [+1, 0, 0]
2 水平 水平 [-1, 0, 0]
3 水平 水平 [0, +1, 0]
4 水平 水平 [0, -1, 0]
5 水平 水平 [0, 0, +1]
6 水平 水平 [0, 0, -1]

采集完数据后,怎么算?以 X 轴为例:

  • 位置1(X朝上):输出 = Kx * g + Bx
  • 位置2(X朝下):输出 = -Kx * g + Bx

两个方程一联立,就能解出 X 轴的零偏 Bx 和标度因数 Kx。Y 轴和 Z 轴同理。

核心公式:

零偏 B = (输出_上 + 输出_下) / 2

标度因数 K = (输出_上 - 输出_下) / (2 * g)

我的经验: 每个位置不要只采一组数据。我一般会采 30 秒到 1 分钟的数据,然后取平均。为什么?因为加速度计有噪声,单点读数不靠谱。另外,转台一定要锁紧,我曾经因为夹具没锁死,导致数据里混入了微小的振动,解算出来的零偏差了 2 mg。

4.2 陀螺仪标定:速率法

陀螺仪标定,就不能靠重力了。它需要已知的角速率输入。这就是速率法

说白了,就是把陀螺仪固定在转台上,让转台以某个精确的角速率旋转。比如,转台转 10°/s,陀螺仪输出应该是多少?如果输出不对,那就是有误差。

速率法通常需要多个速率点。我建议至少取 5 个点:正转和反转各 3~5 个速率,比如 ±1°/s、±5°/s、±10°/s、±20°/s、±50°/s。然后做线性拟合。

为什么需要正反转?因为可以消除地球自转的影响。你想想看,地球本身就在转(约 15°/h),如果只测一个方向,这个量会被当成零偏的一部分。正反转取平均,地球自转分量就抵消了。

注意: 速率法标定陀螺仪时,转台的速率精度至关重要。我曾经用过一台老旧的转台,它的速率波动达到了 0.1°/s,标出来的标度因数误差很大。后来换了高精度转台,数据才稳定下来。所以,标定之前,先确认你的转台是否靠谱。

数据处理流程如下:

  1. 设置转台速率 ω_ref,采集陀螺仪输出 ω_meas。
  2. 对每个速率点,取稳定段数据的平均值。
  3. 以 ω_ref 为横坐标,ω_meas 为纵坐标,做线性回归。
  4. 斜率就是标度因数,截距就是零偏。

代码实现也很简单,我习惯用 Python 处理:

import numpy as np

# 假设采集到的数据
omega_ref = np.array([-50, -20, -10, -5, -1, 1, 5, 10, 20, 50])  # °/s
omega_meas = np.array([-49.8, -19.9, -9.95, -4.98, -0.99, 1.01, 5.02, 10.05, 20.1, 50.2])

# 线性拟合
coeff = np.polyfit(omega_ref, omega_meas, 1)
scale_factor = coeff[0]  # 标度因数
bias = coeff[1]          # 零偏

print(f"标度因数: {scale_factor:.4f}")
print(f"零偏: {bias:.4f} °/s")

4.3 多位置法联合标定

六位置法只标定了加速度计,速率法只标定了陀螺仪。但实际系统中,加速度计和陀螺仪的安装误差角是耦合的。比如,加速度计的安装误差会影响姿态解算,进而影响陀螺仪的误差估计。

所以,更严谨的做法是多位置法联合标定。这个方法的核心思想是:在多个静态位置下,同时采集加速度计和陀螺仪的数据,然后利用重力矢量和地球自转角速度矢量作为参考,一次性解算出所有误差参数。

多位置法通常需要 12 个以上的位置。为什么?因为参数多了。除了零偏和标度因数,还有交叉耦合系数(即轴与轴之间的非正交误差)。

我给大家画个图,看看联合标定的逻辑:

多位置法联合标定流程图 转台多位置转动 采集IMU原始数据 数据预处理 建立误差模型方程 最小二乘法解算参数 输出标定参数

联合标定的误差模型比较复杂,一般写成矩阵形式:

加速度计模型:
a_meas = K_a * (I + S_a) * a_true + b_a + noise

陀螺仪模型:
ω_meas = K_g * (I + S_g) * ω_true + b_g + noise

其中:
K_a, K_g: 标度因数矩阵
S_a, S_g: 交叉耦合矩阵(非正交误差)
b_a, b_g: 零偏向量

解算时,通常用最小二乘法或卡尔曼滤波。我个人更推荐最小二乘法,因为它简单、稳定,而且对于静态标定来说精度足够。

避坑指南: 我曾经在一次联合标定中,发现解算出来的交叉耦合系数特别大,明显不合理。排查了半天,发现是转台的一个位置没对准,导致重力矢量投影错了。所以,多位置法对转台的位置精度要求很高。每个位置都要用光学准直仪确认一下,别偷懒。

4.4 转台标定流程与数据处理

说了这么多方法,最后咱们串一下完整的转台标定流程。不管你是用六位置法还是多位置法,流程都差不多:

  1. 准备阶段: 将IMU固定在转台上,确保安装面清洁、锁紧。上电预热至少 30 分钟,让传感器温度稳定。
  2. 粗对准: 转台回零,记录初始姿态。这一步是为了后续的数据对齐。
  3. 数据采集: 按照预设的位置序列或速率序列,逐点采集数据。每个位置/速率点保持 30~60 秒。
  4. 数据预处理: 剔除异常值(比如转台转动过程中的数据),取稳定段的平均值。
  5. 参数解算: 根据误差模型,用最小二乘法解算零偏、标度因数、交叉耦合系数。
  6. 验证: 将标定后的参数代入,重新采集一组数据,看看残差是否在可接受范围内。

数据处理时,我习惯用 Python 的 scipy.optimize.least_squares 函数。它支持带约束的优化,可以防止解算出物理上不合理的参数(比如标度因数为负)。

from scipy.optimize import least_squares

def error_func(params, data):
    # 解包参数
    bx, by, bz, kx, ky, kz, ... = params
    # 计算残差
    residuals = ...
    return residuals

# 初始猜测
initial_guess = [0, 0, 0, 1, 1, 1, ...]
result = least_squares(error_func, initial_guess, args=(data,))
print(result.x)  # 标定参数

最后提醒一句: 标定不是一劳永逸的。温度变化、时间推移,参数都会漂。我建议每半年重新标定一次,或者在环境温度变化超过 20°C 时重新标定。别等到导航精度下降了才想起来,那时候飞机可能已经偏航了。

好了,确定性误差标定就讲到这里。方法不难,难的是细节。记住:转台精度、数据稳定性、模型正确性,这三个缺一不可。下次咱们聊随机误差的建模与滤波,那个更有意思。


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