3. 随机误差建模与辨识:Allan方差分析法
各位同学,今天我们来聊聊惯性导航里一个绕不开的话题——随机误差建模。说实话,我刚入行那会儿,觉得确定性误差(比如零偏、标度因数)才是大头,随机误差嘛,无非就是白噪声。直到有一次做高精度寻北仪,数据出来飘得离谱,我才意识到:随机误差不建模,系统性能天花板就在那儿。
那怎么分析随机误差呢?业界最常用的工具就是Allan方差。它最早是用于原子钟频率稳定度分析的,后来被我们做惯导的“借”过来,成了分析MEMS和光纤陀螺噪声的标配。说白了,它能把混在一起的噪声成分,像筛子一样一层层筛出来。
3.1 Allan方差分析法的原理
先别急着看公式,咱们先想一个问题:你有一长串陀螺或加速度计的输出数据,怎么知道里面有哪些噪声?
传统方差是算整体波动,但Allan方差聪明在——它把数据按不同时间长度切块。比如你采样了10小时的数据,可以按1秒一段、10秒一段、100秒一段……分别算方差。这样就能看出:不同时间尺度下,噪声的表现是不一样的。
数学上,Allan方差的定义是这样的:
σ²(τ) = (1/2) * ⟨(Ω_{k+1} - Ω_k)²⟩
其中τ是相关时间(也就是你切块的长度),Ω_k是第k个时间块的平均值。这个公式看着简单,但背后有个关键点:它计算的是相邻两个时间块均值的差值的方差。为什么要相邻?因为这样可以滤掉低频趋势项,只保留随机成分。
我个人的习惯是,拿到原始数据后,先画一条Allan方差曲线。这条曲线通常长什么样呢?咱们看下面这张图:
这张图是双对数坐标下的Allan方差曲线。你想想看,不同噪声在曲线上会呈现出不同的斜率。这就是我们辨识噪声的依据。
3.2 Allan方差曲线解读
拿到一条实测的Allan方差曲线,怎么看?我一般分三步走:
- 看形状:曲线是单调下降?还是先降后升?有没有明显的谷底?
- 看斜率:不同区段的斜率是多少?-1、-1/2、0、+1/2、+1?
- 读数值:谷底对应的纵坐标是多少?这直接决定了你的系统能达到的最佳精度。
举个例子。有一次我帮客户分析一款国产MEMS陀螺,Allan方差曲线在τ=10s附近有个明显的谷底,纵坐标大约是0.01°/s。这意味着什么呢?这款陀螺的最佳角速率分辨率就是0.01°/s,再想提高就得换器件了。
核心要点:Allan方差曲线的谷底对应的是零偏不稳定性,这是衡量惯性器件长期稳定性的关键指标。谷底越深、位置越靠右,说明器件性能越好。
3.3 随机噪声项提取
好了,现在咱们来逐个拆解这五种噪声。我按曲线从左到右的顺序来讲。
3.3.1 量化噪声
量化噪声出现在曲线最左端(短相关时间),斜率为-1。它是由AD转换器的有限分辨率引起的。说白了,你模拟量是连续的,但数字量是离散的,这个台阶就是量化噪声。
计算公式:
Q = σ(τ) / √3
其中σ(τ)是τ=1s时的Allan标准差。Q的单位是弧度或度。
我的经验:量化噪声通常很小,除非你用低分辨率ADC。有一次我遇到一个奇怪的现象,Allan曲线在短时间区段斜率不是-1而是-0.8,查了半天发现是ADC的采样时钟有抖动。嗯,这里要注意,时钟抖动也会影响量化噪声的斜率。
3.3.2 角度随机游走
这是惯导系统里最常见的噪声,斜率为-1/2。它代表角速度积分后产生的角度误差,本质上是白噪声通过积分器后的结果。
提取方法:
ARW = σ(τ) × √τ
在双对数曲线上,取τ=1s对应的纵坐标值,就是ARW。单位是°/√h 或 rad/√s。
我记得有一次做车载导航,客户说定位误差越来越大。我一看Allan曲线,ARW高达0.1°/√h,比标称值大了10倍。后来发现是陀螺的供电电源纹波太大,把白噪声放大了。电源质量直接影响ARW,这个坑我踩过。
3.3.3 零偏不稳定性
这是曲线谷底对应的噪声,斜率为0(水平段)。它代表的是低频漂移,是衡量惯性器件长期稳定性的核心指标。
提取方法:直接读取谷底对应的纵坐标值。单位是°/h 或 rad/s。
注意:零偏不稳定性不是零偏本身。零偏是固定偏差,可以标定补偿;零偏不稳定性是随机漂移,无法完全补偿。所以选型时,这个指标比零偏更重要。
3.3.4 速率随机游走
斜率+1/2,出现在曲线中长相关时间区段。它代表角加速度的白噪声,在惯导里通常与机械振动或温度波动有关。
提取方法:
RRW = σ(τ) / √τ
单位是°/h/√h 或 rad/s/√s。
说实话,速率随机游走在MEMS器件里不太常见,但在光纤陀螺里偶尔会出现。我曾经遇到一个光纤陀螺,RRW异常大,最后发现是光纤环的缠绕工艺有问题,导致温度梯度敏感。
3.3.5 速率斜坡
斜率+1,出现在曲线最右端(长相关时间)。它代表的是确定性趋势项,比如温度引起的线性漂移,或者地球自转的残余分量。
提取方法:
K = σ(τ) / τ
单位是°/h² 或 rad/s²。
这里有个容易混淆的地方:速率斜坡到底是随机误差还是确定性误差?严格来说,它是确定性误差,但Allan方差把它也当作噪声项来处理。我个人建议,如果发现曲线末端明显上翘,先检查数据里有没有未补偿的温度漂移,而不是急着把它当作随机噪声。
3.4 实战:用Python提取噪声参数
说了这么多理论,咱们来点实际的。下面是我常用的一个Python脚本片段,用于从Allan方差曲线中提取五种噪声参数:
import numpy as np
import matplotlib.pyplot as plt
def extract_noise_params(tau, allan_var):
"""
从Allan方差曲线提取噪声参数
tau: 相关时间数组
allan_var: Allan方差数组
"""
sigma = np.sqrt(allan_var)
# 1. 量化噪声 (斜率-1, 取tau=1s)
idx_q = np.argmin(np.abs(tau - 1))
Q = sigma[idx_q] / np.sqrt(3)
# 2. 角度随机游走 (斜率-1/2, 取tau=1s)
ARW = sigma[idx_q] * np.sqrt(tau[idx_q])
# 3. 零偏不稳定性 (谷底)
idx_min = np.argmin(sigma)
BI = sigma[idx_min]
tau_bi = tau[idx_min]
# 4. 速率随机游走 (斜率+1/2, 取长相关时间)
idx_rrw = np.argmin(np.abs(tau - tau[-1]//2))
RRW = sigma[idx_rrw] / np.sqrt(tau[idx_rrw])
# 5. 速率斜坡 (斜率+1, 取最长相关时间)
K = sigma[-1] / tau[-1]
return {
'Q': Q, # 量化噪声 (deg)
'ARW': ARW, # 角度随机游走 (deg/√h)
'BI': BI, # 零偏不稳定性 (deg/h)
'RRW': RRW, # 速率随机游走 (deg/h/√h)
'K': K # 速率斜坡 (deg/h²)
}
# 使用示例
tau = np.logspace(0, 4, 100) # 1s 到 10000s
allan_var = 1e-6 / tau + 1e-8 # 模拟数据
params = extract_noise_params(tau, allan_var)
print(params)
这个脚本虽然简单,但足够应付大多数情况。不过要注意,实际数据往往没这么理想,曲线可能有很多毛刺。我建议先做平滑处理,或者用最小二乘法拟合各段斜率。
3.5 避坑指南
最后,分享几个我踩过的坑:
- 数据长度不够:Allan方差要求数据长度至少是最大相关时间的10倍。比如你想分析到1000s,至少需要10000s的数据。我曾经为了省时间只采了半小时,结果曲线后半段全是噪声。
- 温度变化干扰:如果测试环境温度在缓慢变化,Allan曲线末端会异常上翘,容易被误判为速率斜坡。解决办法是加温控箱,或者先做温度补偿。
- 振动耦合:在振动环境下测试,Allan曲线在短时间区段会出现异常凸起。这时候要区分是器件本身的噪声还是外部振动。
- 采样率选择:采样率太低会丢失高频噪声信息,太高又会产生大量冗余数据。我一般建议采样率是系统带宽的5-10倍。
总结一下:Allan方差分析法是惯性导航随机误差建模的基石。通过解读曲线斜率,我们可以把五种噪声一一分离出来。记住,曲线谷底是零偏不稳定性,这是衡量器件精度的核心指标。下次你拿到一份陀螺或加速度计的测试数据,不妨先画一条Allan方差曲线,它能告诉你很多数据手册上没写的东西。
好了,这一章就到这里。下一章我们会讲如何把这些噪声参数用到卡尔曼滤波器里,实现真正的组合导航。到时候见!
公众号:蓝海资料掘金营,微信deep3321