4、陀螺仪标定:静态零偏标定,温度补偿,艾伦方差分析
陀螺仪标定,说白了就是让传感器学会「说实话」。你想想看,一个静止的陀螺仪,理论上输出应该是零。但现实世界里,它总会给你报个几度每秒的数值——这就是零偏。如果不把这个底数扣掉,飞控算出来的姿态就会一直漂,漂到最后飞机都不知道自己在哪。
我个人习惯把陀螺仪标定分成三个层次:静态零偏标定解决「静止时不准」的问题,温度补偿解决「温度变了就不准」的问题,艾伦方差分析解决「到底有多不准」的问题。咱们一个一个来。
4.1 静态零偏标定
这是最基础的一步。把飞控平放在桌面上,保持绝对静止,采集一段时间的数据,然后取平均值。这个平均值就是零偏。
我在项目中遇到过一个问题:有次客户反馈飞机起飞后总是缓慢偏航,查了半天发现是零偏标定时采集时间太短,只采了1秒钟。1秒钟的数据受噪声影响太大,算出来的零偏根本不稳。后来我建议他们至少采30秒,取中位数而不是平均值,效果好了很多。
具体步骤很简单:
- 将飞控水平静止放置,确保无振动
- 以100Hz采样率采集陀螺仪三轴数据,持续30秒
- 对每轴数据分别计算中位数,得到零偏值
- 将零偏值写入飞控参数,后续所有陀螺仪读数都减去这个值
// 伪代码示例:静态零偏标定
#define SAMPLE_COUNT 3000 // 30秒 * 100Hz
float gyro_x[SAMPLE_COUNT], gyro_y[SAMPLE_COUNT], gyro_z[SAMPLE_COUNT];
// 采集数据
for (int i = 0; i < SAMPLE_COUNT; i++) {
read_gyro(&gyro_x[i], &gyro_y[i], &gyro_z[i]);
delay(10); // 10ms间隔
}
// 计算中位数(这里用快速选择算法,实际工程中建议用排序后取中间值)
float bias_x = median(gyro_x, SAMPLE_COUNT);
float bias_y = median(gyro_y, SAMPLE_COUNT);
float bias_z = median(gyro_z, SAMPLE_COUNT);
// 写入参数
param_set("GYRO_BIAS_X", bias_x);
param_set("GYRO_BIAS_Y", bias_y);
param_set("GYRO_BIAS_Z", bias_z);
4.2 温度补偿
静态零偏标定只能解决「当前温度下」的问题。但无人机飞行环境温度变化很大——地面30度,飞到500米高空可能只有10度。陀螺仪的零偏会随着温度变化而漂移,这就是温度效应。
为什么会这样?因为MEMS陀螺仪内部的微机械结构对温度敏感。温度变化会导致材料热胀冷缩,改变谐振频率和阻尼特性,最终表现为零偏漂移。
温度补偿的思路很简单:在不同温度下标定零偏,拟合出一条「温度-零偏」曲线,然后在运行时根据当前温度查表或计算补偿值。
| 温度(℃) | X轴零偏(°/s) | Y轴零偏(°/s) | Z轴零偏(°/s) |
|---|---|---|---|
| -20 | 0.12 | -0.08 | 0.05 |
| 0 | 0.08 | -0.05 | 0.03 |
| 25 | 0.03 | -0.02 | 0.01 |
| 50 | -0.02 | 0.01 | -0.01 |
| 70 | -0.06 | 0.04 | -0.03 |
有了这张表,就可以用线性插值或多项式拟合来补偿。我个人习惯用分段线性插值,计算量小,效果也够用。
// 温度补偿实现:分段线性插值
float temp_compensate(float current_temp, float temp_table[], float bias_table[], int table_size) {
// 边界处理
if (current_temp <= temp_table[0]) return bias_table[0];
if (current_temp >= temp_table[table_size - 1]) return bias_table[table_size - 1];
// 查找区间
for (int i = 0; i < table_size - 1; i++) {
if (current_temp >= temp_table[i] && current_temp <= temp_table[i + 1]) {
float ratio = (current_temp - temp_table[i]) / (temp_table[i + 1] - temp_table[i]);
return bias_table[i] + ratio * (bias_table[i + 1] - bias_table[i]);
}
}
return 0.0f; // 不应该走到这里
}
4.3 艾伦方差分析
好了,零偏扣掉了,温度也补偿了。但陀螺仪的输出还是会有波动——这是噪声。怎么量化这个噪声?怎么知道这个陀螺仪到底「稳不稳」?艾伦方差就是干这个的。
艾伦方差(Allan Variance)是一种时域分析方法。它通过计算不同时间尺度上的方差,来分离出陀螺仪噪声中的不同成分:角度随机游走、速率随机游走、零偏不稳定性、量化噪声等。
我曾经用艾伦方差分析帮一个客户排查过问题。他们的无人机在悬停时总是有高频抖动,PID调了无数遍都没用。我一测陀螺仪的艾伦方差,发现角度随机游走系数比规格书大了10倍——传感器坏了。换了一个后,问题立刻消失。
艾伦方差的计算步骤:
- 采集长时间静态数据(至少2小时,越长越好)
- 将数据按不同时间长度τ分组,每组取平均值
- 计算相邻组平均值的方差,得到艾伦方差σ²(τ)
- 绘制log(τ) - log(σ)曲线,从曲线斜率识别噪声类型
下面这张图展示了艾伦方差分析的核心流程:
实际工程中,我们最关心两个指标:角度随机游走(ARW)和零偏不稳定性(Bias Instability)。ARW决定了姿态估计的短期精度,零偏不稳定性决定了长期漂移程度。
| 噪声类型 | 艾伦方差斜率 | 物理含义 | 典型值(消费级) |
|---|---|---|---|
| 角度随机游走 | -1/2 | 白噪声积分后的角度误差 | 0.1~0.5 °/√h |
| 零偏不稳定性 | 0 | 零偏随时间的缓慢变化 | 5~20 °/h |
| 速率随机游走 | +1/2 | 角速度的随机漂移 | 0.01~0.1 °/h/√h |
| 量化噪声 | -1 | ADC量化引起的误差 | 取决于分辨率 |
4.4 三个标定层次的工程落地
在实际项目中,这三个层次不是割裂的。我一般按这个顺序来做:
- 第一步:做静态零偏标定,得到当前温度下的零偏值。这一步在产线或飞控上电时自动完成。
- 第二步:做全温标定,建立温度补偿表。这一步在研发阶段完成,产线只做抽检。
- 第三步:做艾伦方差分析,评估传感器质量。这一步在传感器选型和来料检验时做,确保批次一致性。
嗯,这里要注意:温度补偿和艾伦方差分析不是每次飞前都要做。静态零偏标定可以每次上电做一次(也就30秒),但温度补偿表是出厂就写死的,艾伦方差分析更是只在研发和质检阶段做。
最后说一句:标定不是万能的。如果传感器本身质量太差,标定也救不回来。我见过有人花了两周时间调温度补偿,结果发现是陀螺仪本身坏了——换一个就好了。所以,先做艾伦方差分析确认传感器健康,再做标定,这个顺序别搞反了。