3、陀螺仪校准:零偏校准、温度补偿、Allan方差分析

陀螺仪校准,说白了就是让飞控知道「什么是静止」。

我刚开始做飞控那会儿,总觉得陀螺仪数据挺准的,结果一上电飞机就慢慢自旋。查了半天,原来是零偏没校准好。嗯,从那以后我再也不敢跳过这一步了。

3.1 零偏校准:最基础也最容易被忽略

陀螺仪静止时,理论上输出应该是0。但现实是,每个陀螺仪都有个固定的偏移量。这个偏移量,就是零偏。

零偏校准的原理

说白了就是让陀螺仪静止一段时间,采集一堆数据,然后取平均值。这个平均值就是零偏值。以后每次读取数据时,把这个值减掉就行。

在ArduPilot里,零偏校准通常在飞控上电后的前几秒自动完成。你只需要把飞机放平、静止不动。

核心参数:

  • INS_GYRO_FILTER:陀螺仪低通滤波频率,默认20Hz
  • INS_ACC_BODY_FIX:是否使用机体坐标系对齐
  • INS_GYRO_RATE:陀螺仪采样率,通常设为400Hz

我个人习惯在每次飞行前做一次静态校准。尤其是冬天和夏天温差大的时候,零偏变化很明显。

小技巧:如果你发现飞机悬停时慢慢往一个方向漂,先别急着调PID。先检查一下陀螺仪零偏值。很多时候,重新校准一下就好了。

3.2 温度补偿:为什么冬天和夏天数据不一样?

陀螺仪的零偏会随温度变化。你想想看,MEMS陀螺仪内部是个微小的振动结构,温度一变,材料的弹性模量、阻尼系数都会变。零偏自然就跑了。

温度补偿怎么做?

ArduPilot支持两种方式:

  1. 内置温度补偿:部分高端IMU芯片自带温度补偿,比如ICM-20689。这种直接用就行。
  2. 软件温度补偿:通过采集不同温度下的零偏值,拟合出一条曲线。ArduPilot里用INS_GYRO_TEMP_ENABLE参数开启。

我在项目中遇到过一个问题:一台无人机在室内校准好好的,拿到室外零下10度的地方,一解锁就翻。查了半天,就是温度补偿没做好。后来我写了个脚本,让飞控在-20°C到60°C范围内自动采集数据,拟合补偿曲线。效果立竿见影。

注意:温度补偿不是万能的。如果温度变化太快(比如从空调房直接拿到烈日下),补偿曲线可能跟不上。建议给飞控一个「温度稳定时间」,至少等30秒再起飞。

3.3 Allan方差分析:量化你的陀螺仪到底有多「稳」

Allan方差,听起来很高大上。其实它就是用来分析陀螺仪噪声特性的工具。

为什么要做Allan方差?

因为陀螺仪的噪声不是白噪声。它包含多种成分:

  • 角度随机游走:高频噪声,像白噪声一样
  • 速率随机游走:低频漂移,慢慢变化
  • 零偏稳定性:长时间尺度下的稳定性
  • 量化噪声:ADC量化带来的误差

Allan方差可以把这些成分分离开来。你想想看,就像用筛子把不同大小的沙子分开一样。

实际操作步骤:

  1. 让陀螺仪静止,采集至少2小时的数据(采样率400Hz)
  2. 用Python或MATLAB计算Allan方差
  3. 从Allan方差曲线上读出关键参数

下面是我常用的Python代码片段:

import numpy as np
import matplotlib.pyplot as plt

def allan_variance(data, fs):
    """计算Allan方差"""
    N = len(data)
    max_m = int(np.log2(N))
    tau = np.zeros(max_m)
    avar = np.zeros(max_m)
    
    for m in range(1, max_m + 1):
        tau[m-1] = m / fs
        # 分组平均
        cluster_size = 2**m
        num_clusters = N // cluster_size
        clusters = data[:num_clusters * cluster_size].reshape(-1, cluster_size)
        means = np.mean(clusters, axis=1)
        # 计算方差
        avar[m-1] = 0.5 * np.mean((means[1:] - means[:-1])**2)
    
    return tau, np.sqrt(avar)

# 读取陀螺仪数据
gyro_data = np.loadtxt('gyro_static.txt')
fs = 400.0  # 采样率

tau, adev = allan_variance(gyro_data, fs)

# 绘制Allan方差曲线
plt.loglog(tau, adev)
plt.xlabel('积分时间 (s)')
plt.ylabel('Allan标准差 (deg/s)')
plt.grid(True)
plt.show()

从曲线上你能读出什么?

曲线特征 对应参数 典型值(消费级IMU)
斜率-1/2的直线段 角度随机游走 0.01 ~ 0.1 °/√h
曲线最低点 零偏稳定性 1 ~ 10 °/h
斜率+1/2的直线段 速率随机游走 0.1 ~ 1 °/h/√h

我记得有一次,客户说他们的无人机悬停时高度漂移严重。我一看Allan方差曲线,零偏稳定性高达50°/h,明显是IMU质量不行。换了IMU后,问题就解决了。

实战建议:如果你用的是Pixhawk这类飞控,建议至少做一次Allan方差分析。把结果存下来,以后换IMU或者升级固件时对比一下。你会发现,不是所有IMU都「一样」的。

3.4 知识体系总览

下面这张图,是我自己总结的陀螺仪校准知识体系。你可以把它当作一个检查清单:

陀螺仪校准知识体系 零偏校准 • 静止采集数据 • 取平均值作为零偏 • 每次飞行前校准 • 参数:INS_GYRO_FILTER • 注意温度影响 温度补偿 • 温度影响零偏 • 内置 vs 软件补偿 • 拟合温度-零偏曲线 • 参数:INS_GYRO_TEMP • 温度稳定后再起飞 Allan方差分析 • 分析噪声特性 • 分离噪声成分 • 角度随机游走 • 零偏稳定性 • 速率随机游走 校准目标:消除零偏 → 补偿温度 → 量化噪声 最终提升EKF融合精度,让飞机飞得更稳 静态 温度 噪声 三个步骤环环相扣,缺一不可

这张图把三个核心模块串起来了。你从左边开始,先做零偏校准,再做温度补偿,最后用Allan方差验证效果。每一步都踩实了,EKF才能正常工作。

最后提醒一句:别指望一次校准管一辈子。陀螺仪会老化,温度环境会变。我建议每3个月重新做一次完整的校准流程。尤其是换过IMU或者摔过机之后,一定要重新校准。


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