4、陀螺仪标定:静态零偏标定,温度补偿,艾伦方差分析

陀螺仪标定,说白了就是让传感器学会「说实话」。你想想看,一个静止的陀螺仪,理论上输出应该是零。但现实世界里,它总会给你报个几度每秒的数值——这就是零偏。如果不把这个底数扣掉,飞控算出来的姿态就会一直漂,漂到最后飞机都不知道自己在哪。

我个人习惯把陀螺仪标定分成三个层次:静态零偏标定解决「静止时不准」的问题,温度补偿解决「温度变了就不准」的问题,艾伦方差分析解决「到底有多不准」的问题。咱们一个一个来。

4.1 静态零偏标定

这是最基础的一步。把飞控平放在桌面上,保持绝对静止,采集一段时间的数据,然后取平均值。这个平均值就是零偏。

我在项目中遇到过一个问题:有次客户反馈飞机起飞后总是缓慢偏航,查了半天发现是零偏标定时采集时间太短,只采了1秒钟。1秒钟的数据受噪声影响太大,算出来的零偏根本不稳。后来我建议他们至少采30秒,取中位数而不是平均值,效果好了很多。

我的经验:静态零偏标定建议采集30-60秒数据,使用中位数滤波。平均值容易被极端值拉偏,中位数更鲁棒。

具体步骤很简单:

  1. 将飞控水平静止放置,确保无振动
  2. 以100Hz采样率采集陀螺仪三轴数据,持续30秒
  3. 对每轴数据分别计算中位数,得到零偏值
  4. 将零偏值写入飞控参数,后续所有陀螺仪读数都减去这个值
// 伪代码示例:静态零偏标定
#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);
注意:零偏标定必须在飞控上电稳定后进行。刚上电的前几秒,传感器内部电路还没稳定,这时候采集的数据不能用。我一般会等10秒再开始采集。

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倍——传感器坏了。换了一个后,问题立刻消失。

艾伦方差的计算步骤:

  1. 采集长时间静态数据(至少2小时,越长越好)
  2. 将数据按不同时间长度τ分组,每组取平均值
  3. 计算相邻组平均值的方差,得到艾伦方差σ²(τ)
  4. 绘制log(τ) - log(σ)曲线,从曲线斜率识别噪声类型
快速判断:艾伦方差曲线斜率为-1/2的区域对应角度随机游走,斜率为0的区域对应零偏不稳定性,斜率为+1/2的区域对应速率随机游走。斜率越陡,说明该噪声成分越显著。

下面这张图展示了艾伦方差分析的核心流程:

艾伦方差分析流程图 采集静态数据 按时间τ分组取平均 计算艾伦方差σ²(τ) 绘制log(τ)-log(σ)曲线 识别噪声成分 数据要求 • 采样率:≥100Hz • 时长:≥2小时 • 环境:静止、恒温 曲线斜率含义 • -1/2:角度随机游走 • 0:零偏不稳定性 • +1/2:速率随机游走

实际工程中,我们最关心两个指标:角度随机游走(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量化引起的误差 取决于分辨率
避坑指南:我曾经遇到过有人用10分钟的数据做艾伦方差分析,结果曲线根本看不出斜率特征。艾伦方差分析对数据时长有硬性要求——要看到零偏不稳定性拐点,至少需要采集1小时以上的数据。想看到完整的噪声谱,2小时起步。

4.4 三个标定层次的工程落地

在实际项目中,这三个层次不是割裂的。我一般按这个顺序来做:

  • 第一步:做静态零偏标定,得到当前温度下的零偏值。这一步在产线或飞控上电时自动完成。
  • 第二步:做全温标定,建立温度补偿表。这一步在研发阶段完成,产线只做抽检。
  • 第三步:做艾伦方差分析,评估传感器质量。这一步在传感器选型和来料检验时做,确保批次一致性。

嗯,这里要注意:温度补偿和艾伦方差分析不是每次飞前都要做。静态零偏标定可以每次上电做一次(也就30秒),但温度补偿表是出厂就写死的,艾伦方差分析更是只在研发和质检阶段做。

最后说一句:标定不是万能的。如果传感器本身质量太差,标定也救不回来。我见过有人花了两周时间调温度补偿,结果发现是陀螺仪本身坏了——换一个就好了。所以,先做艾伦方差分析确认传感器健康,再做标定,这个顺序别搞反了。