Kalman Filter 算法推导--根据B站Dr.can视频整理

Kalman Filter

  • 前提:噪声信号满足正态分布

一、引例1:测量和估计

采样 k k k次(测量值), x 1 , x 2 , x 3 , ⋯   , x k x_1,x_2,x_3,\cdots,x_k x1,x2,x3,,xk,则其估计值 x ^ k \hat x_k x^k为:

x ^ k = 1 k ( x 1 + x 2 + x 3 + ⋯ + x k ) \hat x_k=\frac{1}{k}(x_1+x_2+x_3+\cdots+x_k) x^k=k1(x1+x2+x3++xk),变形得:

x ^ k = 1 k k − 1 k − 1 ( x 1 + x 2 + x 3 + ⋯ + x k − 1 ) + 1 k x k \hat x_k = \frac{1}{k}\frac{k-1}{k-1}(x_1+x_2+x_3+\cdots+x_{k-1})+\frac{1}{k}x_k x^k=k1k1k1(x1+x2+x3++xk1)+k1xk

= k − 1 k x ^ k − 1 + 1 k x k \quad =\frac{k-1}{k}\hat x_{k-1}+\frac{1}{k}x_k =kk1x^k1+k1xk

= x ^ k − 1 + 1 k ( x k − x ^ k − 1 ) \quad = \hat x_{k-1}+\frac{1}{k}(x_k-\hat x_{k-1}) =x^k1+k1(xkx^k1)

1 k = K k \frac{1}{k}=K_k k1=Kk( K k : K_k: Kk:Kalman增益/系数),则上式变为:

x ^ k = x ^ k − 1 + K k ( x k − x ^ k − 1 ) \hat x_k = \hat x_{k-1}+K_k(x_k-\hat x_{k-1}) x^k=x^k1+Kk(xkx^k1)

从上述的引例可以得知,对于一个对象的估计值应该是和测量值、前次的估计值有关。

  • K k = e E S T k − 1 e E S T k − 1 + e M E A K_k=\frac{e_{EST_{k-1}}}{e_{EST_{k-1}}+e_{MEA}} Kk=eESTk1+eMEAeESTk1 e E S T : e_{EST}: eEST:估计误差; e M E A : e_{MEA}: eMEA:测量误差)

二、引例2:数据融合

\quad 假设用两把尺子测量一个物体的长度,测量的结果分别为 l 1 = 30 l_1=30 l1=30 l 2 = 32 l_2=32 l2=32,其中尺子1的标准差 σ 1 = 2 \sigma_1=2 σ1=2,尺子2的标准差 σ 2 = 4 \sigma_2=4 σ2=4。因此,通过这两个测量的数据如何去估计该物体的真实长度?根据kalman filter 公式,估计值与测量值之间的关系为:

\quad l ^ = l 1 + K k ( l 2 − l 1 ) \hat l = l_1+K_k(l_2-l_1) l^=l1+Kk(l2l1)

l ^ \hat l l^的方差为:

\quad v a r ( l ^ ) = v a r ( l 1 + K k ( l 2 − l 1 ) ) var(\hat l)=var(l_1+K_k(l_2-l_1)) var(l^)=var(l1+Kk(l2l1))

\quad ⟹ = v a r ( ( 1 − K k ) l 1 + K k l 2 ) \Longrightarrow \quad = var((1-K_k)l_1+K_kl_2) =var((1Kk)l1+Kkl2)

由于两把尺子的测量结果不会相互影响,因此测量结果 l 1 l_1 l1 l 2 l_2 l2是相互独立,则上述估计值方差公式可以展开为:

\quad v a r ( l ^ ) = ( 1 − K k ) 2 v a r ( l 1 ) + K k 2 v a r ( l 2 ) var(\hat l) = (1-K_k)^2var(l_1)+K_k^2var(l_2) var(l^)=(1Kk)2var(l1)+Kk2var(l2)

要使估计值更接近于真实值,则其方差需要越小,亦即可以将问题转换为 K k K_k Kk取何值时,估计值方差最小?上式对 K k K_k Kk求导并令其等于零可得:

\quad ∂ v a r ( l ^ ) ∂ K k = − 2 ( 1 − K k ) v a r ( l 1 ) + 2 K k v a r ( l 2 ) = 0 \frac{\large \partial var(\hat l)}{\large \partial K_k}=-2(1-K_k)var(l_1)+2K_kvar(l_2)=0 Kkvar(l^)=2(1Kk)var(l1)+2Kkvar(l2)=0

\quad ⟹ K k = v a r ( l 1 ) v a r ( l 1 ) + v a r ( l 2 ) \Longrightarrow K_k = \frac{\large var(l_1)}{\large var(l_1)+var(l_2)} Kk=var(l1)+var(l2)var(l1)

v a r ( l 1 ) = σ 1 2 = 4 、 v a r ( l 2 ) = σ 2 2 = 16 var(l_1)=\sigma_1^2=4、var(l_2)=\sigma_2^2=16 var(l1)=σ12=4var(l2)=σ22=16代入上式可得:

\quad K k = 4 4 + 16 = 0.2 K_k=\frac{4}{4+16}=0.2 Kk=4+164=0.2

K k K_k Kk代入 v a r ( l ^ ) 、 l ^ var(\hat{l})、\hat{l} var(l^)l^中可得方差和估计值为:

v a r ( l ^ ) = ( 1 − 0.2 ) 2 ∗ 2 2 + 0. 2 2 ∗ 4 2 = 3.2 \quad var(\hat l)=(1-0.2)^2*2^2+0.2^2*4^2=3.2 var(l^)=(10.2)222+0.2242=3.2

\quad l ^ = 30 + 0.2 ( 32 − 30 ) = 30.4 \hat l=30+0.2(32-30)=30.4 l^=30+0.2(3230)=30.4

进一步可得估计值标准差 σ l ^ = 3.2 ≈ 1.79 \sigma_{\hat l}=\sqrt{3.2}\approx1.79 σl^=3.2 1.79

import numpy as np #
import matplotlib.pyplot as plt # 

x = np.arange(20,45,0.1) 
#设定 y 轴,载入刚才的正态分布函数
y1 = np.exp(-((x - 30)**2)/(2*2**2)) / (2 * np.sqrt(2*np.pi))#normfun(x, 30, 2)
y2 = np.exp(-((x - 32)**2)/(2*4**2)) / (2 * np.sqrt(2*np.pi))#normfun(x, 32, 4)
y3 = np.exp(-((x - 30.4)**2)/(2*np.sqrt(3.2)**2)) / (2 * np.sqrt(2*np.pi))#normfun(x, 30.4, 3.2)

plt.plot(x,y1,x,y2,x,y3)

执行上段代码可得:

正态分布

三、协方差矩阵

1、协方差矩阵定义

\quad 协方差矩阵将方差和协方差关联在一起。假设对一个对象从三个维度 X   、Y、   Z \textbf {X 、Y、 Z} Y Z进行描述, X   、Y、   Z \textbf {X 、Y、 Z} Y Z都是 n × 1 n\times 1 n×1维向量,如下:

\quad X = [ x 1 x 2 ⋮ x n ] Y = [ y 1 y 2 ⋮ y n ] Z = [ z 1 z 2 ⋮ z n ] X =\begin{bmatrix} x_1 \\ x_2 \\\vdots \\ x_n \end{bmatrix} \qquad Y=\begin{bmatrix} y_1 \\ y_2 \\\vdots \\ y_n \end{bmatrix} \qquad Z=\begin{bmatrix} z_1 \\ z_2 \\\vdots \\ z_n \end{bmatrix} X=x1x2xnY=y1y2ynZ=z1z2zn

X   、Y、   Z \textbf {X 、Y、 Z} Y Z方差分别为 σ x 2 \sigma_x^2 σx2 σ y 2 \sigma_y^2 σy2 σ z 2 \sigma_z^2 σz2 X   、Y、   Z \textbf {X 、Y、 Z} Y Z的均值分别为 x ‾ \overline{x} x y ‾ \overline{y} y z ‾ \overline{z} z。则不同纬度之间的协方差可以写成:

\quad σ x σ y = 1 n [ ( x 1 − x ‾ ) ( y 1 − y ‾ ) + ( x 2 − x ‾ ) ( y 2 − y ‾ ) + ⋯ + ( x n − x ‾ ) ( y n − y ‾ ) ] = σ y σ x \sigma_x\sigma_y=\frac{1}{n}[(x_1-\overline{x})(y_1-\overline{y})+(x_2-\overline{x})(y_2-\overline{y})+\cdots+(x_n-\overline{x})(y_n-\overline{y})]=\sigma_y\sigma_x σxσy=n1[(x1x)(y1y)+(x2x)(y2y)++(xnx)(yny)]=σyσx

\quad σ x σ z = 1 n [ ( x 1 − x ‾ ) ( z 1 − z ‾ ) + ( x 2 − x ‾ ) ( z 2 − z ‾ ) + ⋯ + ( x n − x ‾ ) ( z n − z ‾ ) ] = σ z σ x \sigma_x\sigma_z=\frac{1}{n}[(x_1-\overline{x})(z_1-\overline{z})+(x_2-\overline{x})(z_2-\overline{z})+\cdots+(x_n-\overline{x})(z_n-\overline{z})]=\sigma_z\sigma_x σxσz=n1[(x1x)(z1z)+(x2x)(z2z)++(xnx)(znz)]=σzσx

\quad σ y σ z = 1 n [ ( y 1 − y ‾ ) ( z 1 − z ‾ ) + ( y 2 − y ‾ ) ( z 2 − z ‾ ) + ⋯ + ( y n − y ‾ ) ( z n − z ‾ ) ] = σ z σ y \sigma_y\sigma_z=\frac{1}{n}[(y_1-\overline{y})(z_1-\overline{z})+(y_2-\overline{y})(z_2-\overline{z})+\cdots+(y_n-\overline{y})(z_n-\overline{z})]=\sigma_z\sigma_y σyσz=n1[(y1y)(z1z)+(y2y)(z2z)++(yny)(znz)]=σzσy

因此,协方差矩阵可以写成:

\quad M c o v = [ σ x 2 σ x σ y σ x σ z σ y σ x σ y 2 σ y σ z σ z σ x σ z σ y σ z 2 ] M_{cov}=\begin{bmatrix} \sigma_x^2 & \sigma_x \sigma_y & \sigma_x \sigma_z \\ \sigma_y \sigma_x & \sigma_y^2 & \sigma_y \sigma_z \\ \sigma_z \sigma_x & \sigma_z \sigma_y & \sigma_z^2 \end{bmatrix} Mcov=σx2σyσxσzσxσxσyσy2σzσyσxσzσyσzσz2

2、协方差矩阵性质
  • 根据以上所述可以得出协方差矩阵的一个性质: M c o v = M c o v T M_{cov}=M_{cov}^T Mcov=McovT
  • 如果信号的期望为0,则协方差矩阵等于信号与其转置乘积的期望,简单例证如下:
    \qquad 假设 w w w为二维向量 w = [ w 1 w 2 ] w=\begin{bmatrix} w_1 \\ w_2 \end{bmatrix} w=[w1w2],根据协方差定义, m c o v ( w i , w j ) = E [ ( w i − E [ w i ] ) ( w j − E [ w j ] ) ] m_{cov}(w_i,w_j)=E[(w_i-E[w_i])(w_j-E[w_j])] mcov(wi,wj)=E[(wiE[wi])(wjE[wj])],由于 w w w的期望为0,所以 E [ w i ] 、 E [ w j ] E[w_i]、E[w_j] E[wi]E[wj]等于零,则 m c o v ( w i , w j ) = E [ w i ⋅ w j ] m_{cov}(w_i,w_j)=E[w_i\cdot w_j] mcov(wi,wj)=E[wiwj]
    \qquad 根据相关定义, E [ w 1 2 ] = V A R ( w 1 ) + E [ w 1 2 ] = V A R ( w 1 ) = σ w 1 2 E[w_1^2]=VAR(w_1)+E[w_1^2]=VAR(w_1)=\sigma_{w_1}^2 E[w12]=VAR(w1)+E[w12]=VAR(w1)=σw12,同理, E [ w 2 2 ] = σ w 2 2 E[w_2^2]=\sigma_{w_2}^2 E[w22]=σw22 E [ w 1 w 2 ] = E [ w 2 w 1 ] = σ w 1 σ w 2 E[w_1w_2]=E[w_2w_1]=\sigma_{w_1}\sigma_{w_2} E[w1w2]=E[w2w1]=σw1σw2
    因此,过程噪声 w w w的协方差矩阵Q可以写成:

\qquad \qquad Q = [ E [ w 1 2 ] E [ w 1 w 2 ] E [ w 2 w 1 ] E [ w 2 2 ] ] = E [ w w T ] = [ σ w 1 2 σ w 1 σ w 2 σ w 1 σ w 2 σ w 2 2 ] Q=\begin{bmatrix} E[w_1^2] & E[w_1w_2]\\ E[w_2w_1] & E[w_2^2] \end{bmatrix}=E[ww^T]=\begin{bmatrix} \sigma_{w_1}^2 & \sigma_{w_1}\sigma_{w_2} \\ \sigma_{w_1}\sigma_{w_2} & \sigma_{w_2}^2 \end{bmatrix} Q=[E[w12]E[w2w1]E[w1w2]E[w22]]=E[wwT]=[σw12σw1σw2σw1σw2σw22]

四、Kalman Filter公式推导

1、离散状态空间方程:

{ x k = A x k − 1 + B u k − 1 + w k − 1 ( 4.1 ) z k = H x k + v k ( 4.2 ) \left\{ \begin{array}{ll} x_k=Ax_{k-1}+Bu_{k-1}+w_{k-1} & (4.1)\\ z_k=Hx_k+v_{k} & (4.2) \end{array} \right . {xk=Axk1+Buk1+wk1zk=Hxk+vk4.14.2

  • A A A:状态转移矩阵, n × n n\times n n×n维, B B B:输入矩阵, n × n n\times n n×n维, H H H:观测矩阵, m × n m\times n m×n维, x k x_k xk:状态变量, n × 1 n\times 1 n×1维, z k z_k zk:测量值, m × 1 m\times 1 m×1维, u k u_k uk:输入信号, n × 1 n\times 1 n×1维, w k − 1 w_{k-1} wk1:过程噪声, n × 1 n\times 1 n×1维, v k v_k vk:测量噪声, m × 1 m\times 1 m×1维。其中, w k − 1 、 v k w_{k-1}、v_k wk1vk服从期望为0 ,协方差分别为Q,R的正态分布,即: w ∼ p ( 0 , Q ) w\sim p(0,Q) wp(0,Q) v ∼ p ( 0 , R ) v\sim p(0,R) vp(0,R)
2、先验估计、后验估计及其误差
  • 先验估计 x ^ k − \hat x_k^- x^k:根据已知的系统模型(没有过程噪声,因为过程噪声是未知的,已知的只有确定的研究对象能够建立的模型)和上一次迭代结果而产生的估计值;

  • 后验估计 x ^ k \hat x_k x^k:根据当前计算的结果而产生的估计值;

  • 定义先验估计误差 e k − ∼ p ( 0 , P k − ) : e k − = x k − x ^ k − e_k^- \sim p(0,P_k^-):e_k^-=x_k-\hat x_k^- ekp(0,Pk)ek=xkx^k

  • 定义后验估计误差 e k ∼ p ( 0 , P k ) e_k \sim p(0,P_k) ekp(0,Pk) e k = x k − x ^ k e_k=x_k-\hat x_k ek=xkx^k

  • x k x_k xk为真实值,带^的为估计值;

  • 定义先验估计误差的协方差矩阵 P k − = E [ e k − e k − T ] P_k^-=E[e_k^-{e_k^-}^T] Pk=E[ekekT];

  • 定义后验估计误差的协方差矩阵 P k = E [ e k e k T ] P_k=E[e_k{e_k}^T] Pk=E[ekekT];

  • 先验估计和后验估计值计算:
    1、根据 x ^ k − 1 \hat x_{k-1} x^k1计算出 k k k时刻的先验估计值 x ^ k − \hat x_k^- x^k: x ^ k − = A x ^ k − 1 + B u k − 1 ( 4.3 ) \color{red}{}\hat x_k^- = A\hat x_{k-1}+Bu_{k-1} \qquad (4.3) x^k=Ax^k1+Buk1(4.3)
    2、测量结果的先验估计值 x ^ k m e a = H − 1 z k \hat x_{k_{mea}}=H^{-1}z_k x^kmea=H1zk;
    3、根据1)、2)可以计算出 k k k时刻的后验估计值 x ^ k = x ^ k − + G ( x ^ k m e a − x ^ k − ) \hat x_k=\hat x_k^-+G(\hat x_{k_{mea}}-\hat x_k^-) x^k=x^k+G(x^kmeax^k),令 G = K k H G=K_kH G=KkH,则上式变成:
    x ^ k = x ^ k − + K k ( z k − H x ^ k − ) ( 4.4 ) \qquad\color{red}\large \hat x_k=\hat x_k^-+K_k(z_k-H\hat x_k^-) \qquad (4.4) x^k=x^k+Kk(zkHx^k)(4.4)
    4、 K k ∈ [ 0 , H − ] K_k \in[0,H^-] Kk[0,H]: Kalman Gain, H x ^ k − H\hat x_k^- Hx^k: 残差。

  • 基于以上定义和推导,Kalman Filter的目的即是:在系统结构已知的情况下,给定 k k k时刻的状态观测向量 z k z_k zk,求 k k k时刻的系统状态向量的最优估计 x ^ k \hat x_k x^k,使得后验估计误差协方差矩阵 P P P最小(矩阵的迹最小 → \rightarrow 方差最小 → \rightarrow 后验估计误差最小)。亦即寻找 K k K_k Kk,使得估计值 x ^ k \hat x_k x^k 趋近于真实值 x k x_k xk

3、寻找Kalman Gain K k K_k Kk

\qquad 结合后验估计误差的协方差矩阵公式 P k = E [ e k e k T ] P_k=E[e_ke_k^T] Pk=E[ekekT] 和后验估计误差公式 e k = x k − x ^ k e_k=x_k-\hat x_k ek=xkx^k可得:
\qquad P k = E [ ( x k − x ^ k ) ( x k − x ^ k ) T ] ( 4.5 ) P_k=E[(x_k-\hat x_k)(x_k-\hat x_k)^T] \qquad (4.5) Pk=E[(xkx^k)(xkx^k)T](4.5)

将公式(4.4)代入公式(4.5)中可得:

\qquad P k = E [ ( x k − x ^ k − − K k z k + K k H x ^ k − ) ( x k − x ^ k − − K k z k + K k H x ^ k − ) T ] P_ k=E[(x_k-\hat x_k^--K_kz_k+K_kH\hat x_k^-)(x_k-\hat x_k^--K_kz_k+K_kH\hat x_k^-)^T] Pk=E[(xkx^kKkzk+KkHx^k)(xkx^kKkzk+KkHx^k)T]

z k = H x k + v k z_k=Hx_k+v_k zk=Hxk+vk代入上式可得:

\qquad P k = E [ ( x k − x ^ k − − K k ( H x k + v k ) ) + K k H x ^ k − ) ( x k − x ^ k − − K k ( H x k + v k ) + K k H x ^ k − ) T ] P_k=E[(x_k-\hat x_k^--K_k(Hx_k+v_k))+K_kH\hat x_k^-)(x_k-\hat x_k^--K_k(Hx_k+v_k)+K_kH\hat x_k^-)^T] Pk=E[(xkx^kKk(Hxk+vk))+KkHx^k)(xkx^kKk(Hxk+vk)+KkHx^k)T]

展开后得:

\qquad P k = E [ ( x k − x ^ k − − K k H x k − K k v k + K k H x ^ k − ) ( x k − x ^ k − − K k H x k − K k v k + K k H x ^ k − ) T ] P_k=E[(x_k-\hat x_k^--K_kHx_k-K_kv_k+K_kH\hat x_k^-)(x_k-\hat x_k^--K_kHx_k-K_kv_k+K_kH\hat x_k^-)^T] Pk=E[(xkx^kKkHxkKkvk+KkHx^k)(xkx^kKkHxkKkvk+KkHx^k)T]

整理后得:

\qquad P k = E [ ( ( I − K k H ) ( x k − x ^ k − ) − K k v k ) ( ( I − K k H ) ( x k − x ^ k − ) − K k v k ) T ] P_k=E[((I-K_kH)(x_k-\hat x_k^-)-K_kv_k)((I-K_kH)(x_k-\hat x_k^-)-K_kv_k)^T] Pk=E[((IKkH)(xkx^k)Kkvk)((IKkH)(xkx^k)Kkvk)T]

将先验估计误差 e k − = x k − x ^ k − e_k^-=x_k-\hat x_k^- ek=xkx^k代入上式可得:

\qquad P k = E [ ( ( I − K k H ) e k − − K k v k ) ( ( I − K k H ) e k − − K k v k ) T ] P_k=E[((I-K_kH)e_k^--K_kv_k)((I-K_kH)e_k^--K_kv_k)^T] Pk=E[((IKkH)ekKkvk)((IKkH)ekKkvk)T]

  • 补充知识:矩阵转置的性质
    1、 ( A T ) T = A (A^T)^T=A (AT)T=A
    2、 ( k A ) T = k A T (kA)^T=kA^T (kA)T=kAT
    3、 ( A B ) T = B T A T (AB)^T=B^TA^T (AB)T=BTAT
    4、 ( A ± B ) T = A T ± B T (A\pm B)^T=A^T \pm B^T (A±B)T=AT±BT

根据矩阵转置性质可得:

\qquad P k = E [ ( ( I − K k H ) e k − − K k v k ) ( e k − T ( I − K k H ) T − v k T K k T ) ] P_k=E[((I-K_kH)e_k^--K_kv_k)(e_k^{-T}(I-K_kH)^T-v_k^TK_k^T)] Pk=E[((IKkH)ekKkvk)(ekT(IKkH)TvkTKkT)]

= E [ ( I − K k H ) e k − e k − T ( I − K k H ) T − ( I − K k H ) e k − v k T K k T − K k v k e k − T ( I − K k H ) T + K k v k v k T K k T ] \qquad \qquad=E[(I-K_kH)e_k^-e_k^{-T}(I-K_kH)^T-(I-K_kH)e_k^-v_k^TK_k^T-K_kv_ke_k^{-T}(I-K_kH)^T+K_kv_kv_k^TK_k^T] =E[(IKkH)ekekT(IKkH)T(IKkH)ekvkTKkTKkvkekT(IKkH)T+KkvkvkTKkT]

= E [ ( I − K k H ) e k − e k − T ( I − K k H ) T ] − E [ ( I − K k H ) e k − v k T K k T ] − E [ K k v k e k − T ( I − K k H ) T ] + E [ K k v k v k T K k T ] ( 4.6 ) \qquad \qquad = E[(I-K_kH)e_k^-e_k^{-T}(I-K_kH)^T]-E[(I-K_kH)e_k^-v_k^TK_k^T]-E[K_kv_ke_k^{-T}(I-K_kH)^T]+E[K_kv_kv_k^TK_k^T] \qquad (4.6) =E[(IKkH)ekekT(IKkH)T]E[(IKkH)ekvkTKkT]E[KkvkekT(IKkH)T]+E[KkvkvkTKkT](4.6)

由于先验估计误差 e k − e_k^- ek和测量噪声 v k v_k vk是相互独立且其期望都等于0,根据期望的性质可得:

\qquad E [ ( I − K k H ) e k − v k T K k T ] = E [ I − K k H ] E [ e k − ] E [ v k T ] E [ K k T ] = 0 E[(I-K_kH)e_k^-v_k^TK_k^T]=E[I-K_kH]E[e_k^-]E[v_k^T]E[K_k^T]=0 E[(IKkH)ekvkTKkT]=E[IKkH]E[ek]E[vkT]E[KkT]=0

同理,

\qquad E [ K k v k e k T ( I − K k H ) T ] = E [ K k ] E [ v k ] E [ e k − T ] E [ ( I − K k H ) T ] = 0 E[K_kv_ke_k^T(I-K_kH)^T]=E[K_k]E[v_k]E[e_k^{-T}]E[(I-K_kH)^T]=0 E[KkvkekT(IKkH)T]=E[Kk]E[vk]E[ekT]E[(IKkH)T]=0

因此,式(4.6)整理后得:

\qquad P k = E [ I − K k H ] E [ e k − e k − T ] E [ ( I − K k H ) T ] + E [ K k ] E [ v k v k T ] E [ K k T ] ( 4.7 ) P_k=E[I-K_kH]E[e_k^-e_k^{-T}]E[(I-K_kH)^T]+E[K_k]E[v_kv_k^T]E[K_k^T] \quad (4.7) Pk=E[IKkH]E[ekekT]E[(IKkH)T]+E[Kk]E[vkvkT]E[KkT](4.7)

相对于先验估计误差 e k − e_k^- ek和噪声 v k v_k vk ( I − K k H ) 、 K k (I-K_kH)、K_k (IKkH)Kk都是常数,此外, P k − = E [ e k − e k − T ] P_k^-=E[e_k^-e_k^{-T}] Pk=E[ekekT]为先验估计误差协方差矩阵,且如前所述噪声协方差矩阵 R = E [ v k v k T ] R=E[v_kv_k^T] R=E[vkvkT]。所以式(4.7)变为:

\qquad P k = ( I − K k H ) P k − ( I − K k H ) T + K k R K k T P_k=(I-K_kH)P_k^-(I-K_kH)^T+K_kRK_k^T Pk=(IKkH)Pk(IKkH)T+KkRKkT

= ( P k − − K k H P k − ) ( I − H T K k T ) + K k R K k T \qquad \qquad =(P_k^--K_kHP_k^-)(I-H^TK_k^T)+K_kRK_k^T =(PkKkHPk)(IHTKkT)+KkRKkT

= P k − − P k − H T K k T − K k H P k − + K k H P k − H T K k T + K k R K k T ( 4.8 ) \qquad \qquad \color{red}{} =P_k^--P_k^-H^TK_k^T-K_kHP_k^-+K_kHP_k^-H^TK_k^T+K_kRK_k^T \quad (4.8) =PkPkHTKkTKkHPk+KkHPkHTKkT+KkRKkT(4.8)

如前所述,要寻找 K k K_k Kk,使得后验估计误差最小,亦即需要求后验估计误差得协方差矩阵 P k P_k Pk得迹最小,因此,式(4.8)的迹为:

t r ( P k ) = t r ( P k − ) − t r ( P k − H T K k T ) − t r ( K k H P k − ) + t r ( K k H P k − H T K k T ) + t r ( K k R K k T ) ( 4.9 ) \qquad tr(P_k)=tr(P_k^-)-tr(P_k^-H^TK_k^T)-tr(K_kHP_k^-)+tr(K_kHP_k^-H^TK_k^T)+tr(K_kRK_k^T) \qquad (4.9) tr(Pk)=tr(Pk)tr(PkHTKkT)tr(KkHPk)+tr(KkHPkHTKkT)+tr(KkRKkT)(4.9)

  • 补充知识:矩阵迹及其导数性质
    1、 t r ( A B ) = t r ( B A ) tr(AB) = tr(BA) tr(AB)=tr(BA);
    2、 t r ( A B C ) = t r ( C A B ) = t r ( B C A ) tr(ABC) = tr(CAB) = tr(BCA) tr(ABC)=tr(CAB)=tr(BCA);
    3、 t r ( A ) = t r ( A T ) tr(A)=tr(A^T) tr(A)=tr(AT);
    4、如果 a ∈ a\in a实数,则有 t r ( a ) = a tr(a)=a tr(a)=a;
    5、 d ( t r ( X B ) ) = d ( t r ( B X ) ) = B ′ d(tr(XB))=d(tr(BX))=B' d(tr(XB))=d(tr(BX))=B,对 X X X求导;
    6、 d ( t r ( X ′ B ) ) = d ( t r ( B X ′ ) ) = B d(tr(X'B)) = d(tr(BX'))=B d(tr(XB))=d(tr(BX))=B;
    7、 d t r ( X ) = I dtr(X) = I dtr(X)=I, I I I为单位矩阵;
    8、 d t r ( A ′ X B ′ ) = d t r ( B X ′ A ) = A B dtr(A'XB')=dtr(BX'A)=AB dtr(AXB)=dtr(BXA)=AB;
    9、 d ( t r ( A X B X ′ ) ) = A X B + A ′ X B ′ d(tr(AXBX'))=AXB + A'XB' d(tr(AXBX))=AXB+AXB;
    10、 d t r ( A X B X ) = A ′ X ′ B ′ + B ′ X ′ A ′ dtr(AXBX)=A'X'B'+B'X'A' dtr(AXBX)=AXB+BXA;

根据矩阵的迹及其导数性质对式(4.9)求导可得:

\qquad d t r P k d K k = − P k − H T − P k − H T + 2 K k H P k − H T + 2 K k R ( 4.10 ) \frac{\large dtrP_k}{\large dK_k}=-P_k^-H^T-P_k^-H^T+2K_kHP_k^-H^T+2K_kR \qquad (4.10) dKkdtrPk=PkHTPkHT+2KkHPkHT+2KkR(4.10)

令式(4.10)等于0可得:

\qquad K k = P k − H T H P k − H T + R ( 4.11 ) \color{red}\Large K_k=\frac{\large P_k^-H^T}{\large HP_k^-H^T+R} \qquad (4.11) Kk=HPkHT+RPkHT(4.11)

至此,Kalman Gain K k K_k Kk便已推到完毕。

4、先验估计误差协方差矩阵 P k − P_k^- Pk及后验估计误差协方差矩阵 P k P_k Pk推导
  • 系 统 上 一 次 的 输 出 x k − 1 已 知 u k − 1 已 知 状 态 矩 阵 A 、 输 入 矩 阵 B 已 知 } \left. \begin{array}{r} 系统上一次的输出x_{k-1}已知 \\ u_{k-1}已知 \\ 状态矩阵A、输入矩阵B已知 \end{array} \right\} xk1uk1AB ⟹ \large \Longrightarrow 先验估计值 x ^ k − = A x ^ k − 1 + B u k − 1 \hat x_k^-=A\hat x_{k-1}+Bu_{k-1} x^k=Ax^k1+Buk1已知;

  • 先 验 估 计 值 x ^ k − 已 知 系 统 输 出 z k 已 知 输 出 矩 阵 H 已 知 } \left. \begin{array}{r} 先验估计值\hat x_k^-已知 \\ 系统输出z_k已知 \\ 输出矩阵H已知 \end{array} \right\} x^kzkH ⟹ \large \Longrightarrow 要求后验估计值 x ^ k = x ^ k − + K k ( z k − H x ^ k − ) \hat x_k=\hat x_k^-+K_k(z_k-H\hat x_k^-) x^k=x^k+Kk(zkHx^k),只需求出Kalman Gain K k K_k Kk ⟹ 式 ( 4.11 ) \large \stackrel{\color{red}{}式(4.11)}{\Longrightarrow} (4.11)只要求出先验估计误差的协方差矩阵 P k − P_k^- Pk即可。

先验估计误差的协方差矩阵 P k − P_k^- Pk表达式为:

\qquad P k − = E [ e k − e k − T ] = E [ ( x k − x ^ k − ) ( x k − x k − ) T ] P_k^-=E[e_k^-e_k^{-T}]=E[(x_k-\hat x_k^-)(x_k-x_k^-)^T] Pk=E[ekekT]=E[(xkx^k)(xkxk)T]

x k = A x k − 1 + B u k − 1 + w k − 1 x_k=Ax_{k-1}+Bu_{k-1}+w_{k-1} xk=Axk1+Buk1+wk1代入上式得:

\qquad P k − = E [ ( A x k − 1 + w k − 1 − A x ^ k − 1 ) ( A x k − 1 + w k − 1 − A x ^ k − 1 ) T ] P_k^-=E[(Ax_{k-1}+w_{k-1}-A\hat x_{k-1})(Ax_{k-1}+w_{k-1}-A\hat x_{k-1})^T] Pk=E[(Axk1+wk1Ax^k1)(Axk1+wk1Ax^k1)T]

= E [ ( A ( x k − 1 − x ^ k − 1 ) + w k − 1 ) ( A ( x k − 1 − x ^ k − 1 ) + w k − 1 ) T ] \qquad \qquad = E[(A(x_{k-1}-\hat x_{k-1})+w_{k-1})(A(x_{k-1}-\hat x_{k-1})+w_{k-1})^T] =E[(A(xk1x^k1)+wk1)(A(xk1x^k1)+wk1)T]

= E [ ( A e k − 1 + w k − 1 ) ( A e k − 1 + w k − 1 ) T ] \qquad \qquad = E[(Ae_{k-1}+w_{k-1})(Ae_{k-1}+w_{k-1})^T] =E[(Aek1+wk1)(Aek1+wk1)T]

= E [ ( A e k − 1 + w k − 1 ) ( e k − 1 T A T + w k − 1 T ) ] \qquad \qquad = E[(Ae_{k-1}+w_{k-1})(e_{k-1}^TA^T+w_{k-1}^T)] =E[(Aek1+wk1)(ek1TAT+wk1T)]

= E [ A e k − 1 e k − 1 T A T + A e k − 1 w k − 1 T + w k − 1 e k − 1 T A T + w k − 1 w k − 1 T ] \qquad \qquad = E[Ae_{k-1}e_{k-1}^TA^T+Ae_{k-1}w_{k-1}^T+w_{k-1}e_{k-1}^TA^T+w_{k-1}w_{k-1}^T] =E[Aek1ek1TAT+Aek1wk1T+wk1ek1TAT+wk1wk1T]

= E [ A e k − 1 e k − 1 T A T ] + E [ A e k − 1 w k − 1 T ] + E [ w k − 1 e k − 1 T A T ] + E [ w k − 1 w k − 1 T ] ( 4.12 ) \qquad \qquad = E[Ae_{k-1}e_{k-1}^TA^T]+E[Ae_{k-1}w_{k-1}^T]+E[w_{k-1}e_{k-1}^TA^T]+E[w_{k-1}w_{k-1}^T] \quad (4.12) =E[Aek1ek1TAT]+E[Aek1wk1T]+E[wk1ek1TAT]+E[wk1wk1T](4.12)

由于系统上一次得后验估计误差 e k − 1 e_{k-1} ek1与系统本次的过程噪声 w k − 1 w_{k-1} wk1是相互独立且期望都为0,则 E [ A e k − 1 w k − 1 T ] = E [ w k − 1 e k − 1 T A T ] = 0 E[Ae_{k-1}w_{k-1}^T]=E[w_{k-1}e_{k-1}^TA^T]=0 E[Aek1wk1T]=E[wk1ek1TAT]=0,因此式(4.12)可变为:

P k − = E [ A ] E [ e k − 1 e k − 1 T ] E [ A T ] + E [ w k − 1 w k − 1 T ] \qquad P_k^-=E[A]E[e_{k-1}e_{k-1}^T]E[A^T]+E[w_{k-1}w_{k-1}^T] Pk=E[A]E[ek1ek1T]E[AT]+E[wk1wk1T]

= A P k − 1 A T + Q ( 4.13 ) \qquad \qquad \color{red}{}= AP_{k-1}A^T+Q \qquad (4.13) =APk1AT+Q(4.13)

把式(4.11)代入式(4.8)中可得:

\qquad P k = P k − − P k − H T K k T − K k H P k − + K k ( H P k − H T + R ) K k T P_k=P_k^--P_k^-H^TK_k^T-K_kHP_k^-+K_k(HP_k^-H^T+R)K_k^T Pk=PkPkHTKkTKkHPk+Kk(HPkHT+R)KkT

= P k − − P k − H T K k T − K k H P k − + P k − H T H P k − H T + R ( H P k − H T + R ) K k T \qquad \qquad = P_k^--P_k^-H^TK_k^T-K_kHP_k^-+\frac{P_k^-H^T}{HP_k^-H^T+R}(HP_k^-H^T+R)K_k^T =PkPkHTKkTKkHPk+HPkHT+RPkHT(HPkHT+R)KkT

= P k − − P k − H T K k T − K k H P k − + P k − H T K k T \qquad \qquad = P_k^--P_k^-H^TK_k^T-K_kHP_k^-+P_k^-H^TK_k^T =PkPkHTKkTKkHPk+PkHTKkT

= P k − − K k H P k − \qquad \qquad = P_k^--K_kHP_k^- =PkKkHPk

= ( I − K k H ) P k − 4. ( 14 ) \qquad \qquad \color{red}{}= (I-K_kH)P_k^- \qquad 4.(14) =(IKkH)Pk4.(14)

五、Kalman Filter计算步骤

Kalman Filter 实施分成两大部分:

1、预测

1、计算先验估计值: x ^ k − = A x ^ k − 1 + B u k − 1 ( 4.3 ) \hat x_k^-=A\hat x_{k-1}+Bu_{k-1} \qquad (4.3) x^k=Ax^k1+Buk1(4.3)

2、计算先验误差协方差矩阵 P k − = A P k − 1 A T + Q ( 4.13 ) P_k^-=AP_{k-1}A^T+Q \qquad (4.13) Pk=APk1AT+Q(4.13)

2、校正

3、计算Kalman Gain K k = P k − H T H P k − H T + R ( 4.11 ) K_k={\large\frac{P_k^-H^T}{HP_k^-H^T+R}} \qquad (4.11) Kk=HPkHT+RPkHT(4.11)

4、计算后验估计值 x ^ k = x ^ k − + K k ( z k − H x ^ k − ) ( 4.4 ) \hat x_k=\hat x_k^-+K_k(z_k-H\hat x_k^-)\qquad (4.4) x^k=x^k+Kk(zkHx^k)(4.4)

5、更新后验估计误差协方差矩阵 P k = ( I − K k H ) P k − ( 4.14 ) P_k=(I-K_kH)P_k^-\qquad (4.14) Pk=(IKkH)Pk(4.14)

六、Kalman Filter实例之PMSM速度观测器设计

  • PMSM:永磁同步电机

  • 补充知识:控制系统常用的离散化方法
    1、 前向差分法:
    \qquad 一阶前向差分: d u d t ≈ u ( k + 1 ) − u ( k ) T \frac{du}{dt} \approx \frac{u(k+1)-u(k)}{T} dtduTu(k+1)u(k)
    2、 后向差分法
    \qquad 一阶后向差分: d u d t ≈ u ( k ) − u ( k − 1 ) T \frac{du}{dt} \approx \frac{u(k)-u(k-1)}{T} dtduTu(k)u(k1)
    3、 双线性变换法
    4、 脉冲响应不变法
    5、 阶跃响应不变法
    6、 零极点匹配法

1、PMSM离散化空间状态方程
  • PMSM电磁转矩方程

\qquad T e = 3 2 p ( ψ d i q − ψ q i d ) ( 6.1 ) T_e=\frac{3}{2}p(\psi_di_q-\psi_qi_d) \qquad (6.1) Te=23p(ψdiqψqid)(6.1)

其中 p p p为电机极对数, ψ d 、 ψ q \psi_d、\psi_q ψdψq d 、 q d、q dq轴磁链, i d 、 i q i_d、i_q idiq d 、 q d、q dq轴电流。把 ψ d = ψ f + L d i d , ψ q = L q i q \psi_d=\psi_f+L_di_d,\psi_q=L_qi_q ψd=ψf+Ldid,ψq=Lqiq代入式(6.1)中可得:

T e = 3 2 p ( ( ( ψ f + L d i d ) i q ) − L q i q i d ) \qquad T_e=\frac{3}{2}p(((\psi_f+L_di_d)i_q)-L_qi_qi_d) Te=23p(((ψf+Ldid)iq)Lqiqid)

= 3 2 p ( ψ f i q + ( L d − L q ) i d i q ) ( 6.2 ) \qquad\qquad=\frac{3}{2}p(\psi_fi_q+(L_d-L_q)i_di_q) \qquad (6.2) =23p(ψfiq+(LdLq)idiq)(6.2)

其中 L d 、 L q L_d、L_q LdLq分别为 d 、 q d、q dq轴电感, ψ f \psi_f ψf为永磁体磁链。根据PMSM矢量控制算法,通常都令 i d = 0 i_d=0 id=0,则式(6.2)变为:

T e = 3 2 p ψ f i q ( 6.3 ) \qquad T_e=\frac{3}{2}p\psi_fi_q \qquad (6.3) Te=23pψfiq(6.3)

  • PMSM机械运动方程

T e − T L − B ω m = J d ω m d t ( 6.4 ) \qquad T_e-T_L-B\omega_m=J \frac{\large d\omega_m}{\large dt} \qquad (6.4) TeTLBωm=Jdtdωm(6.4)

其中 T L T_L TL为负载转矩, B B B为摩擦系数。如果忽略摩擦因素,则式(6.4)变为:

T e − T L = J d ω m d t ( 6.5 ) \qquad T_e-T_L=J\frac{\large d\omega_m}{\large dt} \qquad (6.5) TeTL=Jdtdωm(6.5)

此外,假设在 d t dt dt时间内负载转矩 T L T_L TL不变,即:

d T L d t = 0 ( 6.6 ) \qquad \frac{\large dT_L}{\large dt}=0 \qquad(6.6) dtdTL=0(6.6)

联合式(6.5)、(6.6)可得PMSM转速与负载转矩的状态空间方程:

  • { [ d ω m d t d T L d t ] = [ 0 − 1 J 0 0 ] [ ω m T L ] + [ 1.5 p ψ f J 0 ] i q ( 6.7 ) ω m = [ 1 0 ] [ ω m T L ] ( 6.8 ) \left\{ \begin{array}{ll} \begin{bmatrix} \frac{d\omega_m}{dt} \\ \\ \frac{dT_L}{dt} \end{bmatrix}= \begin{bmatrix} 0 & -\frac{1}{J} \\ \\ 0 & 0 \end{bmatrix} \begin{bmatrix} \omega_m \\ \\ T_L \end{bmatrix}+ \begin{bmatrix} \frac{1.5p\psi_f}{J} \\ \\ 0 \end{bmatrix}i_q \qquad(6.7)\\ \\ \omega_m= \begin{bmatrix} 1 && 0 \end{bmatrix} \begin{bmatrix} \omega_m \\ \\ T_L \end{bmatrix} \qquad(6.8) \end{array} \right. dtdωmdtdTL=00J10ωmTL+J1.5pψf0iq(6.7)ωm=[10]ωmTL(6.8)
2、状态空间方程离散化

将式(6.7)进行一阶后向差分离散化得:

\qquad [ ω m ( k ) − ω m ( k − 1 ) T s T L ( k ) − T L ( k − 1 ) T s ] = [ 0 − 1 J 0 0 ] [ ω m ( k − 1 ) T L ( k − 1 ) ] + [ 1.5 p ψ f J 0 ] i q ( k − 1 ) \begin{bmatrix} \frac{\omega_m(k)-\omega_m(k-1)}{T_s} \\ \\ \frac{T_L(k)-T_L(k-1)}{T_s} \end{bmatrix}= \begin{bmatrix} 0 & -\frac{1}{J} \\ \\ 0 & 0 \end{bmatrix} \begin{bmatrix} \omega_m(k-1) \\ \\ T_L(k-1) \end{bmatrix}+ \begin{bmatrix} \frac{1.5p\psi_f}{J} \\ \\ 0 \end{bmatrix}i_q(k-1) Tsωm(k)ωm(k1)TsTL(k)TL(k1)=00J10ωm(k1)TL(k1)+J1.5pψf0iq(k1)

整理后得:

\qquad [ ω m ( k ) T L ( k ) ] ⏟ x k = [ 1 − T s J 0 1 ] ⏟ A [ ω m ( k − 1 ) T L ( k − 1 ) ] ⏟ x k − 1 + [ 1.5 p ψ f T s J 0 ] ⏟ B i q ( k − 1 ) ⏟ u k − 1 ( 6.9 ) \begin{matrix}\underbrace{ \begin{bmatrix} \omega_m(k) \\ \\ T_L(k) \end{bmatrix}}\\ x_k \end{matrix}= \begin{matrix}\underbrace{ \begin{bmatrix} 1 & -\frac{T_s}{J} \\ \\ 0 & 1 \end{bmatrix}}\\ A \end{matrix} \begin{matrix}\underbrace{ \begin{bmatrix} \omega_m(k-1) \\ \\ T_L(k-1) \end{bmatrix}}\\ x_{k-1} \end{matrix}+ \begin{matrix}\underbrace{ \begin{bmatrix} \frac{1.5p\psi_fT_s}{J} \\ \\ 0 \end{bmatrix}}\\ B \end{matrix} \begin{matrix}\underbrace{i_q(k-1)}\\ u_{k-1} \end{matrix} \qquad (6.9) ωm(k)TL(k)xk= 10JTs1A ωm(k1)TL(k1)xk1+ J1.5pψfTs0B iq(k1)uk1(6.9)

将式(6.8)进行一阶后向离散化得:

\qquad ω m ( k ) ⏟ z k = [ 1 0 ] ⏟ H [ ω m ( k ) T L ( k ) ] ⏟ x k ( 6.10 ) \begin{matrix} \underbrace{\omega_m(k)}\\ z_k \end{matrix}= \begin{matrix}\underbrace{ \begin{bmatrix} 1 & 0 \end{bmatrix} }\\ H \end{matrix} \begin{matrix}\underbrace{ \begin{bmatrix} \omega_m(k) \\ \\ T_L(k) \end{bmatrix} }\\ x_{k} \end{matrix} \qquad (6.10) ωm(k)zk= [10]H ωm(k)TL(k)xk(6.10)

3、Kalman Filter 观测器设计

\quad 假设PMSM在运行过程中引入了过程噪声 w w w和编码器测量时候的测量噪声为 v v v,且 w ∼ p ( 0 , Q ) 、 v ∼ p ( 0 , R ) w\sim p(0,Q)、v \sim p(0,R) wp(0,Q)vp(0,R),则式(6.9)、(6.10)可以改写成:

\qquad { x k = A x k − 1 + B u k − 1 + w k − 1 z k = H x k + v k \left\{ \begin{array}{l} x_k=Ax_{k-1}+Bu_{k-1}+w_{k-1} \\ z_k=Hx_{k}+v_k \end{array} \right . {xk=Axk1+Buk1+wk1zk=Hxk+vk

假设某一PMSM具有如下特性:极对数 p = 2 p=2 p=2 J = 2.7 × 1 0 − 5 k g ⋅ m 2 J=2.7\times 10^{-5}kg\cdot m^2 J=2.7×105kgm2,采样周期 T s = 2 m s T_s=2ms Ts=2ms,永磁体磁链 ψ f = 0.162 W b \psi_f=0.162Wb ψf=0.162Wb。则矩阵 A 、 B A、B AB分别等于:

\qquad A = [ 1 − 74.07 0 1 ] , B = [ 36 0 ] A=\begin{bmatrix} 1 & -74.07 \\ 0 & 1 \end{bmatrix}, B=\begin{bmatrix} 36 \\ 0 \end{bmatrix} A=[1074.071]B=[360]

初始化 ω m ( 0 ) = 0 , i q ( 0 ) = 0 , T L ( 0 ) = 0 , P 0 = 0 \omega_m(0)=0,i_q(0)=0,T_L(0)=0,P_0=0 ωm(0)=0iq(0)=0TL(0)=0P0=0
\qquad k = 1 k=1 k=1时,进行第一次迭代,根据第六节的计算步骤:
1、计算先验估计值 x ^ 1 − = 0 \hat x_1^-=0 x^1=0
2、计算先验误差协方差矩阵 P 1 − = Q P_1^-=Q P1=Q;
3、计算Kalman Gain K 1 = P 1 − H H P 1 − H T + R = Q H H Q H T + R K_1=\frac{P_1^-H}{HP_1^-H^T+R}=\frac{QH}{HQH^T+R} K1=HP1HT+RP1H=HQHT+RQH

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡尔曼滤波是一种用来估计系统状态的递归滤波算法,适用于线性系统且满足高斯分布的噪声。该滤波器是由R. E. Kalman提出的。 卡尔曼滤波的原理是基于两个假设:系统动态方程能由线性方程描述,测量方程能由线性方程描述。在每个时间步,卡尔曼滤波器通过两个步骤进行估计和更新:预测步骤和校正步骤。预测步骤是根据系统动态方程和上一个时间步的估计状态预测当前状态的均值和方差。校正步骤是根据测量方程和当前观测得到的测量值以及预测的状态,利用贝叶斯定理更新状态的均值和方差,得到最终的估计值。 推导卡尔曼滤波算法的公式如下: 预测步骤: 预测状态: $ x^- = A \cdot x + B \cdot u $ 预测状态协方差矩阵: $ P^- = A \cdot P \cdot A^T + Q $ 校正步骤: 卡尔曼增益: $ K = P^- \cdot H^T \cdot (H \cdot P^- \cdot H^T + R)^{-1} $ 修正后的状态: $ x = x^- + K \cdot (z - H \cdot x^-) $ 修正后的状态协方差矩阵: $ P = (I - K \cdot H) \cdot P^- $ 其中,x是系统状态向量,A是状态转移矩阵,B是输入矩阵,u是输入向量,P是后验状态的误差协方差矩阵,Q是预测误差协方差矩阵,H是测量矩阵,R是测量误差的协方差矩阵,z是观测向量。 通过上述公式的迭代,卡尔曼滤波器可以递归地估计系统的状态,并通过校正步骤利用最新的观测值来更新估计值。这种算法在估计方差较大的实时系统中具有优势,可以去除噪声和不确定性,提高系统的估计精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值