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,标出来的标度因数误差很大。后来换了高精度转台,数据才稳定下来。所以,标定之前,先确认你的转台是否靠谱。
数据处理流程如下:
- 设置转台速率 ω_ref,采集陀螺仪输出 ω_meas。
- 对每个速率点,取稳定段数据的平均值。
- 以 ω_ref 为横坐标,ω_meas 为纵坐标,做线性回归。
- 斜率就是标度因数,截距就是零偏。
代码实现也很简单,我习惯用 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 个以上的位置。为什么?因为参数多了。除了零偏和标度因数,还有交叉耦合系数(即轴与轴之间的非正交误差)。
我给大家画个图,看看联合标定的逻辑:
联合标定的误差模型比较复杂,一般写成矩阵形式:
加速度计模型:
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 转台标定流程与数据处理
说了这么多方法,最后咱们串一下完整的转台标定流程。不管你是用六位置法还是多位置法,流程都差不多:
- 准备阶段: 将IMU固定在转台上,确保安装面清洁、锁紧。上电预热至少 30 分钟,让传感器温度稳定。
- 粗对准: 转台回零,记录初始姿态。这一步是为了后续的数据对齐。
- 数据采集: 按照预设的位置序列或速率序列,逐点采集数据。每个位置/速率点保持 30~60 秒。
- 数据预处理: 剔除异常值(比如转台转动过程中的数据),取稳定段的平均值。
- 参数解算: 根据误差模型,用最小二乘法解算零偏、标度因数、交叉耦合系数。
- 验证: 将标定后的参数代入,重新采集一组数据,看看残差是否在可接受范围内。
数据处理时,我习惯用 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