3、陀螺仪校准:零偏稳定性分析、Allan方差辨识噪声、温漂补偿实战
陀螺仪校准,说白了就是跟它的「坏脾气」做斗争。我做了这么多年飞控,最头疼的就是陀螺仪。加速度计好歹还能靠重力找平,陀螺仪这家伙,你不动它,它自己还在那瞎报数。这就是零偏。
但零偏还不是最要命的。最要命的是,它的零偏会变。温度一变,它变;上电时间一长,它也变。嗯,今天我们就来彻底收拾它。
3.1 零偏稳定性:到底稳不稳?
先搞清楚两个概念:零偏和零偏稳定性。
- 零偏:陀螺仪静止时,输出值的平均值。比如你测出来是 0.01 °/s,那这就是零偏。
- 零偏稳定性:这个平均值,在长时间内能稳定在什么范围内。单位通常是 °/h。
我个人习惯把零偏稳定性理解为「陀螺仪的定力」。你想想看,一个号称零偏稳定性 10°/h 的陀螺仪,意味着它在一小时内,零偏的漂移不会超过 10 度。对于无人机来说,这基本没法用。我们做飞控,至少得 1°/h 以内,甚至 0.1°/h。
关键指标:零偏稳定性是衡量陀螺仪长期性能的核心指标。它直接决定了你的航向角能保持多久不飘。
我在项目中遇到过一款国产 MEMS 陀螺仪,数据手册上写着零偏稳定性 5°/h。结果上电测试,前十分钟还行,半小时后直接漂了 30 度。后来发现是温度补偿没做好。所以,别信手册,自己测。
3.2 Allan方差:给噪声做「体检」
Allan 方差,听起来很高大上。其实它就是用来分析陀螺仪噪声成分的工具。为什么要分析?因为不同的噪声,需要用不同的滤波器去处理。
Allan 方差的核心思想很简单:把陀螺仪静止时的数据,按不同的时间长度(簇时间)分段,然后看每段平均值的波动情况。
具体步骤我列一下:
- 采集至少 2 小时以上的静态数据。越长越好,我一般采 4 小时。
- 计算不同簇时间 τ 下的 Allan 方差 σ²(τ)。
- 画出 log(τ) - log(σ(τ)) 曲线。
- 从曲线上读出关键噪声参数。
这张曲线图,你能读出五种噪声:
| 噪声类型 | 斜率 | 物理含义 |
|---|---|---|
| 量化噪声 | -1 | ADC 分辨率限制 |
| 角度随机游走 | -0.5 | 白噪声积分结果 |
| 零偏不稳定性 | 0 | 曲线最低点,就是零偏稳定性 |
| 速率随机游走 | +0.5 | 低频漂移 |
| 速率斜坡 | +1 | 温度引起的趋势性漂移 |
为什么会这样?因为不同噪声在不同时间尺度上表现不同。短时间看,白噪声占主导;长时间看,温漂占主导。Allan 方差就是把这些噪声「分时段」揪出来。
实战技巧:我写了个 Python 脚本,采集 3 小时数据后自动计算 Allan 方差并画图。重点关注曲线最低点对应的 τ 值和 σ 值。那个 σ 值就是你的零偏稳定性。
代码示例(核心部分):
import numpy as np
import matplotlib.pyplot as plt
def allan_variance(data, fs):
"""计算Allan方差"""
N = len(data)
max_pow = int(np.log2(N)) - 1
tau = []
sigma = []
for p in range(1, max_pow):
m = 2**p
tau_m = m / fs
# 分段平均
num_clusters = N // m
clusters = data[:num_clusters*m].reshape(num_clusters, m)
means = np.mean(clusters, axis=1)
# 计算方差
var = 0.5 * np.mean((means[1:] - means[:-1])**2)
tau.append(tau_m)
sigma.append(np.sqrt(var))
return np.array(tau), np.array(sigma)
# 使用示例
# tau, sigma = allan_variance(gyro_data, 100) # 100Hz采样
# plt.loglog(tau, sigma)
# plt.grid(True, which='both')
3.3 温漂补偿实战:把温度「算」进去
温漂是陀螺仪最大的敌人。我做过对比测试:一个没做温补的陀螺仪,从 25°C 升到 60°C,零偏能漂 5 °/s。这什么概念?飞机直接翻跟头。
温漂补偿的思路很简单:建立温度-零偏模型。然后实时查表或计算,把零偏减去。
具体做法分三步:
- 数据采集:把飞控放进温箱,从 -20°C 到 80°C,每 5°C 记录一次静态零偏。每个温度点保持 10 分钟。
- 模型拟合:我一般用三阶多项式拟合。别用太高阶,容易过拟合。
- 在线补偿:飞控运行时,读取温度传感器,代入多项式算出零偏,然后减去。
注意:温度传感器和陀螺仪芯片之间可能有热延迟。我曾经踩过这个坑——温度读数变了,但陀螺仪内部温度还没跟上。补偿结果反而更差。解决办法是加一个低通滤波器,让温度信号慢半拍。
拟合代码示例:
import numpy as np
# 假设采集到的数据
temps = np.array([-20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80])
biases = np.array([0.12, 0.08, 0.03, -0.01, -0.02, 0.01, 0.06, 0.15, 0.28, 0.45, 0.68])
# 三阶多项式拟合
coeffs = np.polyfit(temps, biases, 3)
print(f"多项式系数: {coeffs}")
# 在线补偿函数
def compensate_gyro(raw_gyro, temp):
bias = coeffs[0]*temp**3 + coeffs[1]*temp**2 + coeffs[2]*temp + coeffs[3]
return raw_gyro - bias
嗯,这里要注意:温补模型不是一劳永逸的。同一型号的不同芯片,温漂曲线可能不一样。我建议每颗芯片单独标定。如果量产成本不允许,至少抽测 10 颗,取平均模型。
避坑指南:我曾经在量产时偷懒,用了同一套温补参数。结果 20% 的飞控在高空低温环境下航向发散。后来老老实实每颗芯片单独标定,问题才解决。
3.4 实战流程总结
好了,把今天的内容串起来。一个完整的陀螺仪校准流程应该是:
- 静态采集:上电后静止采集 2-4 小时数据,同时记录温度。
- Allan 方差分析:确定零偏稳定性、角度随机游走等参数。这些参数会用于后续的滤波器设计。
- 温箱标定:建立温度-零偏模型,写入飞控参数。
- 在线补偿:飞控运行时,实时读取温度,进行零偏补偿。
- 验证测试:上电后静止 10 分钟,看零偏是否稳定在预期范围内。
你想想看,如果这些步骤都做到位了,你的陀螺仪基本上就「驯服」了。剩下的就是滤波器的事了——那是下一章的内容。
个人习惯:我每次拿到新陀螺仪,第一件事就是跑 Allan 方差。这就像医生看病先做血常规一样,能快速了解这个传感器的「体质」。