让GNSS&RTK不再难【第15讲 Kalman滤波】

18 篇文章 1 订阅 ¥129.90 ¥299.90

第15讲 Kalman滤波

15.1 一个简单的小例子

我们要每隔十分钟测量室内的温度,正好我们手中有一个温度计,其测量精度为0.1°C。最简单的做法是每隔十分钟用温度计测一次,然后发布出去,每次发布的温度的精度为0.1°C,可以满足我们的日常需要。

但是随着温度计使用年限过久,其精度有大幅下降,每测量一次的随机误差在1°C,也就是每次测量的结果符合标准差为1°C的正态分布。如果还是将每次温度计的读数直接发布,那可能会对我们的日常生活带来影响,因为发布的温度精度有明显下降。

方法之一是,如果每次测量时同时有10个温度计,那么对10个结果取平均作为最后结果,那么可以提升最后结果的精度。

如果我们仅有一个温度计,如何挖掘其他有用信息,然后提升我们的最后的精度呢?

我们知道温度不可能忽然变化,一般十分钟前和现在的温度基本上一样。这是一个很有用的信息,即使我们这个时刻没有温度计的读数,如果我们有十分钟前的温度信息,那么我们就可以将十分钟前的温度结果拿过来,直接作为当前温度发布出去。

这样不就不需要温度计了吗?

每次我们都可以用十分钟前的温度结果,这样一直外推下去不就好了?

好像哪里不对。

其实这样一直外推也没问题,只是我们在关注结果同时,需要加上结果的精度信息。一个小时前测的温度32°C,其精度为1°C,由此我们外推得到十分钟前的温度为32°C,但其精度有所变差,变为1.5°C。由此类推,一个小时后我依然发布当前的温度为32°C,只是其精度为6°C。

有问题吗?没有问题。

15.2 Kalman滤波算法公式

Kalman滤波算法分为两个阶段:

  1. 预测阶段:卡尔曼滤波器使用历史的估计值估计当前时刻的状态和方差信息;
  2. 更新阶段:使用当前时刻的观测更新预测的状态和方差信息。

这两个阶段交替迭代包含了时间更新和测量更新两个重要部分。

首先以一个离散线性控制过程为例,该系统能够用一个线性随机微分方程描述(即系统状态方程):

x ^ k ∣ k − 1 = H x ^ k − 1 + B u k − 1 + W k − 1 \hat{x}_{k|k-1} = H \hat{x}_{k-1} + B u_{k-1} + W_{k-1} x^kk1=Hx^k1+Buk1+Wk1
其中:

  • H H H ——状态转移矩阵;
  • B B B ——控制矩阵;
  • u k − 1 u_{k-1} uk1 ——k时刻的系统控制变量;
  • W k − 1 W_{k-1} Wk1 ——系统噪声向量,为高斯白噪声,协方差为 Q Q Q

再加上系统的测量值(即观测方程):
z k = A x k + V k z_k = A x_k + V_k zk=Axk+Vk
其中:

  • A A A ——系统测量矩阵;
  • V k V_k Vk ——测量噪声向量,为高斯白噪声,协方差为 R R R
  • z k z_k zk ——k时刻的测量值,但即对系统的部分观测向量。对于系统状态变量而言,并不一定能观测所有的量。

整个系统更新思路包括:状态更新和协方差更新。

Kalman滤波的五个关键公式:

时间更新

x ^ k ∣ k − 1 = H x ^ k − 1 + B u k − 1 (1) \hat{x}_{k|k-1} = H \hat{x}_{k-1} + B u_{k-1} \qquad \text{(1)} x^kk1=Hx^k1+Buk1(1)

P k ∣ k − 1 = H P k − 1 H T + Q (2) P_{k|k-1} = H P_{k-1} H^T + Q \qquad \text{(2)} Pkk1=HPk1HT+Q(2)

公式(1)和(2)表示对系统的预测值的计算;

观测更新

K k = P k ∣ k − 1 A T ( A P k ∣ k − 1 A T + R ) − 1 (3) K_k = P_{k|k-1} A^T (A P_{k|k-1} A^T + R)^{-1} \qquad \text{(3)} Kk=Pkk1AT(APkk1AT+R)1(3)

x ^ k = x ^ k ∣ k − 1 + K k ( z k − A x ^ k ∣ k − 1 ) (4) \hat{x}_k = \hat{x}_{k|k-1} + K_k (z_k - A \hat{x}_{k|k-1}) \qquad \text{(4)} x^k=x^kk1+Kk(zkAx^kk1)(4)

公式(3)和(4)表示对系统的测量更新;

但是为了使卡尔曼滤波器不断的运行下去直到系统过程结束,需要更新k状态下 x ^ k \hat{x}_k x^k 的协方差:
P k = ( I − K k A ) P k ∣ k − 1 (5) P_k = (I - K_k A) P_{k|k-1} \qquad \text{(5)} Pk=(IKkA)Pkk1(5)
其中 I I I 为单位矩阵。

当系统进入k+1状态时, P k P_k Pk 就是公式(2)的 P k − 1 P_{k-1} Pk1。这样,算法就可以自回归的运算下去。

运行过程:(1)(2)-(3)-(4)(5)-(1)(2)……

输出量: x ^ k \hat{x}_k x^k ——k时刻系统状态最优估计值和其协方差 P k P_k Pk

在这里插入图片描述

15.3 Kalman滤波的温度实时计算

接下来就需要将外推值,与当前历元的观测值进行融合,得到最终的温度结果。
简单理一下:

  1. 我们在0时刻测了一个温度为32℃,其误差即为温度计的测量精度1℃。由于没有历史温度信息,本次发布为,温度:32℃,精度1℃。

  2. 在10分钟这个时刻,温度计读数为33℃,同样测量精度为1℃;但我们有十分钟前的外推结果,外推温度为32℃,精度为1.5℃(1℃+0.5℃),其中0.5℃为我们外推的精度损失。对于两个温度结果,我们使用加权平均的方式来计算当前实际的温度。在此,我们引入Kalman滤波公式。

在本例子中,状态量 x ^ k \hat{x}_k x^k 就一个,就是当前时刻的温度。状态转移矩阵H也很简单,就是1。
公式(1)(2)的预测过程已经完成。只是我们上面给出的是标准差,公式需要用方差。

使用公式(3)计算kalman增益,即
K k = 1. 5 2 1. 5 2 + 1 2 = 0.6923 K_k = \frac{1.5^2}{1.5^2 + 1^2} = 0.6923 Kk=1.52+121.52=0.6923

那么10分钟时刻的最优温度:

x ^ k = 32 + K k ∗ ( 33 − 32 ) = 32.6923 \hat{x}_k = 32 + K_k * (33 - 32) = 32.6923 x^k=32+Kk(3332)=32.6923

其相应的方差信息

P k = ( 1 − K k ) ∗ 1. 5 2 = 0.6925 P_k = (1 - K_k) * 1.5^2 = 0.6925 Pk=(1Kk)1.52=0.6925

对其开根号,即当前时刻最后的温度精度为0.83℃,明显的该精度是优于仅使用温度计结果。
所以,我们发布10分钟时刻的温度和精度为32.69℃和0.83℃。

  1. 在20分钟这个时刻,温度计读数为32℃,同样测量精度为1℃。上一个时刻的温度和精度为32.69℃和0.83℃,同样可以外推到当前历元的温度和精度信息。

15.4 PVA(位置、速度、加速度)状态转移模型

在RTKLIB中,rtk算法对Kalman滤波使用PVA状态转移模型,具体见 rtkpos.c -> udpos 函数。以下是单点的PVA状态转移函数,该函数逻辑与rtk算法一致,仅名称不同 (pntpos.c -> udpos_spp) 以避免对rtk算法的影响。

状态转移矩阵的代码逻辑

时间变化量 tt 为相邻历元的时间差,其关系如下:
P 1 = P 0 + V 0 ⋅ t t + 1 2 a 0 ⋅ t t 2 P_1 = P_0 + V_0 \cdot tt + \frac{1}{2} a_0 \cdot tt^2 P1=P0+V0tt+21a0tt2

V 1 = V 0 + a 0 ⋅ t t V_1 = V_0 + a_0 \cdot tt V1=V0+a0tt

a 1 = a 0 a_1 = a_0 a1=a0

以下是状态转移矩阵的打印结果:
F = [ 1.000 0.000 0.000 1.000 0.000 0.000 0.500 0.000 0.000 0.000 1.000 0.000 0.000 1.000 0.000 0.000 0.500 0.000 0.000 0.000 1.000 0.000 0.000 1.000 0.000 0.000 0.500 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 1.000 ] F = \begin{bmatrix} 1.000 & 0.000 & 0.000 & 1.000 & 0.000 & 0.000 & 0.500 & 0.000 & 0.000 \\ 0.000 & 1.000 & 0.000 & 0.000 & 1.000 & 0.000 & 0.000 & 0.500 & 0.000 \\ 0.000 & 0.000 & 1.000 & 0.000 & 0.000 & 1.000 & 0.000 & 0.000 & 0.500 \\ 0.000 & 0.000 & 0.000 & 1.000 & 0.000 & 0.000 & 0.000 & 0.000 & 0.000 \\ 0.000 & 0.000 & 0.000 & 0.000 & 1.000 & 0.000 & 0.000 & 0.000 & 0.000 \\ 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 1.000 & 0.000 & 0.000 & 0.000 \\ 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 1.000 & 0.000 & 0.000 \\ 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 1.000 & 0.000 \\ 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 0.000 & 1.000 \\ \end{bmatrix} F= 1.0000.0000.0000.0000.0000.0000.0000.0000.0000.0001.0000.0000.0000.0000.0000.0000.0000.0000.0000.0001.0000.0000.0000.0000.0000.0000.0001.0000.0000.0001.0000.0000.0000.0000.0000.0000.0001.0000.0000.0001.0000.0000.0000.0000.0000.0000.0001.0000.0000.0001.0000.0000.0000.0000.5000.0000.0000.0000.0000.0001.0000.0000.0000.0000.5000.0000.0000.0000.0000.0001.0000.0000.0000.0000.5000.0000.0000.0000.0000.0001.000

状态转移矩阵F解析:

图片中的状态转移矩阵 F F F 代表位置、速度、加速度在时间 t t tt tt 后的关系。矩阵的具体形式如下:

F = [ 1 0 0 t t 0 0 0.5 t t 2 0 0 0 1 0 0 t t 0 0 0.5 t t 2 0 0 0 1 0 0 t t 0 0 0.5 t t 2 0 0 0 1 0 0 t t 0 0 0 0 0 0 1 0 0 t t 0 0 0 0 0 0 1 0 0 t t 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 ] F = \begin{bmatrix} 1 & 0 & 0 & tt & 0 & 0 & 0.5tt^2 & 0 & 0 \\ 0 & 1 & 0 & 0 & tt & 0 & 0 & 0.5tt^2 & 0 \\ 0 & 0 & 1 & 0 & 0 & tt & 0 & 0 & 0.5tt^2 \\ 0 & 0 & 0 & 1 & 0 & 0 & tt & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & tt & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & tt \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \end{bmatrix} F= 100000000010000000001000000tt001000000tt001000000tt0010000.5tt200tt0010000.5tt200tt0010000.5tt200tt001

状态转移矩阵F展示了状态向量(位置、速度、加速度)在连续时间步间的变化规律,基于上述物理公式。具体解析为:

  • 位置(P):矩阵的前三行表示位置受前一时刻位置、速度及加速度影响的变化。
    • 位置P的更新规则:
      P 1 = P 0 + V 0 ⋅ t t + 1 2 a 0 ⋅ t t 2 P_1 = P_0 + V_0 \cdot tt + \frac{1}{2} a_0 \cdot tt^2 P1=P0+V0tt+21a0tt2
    • 矩阵F中的体现:
      P 1 P_1 P1的x分量由 P 0 P_0 P0的x分量、 v 0 v_0 v0的x分量乘以 t t tt tt 1 / 2 a 0 1/2a_0 1/2a0的x分量乘以 t t 2 tt{^2} tt2共同决定,对应的矩阵元素为[1,0,0,1,0,0,0.5,0,0]。
      同理,y和z分量也有相应的系数,因此整个矩阵的前三行(除了对角线外)反映了位置受速度和加速度影响的部分。
  • 速度(V):接下来的三行说明了速度如何基于前一状态及加速度更新。
    • 速度V的更新规则:
      a 1 = a 0 a_1 = a_0 a1=a0
    • 矩阵F中的体现:
      V 1 V_1 V1的x分量由 V 0 V_0 V0的x分量和 a 0 a_0 a0 ​的x分量乘以 t t tt tt决定,对应的矩阵元素为[0,0,0,0,1,0,0,0.5,0]。
      同样,y和z分量的更新规则也在矩阵的第四至第六行中体现,除了对角线上保持为1(表示速度的延续性)外,其余位置为0,直到速度受加速度影响的部分。
  • 加速度(a):最后三行体现了加速度的恒定性,假设无外力影响。
    • 加速度a的更新规则:
      公式:
      a 1 = a 0 a_1 = a_0 a1=a0
    • 矩阵F中的体现:
      加速度在理想情况下是恒定的,不随时间变化,因此在状态转移中,加速度的各分量保持不变,矩阵的第七至第九行对角线上的元素均为1,表示加速度状态的自保持,其余元素为0。

另一个需要注意,我们只需要在加速度上加入过程噪声,即放大预测值的方差信息。因为从状态转移矩阵中,我们就可以知道,加速度的精度信息会传递到速度和位置。
当然,你也可以修改任何状态量的方差信息,只要你认为该状态的精度符合你修改要求。不要去修改协方差信息,尤其是对于RTKLIB这种对速度和加速度没有测量更新的模型。

附加A:

【浅显易懂】卡尔曼滤波原理解读_哔哩哔哩_bilibili

卡尔曼滤波前言

简单平均:

首先,考虑两个温度测量值 T 1 T_1 T1 T 2 T_2 T2,它们的真实值 T T T 和测量误差 ϵ 1 \epsilon_1 ϵ1 ϵ 2 \epsilon_2 ϵ2 分别为:

T 1 = T + ϵ 1 T_1 = T + \epsilon_1 T1=T+ϵ1

T 2 = T + ϵ 2 T_2 = T + \epsilon_2 T2=T+ϵ2

其中, ϵ 1 ∼ N ( 0 , σ 1 2 ) \epsilon_1 \sim N(0, \sigma_1^2) ϵ1N(0,σ12) ϵ 2 ∼ N ( 0 , σ 2 2 ) \epsilon_2 \sim N(0, \sigma_2^2) ϵ2N(0,σ22),且 E [ ϵ 1 ϵ 2 ] = 0 E[\epsilon_1 \epsilon_2] = 0 E[ϵ1ϵ2]=0

假设用简单平均法来估计 T T T

T ^ e s t 1 = T 1 + T 2 2 \hat{T}_{est1} = \frac{T_1 + T_2}{2} T^est1=2T1+T2

其方差为:

D [ T ^ e s t 1 ] = D [ T 1 + T 2 2 ] D[\hat{T}_{est1}] = D\left[\frac{T_1 + T_2}{2}\right] D[T^est1]=D[2T1+T2]

由于 T 1 T_1 T1 T 2 T_2 T2 是独立的,方差计算如下:

D [ T ^ e s t 1 ] = D [ T 1 ] + D [ T 2 ] 4 = σ 1 2 + σ 2 2 4 D[\hat{T}_{est1}] = \frac{D[T_1] + D[T_2]}{4} = \frac{\sigma_1^2 + \sigma_2^2}{4} D[T^est1]=4D[T1]+D[T2]=4σ12+σ22

加权平均:

现在考虑加权平均法:

T ^ e s t 2 = α ⋅ T 1 + ( 1 − α ) ⋅ T 2 \hat{T}_{est2} = \alpha \cdot T_1 + (1-\alpha) \cdot T_2 T^est2=αT1+(1α)T2

其方差为:

D [ T ^ e s t 2 ] = D [ α ⋅ T 1 + ( 1 − α ) ⋅ T 2 ] D[\hat{T}_{est2}] = D[\alpha \cdot T_1 + (1-\alpha) \cdot T_2] D[T^est2]=D[αT1+(1α)T2]

展开方差计算:

D [ T ^ e s t 2 ] = α 2 D [ T 1 ] + ( 1 − α ) 2 D [ T 2 ] D[\hat{T}_{est2}] = \alpha^2 D[T_1] + (1-\alpha)^2 D[T_2] D[T^est2]=α2D[T1]+(1α)2D[T2]

因此:

D [ T ^ e s t 2 ] = α 2 σ 1 2 + ( 1 − α ) 2 σ 2 2 D[\hat{T}_{est2}] = \alpha^2 \sigma_1^2 + (1-\alpha)^2 \sigma_2^2 D[T^est2]=α2σ12+(1α)2σ22

为了最小化方差,我们对 α \alpha α 求导,并设导数为0,得到:

d d α ( α 2 σ 1 2 + ( 1 − α ) 2 σ 2 2 ) = 0 \frac{d}{d\alpha} \left( \alpha^2 \sigma_1^2 + (1-\alpha)^2 \sigma_2^2 \right) = 0 dαd(α2σ12+(1α)2σ22)=0

2 α σ 1 2 − 2 ( 1 − α ) σ 2 2 = 0 2\alpha \sigma_1^2 - 2(1-\alpha) \sigma_2^2 = 0 2ασ122(1α)σ22=0

2 α σ 1 2 = 2 σ 2 2 − 2 α σ 2 2 2\alpha \sigma_1^2 = 2\sigma_2^2 - 2\alpha \sigma_2^2 2ασ12=2σ222ασ22

2 α σ 1 2 + 2 α σ 2 2 = 2 σ 2 2 2\alpha \sigma_1^2 + 2\alpha \sigma_2^2 = 2\sigma_2^2 2ασ12+2ασ22=2σ22

2 α ( σ 1 2 + σ 2 2 ) = 2 σ 2 2 2\alpha (\sigma_1^2 + \sigma_2^2) = 2\sigma_2^2 2α(σ12+σ22)=2σ22

α ( σ 1 2 + σ 2 2 ) = σ 2 2 \alpha (\sigma_1^2 + \sigma_2^2) = \sigma_2^2 α(σ12+σ22)=σ22

α = σ 2 2 σ 1 2 + σ 2 2 \alpha = \frac{\sigma_2^2}{\sigma_1^2 + \sigma_2^2} α=σ12+σ22σ22

因此,最小化后的方差为:

min ⁡ { D [ T ^ e s t 2 ] } = α 2 σ 1 2 + ( 1 − α ) 2 σ 2 2 \min\{D[\hat{T}_{est2}]\} = \alpha^2 \sigma_1^2 + (1-\alpha)^2 \sigma_2^2 min{D[T^est2]}=α2σ12+(1α)2σ22

代入 α = σ 2 2 σ 1 2 + σ 2 2 \alpha = \frac{\sigma_2^2}{\sigma_1^2 + \sigma_2^2} α=σ12+σ22σ22

= ( σ 2 2 σ 1 2 + σ 2 2 ) 2 σ 1 2 + ( 1 − σ 2 2 σ 1 2 + σ 2 2 ) 2 σ 2 2 = \left(\frac{\sigma_2^2}{\sigma_1^2 + \sigma_2^2}\right)^2 \sigma_1^2 + \left(1 - \frac{\sigma_2^2}{\sigma_1^2 + \sigma_2^2}\right)^2 \sigma_2^2 =(σ12+σ22σ22)2σ12+(1σ12+σ22σ22)2σ22

= σ 1 2 σ 2 4 ( σ 1 2 + σ 2 2 ) 2 + σ 1 4 σ 2 2 ( σ 1 2 + σ 2 2 ) 2 = \frac{\sigma_1^2 \sigma_2^4}{(\sigma_1^2 + \sigma_2^2)^2} + \frac{\sigma_1^4 \sigma_2^2}{(\sigma_1^2 + \sigma_2^2)^2} =(σ12+σ22)2σ12σ24+(σ12+σ22)2σ14σ22

= σ 1 2 σ 2 2 ( σ 2 2 + σ 1 2 ) ( σ 1 2 + σ 2 2 ) 2 = \frac{\sigma_1^2 \sigma_2^2 (\sigma_2^2 + \sigma_1^2)}{(\sigma_1^2 + \sigma_2^2)^2} =(σ12+σ22)2σ12σ22(σ22+σ12)

= σ 1 2 σ 2 2 σ 1 2 + σ 2 2 = \frac{\sigma_1^2 \sigma_2^2}{\sigma_1^2 + \sigma_2^2} =σ12+σ22σ12σ22

基本不等式证明

我们可以证明,对于任意 α \alpha α,以下不等式成立:

σ 1 2 σ 2 2 σ 1 2 + σ 2 2 ≤ σ 1 2 + σ 2 2 4 \frac{\sigma_1^2 \sigma_2^2}{\sigma_1^2 + \sigma_2^2} \leq \frac{\sigma_1^2 + \sigma_2^2}{4} σ12+σ22σ12σ224σ12+σ22

为了证明这个不等式,我们考虑以下函数:

f ( α ) = α 2 σ 1 2 + ( 1 − α ) 2 σ 2 2 f(\alpha) = \alpha^2 \sigma_1^2 + (1-\alpha)^2 \sigma_2^2 f(α)=α2σ12+(1α)2σ22

首先,考虑 α = 0.5 \alpha = 0.5 α=0.5:

f ( 0.5 ) = ( 0.5 ) 2 σ 1 2 + ( 0.5 ) 2 σ 2 2 = 0.25 σ 1 2 + 0.25 σ 2 2 = 0.25 ( σ 1 2 + σ 2 2 ) f(0.5) = (0.5)^2 \sigma_1^2 + (0.5)^2 \sigma_2^2 = 0.25 \sigma_1^2 + 0.25 \sigma_2^2 = 0.25 (\sigma_1^2 + \sigma_2^2) f(0.5)=(0.5)2σ12+(0.5)2σ22=0.25σ12+0.25σ22=0.25(σ12+σ22)

我们需要证明:

σ 1 2 σ 2 2 σ 1 2 + σ 2 2 ≤ 0.25 ( σ 1 2 + σ 2 2 ) \frac{\sigma_1^2 \sigma_2^2}{\sigma_1^2 + \sigma_2^2} \leq 0.25 (\sigma_1^2 + \sigma_2^2) σ12+σ22σ12σ220.25(σ12+σ22)

等价于证明:

4 σ 1 2 σ 2 2 ≤ ( σ 1 2 + σ 2 2 ) 2 4 \sigma_1^2 \sigma_2^2 \leq (\sigma_1^2 + \sigma_2^2)^2 4σ12σ22(σ12+σ22)2

展开右侧:

( σ 1 2 + σ 2 2 ) 2 = σ 1 4 + 2 σ 1 2 σ 2 2 + σ 2 4 (\sigma_1^2 + \sigma_2^2)^2 = \sigma_1^4 + 2 \sigma_1^2 \sigma_2^2 + \sigma_2^4 (σ12+σ22)2=σ14+2σ12σ22+σ24

因此,我们需要证明:

4 σ 1 2 σ 2 2 ≤ σ 1 4 + 2 σ 1 2 σ 2 2 + σ 2 4 4 \sigma_1^2 \sigma_2^2 \leq \sigma_1^4 + 2 \sigma_1^2 \sigma_2^2 + \sigma_2^4 4σ12σ22σ14+2σ12σ22+σ24

即:

2 σ 1 2 σ 2 2 ≤ σ 1 4 + σ 2 4 2 \sigma_1^2 \sigma_2^2 \leq \sigma_1^4 + \sigma_2^4 2σ12σ22σ14+σ24

这总是成立,因为 σ 1 4 + σ 2 4 \sigma_1^4 + \sigma_2^4 σ14+σ24 永远大于或等于 2 σ 1 2 σ 2 2 2 \sigma_1^2 \sigma_2^2 2σ12σ22。可以通过以下方式进一步理解:

考虑以下恒等式:

( σ 1 2 − σ 2 2 ) 2 ≥ 0 (\sigma_1^2 - \sigma_2^2)^2 \geq 0 (σ12σ22)20

展开后得到:

σ 1 4 − 2 σ 1 2 σ 2 2 + σ 2 4 ≥ 0 \sigma_1^4 - 2 \sigma_1^2 \sigma_2^2 + \sigma_2^4 \geq 0 σ142σ12σ22+σ240

即:

σ 1 4 + σ 2 4 ≥ 2 σ 1 2 σ 2 2 \sigma_1^4 + \sigma_2^4 \geq 2 \sigma_1^2 \sigma_2^2 σ14+σ242σ12σ22

因此,我们有:

2 σ 1 2 σ 2 2 ≤ σ 1 4 + σ 2 4 2 \sigma_1^2 \sigma_2^2 \leq \sigma_1^4 + \sigma_2^4 2σ12σ22σ14+σ24

这证明了不等式:

σ 1 2 σ 2 2 σ 1 2 + σ 2 2 ≤ σ 1 2 + σ 2 2 4 \frac{\sigma_1^2 \sigma_2^2}{\sigma_1^2 + \sigma_2^2} \leq \frac{\sigma_1^2 + \sigma_2^2}{4} σ12+σ22σ12σ224σ12+σ22

因此,加权平均法的方差总是小于或等于简单平均法的方差。

公式解释

设:

T 1 = T + ϵ 1 T_1 = T + \epsilon_1 T1=T+ϵ1

T 2 = T + ϵ 2 T_2 = T + \epsilon_2 T2=T+ϵ2

其中:

ϵ 1 ∼ N ( 0 , σ 1 2 ) , ϵ 2 ∼ N ( 0 , σ 2 2 ) , E [ ϵ 1 ϵ 2 ] = 0 \epsilon_1 \sim N(0, \sigma_1^2), \epsilon_2 \sim N(0, \sigma_2^2), E[\epsilon_1 \epsilon_2] = 0 ϵ1N(0,σ12),ϵ2N(0,σ22),E[ϵ1ϵ2]=0

卡尔曼滤波思想

初值:
x ^ 0 ,    P 0 \hat{x}_0, \; P_0 x^0,P0

  • x ^ 0 \hat{x}_0 x^0: 初始状态向量的估计值。
  • P 0 P_0 P0: 初始状态估计误差的协方差矩阵。

系统参数:
A k ,    B k ,    Q k ,    C k ,    R k A_k, \; B_k, \; Q_k, \; C_k, \; R_k Ak,Bk,Qk,Ck,Rk

  • A k A_k Ak: 状态转移矩阵,描述系统从时刻 k − 1 k-1 k1 到时刻 k k k 的状态变化。
  • B k B_k Bk: 控制矩阵,描述控制输入 u k u_k uk 对状态的影响。
  • Q k Q_k Qk: 过程噪声协方差矩阵,描述过程噪声的统计特性。
  • C k C_k Ck: 观测矩阵,描述状态向量到观测向量的映射关系。
  • R k R_k Rk: 观测噪声协方差矩阵,描述观测噪声的统计特性。

预测:

  1. 状态预测:

x ^ k ′ = A k x ^ k − 1 + B k u k \hat{x}'_k = A_k \hat{x}_{k-1} + B_k u_k x^k=Akx^k1+Bkuk

  • x ^ k ′ \hat{x}'_k x^k: 预测的状态向量。
  • x ^ k − 1 \hat{x}_{k-1} x^k1: 上一时刻的状态估计值。
  • u k u_k uk: 当前时刻的控制输入。
  1. 误差协方差预测:

P k ′ = A k P k − 1 A k T + Q k P'_k = A_k P_{k-1} A_k^T + Q_k Pk=AkPk1AkT+Qk

  • P k ′ P'_k Pk: 预测的误差协方差矩阵。
  • P k − 1 P_{k-1} Pk1: 上一时刻的误差协方差矩阵。

更新:

  1. 卡尔曼增益:

K k = P k ′ C k T ( C k P k ′ C k T + R k ) − 1 K_k = P'_k C_k^T (C_k P'_k C_k^T + R_k)^{-1} Kk=PkCkT(CkPkCkT+Rk)1

  • K k K_k Kk: 卡尔曼增益矩阵,用于调整预测的状态向量。
  1. 状态更新:

x ^ k = x ^ k ′ + K k ( z k − C k x ^ k ′ ) \hat{x}_k = \hat{x}'_k + K_k (z_k - C_k \hat{x}'_k) x^k=x^k+Kk(zkCkx^k)

  • x ^ k \hat{x}_k x^k: 更新后的状态向量。
  • z k z_k zk: 当前时刻的观测值。
  1. 误差协方差更新:

P k = ( I − K k C k ) P k ′ P_k = (I - K_k C_k) P'_k Pk=(IKkCk)Pk

  • P k P_k Pk: 更新后的误差协方差矩阵。
  • I I I: 单位矩阵。
卡尔曼滤波实际例子

初值:
x ^ 0 = [ 0 1 ] \hat{x}_0 = \begin{bmatrix} 0 \\ 1 \end{bmatrix} x^0=[01]
即小车起始位置为0,初始速度为1。

初始误差协方差矩阵:
P 0 = [ 1 0 0 1 ] P_0 = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} P0=[1001]

  • 这是一个单位矩阵,表示在初始时刻,我们对位置和速度的估计都有单位方差(即初始的不确定性)。
  • 每个元素的含义如下:
    • P 0 11 = 1 P_{0_{11}} = 1 P011=1:表示初始时刻位置估计的方差。
    • P 0 22 = 1 P_{0_{22}} = 1 P022=1:表示初始时刻速度估计的方差。
    • P 0 12 = P 0 21 = 0 P_{0_{12}} = P_{0_{21}} = 0 P012=P021=0:表示位置和速度之间的协方差为零,即它们在初始时刻是独立的。

系统参数:

  • 状态转移矩阵 A k A_k Ak:
    A k = [ 1 Δ t 0 1 ] A_k = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} Ak=[10Δt1]

    • 表示系统从时刻 k − 1 k-1 k1 到时刻 k k k 的状态转移。
    • Δ t \Delta t Δt 是时间间隔,第一行表示位置更新为前一时刻位置加上速度乘以时间,第二行表示速度保持不变。
    解释:
    • 矩阵 A k A_k Ak 由两个变量构成,分别是位置和速度。
    • 元素 A 11 = 1 A_{11} = 1 A11=1 表示位置保持位置分量。
    • 元素 A 12 = Δ t A_{12} = \Delta t A12=Δt 表示时间间隔与速度的乘积对位置的影响。
    • 元素 A 21 = 0 A_{21} = 0 A21=0 表示位置对速度没有直接影响。
    • 元素 A 22 = 1 A_{22} = 1 A22=1 表示速度保持速度分量。

    具体来说,矩阵的第一行 [ 1    Δ t ] [1 \; \Delta t] [1Δt] 表示位置更新的公式:
    x k = x k − 1 + v k − 1 Δ t x_k = x_{k-1} + v_{k-1} \Delta t xk=xk1+vk1Δt

    矩阵的第二行 [ 0    1 ] [0 \; 1] [01] 表示速度保持不变:
    v k = v k − 1 v_k = v_{k-1} vk=vk1

控制矩阵 B k B_k Bk:
B k = [ 0.5 Δ t 2 Δ t ] B_k = \begin{bmatrix} 0.5 \Delta t^2 \\ \Delta t \end{bmatrix} Bk=[0.5Δt2Δt]

  • 表示控制输入对系统状态的影响。
  • 第一行表示控制输入对位置的影响(加速度的一半乘以时间间隔的平方),即 0.5 Δ t 2 0.5 \Delta t^2 0.5Δt2。这是因为在物理学中,位置的改变不仅取决于初始速度,还包括加速度的影响,且加速度影响的位置变化量是 0.5 ⋅ 加速度 ⋅ ( Δ t ) 2 0.5 \cdot \text{加速度} \cdot (\Delta t)^2 0.5加速度(Δt)2
  • 第二行表示控制输入对速度的影响(加速度乘以时间间隔),即 Δ t \Delta t Δt。在速度变化的公式中,速度的改变取决于加速度和时间间隔的乘积。

过程噪声协方差矩阵 Q k Q_k Qk:
Q k = [ 0.1 0 0 0.1 ] Q_k = \begin{bmatrix} 0.1 & 0 \\ 0 & 0.1 \end{bmatrix} Qk=[0.1000.1]

  • 表示过程噪声的统计特性。对位置和速度的过程噪声假设为0.1。

观测矩阵 C k C_k Ck:
C k = [ 1 0 ] C_k = \begin{bmatrix} 1 & 0 \end{bmatrix} Ck=[10]

  • 表示从状态向量到观测向量的映射关系。我们假设只能测量位置,所以观测矩阵表示只观察位置。

观测噪声协方差矩阵 R k R_k Rk:
R k = [ 1 ] R_k = \begin{bmatrix} 1 \end{bmatrix} Rk=[1]

  • 表示观测噪声的统计特性。假设观测噪声的方差为1。
  • 该矩阵的形式表示在当前模型中,我们只考虑一个观测变量,并且假设观测噪声是一个具有方差为1的正态分布。
  • 这个值反映了我们对测量精度的信心程度,方差越小,表示测量越精确。这里选择1表示我们假设观测噪声有一定的不确定性,但不是很大。

预测:

  1. 状态预测:

x ^ k ′ = A k x ^ k − 1 + B k u k \hat{x}'_k = A_k \hat{x}_{k-1} + B_k u_k x^k=Akx^k1+Bkuk

x ^ k ′ = [ 1 Δ t 0 1 ] [ x k − 1 v k − 1 ] + [ 0.5 Δ t 2 Δ t ] u k \hat{x}'_k = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x_{k-1} \\ v_{k-1} \end{bmatrix} + \begin{bmatrix} 0.5 \Delta t^2 \\ \Delta t \end{bmatrix} u_k x^k=[10Δt1][xk1vk1]+[0.5Δt2Δt]uk

具体计算为:

x ^ k ′ = [ x k − 1 + v k − 1 Δ t + 0.5 u k Δ t 2 v k − 1 + u k Δ t ] \hat{x}'_k = \begin{bmatrix} x_{k-1} + v_{k-1} \Delta t + 0.5 u_k \Delta t^2 \\ v_{k-1} + u_k \Delta t \end{bmatrix} x^k=[xk1+vk1Δt+0.5ukΔt2vk1+ukΔt]

  1. 误差协方差预测:

P k ′ = A k P k − 1 A k T + Q k P'_k = A_k P_{k-1} A_k^T + Q_k Pk=AkPk1AkT+Qk

P k ′ = [ 1 Δ t 0 1 ] P k − 1 [ 1 0 Δ t 1 ] + [ 0.1 0 0 0.1 ] P'_k = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} P_{k-1} \begin{bmatrix} 1 & 0 \\ \Delta t & 1 \end{bmatrix} + \begin{bmatrix} 0.1 & 0 \\ 0 & 0.1 \end{bmatrix} Pk=[10Δt1]Pk1[1Δt01]+[0.1000.1]

具体计算为:

P k ′ = [ 1 Δ t 0 1 ] [ p 11 p 12 p 21 p 22 ] [ 1 0 Δ t 1 ] + [ 0.1 0 0 0.1 ] P'_k = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} p_{11} & p_{12} \\ p_{21} & p_{22} \end{bmatrix} \begin{bmatrix} 1 & 0 \\ \Delta t & 1 \end{bmatrix} + \begin{bmatrix} 0.1 & 0 \\ 0 & 0.1 \end{bmatrix} Pk=[10Δt1][p11p21p12p22][1Δt01]+[0.1000.1]

P k ′ = [ p 11 + Δ t ( p 21 + p 12 ) + Δ t 2 p 22 p 12 + Δ t p 22 p 21 + Δ t p 22 p 22 ] + [ 0.1 0 0 0.1 ] P'_k = \begin{bmatrix} p_{11} + \Delta t (p_{21} + p_{12}) + \Delta t^2 p_{22} & p_{12} + \Delta t p_{22} \\ p_{21} + \Delta t p_{22} & p_{22} \end{bmatrix} + \begin{bmatrix} 0.1 & 0 \\ 0 & 0.1 \end{bmatrix} Pk=[p11+Δt(p21+p12)+Δt2p22p21+Δtp22p12+Δtp22p22]+[0.1000.1]

P k ′ = [ p 11 + Δ t ( p 21 + p 12 ) + Δ t 2 p 22 + 0.1 p 12 + Δ t p 22 p 21 + Δ t p 22 p 22 + 0.1 ] P'_k = \begin{bmatrix} p_{11} + \Delta t (p_{21} + p_{12}) + \Delta t^2 p_{22} + 0.1 & p_{12} + \Delta t p_{22} \\ p_{21} + \Delta t p_{22} & p_{22} + 0.1 \end{bmatrix} Pk=[p11+Δt(p21+p12)+Δt2p22+0.1p21+Δtp22p12+Δtp22p22+0.1]

更新:

  1. 卡尔曼增益:

K k = P k ′ C k T ( C k P k ′ C k T + R k ) − 1 K_k = P'_k C_k^T (C_k P'_k C_k^T + R_k)^{-1} Kk=PkCkT(CkPkCkT+Rk)1

K k = P k ′ [ 1 0 ] ( [ 1 0 ] P k ′ [ 1 0 ] + 1 ) − 1 K_k = P'_k \begin{bmatrix} 1 \\ 0 \end{bmatrix} \left( \begin{bmatrix} 1 & 0 \end{bmatrix} P'_k \begin{bmatrix} 1 \\ 0 \end{bmatrix} + 1 \right)^{-1} Kk=Pk[10]([10]Pk[10]+1)1

具体计算为:

K k = [ p 11 ′ p 21 ′ ] ( p 11 ′ + 1 ) − 1 K_k = \begin{bmatrix} p_{11}' \\ p_{21}' \end{bmatrix} \left( p_{11}' + 1 \right)^{-1} Kk=[p11p21](p11+1)1

  1. 状态更新:

x ^ k = x ^ k ′ + K k ( z k − C k x ^ k ′ ) \hat{x}_k = \hat{x}'_k + K_k (z_k - C_k \hat{x}'_k) x^k=x^k+Kk(zkCkx^k)

假设观测值 z k z_k zk 是小车的实际位置,那么:

x ^ k = x ^ k ′ + K k ( z k − [ 1 0 ] x ^ k ′ ) \hat{x}_k = \hat{x}'_k + K_k (z_k - \begin{bmatrix} 1 & 0 \end{bmatrix} \hat{x}'_k) x^k=x^k+Kk(zk[10]x^k)

具体计算为:

x ^ k = [ x k − 1 + v k − 1 Δ t + 0.5 u k Δ t 2 v k − 1 + u k Δ t ] + K k ( z k − x k − 1 − v k − 1 Δ t − 0.5 u k Δ t 2 ) \hat{x}_k = \begin{bmatrix} x_{k-1} + v_{k-1} \Delta t + 0.5 u_k \Delta t^2 \\ v_{k-1} + u_k \Delta t \end{bmatrix} + K_k (z_k - x_{k-1} - v_{k-1} \Delta t - 0.5 u_k \Delta t^2) x^k=[xk1+vk1Δt+0.5ukΔt2vk1+ukΔt]+Kk(zkxk1vk1Δt0.5ukΔt2)

  1. 误差协方差更新:

P k = ( I − K k C k ) P k ′ P_k = (I - K_k C_k) P'_k Pk=(IKkCk)Pk

P k = ( I − K k [ 1 0 ] ) P k ′ P_k = (I - K_k \begin{bmatrix} 1 & 0 \end{bmatrix}) P'_k Pk=(IKk[10])Pk

具体计算为:

P k = ( I − K k [ 1 0 ] ) [ p 11 ′ p 12 ′ p 21 ′ p 22 ′ ] P_k = (I - K_k \begin{bmatrix} 1 & 0 \end{bmatrix}) \begin{bmatrix} p_{11}' & p_{12}' \\ p_{21}' & p_{22}' \end{bmatrix} Pk=(IKk[10])[p11p21p12p22]

通过以上步骤,我们完成了一次卡尔曼滤波的预测和更新过程,得到当前时刻 k k k 的状态估计值 x ^ k \hat{x}_k x^k 和误差协方差 P k P_k Pk

附加B:协方差矩阵

协方差矩阵的计算

假设我们有两个变量 a a a b b b,并且有 m m m 个样本值。变量 a a a b b b 的样本值分别为 a 1 , a 2 , . . . , a m a_1, a_2, ..., a_m a1,a2,...,am b 1 , b 2 , . . . , b m b_1, b_2, ..., b_m b1,b2,...,bm。协方差矩阵可以通过以下步骤计算得到。

  1. 定义矩阵 X X X

X = [ a 1 a 2 ⋯ a m b 1 b 2 ⋯ b m ] X = \begin{bmatrix} a_1 & a_2 & \cdots & a_m \\ b_1 & b_2 & \cdots & b_m \\ \end{bmatrix} X=[a1b1a2b2ambm]

  1. 计算 X X X 的转置矩阵 X T X^T XT

X T = [ a 1 b 1 a 2 b 2 ⋮ ⋮ a m b m ] X^T = \begin{bmatrix} a_1 & b_1 \\ a_2 & b_2 \\ \vdots & \vdots \\ a_m & b_m \\ \end{bmatrix} XT= a1a2amb1b2bm

  1. 计算协方差矩阵:

1 m X X T = 1 m [ a 1 a 2 ⋯ a m b 1 b 2 ⋯ b m ] [ a 1 b 1 a 2 b 2 ⋮ ⋮ a m b m ] \frac{1}{m}XX^T = \frac{1}{m}\begin{bmatrix} a_1 & a_2 & \cdots & a_m \\ b_1 & b_2 & \cdots & b_m \\ \end{bmatrix} \begin{bmatrix} a_1 & b_1 \\ a_2 & b_2 \\ \vdots & \vdots \\ a_m & b_m \\ \end{bmatrix} m1XXT=m1[a1b1a2b2ambm] a1a2amb1b2bm

  1. 计算具体的协方差值:

= [ 1 m ∑ i = 1 m a i 2 1 m ∑ i = 1 m a i b i 1 m ∑ i = 1 m a i b i 1 m ∑ i = 1 m b i 2 ] = \begin{bmatrix} \frac{1}{m}\sum_{i=1}^m a_i^2 & \frac{1}{m}\sum_{i=1}^m a_i b_i \\ \frac{1}{m}\sum_{i=1}^m a_i b_i & \frac{1}{m}\sum_{i=1}^m b_i^2 \\ \end{bmatrix} =[m1i=1mai2m1i=1maibim1i=1maibim1i=1mbi2]

  1. 最终的协方差矩阵:

= [ Cov ( a , a ) Cov ( a , b ) Cov ( b , a ) Cov ( b , b ) ] = \begin{bmatrix} \text{Cov}(a, a) & \text{Cov}(a, b) \\ \text{Cov}(b, a) & \text{Cov}(b, b) \\ \end{bmatrix} =[Cov(a,a)Cov(b,a)Cov(a,b)Cov(b,b)]

初始误差三维协方差矩阵示例

协方差矩阵展示了不同维度之间的方差和协方差。以三维数据 x x x y y y z z z 为例,协方差矩阵如下:

[ Cov ( x , x ) Cov ( x , y ) Cov ( x , z ) Cov ( y , x ) Cov ( y , y ) Cov ( y , z ) Cov ( z , x ) Cov ( z , y ) Cov ( z , z ) ] \begin{bmatrix} \text{Cov}(x, x) & \text{Cov}(x, y) & \text{Cov}(x, z) \\ \text{Cov}(y, x) & \text{Cov}(y, y) & \text{Cov}(y, z) \\ \text{Cov}(z, x) & \text{Cov}(z, y) & \text{Cov}(z, z) \\ \end{bmatrix} Cov(x,x)Cov(y,x)Cov(z,x)Cov(x,y)Cov(y,y)Cov(z,y)Cov(x,z)Cov(y,z)Cov(z,z)

  • 方差: 对角线上的元素,如 Cov ( x , x ) \text{Cov}(x, x) Cov(x,x), Cov ( y , y ) \text{Cov}(y, y) Cov(y,y), 和 Cov ( z , z ) \text{Cov}(z, z) Cov(z,z),表示变量 x x x y y y z z z 各自的方差。
  • 协方差: 非对角线上的元素,如 Cov ( x , y ) \text{Cov}(x, y) Cov(x,y) Cov ( y , x ) \text{Cov}(y, x) Cov(y,x),表示变量之间的协方差,反映它们之间的线性关系。
协方差矩阵解释

假设我们有一个物体在二维平面上移动,我们希望同时估计其位置( x x x y y y)和速度( v x v_x vx v y v_y vy)。初始误差协方差矩阵 P 0 P_0 P0 的形式为:

P 0 = [ σ x 2 σ x y σ x v x σ x v y σ y x σ y 2 σ y v x σ y v y σ v x x σ v x y σ v x 2 σ v x v y σ v y x σ v y y σ v y v x σ v y 2 ] P_0 = \begin{bmatrix} \sigma_x^2 & \sigma_{xy} & \sigma_{xv_x} & \sigma_{xv_y} \\ \sigma_{yx} & \sigma_y^2 & \sigma_{yv_x} & \sigma_{yv_y} \\ \sigma_{v_xx} & \sigma_{v_xy} & \sigma_{v_x}^2 & \sigma_{v_xv_y} \\ \sigma_{v_yx} & \sigma_{v_yy} & \sigma_{v_yv_x} & \sigma_{v_y}^2 \end{bmatrix} P0= σx2σyxσvxxσvyxσxyσy2σvxyσvyyσxvxσyvxσvx2σvyvxσxvyσyvyσvxvyσvy2

  • σ x 2 \sigma_x^2 σx2 σ y 2 \sigma_y^2 σy2 表示位置 x x x y y y 的方差,即对位置估计的不确定性。
  • σ v x 2 \sigma_{v_x}^2 σvx2 σ v y 2 \sigma_{v_y}^2 σvy2 表示速度 v x v_x vx v y v_y vy 的方差,即对速度估计的不确定性。
  • σ x y \sigma_{xy} σxy 表示位置 x x x y y y 之间的协方差,如果两个位置变量之间存在线性关系,则该值不为零。
  • σ x v x \sigma_{xv_x} σxvx σ x v y \sigma_{xv_y} σxvy 表示位置 x x x 与速度 v x v_x vx v y v_y vy 之间的协方差,表示位置和速度之间的关系。
  • σ v x v y \sigma_{v_xv_y} σvxvy 表示速度 v x v_x vx v y v_y vy 之间的协方差。

在初始情况下,假设位置和速度之间是独立的,并且在两个位置维度和两个速度维度之间没有相关性,矩阵可以简化为:

P 0 = [ σ x 2 0 0 0 0 σ y 2 0 0 0 0 σ v x 2 0 0 0 0 σ v y 2 ] P_0 = \begin{bmatrix} \sigma_x^2 & 0 & 0 & 0 \\ 0 & \sigma_y^2 & 0 & 0 \\ 0 & 0 & \sigma_{v_x}^2 & 0 \\ 0 & 0 & 0 & \sigma_{v_y}^2 \end{bmatrix} P0= σx20000σy20000σvx20000σvy2

例如,如果 σ x 2 = 1 \sigma_x^2 = 1 σx2=1, σ y 2 = 1 \sigma_y^2 = 1 σy2=1, σ v x 2 = 1 \sigma_{v_x}^2 = 1 σvx2=1, σ v y 2 = 1 \sigma_{v_y}^2 = 1 σvy2=1,则:

P 0 = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] P_0 = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} P0= 1000010000100001

这表示我们对初始位置和速度估计的方差都为1,并且位置和速度之间没有初始的相关性。

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值