如何使用 NIS 判断观测是否可靠:从卡尔曼滤波推导到机器人实践

如何使用 NIS 判断观测是否可靠:从卡尔曼滤波推导到机器人实践

核心问题:考虑了预测与传感器各自的不确定性之后,本次观测与预测之间的差异,是否大得不合理?

NIS(Normalized Innovation Squared,归一化创新平方)检验的是观测与当前预测、噪声模型之间的统计一致性,不是直接判断观测是否接近真实值。它不需要真实状态,适合在线使用;但也正因为没有真实值,它不能仅凭一次检验就证明"传感器错了,预测一定是对的"。

本文从创新和协方差的定义出发,逐步推导 NIS 与卡方门限;随后用固定数字走完整个预测、门控和更新过程,再讨论相关误差、接触约束、走廊退化、多帧统计与 ESKF 实现。所有数值例子均为教学构造,不代表某一具体传感器的标定参数。


1. NIS 到底在判断什么?

机器人通过 IMU、运动模型或者上一时刻状态,得到当前状态的预测;相机、激光雷达、轮速计等传感器又提供了新的观测。两者通常不会完全相同。

最简单的想法是:

观测与预测差得越多,观测就越不可靠。

但这个判断遗漏了一个关键问题:预测本身有多准,传感器本身又有多准?

例如,同样是位置差了 0.5   m 0.5\,\mathrm m 0.5m:

  • 预测标准差只有 0.01   m 0.01\,\mathrm m 0.01m,传感器标准差也只有 0.01   m 0.01\,\mathrm m 0.01m,这个差异非常异常。
  • 预测标准差已经达到 2   m 2\,\mathrm m 2m,那么差了 0.5   m 0.5\,\mathrm m 0.5m 并不奇怪。

因此,不能只比较原始距离,而应该比较:

差异的大小 相对于 这一差异本来应该具有的不确定性 \text{差异的大小} \quad\text{相对于}\quad \text{这一差异本来应该具有的不确定性} 差异的大小相对于这一差异本来应该具有的不确定性

这正是 NIS 所做的事情。

还需要区分三个问题:

问题 NIS 能否单独回答?
当前观测与预测及其协方差模型是否一致? 可以提供统计检验证据
当前观测是否接近真实值? 不能,因为没有直接使用真实值
当前观测能否显著提高所有状态方向的精度? 不能,还要看雅可比、协方差、可观性与增益

通过 NIS 门控,不等于观测精度高;NIS 超限,也不等于已经定位到传感器故障。


2. 先分清楚:状态误差、测量噪声和创新

2.1 符号约定

本文使用以下符号:

符号 含义
x x x 真实状态
x ^ − \hat x^- x^− 使用当前观测之前的预测状态
P − P^- P− 预测状态误差的协方差
z z z 当前实际观测
h ( x ) h(x) h(x) 观测模型
n n n 测量噪声
R R R 测量噪声协方差
J J J 观测模型对状态误差的一阶雅可比
ν \nu ν 创新,即实际观测减去预测观测
S S S 创新协方差
m m m 创新向量的维数,在正定情形下也是 NIS 的自由度
ϵ \epsilon ϵ NIS 数值
τ \tau τ NIS 门限

上标 " − - −" 表示当前观测更新之前;上标 " + + +" 表示更新之后。

这里用 J J J 表示观测雅可比,避免与退化分析中常见的信息矩阵 H = J T J H=J^T J H=JTJ 混淆。

2.2 状态预测误差

假设机器人已经获得预测状态:

x ^ − \hat x^- x^−

定义真实状态与预测状态之间的误差:

x ~ = x − x ^ − \tilde x=x-\hat x^- x~=x−x^−

假设预测无偏:

E x \~ = 0 , E x \~ x \~ T = P − E\\tilde x=0, \qquad E\\tilde x\\tilde x\^T=P^- Ex\~=0,Ex\~x\~T=P−

对于 ESKF,上式中的减法应理解为与误差状态定义一致的局部差异。姿态状态通常不能简单地用四元数的四个分量直接相减;本文先用欧氏空间写法解释基本统计关系。

2.3 测量噪声

传感器模型为:

z = h ( x ) + n , z=h(x)+n, z=h(x)+n,

其中:

E n = 0 , E n n T = R En=0, \qquad Enn\^T=R En=0,EnnT=R

测量噪声是实际观测与真实状态对应的理想观测之间的差:

n = z − h ( x ) n=z-h(x) n=z−h(x)

由于不知道真实状态 x x x,通常也无法直接得到每次观测的真实测量噪声。

2.4 创新

用预测状态计算"传感器应该测到什么":

z ^ − = h ( x ^ − ) \hat z^-=h(\hat x^-) z^−=h(x^−)

实际观测与预测观测之间的差:

ν = z − h ( x ^ − ) \boxed{\nu=z-h(\hat x^-)} ν=z−h(x^−)

就叫做创新,innovation。

三者的区别是:

量 定义 在线能否直接获得?
状态误差 x ~ = x − x ^ − \tilde x=x-\hat x^- x~=x−x^− 通常不能,因为不知道真实状态
测量噪声 n = z − h ( x ) n=z-h(x) n=z−h(x) 通常不能,因为不知道真实状态
创新 ν = z − h ( x ^ − ) \nu=z-h(\hat x^-) ν=z−h(x^−) 可以,观测和预测都有

NIS 使用创新,正是因为创新可以在线计算。

2.5 创新中到底包含什么误差?

对观测模型做一阶展开:

h ( x ) = h ( x ^ − + x ~ ) ≈ h ( x ^ − ) + J x ~ , h(x) =h(\hat x^-+\tilde x) \approx h(\hat x^-)+J\tilde x, h(x)=h(x^−+x~)≈h(x^−)+Jx~,

其中:

J = ∂ h ∂ x ∣ x ^ − J=\left.\frac{\partial h}{\partial x}\right|_{\hat x^-} J=∂x∂h x^−

代入创新:

ν = z − h ( x ^ − ) = h ( x ) + n − h ( x ^ − ) ≈ J x ~ + n \begin{aligned} \nu &=z-h(\hat x^-)\\ &=h(x)+n-h(\hat x^-)\\ &\approx J\tilde x+n \end{aligned} ν=z−h(x^−)=h(x)+n−h(x^−)≈Jx~+n

因此:

创新 ≈ 状态预测误差投影到观测空间 + 测量噪声 \boxed{ \text{创新} \approx \text{状态预测误差投影到观测空间} + \text{测量噪声} } 创新≈状态预测误差投影到观测空间+测量噪声

这说明:创新大,既可能是传感器存在问题,也可能是状态预测存在问题。


3. 推导创新协方差:为什么是 S = J P − J T + R S=JP^-J^T+R S=JP−JT+R?

3.1 从协方差定义展开

由:

ν ≈ J x ~ + n , \nu\approx J\tilde x+n, ν≈Jx~+n,

在零均值假设下,创新协方差为:

S = E ν ν T S=E\\nu\\nu\^T S=EννT

展开得到:

S ≈ E ( J x \~ + n ) ( J x \~ + n ) T = J E x \~ x \~ T J T + J E x \~ n T + E n x \~ T J T + E n n T \begin{aligned} S &\approx E(J\\tilde x+n)(J\\tilde x+n)\^T\\ &=JE\\tilde x\\tilde x\^TJ^T +JE\\tilde x n\^T\\ &\quad+En\\tilde x\^TJ^T +Enn\^T \end{aligned} S≈E(Jx\~+n)(Jx\~+n)T=JEx\~x\~TJT+JEx\~nT+Enx\~TJT+EnnT

如果当前测量噪声与预测误差不相关:

E x \~ n T = 0 , E\\tilde x n\^T=0, Ex\~nT=0,

则交叉项消失:

S = J P − J T + R \boxed{S=JP^-J^T+R} S=JP−JT+R

两个部分分别是:

J P − J T ⏟ 预测观测的不确定性 + R ⏟ 测量噪声的不确定性 \underbrace{JP^-J^T}{\text{预测观测的不确定性}} + \underbrace{R}{\text{测量噪声的不确定性}} 预测观测的不确定性 JP−JT+测量噪声的不确定性 R

3.2 为什么要乘 J J J?

因为 P − P^- P− 描述的是状态空间 里的误差,创新却在观测空间中。

假设状态有 15 维,但当前只观测三维速度,那么:

P − ∈ R 15 × 15 , J ∈ R 3 × 15 , S ∈ R 3 × 3 P^-\in\mathbb R^{15\times15}, \qquad J\in\mathbb R^{3\times15}, \qquad S\in\mathbb R^{3\times3} P−∈R15×15,J∈R3×15,S∈R3×3

J J J 的作用,是将状态误差的一阶影响映射到当前观测上。因此,参与创新协方差的不是整个 P − P^- P− 的简单加和,而是:

J P − J T JP^-J^T JP−JT

3.3 一维数值例子

假设预测位置的标准差为:

σ p r e d = 0.2   m , \sigma_{\mathrm{pred}}=0.2\,\mathrm m, σpred=0.2m,

传感器测量位置的标准差为:

σ s e n s o r = 0.1   m \sigma_{\mathrm{sensor}}=0.1\,\mathrm m σsensor=0.1m

直接测量位置,故 J = 1 J=1 J=1。于是:

S = 0.2 2 + 0.1 2 = 0.05   m 2 S=0.2^2+0.1^2=0.05\,\mathrm{m^2} S=0.22+0.12=0.05m2

创新的标准差为:

σ ν = 0.05 ≈ 0.2236   m \boxed{ \sigma_\nu=\sqrt{0.05}\approx0.2236\,\mathrm m } σν=0.05 ≈0.2236m

解释这个数值时,可以这样理解:

预测与观测之间有一定差异是正常的。判断差异大不大,应使用双方误差合成后的 0.2236   m 0.2236\,\mathrm m 0.2236m,而不是只使用传感器的 0.1   m 0.1\,\mathrm m 0.1m。

所以,标准预测创新检验使用:

ν T S − 1 ν , \nu^TS^{-1}\nu, νTS−1ν,

而不是直接使用:

ν T R − 1 ν \nu^TR^{-1}\nu νTR−1ν

后一种写法忽略了预测状态的不确定性,除非具体问题已经满足可以忽略该项等额外条件,否则不能替代 NIS。


4. 从"几个标准差"推导出 NIS

4.1 一维情况下:标准化创新的平方

设一维创新为 ν \nu ν,方差为:

S = σ ν 2 S=\sigma_\nu^2 S=σν2

先除以标准差:

w = ν σ ν w=\frac{\nu}{\sigma_\nu} w=σνν

w w w 表示当前创新相当于多少个创新标准差。

再平方:

ϵ N I S = w 2 = ν 2 S \boxed{ \epsilon_{\mathrm{NIS}}=w^2=\frac{\nu^2}{S} } ϵNIS=w2=Sν2

例如:

ν = 0.6   m , S = 0.05   m 2 \nu=0.6\,\mathrm m, \qquad S=0.05\,\mathrm{m^2} ν=0.6m,S=0.05m2

于是:

w = 0.6 0.2236 ≈ 2.683 , w=\frac{0.6}{0.2236}\approx2.683, w=0.22360.6≈2.683,

ϵ N I S = 2.683 2 = 7.2 \epsilon_{\mathrm{NIS}}=2.683^2=7.2 ϵNIS=2.6832=7.2

NIS 为 7.2 7.2 7.2,不是偏了 7.2 σ 7.2\sigma 7.2σ;在一维情况下,它对应的是约 2.683 σ 2.683\sigma 2.683σ。

4.2 NIS 为什么没有单位?

因为分子是创新平方,分母是创新方差,两者的单位抵消。

把前面例子的米换成厘米:

ν = 60   c m , S = 500   c m 2 , \nu=60\,\mathrm{cm}, \qquad S=500\,\mathrm{cm^2}, ν=60cm,S=500cm2,

仍然得到:

60 2 500 = 7.2 \frac{60^2}{500}=7.2 500602=7.2

因此,NIS 不会因为长度单位从米改成厘米就改变。前提是创新和协方差必须一起进行正确的单位变换。

4.3 多维情况下:为什么不能只逐项除以方差?

当创新各分量相互独立、 S S S 为对角矩阵时,可以写成:

ϵ N I S = ν 1 2 S 11 + ν 2 2 S 22 + ⋯ + ν m 2 S m m \epsilon_{\mathrm{NIS}} =\frac{\nu_1^2}{S_{11}} +\frac{\nu_2^2}{S_{22}} +\cdots +\frac{\nu_m^2}{S_{mm}} ϵNIS=S11ν12+S22ν22+⋯+Smmνm2

但如果各分量存在相关性,上式会遗漏非对角项包含的信息。

正确做法是白化:既统一尺度,又去除相关性。

4.4 用 Cholesky 分解推导白化

对正定创新协方差进行分解:

S = L L T , S=LL^T, S=LLT,

其中 L L L 是下三角矩阵。

定义:

w = L − 1 ν w=L^{-1}\nu w=L−1ν

白化创新的协方差为:

Cov ⁡ ( w ) = L − 1 S L − T = L − 1 L L T L − T = I \begin{aligned} \operatorname{Cov}(w) &=L^{-1}SL^{-T}\\ &=L^{-1}LL^TL^{-T}\\ &=I \end{aligned} Cov(w)=L−1SL−T=L−1LLTL−T=I

如果:

ν ∼ N ( 0 , S ) , \nu\sim\mathcal N(0,S), ν∼N(0,S),

则:

w ∼ N ( 0 , I ) w\sim\mathcal N(0,I) w∼N(0,I)

在联合高斯假设下,白化后的各分量相互独立,并且都服从标准正态分布。注意:只知道协方差为单位阵、但没有联合高斯等额外条件时,不能仅凭"不相关"就断言"独立"。

计算白化创新的平方长度:

w T w = ( L − 1 ν ) T ( L − 1 ν ) = ν T L − T L − 1 ν = ν T S − 1 ν \begin{aligned} w^Tw &=(L^{-1}\nu)^T(L^{-1}\nu)\\ &=\nu^TL^{-T}L^{-1}\nu\\ &=\nu^TS^{-1}\nu \end{aligned} wTw=(L−1ν)T(L−1ν)=νTL−TL−1ν=νTS−1ν

因此:

ϵ N I S = ν T S − 1 ν \boxed{ \epsilon_{\mathrm{NIS}}=\nu^TS^{-1}\nu } ϵNIS=νTS−1ν

NIS 就是创新的马氏距离平方 ,也就是白化创新的平方长度。


5. 为什么 NIS 要和卡方分布比较?

5.1 卡方分布从哪里来?

设创新有 m m m 维。白化后:

w = w 1 ⋯ w m T , w=\begin{bmatrix}w_1&\cdots&w_m\end{bmatrix}^T, w=w1⋯wmT,

其中各分量相互独立,并满足:

w i ∼ N ( 0 , 1 ) w_i\sim\mathcal N(0,1) wi∼N(0,1)

于是:

ϵ N I S = w 1 2 + w 2 2 + ⋯ + w m 2 \epsilon_{\mathrm{NIS}} =w_1^2+w_2^2+\cdots+w_m^2 ϵNIS=w12+w22+⋯+wm2

m m m 个独立标准正态变量的平方和,服从自由度为 m m m 的卡方分布。因此:1

ϵ N I S ∼ χ m 2 \boxed{\epsilon_{\mathrm{NIS}}\sim\chi_m^2} ϵNIS∼χm2

其均值与方差为:

E ϵ N I S = m , Var ⁡ ( ϵ N I S ) = 2 m E\\epsilon_{\\mathrm{NIS}}=m, \qquad \operatorname{Var}(\epsilon_{\mathrm{NIS}})=2m EϵNIS=m,Var(ϵNIS)=2m

因此:

正常 NIS 的长期均值不是一律接近 1,而是接近观测维数 m m m。

有些代码记录的是:

ϵ N I S m , \frac{\epsilon_{\mathrm{NIS}}}{m}, mϵNIS,

这个量的期望才是 1。使用门限之前,必须确认日志里的指标有没有除以自由度。

5.2 这个结论需要哪些前提?

核心前提是:

ν ∼ N ( 0 , S ) , \nu\sim\mathcal N(0,S), ν∼N(0,S),

并且算法使用的 S S S 确实描述了创新的不确定性。

在线性高斯、正确建模、正确初始化等标准条件下,可以得到相应的卡方结论。对 EKF/ESKF,创新与协方差来自线性化,通常只能把 NIS 视为近似检验。

强非线性、错误关联、系统性偏差、错误协方差、未处理的相关性等,都会使理论门限的实际含义发生变化。

因此,门限具有统计意义的前提不是"公式写对了"这一项,而是创新分布模型也基本成立。

5.3 单帧异常门控:上尾检验

建立原假设:

H 0 : ν ∼ N ( 0 , S ) H_0:\quad\nu\sim\mathcal N(0,S) H0:ν∼N(0,S)

选择理论误报概率 α \alpha α,例如:

α = 0.01 \alpha=0.01 α=0.01

门限为:

τ = F χ m 2 − 1 ( 1 − α ) \boxed{ \tau=F_{\chi_m^2}^{-1}(1-\alpha) } τ=Fχm2−1(1−α)

其中 F − 1 F^{-1} F−1 是分位数函数。

判定规则为:

{ ϵ N I S ≤ τ , 未发现显著的不一致证据; ϵ N I S > τ , 判为与当前统计模型显著不一致 \boxed{ \begin{cases} \epsilon_{\mathrm{NIS}}\le\tau, &\text{未发现显著的不一致证据;}\\ \epsilon_{\mathrm{NIS}}>\tau, &\text{判为与当前统计模型显著不一致} \end{cases} } {ϵNIS≤τ,ϵNIS>τ,未发现显著的不一致证据;判为与当前统计模型显著不一致

因为创新已经平方,所以正方向和负方向的过大创新都会被检测;"上尾检验"不是说只检查正创新。

5.4 常用卡方门限

下表表头表示原假设成立时的理论覆盖率;数值为对应卡方分布的上分位点。2

观测维数 m m m 95% 99% 99.9%
1 3.841 6.635 10.828
2 5.991 9.210 13.816
3 7.815 11.345 16.266
6 12.592 16.812 22.458

例如,三维速度观测使用 99% 门限:

ϵ N I S > 11.345 ⇒ 触发异常门控 \epsilon_{\mathrm{NIS}}>11.345 \quad\Rightarrow\quad \text{触发异常门控} ϵNIS>11.345⇒触发异常门控

即使 ESKF 有 15 维状态,这里仍然使用 3 个自由度,不是 15 个。

5.5 通过 99% 门限,不等于数据有 99% 概率正确

正确的概率含义是:

P ( ϵ N I S > τ ∣ H 0 ) = 1 % P(\epsilon_{\mathrm{NIS}}>\tau\mid H_0)=1\% P(ϵNIS>τ∣H0)=1%

即:

假如预测、观测和协方差模型符合原假设,仍然约有 1% 的样本会超过这个门限。

它不是:

P ( 数据错误 ∣ ϵ N I S > τ ) = 99 % P(\text{数据错误}\mid\epsilon_{\mathrm{NIS}}>\tau)=99\% P(数据错误∣ϵNIS>τ)=99%

这两个条件概率完全不同。要判断"给定检验结果后,数据错误的概率",还需要故障先验和故障情况下的创新分布等额外信息。

同理,通过门控只能表述为"没有足够证据拒绝原假设",而不是"已经证明观测正确"。

5.6 99.9% 门限反而比 99% 更宽松

覆盖率越高,门限越大:

F_{\\chi_m^2}^{-1}(0.999) F_{\\chi_m^2}^{-1}(0.99)

因此,更大的创新也可能通过。

它通常意味着在原假设下误拒正常观测更少,但也可能放过更多异常观测。不能因为数字"99.9%"更大,就认为异常筛选更严格。


6. 完整数值例子:从预测到门控,再到卡尔曼更新

本节始终使用同一组位置---速度状态,逐项计算所有中间量。

6.1 状态、预测和观测模型

状态为:

x = p v x=\begin{bmatrix}p\\v\end{bmatrix} x=pv

预测状态为:

x ^ − = 10 2 , \hat x^-= \begin{bmatrix} 10\\2 \end{bmatrix}, x^−=102,

即位置 10   m 10\,\mathrm m 10m、速度 2   m / s 2\,\mathrm{m/s} 2m/s。

预测协方差为:

P − = 0.04 0.015 0.015 0.09 P^-= \begin{bmatrix} 0.04&0.015\\ 0.015&0.09 \end{bmatrix} P−=0.040.0150.0150.09

各项的含义是:

  • 位置方差: 0.04   m 2 0.04\,\mathrm{m^2} 0.04m2,对应标准差 0.2   m 0.2\,\mathrm m 0.2m。
  • 速度方差: 0.09   ( m / s ) 2 0.09\,(\mathrm{m/s})^2 0.09(m/s)2,对应标准差 0.3   m / s 0.3\,\mathrm{m/s} 0.3m/s。
  • 交叉协方差: 0.015   m 2 / s 0.015\,\mathrm{m^2/s} 0.015m2/s,表示位置与速度误差相关。

传感器只测量位置:

z = p + n , J = 1 0 z=p+n, \qquad J=\begin{bmatrix}1&0\end{bmatrix} z=p+n,J=10

测量标准差为 0.1   m 0.1\,\mathrm m 0.1m,所以:

R = 0.01 R=0.01 R=0.01

创新协方差:

S = J P − J T + R = 1 0 0.04 0.015 0.015 0.09 1 0 + 0.01 = 0.05 \begin{aligned} S &=JP^-J^T+R\\ &= \begin{bmatrix}1&0\end{bmatrix} \begin{bmatrix} 0.04&0.015\\ 0.015&0.09 \end{bmatrix} \begin{bmatrix}1\\0\end{bmatrix} +0.01\\ &=0.05 \end{aligned} S=JP−JT+R=100.040.0150.0150.0910+0.01=0.05

虽然状态是二维,本次创新仍然只有一维。

6.2 情况 A:观测位置为 10.2   m 10.2\,\mathrm m 10.2m

创新:

ν = 10.2 − 10 = 0.2 \nu=10.2-10=0.2 ν=10.2−10=0.2

NIS:

ϵ N I S = 0.2 2 0.05 = 0.8 \epsilon_{\mathrm{NIS}} =\frac{0.2^2}{0.05} =0.8 ϵNIS=0.050.22=0.8

采用一维 99% 门限:

0.8 < 6.635 0.8<6.635 0.8<6.635

因此,通过门控。

随后才计算卡尔曼增益并更新状态:

K = P − J T S − 1 = 0.04 0.015 1 0.05 = 0.8 0.3 \begin{aligned} K &=P^-J^TS^{-1}\\ &=\begin{bmatrix}0.04\\0.015\end{bmatrix}\frac1{0.05}\\ &=\begin{bmatrix}0.8\\0.3\end{bmatrix} \end{aligned} K=P−JTS−1=0.040.0150.051=0.80.3

状态更新:

x ^ + = x ^ − + K ν = 10 2 + 0.8 0.3 0.2 = 10.16 2.06 \begin{aligned} \hat x^+ &=\hat x^-+K\nu\\ &=\begin{bmatrix}10\\2\end{bmatrix} +\begin{bmatrix}0.8\\0.3\end{bmatrix}0.2\\ &=\boxed{\begin{bmatrix}10.16\\2.06\end{bmatrix}} \end{aligned} x^+=x^−+Kν=102+0.80.30.2=10.162.06

后验协方差为:

P + = P − − P − J T S − 1 J P − = 0.008 0.003 0.003 0.0855 \begin{aligned} P^+ &=P^--P^-J^TS^{-1}JP^-\\ &=\begin{bmatrix} 0.008&0.003\\ 0.003&0.0855 \end{bmatrix} \end{aligned} P+=P−−P−JTS−1JP−=0.0080.0030.0030.0855

由此可以看出:

NIS 门控决定是否允许这份观测进入更新;卡尔曼增益决定允许更新之后,各状态调整多少。

虽然传感器只测量位置,但位置观测仍然改变了速度。这是因为 P − P^- P− 中位置与速度的交叉协方差不为零。

6.3 情况 B:同一份先验,观测位置为 10.6   m 10.6\,\mathrm m 10.6m

注意:这里不是接着情况 A 更新,而是重新从相同的 x ^ − , P − \hat x^-,P^- x^−,P− 出发。

创新:

ν = 10.6 − 10 = 0.6 \nu=10.6-10=0.6 ν=10.6−10=0.6

NIS:

ϵ N I S = 0.6 2 0.05 = 7.2 \epsilon_{\mathrm{NIS}} =\frac{0.6^2}{0.05} =7.2 ϵNIS=0.050.62=7.2

因为:

7.2 > 6.635 , 7.2>6.635, 7.2>6.635,

所以触发异常门控。在最简单的硬门控策略下,不用这一观测执行状态更新。

一维情况下,还可以把 NIS 门限转换回原始距离门限:

ν 2 S ≤ τ ⟺ ∣ ν ∣ ≤ τ S \frac{\nu^2}{S}\le\tau \quad\Longleftrightarrow\quad |\nu|\le\sqrt{\tau S} Sν2≤τ⟺∣ν∣≤τS

代入数据:

∣ ν ∣ ≤ 6.634897 × 0.05 ≈ 0.575973   m |\nu| \le\sqrt{6.634897\times0.05} \approx0.575973\,\mathrm m ∣ν∣≤6.634897×0.05 ≈0.575973m

因此, 0.6   m 0.6\,\mathrm m 0.6m 的创新已经越界。

它的上尾 p p p 值约为:

p u p p e r = P ( χ 1 2 ≥ 7.2 ) ≈ 0.007290 p_{\mathrm{upper}} =P(\chi_1^2\ge7.2) \approx0.007290 pupper=P(χ12≥7.2)≈0.007290

含义是:在原假设成立时,出现至少这么大 NIS 的概率约为 0.729 % 0.729\% 0.729%。

它不是"这份数据只有 0.729 % 0.729\% 0.729% 的概率正确"。

6.4 情况 C:还是差 0.6   m 0.6\,\mathrm m 0.6m,但预测更不确定

将预测位置方差改成:

P p p − = 0.25 , P_{pp}^-=0.25, Ppp−=0.25,

即预测位置标准差为 0.5   m 0.5\,\mathrm m 0.5m。

仍然使用:

R = 0.01 , ν = 0.6 R=0.01, \qquad \nu=0.6 R=0.01,ν=0.6

此时:

S = 0.25 + 0.01 = 0.26 , S=0.25+0.01=0.26, S=0.25+0.01=0.26,

ϵ N I S = 0.36 0.26 ≈ 1.385 \epsilon_{\mathrm{NIS}} =\frac{0.36}{0.26} \approx1.385 ϵNIS=0.260.36≈1.385

这次通过门控。

观测没有改变,改变的是预测对自身精度的声明。

因此,NIS 不是固定距离门限,而是根据预测与观测的不确定性调整判定尺度。


7. 二维相关性例子:同样的距离,为什么一个通过、另一个拒绝?

7.1 创新协方差

考虑二维位置创新:

S = 0.04 0.036 0.036 0.04 m 2 S= \begin{bmatrix} 0.04&0.036\\ 0.036&0.04 \end{bmatrix} \mathrm{m^2} S=0.040.0360.0360.04m2

两个坐标轴上的标准差都是:

σ x = σ y = 0.2   m \sigma_x=\sigma_y=0.2\,\mathrm m σx=σy=0.2m

相关系数为:

ρ = 0.036 0.2 × 0.2 = 0.9 \rho=\frac{0.036}{0.2\times0.2}=0.9 ρ=0.2×0.20.036=0.9

这表示两维创新具有很强的正相关性,更倾向于一起变大、一起变小。

比较两组创新:

ν A = 0.2 0.2 , ν B = 0.2 − 0.2 \nu_A=\begin{bmatrix}0.2\\0.2\end{bmatrix}, \qquad \nu_B=\begin{bmatrix}0.2\\-0.2\end{bmatrix} νA=0.20.2,νB=0.2−0.2

它们的欧氏长度相同:

∥ ν A ∥ = ∥ ν B ∥ = 0.08 ≈ 0.283   m \|\nu_A\|=\|\nu_B\| =\sqrt{0.08} \approx0.283\,\mathrm m ∥νA∥=∥νB∥=0.08 ≈0.283m

而且,每一个坐标分量都只偏了 1 σ 1\sigma 1σ。

但联合来看,这两组创新并不等价。

7.2 特征方向与特征值

S S S 的两个特征方向为:

u + = 1 2 1 1 , λ + = 0.076 , u_+=\frac1{\sqrt2}\begin{bmatrix}1\\1\end{bmatrix}, \qquad \lambda_+=0.076, u+=2 111,λ+=0.076,

u − = 1 2 1 − 1 , λ − = 0.004 u_-=\frac1{\sqrt2}\begin{bmatrix}1\\-1\end{bmatrix}, \qquad \lambda_-=0.004 u−=2 11−1,λ−=0.004

这里 u + u_+ u+ 与 u − u_- u− 是单位特征向量。

沿着"同向变化"的方向,方差较大;沿着"反向变化"的方向,方差很小。

一般地,若:

S = U Λ U T , S=U\Lambda U^T, S=UΛUT,

则:

ϵ N I S = ν T U Λ − 1 U T ν = ∑ i = 1 m ( u i T ν ) 2 λ i \begin{aligned} \epsilon_{\mathrm{NIS}} &=\nu^TU\Lambda^{-1}U^T\nu\\ &=\boxed{\sum_{i=1}^{m}\frac{(u_i^T\nu)^2}{\lambda_i}} \end{aligned} ϵNIS=νTUΛ−1UTν=i=1∑mλi(uiTν)2

计算过程是:

先将创新投影到协方差的主方向,再除以各方向的方差,最后求和。

7.3 分别计算两组创新

ν A \nu_A νA 完全沿着 u + u_+ u+,因此:

ϵ A = 0.08 0.076 ≈ 1.053 \epsilon_A=\frac{0.08}{0.076}\approx1.053 ϵA=0.0760.08≈1.053

ν B \nu_B νB 完全沿着 u − u_- u−,因此:

ϵ B = 0.08 0.004 = 20 \epsilon_B=\frac{0.08}{0.004}=20 ϵB=0.0040.08=20

使用二维 99% 门限:

τ = 9.210 , \tau=9.210, τ=9.210,

所以:

ν A 通过, ν B 拒绝 \boxed{\nu_A\text{ 通过,}\qquad\nu_B\text{ 拒绝}} νA 通过,νB 拒绝

创新 欧氏长度 NIS 二维 99% 门控
0.2 ,   0.2 T 0.2,\\,0.2^T 0.2,0.2T 0.283   m 0.283\,\mathrm m 0.283m 1.053 通过
0.2 ,   − 0.2 T 0.2,\\,-0.2^T 0.2,−0.2T 0.283   m 0.283\,\mathrm m 0.283m 20.000 拒绝

如果错误地忽略交叉项,两者都会被算成:

0.2 2 0.04 + 0.2 2 0.04 = 2 , \frac{0.2^2}{0.04}+\frac{0.2^2}{0.04}=2, 0.040.22+0.040.22=2,

从而漏掉第二组异常。

因此:

NIS 不只是考虑"创新有多大",还考虑"创新朝哪个方向大"。

从几何上看,门控条件:

ν T S − 1 ν ≤ τ \nu^TS^{-1}\nu\le\tau νTS−1ν≤τ

对应一个椭球。沿着特征向量 u i u_i ui 的半轴长度为:

τ λ i \sqrt{\tau\lambda_i} τλi

方差大的方向允许更大的偏差;方差小的方向对偏差更敏感。


8. 机器人应用:接触约束与退化观测

8.1 足端零速度约束是否适合融合?

假设当前认为某只脚与地面接触,并且接触点没有滑动,于是构造零速度伪观测:

z = 0 0 0 z=\begin{bmatrix}0\\0\\0\end{bmatrix} z= 000

通过预测状态和关节运动学,得到世界坐标系中的足端速度:

h ( x ^ − ) = v ^ f W h(\hat x^-)=\hat v_f^W h(x^−)=v^fW

创新为:

ν = 0 − v ^ f W \nu=0-\hat v_f^W ν=0−v^fW

这里检验的不是"某个直接测量出的足端速度是否正确",而是:

足端零速度假设,是否与当前预测和运动学计算相容?

假设创新协方差为:

S = 0.0009 I 3 ( m / s ) 2 , S=0.0009I_3 \quad(\\mathrm{m/s})\^2, S=0.0009I3(m/s)2,

也就是每个创新分量的标准差为:

0.0009 = 0.03   m / s \sqrt{0.0009}=0.03\,\mathrm{m/s} 0.0009 =0.03m/s

注意, S S S 应由状态预测、运动学与观测噪声模型推导,而不是仅因为构造了零观测就设置为零。

第一只脚的预测速度为:

v ^ f , 1 W = 0.02 0.01 0 m / s \hat v_{f,1}^W= \begin{bmatrix}0.02\\0.01\\0\end{bmatrix} \mathrm{m/s} v^f,1W= 0.020.010 m/s

NIS 为:

ϵ 1 = 0.02 2 + 0.01 2 0.0009 ≈ 0.556 \epsilon_1 =\frac{0.02^2+0.01^2}{0.0009} \approx0.556 ϵ1=0.00090.022+0.012≈0.556

第二只脚的预测速度为:

v ^ f , 2 W = 0.12 0.01 0 m / s \hat v_{f,2}^W= \begin{bmatrix}0.12\\0.01\\0\end{bmatrix} \mathrm{m/s} v^f,2W= 0.120.010 m/s

NIS 为:

ϵ 2 = 0.12 2 + 0.01 2 0.0009 ≈ 16.111 \epsilon_2 =\frac{0.12^2+0.01^2}{0.0009} \approx16.111 ϵ2=0.00090.122+0.012≈16.111

三维 99% 门限为:

τ = 11.345 \tau=11.345 τ=11.345

因此:

第一只脚的零速约束通过,第二只脚的零速约束触发异常 \boxed{ \text{第一只脚的零速约束通过,第二只脚的零速约束触发异常} } 第一只脚的零速约束通过,第二只脚的零速约束触发异常

但是,第二只脚超限不能单独证明脚在打滑。可能的解释还包括基座速度预测错误、关节运动学参数错误、外参错误或者时间未对齐。

更准确的工程结论是:

当前不宜在未经进一步处理的情况下,强行融合第二只脚的零速度约束。

可以进一步结合接触力、关节状态、其他支撑脚、独立速度观测等信息进行故障区分。NIS 本身不负责把这些原因自动区分开。

8.2 走廊退化:NIS 很小,为什么也可能没什么约束能力?

考虑一个仅含 x , y x,y x,y 平移的教学问题。假设匹配残差已经按噪声白化,局部信息矩阵为:

I = 0.01 0 0 200 m − 2 \mathcal I= \begin{bmatrix} 0.01&0\\ 0&200 \end{bmatrix} \mathrm{m^{-2}} I=0.0100200m−2

在线性高斯、无额外先验且局部问题可逆等简化条件下,匹配结果的协方差可近似写成:

$$

R\approx\mathcal I^{-1}

\begin{bmatrix}

100&0\

0&0.005

\end{bmatrix}

\mathrm{m^2}

也就是: σ x = 10   m , σ y ≈ 0.0707   m \\sigma_x=10\\,\\mathrm m, \\qquad \\sigma_y\\approx0.0707\\,\\mathrm m σx=10m,σy≈0.0707m 这份观测在 x x x 方向很不确定,在 y y y 方向比较精确。 假设滤波器预测位置协方差为: P − = 0.04 I 2 , P\^-=0.04I_2, P−=0.04I2, 并将匹配结果视作独立的位置观测: J = I 2 J=I_2 J=I2 那么: ##

S=P^-+R

\begin{bmatrix}

100.04&0\

0&0.045

\end{bmatrix}

假设创新为: ν = \[ 2 0.1 \] m \\nu= \\begin{bmatrix} 2\\\\0.1 \\end{bmatrix} \\mathrm m ν=\[20.1\]m 虽然 x x x 方向差了两米,但: ϵ N I S = 2 2 100.04 + 0.1 2 0.045 ≈ 0.262 \\epsilon_{\\mathrm{NIS}} =\\frac{2\^2}{100.04} +\\frac{0.1\^2}{0.045} \\approx0.262 ϵNIS=100.0422+0.0450.12≈0.262 NIS 很小,会通过门控。 这并不奇怪,因为这份匹配结果本来就在声明: > 我的 x x x 方向标准差有 10 米,差两米并不意外。 卡尔曼增益为: K = P − ( P − + R ) − 1 ≈ \[ 0.000400 0 0 0.888889 \] \\begin{aligned} K \&=P\^-(P\^-+R)\^{-1}\\\\ \&\\approx \\begin{bmatrix} 0.000400\&0\\\\ 0\&0.888889 \\end{bmatrix} \\end{aligned} K=P−(P−+R)−1≈\[0.000400000.888889\] 位置修正约为: Δ p = K ν ≈ \[ 0.000800 0.088889 \] m \\Delta p=K\\nu \\approx \\begin{bmatrix} 0.000800\\\\0.088889 \\end{bmatrix} \\mathrm m Δp=Kν≈\[0.0008000.088889\]m 因此,滤波器几乎不使用它修正 x x x,却会明显利用它修正 y y y。 这里需要区分: 通过一致性检验 ≠ 观测很精确 ≠ 所有方向都可观 \\boxed{ \\text{通过一致性检验} \\neq \\text{观测很精确} \\neq \\text{所有方向都可观} } 通过一致性检验=观测很精确=所有方向都可观 NIS 回答"这个差异能否被不确定性解释";信息矩阵、协方差和增益则回答"哪些方向有约束、约束有多强"。 \*\*实际系统中的额外注意:\*\*不能把任意优化问题的 Hessian 直接求逆后,当作独立传感器的 R R R。必须检查白化尺度、规范自由度、鲁棒权重、地图不确定性,以及优化结果是否已经包含同一份状态先验。若匹配结果与滤波器预测相关,还需要处理相关性,避免重复使用信息。上面例子只展示在所列简化条件下的关系。 *** ** * ** *** ### 9. NIS 偏大、偏小,分别可能意味着什么? #### 9.1 用一个公式统一理解 设实际创新的均值与协方差为: E \[ ν \] = b , Cov ⁡ ( ν ) = Σ , E\[\\nu\]=b, \\qquad \\operatorname{Cov}(\\nu)=\\Sigma, E\[ν\]=b,Cov(ν)=Σ, 但算法用来计算 NIS 的协方差是 S S S。 由于: E \[ ν ν T \] = Σ + b b T , E\[\\nu\\nu\^T\]=\\Sigma+bb\^T, E\[ννT\]=Σ+bbT, 因此: E \[ ϵ N I S \] = E \[ ν T S − 1 ν \] = tr ⁡ ( S − 1 E \[ ν ν T \] ) = tr ⁡ ( S − 1 Σ ) + tr ⁡ ( S − 1 b b T ) = tr ⁡ ( S − 1 Σ ) + b T S − 1 b \\begin{aligned} E\[\\epsilon_{\\mathrm{NIS}}\] \&=E\[\\nu\^TS\^{-1}\\nu\]\\\\ \&=\\operatorname{tr}\\left(S\^{-1}E\[\\nu\\nu\^T\]\\right)\\\\ \&=\\operatorname{tr}(S\^{-1}\\Sigma) +\\operatorname{tr}(S\^{-1}bb\^T)\\\\ \&=\\boxed{ \\operatorname{tr}(S\^{-1}\\Sigma) +b\^TS\^{-1}b } \\end{aligned} E\[ϵNIS\]=E\[νTS−1ν\]=tr(S−1E\[ννT\])=tr(S−1Σ)+tr(S−1bbT)=tr(S−1Σ)+bTS−1b 这里假设 S S S 是给定的;若 S S S 随历史变化,可以先在相应历史条件下理解该关系。 理想情况下: b = 0 , Σ = S , b=0, \\qquad \\Sigma=S, b=0,Σ=S, 于是: E \[ ϵ N I S \] = tr ⁡ ( I ) = m E\[\\epsilon_{\\mathrm{NIS}}\] =\\operatorname{tr}(I)=m E\[ϵNIS\]=tr(I)=m 这个式子直接揭示了 NIS 偏大的两类不同来源:实际随机散布过大,或者存在非零偏差。 #### 9.2 长期 NIS 偏大:未必是传感器噪声变大 第一类情况,是实际创新在某些方向上的散布,比算法声明的更大。 这可能来自 R R R 偏小,也可能来自 P − P\^- P− 偏小。 而预测协方差又受过程噪声影响: P − = F P + F T + G Q G T P\^-=FP\^+F\^T+GQG\^T P−=FP+FT+GQGT 所以,低估 Q Q Q 也可能导致 NIS 持续偏大。 第二类情况,是创新存在非零均值: b ≠ 0 b\\neq0 b=0 时间不同步、外参错误、未建模的运动、传感器偏置等,都可能使创新持续偏离零。 因此,看到 NIS 偏大,不能马上得出: > 应该增大 R R R。 更应该先判断:到底是测量噪声模型、预测模型、系统性偏差,还是数据关联出了问题。 #### 9.3 长期 NIS 偏小:也未必是估计很准 保持实际创新不变,只将声明的协方差放大为: S ′ = 100 S S'=100S S′=100S 那么: ϵ ′ = ν T ( 100 S ) − 1 ν = ϵ 100 \\epsilon' =\\nu\^T(100S)\^{-1}\\nu =\\frac{\\epsilon}{100} ϵ′=νT(100S)−1ν=100ϵ NIS 小了 100 倍,但实际数据和真实估计误差并没有因此改善。 因此: > 不能把"尽量降低 NIS"作为滤波器的优化目标。 长期偏小可能意味着不确定性声明过于保守,也可能来自样本筛选、更新后残差误用、相关性未建模等原因。 此外,单帧 NIS 很小本来就可能是正常随机结果。不能因为某一次观测"过于接近预测"就判为故障;检查下尾通常用于模型一致性诊断,且要结合多帧统计。 #### 9.4 NIS 无法发现所有状态错误 设某个状态误差方向为 d d d,如果: J d = 0 , Jd=0, Jd=0, 那么在一阶近似下,该方向的误差不会改变当前预测观测。 因此,即使状态沿 d d d 发生了很大的误差,当前观测的 NIS 也可能很小。 这就是不可观方向的漂移不能靠当前创新自动发现的数学原因。 同样,如果预测和观测共享某种误差,两者可能一起错,但彼此仍然一致。 #### 9.5 与 NEES 的区别 NIS 使用的是观测空间中的创新: ϵ N I S = ν T S − 1 ν \\epsilon_{\\mathrm{NIS}}=\\nu\^TS\^{-1}\\nu ϵNIS=νTS−1ν 与之相对,若能够获得真实状态,则可以构造状态误差的一致性指标: ϵ N E E S = ( x − x \^ ) T P − 1 ( x − x \^ ) \\epsilon_{\\mathrm{NEES}} =(x-\\hat x)\^TP\^{-1}(x-\\hat x) ϵNEES=(x−x\^)TP−1(x−x\^) 前者关注"观测与预测是否一致",后者关注"实际状态误差是否与状态协方差一致"。后者通常需要仿真真值或可信的参考系统,不能把两者混为一谈。对于姿态等流形状态,NEES 中的状态差同样需要使用一致的局部误差定义。 *** ** * ** *** ### 10. 连续数据怎么判断:平均 NIS、偏置与时间相关性 #### 10.1 单次超限不等于系统失效 NIS 是随机量。即使模型正确,仍会按照所选显著性水平出现一定比例的超限样本。 如果观测频率很高,那么"偶尔超限"与"持续超限"是不同性质的问题。应当同时关注每次 NIS、超限频率、连续超限情况以及系统状态,而不是看到一次超限就宣布传感器故障。 #### 10.2 推导平均 NIS 的检验区间 假设有 N N N 个相互独立的 NIS,每次观测维数都为 m m m: ϵ k ∼ χ m 2 \\epsilon_k\\sim\\chi_m\^2 ϵk∼χm2 其和满足: T = ∑ k = 1 N ϵ k ∼ χ N m 2 T=\\sum_{k=1}\^{N}\\epsilon_k \\sim\\chi_{Nm}\^2 T=k=1∑Nϵk∼χNm2 定义平均 NIS: ϵ ‾ = 1 N ∑ k = 1 N ϵ k \\overline\\epsilon =\\frac1N\\sum_{k=1}\^{N}\\epsilon_k ϵ=N1k=1∑Nϵk 于是: E \[ ϵ ‾ \] = m , Var ⁡ ( ϵ ‾ ) = 2 m N E\[\\overline\\epsilon\]=m, \\qquad \\operatorname{Var}(\\overline\\epsilon)=\\frac{2m}{N} E\[ϵ\]=m,Var(ϵ)=N2m 对长期一致性,可以使用双侧检验: F χ N m 2 − 1 ( α / 2 ) N ≤ ϵ ‾ ≤ F χ N m 2 − 1 ( 1 − α / 2 ) N \\boxed{ \\frac{F_{\\chi_{Nm}\^2}\^{-1}(\\alpha/2)}{N} \\le\\overline\\epsilon\\le \\frac{F_{\\chi_{Nm}\^2}\^{-1}(1-\\alpha/2)}{N} } NFχNm2−1(α/2)≤ϵ≤NFχNm2−1(1−α/2) 这与单帧异常观测的上尾门控不是同一个用途: | 检验方式 | 主要目的 | |-----------|--------------------| | 单帧上尾门控 | 检查当前创新是否异常偏大 | | 多帧双侧一致性检验 | 检查整体 NIS 是否持续偏大或偏小 | 上下分位点的用法与卡方双侧检验一致。\[2\] #### 10.3 数值例子:100 帧三维观测 设: m = 3 , N = 100 m=3, \\qquad N=100 m=3,N=100 在独立性等假设成立时,使用 95% 双侧区间,即: α = 0.05 \\alpha=0.05 α=0.05 计算得到: 2.539123 ≤ ϵ ‾ ≤ 3.498745 \\boxed{ 2.539123 \\le\\overline\\epsilon\\le 3.498745 } 2.539123≤ϵ≤3.498745 因此,平均 NIS 为 3.1 3.1 3.1 不会触发这项检验;平均值为 8 8 8 或 0.5 0.5 0.5,则应检查模型、协方差或样本处理流程。 但均值通过这一项检验,并不代表创新的全部统计性质都正确。 #### 10.4 为什么还要看创新的符号和均值? 考虑一维白化创新长期满足: w k ≈ 1 w_k\\approx1 wk≈1 此时每次都有: ϵ k = w k 2 ≈ 1 \\epsilon_k=w_k\^2\\approx1 ϵk=wk2≈1 平均 NIS 看起来恰好等于一维的理论均值。 但创新持续为正,说明预测观测可能长期偏低。只计算平方并求平均,会丢掉符号信息。 因此,一个更完整的诊断需要同时检查: E \[ w k \] ≈ 0 , E\[w_k\]\\approx0, E\[wk\]≈0, Cov ⁡ ( w k ) ≈ I , \\operatorname{Cov}(w_k)\\approx I, Cov(wk)≈I, 以及不同时间之间是否存在明显相关性。 例如,记录白化创新的样本均值: w ˉ = 1 N ∑ k = 1 N w k , \\bar w=\\frac1N\\sum_{k=1}\^{N}w_k, wˉ=N1k=1∑Nwk, 并观察各分量是否长期偏离零。 #### 10.5 白化空间相关性,不等于消除时间相关性 用当前的 S k S_k Sk 白化创新,是在处理同一时刻各分量的协方差: w k = L k − 1 ν k w_k=L_k\^{-1}\\nu_k wk=Lk−1νk 这并不自动保证: E \[ w k w k − ℓ T \] = 0 , ℓ ≠ 0 E\[w_kw_{k-\\ell}\^T\]=0, \\qquad\\ell\\neq0 E\[wkwk−ℓT\]=0,ℓ=0 若相邻帧共享数据、观测模型遗漏动态项、滤波器模型不正确,或者样本被某种流程筛选,那么时间相关性可能仍然存在。 在理想线性高斯卡尔曼滤波的相应条件下,创新具有白噪声性质;但不能把这个理想结论直接套到任意 EKF、滑动窗口结果或经过复杂筛选的数据上。 \*\*窗口样本明显相关时,不能直接把 NIS 的和当成 χ N m 2 \\chi\^2_{Nm} χNm2。\*\*否则理论置信区间的实际覆盖率可能不正确。 #### 10.6 不要只统计通过门控的样本 假设先删除所有: ϵ \> τ \\epsilon\>\\tau ϵ\>τ 的样本,再对剩下的 NIS 求平均。 此时统计的不是原始卡方分布,而是截断后的条件分布: ϵ ∣ ϵ ≤ τ \\epsilon\\mid\\epsilon\\le\\tau ϵ∣ϵ≤τ 高值被删除,均值自然会下降。 以二维 NIS 为例: ϵ ∼ χ 2 2 , E \[ ϵ \] = 2 \\epsilon\\sim\\chi_2\^2, \\qquad E\[\\epsilon\]=2 ϵ∼χ22,E\[ϵ\]=2 其概率密度为:\[1\] f ( t ) = 1 2 e − t / 2 , t ≥ 0 f(t)=\\frac12e\^{-t/2}, \\qquad t\\ge0 f(t)=21e−t/2,t≥0 只保留 ϵ ≤ τ \\epsilon\\le\\tau ϵ≤τ 后: E \[ ϵ ∣ ϵ ≤ τ \] = ∫ 0 τ t 1 2 e − t / 2   d t 1 − e − τ / 2 = 2 − τ e − τ / 2 1 − e − τ / 2 \\begin{aligned} E\[\\epsilon\\mid\\epsilon\\le\\tau\] \&=\\frac{\\int_0\^\\tau t\\frac12e\^{-t/2}\\,dt}{1-e\^{-\\tau/2}}\\\\ \&=2-\\frac{\\tau e\^{-\\tau/2}}{1-e\^{-\\tau/2}} \\end{aligned} E\[ϵ∣ϵ≤τ\]=1−e−τ/2∫0τt21e−t/2dt=2−1−e−τ/2τe−τ/2 使用二维 99% 门限: τ = 9.210340 , e − τ / 2 = 0.01 , \\tau=9.210340, \\qquad e\^{-\\tau/2}=0.01, τ=9.210340,e−τ/2=0.01, 得到: E \[ ϵ ∣ ϵ ≤ τ \] ≈ 1.906966 \\boxed{ E\[\\epsilon\\mid\\epsilon\\le\\tau\] \\approx1.906966 } E\[ϵ∣ϵ≤τ\]≈1.906966 即便原始数据完全符合模型,门控通过样本的均值也不是 2,而是约 1.907。 数据关联中"从多个候选里挑残差最小的那个",也会引入选择偏差。筛选后的分布不能不加区分地继续按原始卡方分布解释。 #### 10.7 应该记录哪些数据? 建议保留门控前的创新、创新协方差或其分解、NIS、自由度、门限、接受/拒绝标记,以及观测类型与时间戳。 这样才能区分"原始数据确实一致"和"因为大残差都被删了,所以剩下的数据看起来很好"。 但也要注意:\*\*门控前记录是必要的,不代表所有记录都属于原假设下的有效高斯样本。\*\*错误关联、杂波候选以及门控对后续滤波状态的影响,仍需单独考虑。 *** ** * ** *** ### 11. 实现时最容易出错的地方 #### 11.1 必须使用当前观测更新前的创新与协方差 标准预测创新 NIS 使用: ν − = z − h ( x \^ − ) , \\nu\^-=z-h(\\hat x\^-), ν−=z−h(x\^−), S − = J P − J T + R S\^-=JP\^-J\^T+R S−=JP−JT+R 不能先融合观测,然后直接使用: \[ z − h ( x \^ + ) \] T ( J P + J T + R ) − 1 \[ z − h ( x \^ + ) \] \[z-h(\\hat x\^+)\]\^T (JP\^+J\^T+R)\^{-1} \[z-h(\\hat x\^+)\] \[z−h(x\^+)\]T(JP+JT+R)−1\[z−h(x\^+)\] 并把它当成同一个 NIS。 仍以前面的异常观测 z = 10.6 z=10.6 z=10.6 为例。 正确的更新前 NIS 是: ϵ − = 7.2 \\epsilon\^-=7.2 ϵ−=7.2 如果没有门控,先用位置增益 K p = 0.8 K_p=0.8 Kp=0.8 更新: p \^ + = 10 + 0.8 × 0.6 = 10.48 \\hat p\^+=10+0.8\\times0.6=10.48 p\^+=10+0.8×0.6=10.48 更新后残差只剩: ν + = 10.6 − 10.48 = 0.12 \\nu\^+=10.6-10.48=0.12 ν+=10.6−10.48=0.12 若错误地使用: P p p + + R = 0.008 + 0.01 = 0.018 , P_{pp}\^++R=0.008+0.01=0.018, Ppp++R=0.008+0.01=0.018, 会得到: 0.12 2 0.018 = 0.8 \\frac{0.12\^2}{0.018}=0.8 0.0180.122=0.8 原本异常的观测,竟然"通过了"。 问题在于:**后验状态已经使用了这份测量,所以它与该测量噪声不再独立。** 在线性情况下,后验残差满足: ν + = ( I − J K ) ν − \\nu\^+=(I-JK)\\nu\^- ν+=(I−JK)ν− 其正确协方差为: Cov ⁡ ( ν + ) = ( I − J K ) S − ( I − J K ) T \\operatorname{Cov}(\\nu\^+) =(I-JK)S\^-(I-JK)\^T Cov(ν+)=(I−JK)S−(I−JK)T 在本例中: Var ⁡ ( ν + ) = ( 1 − 0.8 ) 2 × 0.05 = 0.002 \\operatorname{Var}(\\nu\^+) =(1-0.8)\^2\\times0.05 =0.002 Var(ν+)=(1−0.8)2×0.05=0.002 使用正确的协方差,得到: 0.12 2 0.002 = 7.2 \\frac{0.12\^2}{0.002}=7.2 0.0020.122=7.2 所以,不是"后验残差永远不能检验",而是**不能对后验残差直接套用更新前创新的协方差公式**。 #### 11.2 预测误差与测量噪声相关时,要保留交叉项 前面默认: E \[ x \~ n T \] = 0 E\[\\tilde x n\^T\]=0 E\[x\~nT\]=0 若定义: C = E \[ x \~ n T \] ≠ 0 , C=E\[\\tilde x n\^T\]\\neq0, C=E\[x\~nT\]=0, 则应使用: S = J P − J T + R + J C + C T J T \\boxed{ S=JP\^-J\^T+R+JC+C\^TJ\^T } S=JP−JT+R+JC+CTJT 这里的正负号来自本文误差和创新定义;若更换误差定义,需要一致地重新推导。 同一份原始数据既参与预测又参与构造观测时,尤其需要检查独立性。例如,某个估计结果已经融合了 IMU,却又被当作完全独立的观测回灌到使用同一 IMU 的滤波器中,就不能直接假定没有相关性。 #### 11.3 坐标系、单位与误差定义必须一致 对 ESKF,应保证创新、雅可比、协方差描述的是同一个局部误差空间。 典型问题包括: * 创新使用世界坐标系,但协方差仍在机体坐标系。 * 创新使用角度制,协方差却使用弧度制。 * 雅可比按右扰动推导,协方差却按另一种误差定义传播。 * 姿态观测以四元数四个分量直接相减,又直接使用 4 个自由度。 例如,三维姿态通常具有三个局部自由度,应该根据实际构造的姿态创新及其协方差来决定检验维数,而不是按存储变量的个数机械决定。 #### 11.4 不要为了通过门控而反复增大 R R R 增大 R R R 会扩大 S S S,从而降低 NIS。 但这只是改变了不确定性声明,并没有证明观测变好了。 根据成像质量、特征几何、接触条件等外部质量信息构建 R R R,可以作为建模的一部分。但其统计解释依然依赖于该条件噪声模型是否合理。 如果看到当前残差过大,就不断增大 R R R 直到通过,那么这个过程不能继续解释为原先固定显著性水平的标准 NIS 检验。 同样,经过裁剪、鲁棒加权或数据依赖变换后的残差,也不能未经推导就沿用原始卡方门限。 #### 11.5 持续拒绝观测,也可能是预测已经错误且过度自信 假如预测状态已经偏离真实状态,但 P − P\^- P− 仍然很小,那么一个正确的观测也可能产生很大的 NIS。 此时若只会永久拒绝观测,滤波器可能失去恢复机会。 因此,工程流程应区分"偶发外点"和"持续模型失配"。对于持续异常,需要结合独立观测、初始化状态、运动模型和传感器诊断,决定是否重新初始化、调整建模或进入恢复模式,而不是只凭 NIS 认定传感器长期失效。 #### 11.6 不要显式计算矩阵逆 虽然公式为: ϵ = ν T S − 1 ν , \\epsilon=\\nu\^TS\^{-1}\\nu, ϵ=νTS−1ν, 实现时更适合: S = L L T , L w = ν , ϵ = w T w S=LL\^T, \\qquad Lw=\\nu, \\qquad \\epsilon=w\^Tw S=LLT,Lw=ν,ϵ=wTw 这样不需要显式计算 S − 1 S\^{-1} S−1。NumPy 的 Cholesky 分解可用于对称正定矩阵。\[4\] 如果分解失败,应先检查协方差构造、单位和数值条件。不能无条件加入一个很大的对角项,把模型问题掩盖掉。 #### 11.7 自由度不是状态维数,也不一定等于原始数据项数 本文默认 S S S 正定,此时自由度为创新维数 m m m。 如果存在精确冗余、 S S S 在数学上确实奇异,那么应在有效子空间内构造检验。设有效秩为 r r r,只有在创新确实落在该子空间且相应高斯模型正确等条件下,才可使用对应的 r r r 维卡方检验。 不能随便使用伪逆,再忽略创新在零方差方向上的非零分量。若模型声称某方向的方差严格为零,而创新在该方向却非零,这本身就是模型不相容的表现。 还要注意: rank ⁡ ( J ) \< m 不意味着 rank ⁡ ( S ) \< m \\operatorname{rank}(J)\ dict: """计算更新前创新的 NIS,并进行上尾门控。 Parameters ---------- innovation : np.ndarray 一维创新向量,shape=(m,)。 S : np.ndarray 创新协方差,shape=(m, m),要求对称正定。 confidence : float 原假设成立时的理论覆盖率,例如 0.99。 Returns ------- dict NIS、自由度、门限、上尾概率、门控结果和白化创新。 accepted=True 只表示通过一致性门控,不代表观测一定正确。 """ nu = np.asarray(innovation, dtype=float) S = np.asarray(S, dtype=float) if not 0.0 < confidence < 1.0: raise ValueError("confidence 必须位于 (0, 1)。") if nu.ndim != 1 or nu.size == 0: raise ValueError("innovation 必须是非空一维向量。") if S.shape != (nu.size, nu.size): raise ValueError("S 的尺寸必须等于观测维数 × 观测维数。") if not np.isfinite(nu).all() or not np.isfinite(S).all(): raise ValueError("创新或协方差包含 NaN / Inf。") if not np.allclose(S, S.T, rtol=1e-7, atol=1e-12): raise ValueError("S 明显不对称,请检查协方差计算。") # 仅消除很小的浮点非对称,不用于修复错误模型。 S = 0.5 * (S + S.T) try: L = np.linalg.cholesky(S) except np.linalg.LinAlgError as exc: raise ValueError( "S 不是正定矩阵,不能进行此 NIS 检验。" ) from exc # 白化:解 L @ w = nu,不显式计算 S 的逆矩阵。 whitened = solve_triangular(L, nu, lower=True) value = float(whitened @ whitened) if not np.isfinite(value): raise ValueError("NIS 数值溢出,请检查量纲和协方差尺度。") dof = int(nu.size) threshold = float(chi2.ppf(confidence, df=dof)) return { "nis": value, "dof": dof, "threshold": threshold, "p_upper": float(chi2.sf(value, df=dof)), "accepted": bool(value <= threshold), "whitened_innovation": whitened, } def mean_nis_interval( dof: int, count: int, confidence: float = 0.95, ) -> tuple: """相互独立、固定维数的 NIS 样本均值的双侧接受区间。 不能直接用于仅保留门控通过样本的数据,或明显时间相关的数据。 此函数只计算理论区间,不验证输入样本是否满足统计假设。 """ for name, value in (("dof", dof), ("count", count)): if ( isinstance(value, bool) or not isinstance(value, (int, np.integer)) or value <= 0 ): raise ValueError(f"{name} 必须是正整数。") if not 0.0 < confidence < 1.0: raise ValueError("confidence 必须位于 (0, 1)。") alpha = 1.0 - confidence total_dof = int(dof) * int(count) lower = chi2.ppf(alpha / 2.0, df=total_dof) / count upper = chi2.ppf(1.0 - alpha / 2.0, df=total_dof) / count return float(lower), float(upper) def main() -> None: # 1. 位置---速度状态,传感器只测量位置。 x_pred = np.array([10.0, 2.0]) P_pred = np.array([ [0.04, 0.015], [0.015, 0.09], ]) J = np.array([[1.0, 0.0]]) R = np.array([[0.01]]) S = J @ P_pred @ J.T + R # 两个观测分别使用同一份先验,不是依次更新。 for z in (10.2, 10.6): innovation = np.array([z]) - J @ x_pred result = nis_gate(innovation, S, confidence=0.99) print( f"z={z:.1f}, NIS={result['nis']:.3f}, " f"门限={result['threshold']:.3f}, " f"通过={result['accepted']}, " f"p_upper={result['p_upper']:.6f}" ) if result["accepted"]: # 解 S @ K.T = J @ P_pred,避免显式求逆。 K = np.linalg.solve(S, J @ P_pred).T x_post = x_pred + K @ innovation # Joseph 形式;此处是欧氏空间的线性 KF 示例。 A = np.eye(x_pred.size) - K @ J P_post = A @ P_pred @ A.T + K @ R @ K.T P_post = 0.5 * (P_post + P_post.T) print(" 更新后的状态:", np.round(x_post, 6)) print(" 更新后的协方差:") print(P_post) # 2. 二维强相关创新:长度相同,但方向不同。 S_correlated = np.array([ [0.04, 0.036], [0.036, 0.04], ]) cases = ( ("同向创新", np.array([0.2, 0.2])), ("反向创新", np.array([0.2, -0.2])), ) for name, innovation in cases: result = nis_gate(innovation, S_correlated) print( f"{name}: NIS={result['nis']:.3f}, " f"通过={result['accepted']}" ) # 3. 两只脚分别进行零速度约束门控。 S_foot = 0.0009 * np.eye(3) foot_velocities = ( np.array([0.02, 0.01, 0.0]), np.array([0.12, 0.01, 0.0]), ) for index, velocity in enumerate(foot_velocities, start=1): innovation = -velocity # 观测为零,减去预测足端速度。 result = nis_gate(innovation, S_foot) print( f"足端{index}: NIS={result['nis']:.3f}, " f"通过={result['accepted']}" ) # 4. 100 个独立三维 NIS 样本的均值接受区间。 lower, upper = mean_nis_interval(dof=3, count=100) print(f"平均 NIS 的 95% 双侧区间: [{lower:.6f}, {upper:.6f}]") if __name__ == "__main__": main() ``` 预期输出: ```text z=10.2, NIS=0.800, 门限=6.635, 通过=True, p_upper=0.371093 更新后的状态: [10.16 2.06] 更新后的协方差: [[0.008 0.003 ] [0.003 0.0855]] z=10.6, NIS=7.200, 门限=6.635, 通过=False, p_upper=0.007290 同向创新: NIS=1.053, 通过=True 反向创新: NIS=20.000, 通过=False 足端1: NIS=0.556, 通过=True 足端2: NIS=16.111, 通过=False 平均 NIS 的 95% 双侧区间: [2.539123, 3.498745] ``` 这份代码中,门控与更新是分开的。被拒绝的观测不会更新状态;用于比较的两个位置观测也不会互相改变先验。 Joseph 形式为: P + = ( I − K J ) P − ( I − K J ) T + K R K T P\^+=(I-KJ)P\^-(I-KJ)\^T+KRK\^T P+=(I−KJ)P−(I−KJ)T+KRKT 它在本文不相关噪声的线性模型下与前面给出的协方差更新式等价。若存在预测---观测噪声相关性,卡尔曼增益和协方差更新也需要相应修改,不能只改 S S S 而其他公式保持不变。 对 ESKF,还需要将估计的误差注入名义状态,并按照采用的误差定义执行协方差重置。上面的欧氏空间状态更新示例不能原封不动替代这些步骤。 *** ** * ** *** ### 13. 接入 ESKF 的推荐流程 下面是一条便于理解和调试的处理顺序: ```text IMU / 运动模型预测 得到名义状态 x⁻、误差协方差 P⁻ ↓ 在当前观测时刻构造观测模型 计算预测观测、创新 ν、雅可比 J、噪声协方差 R ↓ 构造创新协方差 S 检查坐标系、单位、正定性及相关性假设 ↓ 计算白化创新与门控前 NIS 记录 ν、S、NIS、自由度、门限与时间戳 ↓ 执行 NIS 门控,并结合独立的观测质量与几何检查 ↓ 通过:计算增益,估计误差,注入名义状态,更新并重置协方差 拒绝:保留当前预测,记录异常;必要时进入故障诊断或恢复逻辑 ``` 这里的"拒绝后保留预测"对应最简单的硬门控。降权、多模型判断或重新初始化属于更完整的估计系统设计;使用这些机制时,应重新考虑原有统计门限是否仍然适用。 也不应将 NIS 通过作为唯一的融合条件。例如,几何上完全退化的匹配,即使通过一致性检验,也不意味着可以在所有方向上给予很高权重。 *** ** * ** *** ### 14. 公式速查与最终总结 #### 14.1 公式速查 | 内容 | 公式或结论 | |--------------|----------------------------------------------------------------------------------------------------------------------------------| | 更新前创新 | ν = z − h ( x \^ − ) \\nu=z-h(\\hat x\^-) ν=z−h(x\^−) | | 创新一阶模型 | ν ≈ J x \~ + n \\nu\\approx J\\tilde x+n ν≈Jx\~+n | | 无交叉相关时的创新协方差 | S = J P − J T + R S=JP\^-J\^T+R S=JP−JT+R | | 有交叉相关时的创新协方差 | S = J P − J T + R + J C + C T J T S=JP\^-J\^T+R+JC+C\^TJ\^T S=JP−JT+R+JC+CTJT | | NIS | ϵ = ν T S − 1 ν \\epsilon=\\nu\^TS\^{-1}\\nu ϵ=νTS−1ν | | 白化计算 | S = L L T , L w = ν , ϵ = w T w S=LL\^T,\\ Lw=\\nu,\\ \\epsilon=w\^Tw S=LLT, Lw=ν, ϵ=wTw | | 理想分布 | ϵ ∼ χ m 2 \\epsilon\\sim\\chi_m\^2 ϵ∼χm2 | | 理想均值 | E \[ ϵ \] = m E\[\\epsilon\]=m E\[ϵ\]=m | | 单帧上尾门限 | τ = F χ m 2 − 1 ( 1 − α ) \\tau=F\^{-1}_{\\chi_m\^2}(1-\\alpha) τ=Fχm2−1(1−α) | | 上尾概率 | p u p p e r = P ( χ m 2 ≥ ϵ ) p_{\\mathrm{upper}}=P(\\chi_m\^2\\ge\\epsilon) pupper=P(χm2≥ϵ) | | 一维原始创新门限 | ∣ ν ∣ ≤ τ S \\lvert\\nu\\rvert\\le\\sqrt{\\tau S} ∣ν∣≤τS | | 独立样本求和 | ∑ k = 1 N ϵ k ∼ χ N m 2 \\sum_{k=1}\^{N}\\epsilon_k\\sim\\chi_{Nm}\^2 ∑k=1Nϵk∼χNm2 | | 一般创新均值下的期望 | E \[ ϵ \] = tr ⁡ ( S − 1 Σ ) + b T S − 1 b E\[\\epsilon\]=\\operatorname{tr}(S\^{-1}\\Sigma)+b\^TS\^{-1}b E\[ϵ\]=tr(S−1Σ)+bTS−1b | 上表中的分布和门限结论,都以文中说明的高斯性、协方差正确性、维数和独立性条件为前提。 #### 14.2 最容易混淆的四句话 **"NIS 小,所以传感器准确。"** 不一定。也可能是 P − P\^- P− 或 R R R 声明得很大,或者预测与观测共享同一种误差。 **"NIS 大,所以应该增大 R R R。"** 不一定。问题可能出在 Q Q Q、 P − P\^- P−、外参、时间同步、运动模型或数据关联。 **"通过 99% 门控,所以观测有 99% 的概率正确。"** 不是。99% 是原假设成立时的理论覆盖率,不是观测正确的后验概率。 **"NIS 通过,所以所有状态都受到有效约束。"** 不是。NIS 与可观性、信息强弱回答的是不同问题。 #### 14.3 用一句话记住 NIS ##

\boxed{
\text{NIS}

\text{考虑完整协方差之后,创新的异常程度}

}

$$

它不是问:

观测与预测相差多少米?

而是问:

按照预测和传感器各自声明的不确定性,这么大的差异是否合理?

正确使用 NIS 的关键是:用更新前创新,使用正确的创新协方差,按实际创新自由度选择卡方门限,并将"统计不一致"与"传感器故障""精度不足""状态不可观"区分开。


参考资料

以下资料对应文中的基础分布、门限与函数接口;教学例子的具体数值由文中给出的参数计算得到。

1 NIST/SEMATECH, Chi-Square Distribution :卡方分布定义、密度、均值和方差。

https://www.itl.nist.gov/div898/handbook/eda/section3/eda3666.htm

2 NIST/SEMATECH, Critical Values of the Chi-Square Distribution :卡方临界值与分位点。

https://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htm

3 SciPy 官方文档,scipy.stats.chi2:ppf、cdf 和 sf 等函数接口。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2.html

4 NumPy 官方文档,numpy.linalg.cholesky:对称正定矩阵的 Cholesky 分解。

https://numpy.org/doc/stable/reference/generated/numpy.linalg.cholesky.html

相关推荐
todoitbo12 小时前
在 Ubuntu ARM64 上运行 Q1 V3.0 MuJoCo 模型:加载、步进和单执行器响应
linux·运维·ubuntu·ai·机器人·仿真教程·启元
dghongcheng13 小时前
喷涂机器人品牌推荐:六轴 vs 协作机器人怎么选
机器人·喷涂·喷漆设备·自动喷涂线·自动喷涂
todoitbo14 小时前
Q1 MuJoCo 模型里的 49 项传感器定义与 60 维数据:一次关节和 IMU 输出核验
人工智能·ai·机器人·1024程序员节·启元机器人
Evand J17 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
SteveSenna18 小时前
aubo学习:启动真实机械臂
机器人
Wanda121420 小时前
机器人与机电一体化3D数字孪生机器-Day6
unity·机器人·数字孪生·1024程序员节
真的想上岸啊21 小时前
笔记3:思小伴 搭载 EEG 脑电专注力监测的多功能儿童陪伴桌宠
机器人
硅谷秋水1 天前
AdaRSI 论文分析
人工智能·机器学习·语言模型·机器人
海盗12341 天前
微软技术日报 2026-10-24:CA 私钥是 4,Windows 封了中间证书未动父根
人工智能·机器人·aigc·1024程序员节