在INS的各种误差源中,影响最大的是惯性传感器误差,其中包括加速度计和陀螺仪的误差。从误差的性质上可以分为系统误差和随机误差,而从误差源上又可以分为零偏误差、比例因子误差、非线性误差、安装误差以及随机噪声等。惯性传感器误差的大小与其质量相关,对于不同导航系统性能的需求,要求选择的传感器的等级也不同。在组合导航系统设计时,尤其是对于低成本的惯性传感器,比如车载惯性导航系统,必须对惯性误差进行在线估计和反馈补偿。
惯性传感器误差主要分为系统误差和随机误差。又可称为静态误差(加性误差),如零偏Bias等和动态误差(乘性误差),如比例因子误差、非正交耦合误差等。
系统误差可以通过实验校准进行补偿,尤其对于高精度传感器来说更是如此。常见的系统误差包括系统零偏、比例因子误差、非线性误差、比例因子不对称性、死区、量化误差、非正交误差、不重合误差等。
系统零偏是所有加速度计和陀螺仪表现出来的一种偏差,可将其定义为零输入下的传感器输出,如下图所示,它与比力和角速度无关。
比例因子误差是系统输入——输出斜率的偏差。由比例因子误差引起的加速度计输出误差与沿敏感轴的真实比力成正比,由比例因子误差引起的陀螺仪输出误差与沿敏感轴的真实角速率成正比。如下图所示为比例因子的影响。
在正输入与负输入时,比例因子不对称情况如图所示。
死区是指在有输入时也没有输出的一个范围,如下图所示。
量化误差发送在所有以模拟量作为输入的数字系统中,如下图所示。
当传感器的三轴不正交时,就会产生非正交误差,非正交误差是在机械制造时产生的。如下图所示为z轴未对准时,它相对于xz平面有角度,相对于yz平面有角度.
不重合误差是由于安装时的不完美导致的,造成了惯性传感器的敏感轴与载体坐标系的正交轴之间的不完全重合而产生的误差。如下图所示为敏感轴相对于二维系统的载体坐标轴有小偏角.
惯性传感器有各种各样的随机误差,通常通过随机建模可以减少随机误差的影响。
零偏在每次运行时都发送改变,该零偏变化的最大值称为逐次启动零偏。
每次运行时,零偏随时间而发生随机改变,单次运行时,传感器零偏是不稳定的,称为随机游走,如下图所示。随机游走是随机的,引起随机游走的原因之一是温度变化。
单次运行期间比例因子的随机变化范围通常是由温度变化引起的。比例因子在重复运行时也会发生改变,但是特定单次运行时保持为常数,它表征了传感器的可重复性,也称为逐次启动比例因子。
白噪声是一个不相关噪声,均匀分布在所有频率中,这种类型的噪声可以有电源引起,但对于半导体器件是固有噪声,白噪声示意图如下。
陀螺仪的角度随机漂移通常用°/h/√Hz 或°/h作为单位。加速度计的随机漂移单位为μg/√Hz 或 m/s/√h。该定义需要确定数据采集系统中的传感器测量获得的数据传输速率(采用频率)。数据传输速率与传感器的带宽有关,这是一个重要参数。惯性传感器的带宽(Hz为单位)定义了能够被传感器检测的频率范围。比如,100Hz的陀螺仪能够检测小于100Hz的运动,任何更高的频率不会被检测。基于采样原理,传感器必须以最大频率的2倍频率解析采样,上述对应为200Hz.虽然增加数据传输速率见扩大带宽,方便更高的频率进行动态检测,但是也更容易引入噪声。如下所示为常见的KVH陀螺仪的重要性能参数。
INS的性能可以有两类传感器来衡量,分别是陀螺仪和加速度计。
陀螺仪是角速率传感器,输出角速率还是姿态取决于是速率陀螺仪还是速率积分陀螺仪。
角速率的测量可由以下方程建模:
其中: 为三轴陀螺仪带误差的测量值(°/h), 为三轴陀螺仪真实角速率(°/h),
是陀螺仪漂移误差称为bias(°/h),是一个比例因子矩阵,是陀螺仪非正交矩阵。 是陀螺仪噪声矢量(°/h)。
偏差矢量、矩阵 及表达式如下:
上式中,为定义的陀螺仪三轴不重合度的小角度;为陀螺仪的三轴比例因子。
加速度计准确度的性能指标与表征陀螺仪的指标很接近,如零偏、比例因子稳定性、随机噪声等。比力的测量表达式可由如下方程进行建模:
其中: 为三轴加速度计带误差的测量值, 为三轴加速度计真实比力矢量,
是加速度计零偏矢量称为bias,线性比例因子误差矩阵,是非线性比例因子误差矩阵,是表征加速度计各轴非正交的矩阵。 为不规则重力加速度矢量 (与理论重力加速度的偏差), 是加速度计噪声矢量。
偏差矢量、矩阵表达式如下:
上式中,为定义的加速度计三轴不重合度的小角度;为加速度计的三轴比例因子。
对于这两个惯性传感器,比例因子与零偏通常认为是恒定的(在一定的时间范围内),但在不同的传感器之间却是不相关的未知量。原则上,这些误差可以由校准技术消除。传感器噪声由白噪声、相关噪声和随机噪声等组成,可以由误差估计算法尽量减小。
传感器误差的非确定性部分是随机的,可采用随机模型对其建模。这些误差常与时间有关,常用的误差建模方法有随机游走过程、一阶-高斯马尔可夫过程(GM)、自回归过程AR等.
一阶-高斯马尔可夫过程通常用来对随机误差建模,它的形式如下:
式中, 为随机过程对应的变量, 是过程相关时间的倒数, , 是具有零均值单位方差的不相关高斯白噪声矢量(协方差非对角为0),是与随机过程相关的白噪声矢量.一阶-高斯马尔可夫模型是x的衰减指数(双侧指数分布即laplace分布)自相关序列,示意图如下
对上述表达式离散化处理得到:
一般在组合导航中,采用allan方差中的Bias Instibility 参数和 τ 当作随机噪声和反相关时间常数即分别对应参数.
IMU的成本通常取决于惯性传感器的类型。IMU是根据它们的具体应用进行分类的,主要依据以°/h为单位的陀螺仪漂移。其性能的第二个衡量指标是陀螺仪的随机游走和加速度计零偏,陀螺仪随机游走通常以°/√h为单位。基于性能参数可将IMU分类为四个类别或等级。
IMU的测量输出值通常是角速率和比力,而导航解算时通常需增量值,为此可按如下转化:
上式中,为比力(加速度计b-frame中的输出,m/s²),为载体坐标系相对于惯性坐标系的旋转角速率,在惯性坐标系中求解(即陀螺仪的输出,rad/s);为单位采样时间内比力的变化量(即速度m/s),为单位采样时间内角速率的变化量(即角度rad),为采样时间间隔.
采用实验室校准或数学方法校准后,得到IMU的零偏和比例因子,然后用于原始测量数据的补偿:
上式中,为陀螺仪漂移(bias误差,rad/s),为陀螺仪比例因子(ppm),为加速度计零偏(bias误差,m/s²),为加速度计比例因子(ppm);为修正后的增量陀螺仪输出(rad),为为修正后的增量加速度计输出(m/s).
对于上述误差建模涉及到IMU传感器的相关参数,则误差模型参数的识别主要由如下方法:
a)Auto-correlation
b)Power spectrum density(PSD)
c)Allan Variance
前两种方法是通用的分析随机误差的方法,第三种方法主要针对惯性器件。惯性器件随机噪声方差产生影响的主要局限于低频段,对上述前两种主要适用于中高频率的方法不太适用,一般通过Allan方差分析进行确定和分析。
对于随机误差,利用常规的分析方法,例如计算样本均值和方差并不能揭示潜在的误差源,另一方面,虽然自相关函数和功率谱密度函数分别从时域和频域描述了随机误差的统计特性,但是在实际工作中通过这些函数加以分析将随机误差分离出来比较困难(源于频率过低)。
Allan方差法是20世纪60年代由美国国家标准局David Allan提出的,它是一种基于时域的分析方法,不仅可以用来分析光学陀螺的误差特性,而且还可以应用于其他任何精密测量仪器.
Allan方差法的主要特点是能非常容易对各种误差源及其对整个噪声统计特性的贡献进行细致的表征和辨识,而且便于计算,易于分离。它提供了一种识别并量化存在于数据中的不同噪声项。
Allan方差分析主要用于分析陀螺量化噪声、角度随机游走噪声(角速率白噪声)、零偏不稳定性、角速率随机游走(角加速度白噪声)和速率斜坡(角速率常值趋势项)等五种典型误差。
allan方差将噪声从频域转换到时域进行分析,因此不用做傅立叶变换,直接通过运算得到时间序列。在GNSS/INS组合导航中,一般需要确定位置、姿态、速度、加速度计零偏和陀螺仪零偏的过程噪声的谱密度(PSD),也称为随机游走噪声参数。其中位置的过程噪声已经蕴含在速度中,其谱密度参数可以设置为0或者很小的值。其余谱密度参数由角速度和加速度的观测值的allan方差对数图得到。
关于allan方差分析过程噪声的步骤和方法,具体如下(源于武汉大学惯性导航课件)
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 5 13:01:19 2022
@author: scott
"""
import os
import numpy as np
import matplotlib.pyplot as plt
def allan_variance(y0, tau0):
# avar(y0, tau0)
# 计算Allan方差
# 输入:y -- 数据(一行或列向量), tau0 -- 采样周期
# 输出:sigma -- Allan方差(量纲单位与输入y保持一致), tau -- 取样时间, Err -- 百分比估计误差
pass
def main(N = 100000):
# sigma, tau, Err = allan_variance(y, 0.1)
# sigma, tau, Err = allan_variance(y0, tau0)
y0 = np.random.normal(loc=0.0, scale=1.0, size=(N,)) + 0.00001*np.arange(N)
tau0 = 0.1
N = len(y0)
y = y0
NL = N
tau = np.zeros(N,)
sigma = np.zeros(N,)
Err = np.zeros(N,)
for k in range(N):
sigma[k] = np.sqrt(1/(2*(NL-1))*sum((y[1:NL]-y[0:NL-1])**2))
tau[k] = 2**(k-1)*tau0
Err[k] = 1/np.sqrt(2*(NL-1))
NL = int(np.floor(NL/2))
if NL < 3 :
break
y = 1/2*(y[0:2*NL:2] + y[1:2*NL:2]) # 分组长度加倍(数据长度减半)
plt.figure(figsize=(16,12))
plt.subplot(211)
plt.plot(tau0*np.arange(N), y0, 'bo')
plt.xlabel('$ \\tau /s $',fontsize=14)
plt.ylabel("y",fontsize=14)
#plt.legend(["allan variance plot"],loc='best',fontsize=16)
plt.grid()
plt.title('Allan Variance Analysis',fontsize=14)
plt.subplot(212)
plt.loglog(tau, sigma, 'b+', tau, sigma**(1-Err), 'ro', tau, sigma**(1+Err), 'ro')
plt.xlabel('$ \\tau /s $',fontsize=14)
plt.ylabel("$\sigma_A(\\tau)$",fontsize=14)
plt.legend(["$\sigma_A $","$ \sigma_A-err $", "$ \sigma_A+err $"],loc='best',fontsize=14)
plt.grid()
plt.title('',fontsize=14)
# plt.savefig(f'{path_data}\\variance.png')
return tau, sigma, sigma**(1-Err), sigma**(1+Err)
if __name__ == "__main__":
a,b,c,d = main()