卡尔曼滤波原理(2)

三、卡尔曼五大公式推导
相信大家已经看了我的上一篇文章吧,其实上一篇通过例子讲了卡尔曼滤波思想,卡尔曼滤波又称最优递归数字处理算法,他就是一处理数据的算法,目的是获取更为准确的数据。接下来,我要开始超级硬核的推导,推导非常详细,而且容易立即额,希望你们可以和我一起推导
相信大家都了解过状态方程与观测器吧,现代控制理论比较基础的内容,我举一个简单的例子,就是控制中最常见的弹簧阻尼系统,如图1
弹簧阻尼系统该系统的力平衡方程可以用以下式子表示(不明白的可以去https://wenku.baidu.com/view/f800e6e1ddccda38376bafa0.html看看,有详细推导过程) m k y ¨ + f k y ˙ + y = 1 k F \frac{m}{k}\ddot{y}+\frac{f}{k}\dot{y}+y=\frac{1}{k}F kmy¨+kfy˙+y=k1F
在状态方程中,我们一般习惯用x表示,做一个简单的变量替换,用x代替y,然后让两边同时乘以k,可以得到 m x ¨ + f x ˙ + k x = F = u m\ddot{x}+f\dot{x}+kx=F=u mx¨+fx˙+kx=F=u
在弹簧阻尼系统中,这个外力F实际就是我们的输入,可以将其表示为u。我们令 x 1 = x , x 2 = x ˙ x_{1}=x,x_{2}=\dot{x} x1=x,x2=x˙,所以上式我们可以改写为 { x 1 ˙ = x 2 x 2 ˙ = − k m x 1 − f m x 2 + 1 m u \left\{\begin{matrix} \dot{x_{1}}= x_{2}\\ \dot{x_{2}}= -\frac{k}{m}x_{1}-\frac{f}{m}x_{2}+\frac{1}{m}u \end{matrix}\right. {x1˙=x2x2˙=mkx1mfx2+m1u将其改写为矩阵形式 [ x 1 ˙ x 2 ˙ ] = [ 0 1 − k m − f m ] [ x 1 x 2 ] + [ 0 1 m ] u \begin{bmatrix} \dot{x_{1}}\\ \dot{x_{2}} \end{bmatrix}=\begin{bmatrix} 0 &1 \\ -\frac{k}{m} & -\frac{f}{m} \end{bmatrix}\begin{bmatrix} x_{1}\\ x_{2} \end{bmatrix}+\begin{bmatrix} 0\\ \frac{1}{m} \end{bmatrix}u [x1˙x2˙]=[0mk1mf][x1x2]+[0m1]u假设我们有一位置观测器,用于观测 x 1 , x 2 x_{1},x_{2} x1,x2的值,我们观测值分别为 z 1 , z 2 z_{1},z_{2} z1,z2,用数学式表达如下 [ z 1 z 2 ] = [ 1 0 0 1 ] [ x 1 x 2 ] \begin{bmatrix} z_{1}\\ z_{2} \end{bmatrix}=\begin{bmatrix} 1 & 0\\ 0 & 1 \end{bmatrix}\begin{bmatrix} x_{1}\\ x_{2} \end{bmatrix} [z1z2]=[1001][x1x2]这两个式子就是我们的状态方程与观测方程,这是一个简单的例子,推广为一般形式,连续系统的表达式为 X = A X + B u X=AX+Bu X=AX+Bu Z = H X Z=HX Z=HX其离散形式 X k = A X k − 1 + B u k − 1 X_{k}=AX_{k-1}+Bu_{k-1} Xk=AXk1+Buk1 Z k = H X k Z_{k}=HX_{k} Zk=HXk由此来看,我们可以从状态方程算出系统状态,但是这是处于理想条件下的情况,往往现实中状态方程和观测方程不会这么理想,会有各种各样的干扰,那么系统的状态方程可以写成下面的形式 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 Z k = H X k + v k Z_{k}=HX_{k}+v_{k} Zk=HXk+vk其中 w k − 1 w_{k-1} wk1为过程噪声, v k v_{k} vk是测量噪声,它们是服从正态分布的而且是获取不了的,这时我们怎么得到更加接近真实值的 X k X_{k} Xk?
还记得上一篇文章我讲了一个用两个有误差的传感器获取更加准确的硬币直径的例子吗?我们现在的思路和那个例子一样,我们使用状态方程计算出来的值就可以看成传感器1测出来的值,用观测器得到的值就可以看为传感器2获得的值,按照那个例子的思路,我们开始推导
首先我们假设过程噪声w它是满足 P ( w ) ∼ ( 0 , Q ) P(w)\sim (0,Q) P(w)(0,Q)即w满足正态分布,其均值为0,协方差矩阵为Q(统计概率方面的知识),为什么用协方差而不是方差,这是因为我们过程噪声 w k w_{k} wk并不是标量,它是一个向量;同理,测量噪声同样满足正态分布,其数学表达式如下 P ( v ) ∼ ( 0 , R ) P(v)\sim (0,R) P(v)(0,R)在实际中,我们往往得不到w和v的值,于是我们采用状态方程已知的部分来计算Xk,其数学表达式如下: X k ^ − = A X k − 1 ^ + B u k − 1 {\color{Red} \hat{X_{k}}^{-}=A\hat{X_{k-1}}+Bu_{k-1}} Xk^=AXk1^+Buk1大家仔细观察一下,我这个式子出现了一些新的符号, X k ^ − \hat{X_{k}}^{-} Xk^这个符号我们一般将其称为第k次的先验估计, X k − 1 ^ \hat{X_{k-1}} Xk1^这个符号代表第k-1次的估计值。现在我来解释一下这两个参数的意义, X k ^ − \hat{X_{k}}^{-} Xk^是通过一个有误差的状态方程计算出来的值,后面我们会使用观测方程得到的值对这个值进行修正,即进行数据融合,因此我们称其为先验估计。 X k − 1 ^ \hat{X_{k-1}} Xk1^则是上一次我们估计的值,这个值是在第k-1次计算中最接近真实值的值,所以我们在第k次计算中使用,以减弱干扰。
同理,在不考虑噪声时,通过观测方程我们也可以得到一个 X k ^ \hat{X_{k}} Xk^,其数学表达式如下: X k m e a ^ = H − 1 Z k \hat{X_{k_{mea}}}=H^{-1}Z_{k} Xkmea^=H1Zk为了和先验估计 X k ^ − \hat{X_{k}}^{-} Xk^区别,我们用 X k m e a ^ \hat{X_{k_{mea}}} Xkmea^表示,叫做测量估计,mea代表measure(测量)。由上一篇数据融合的思想,我们第k次的估计值 X k ^ \hat{X_{k}} Xk^可以由先验估计和测量估计表示,表达式如下: 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}}^{-}) Xk^=Xk^+G(Xkmea^Xk^) X k ^ = X k ^ − + G ( H − 1 Z k − X k ^ − ) \hat{X_{k}}=\hat{X_{k}}^{-}+G(H^{-1}Z_{k}-\hat{X_{k}}^{-}) Xk^=Xk^+G(H1ZkXk^)式中,G是一个系数,当G=0, X k ^ = X k ^ − \hat{X_{k}}=\hat{X_{k}}^{-} Xk^=Xk^;当G=1时, X k ^ = X k m e a ^ = H − 1 Z k \hat{X_{k}}=\hat{X_{k_{mea}}}=H^{-1}Z_{k} Xk^=Xkmea^=H1Zk
做一个简单的数学变换,令 G = K k H G=K_{k}H G=KkH,则上式变换如下: X k ^ = X k ^ − + K k ( Z k − H X k ^ − ) , ( K k ∈ [ 0 , H − 1 ] ) {\color{Red} \hat{X_{k}}=\hat{X_{k}}^{-}+K_{k}(Z_{k}-H\hat{X_{k}}^{-})},(K_{k}\in [0,H^{-1}]) Xk^=Xk^+Kk(ZkHXk^),(Kk[0,H1])这个式子眼熟不?这个公式就和上篇文章数据融合的公式形式一致,按照数据融合的思想,我们现在就要找到一个参数 K k K_{k} Kk使得我们的估计值 X k ^ \hat{X_{k}} Xk^最接近真实值 X k X_{k} Xk,接下来要开始推导了,建议拿起笔一起计算,过程不难的。
首先定义 e k = X k − X k ^ e_{k}=X_{k}-\hat{X_{k}} ek=XkXk^,从状态方程和观测方程可知,真实值 X k X_{k} Xk与估计值 X k ^ \hat{X_{k}} Xk^只相差 w k w_{k} wk v k v_{k} vk的线性组合,而 w k w_{k} wk v k v_{k} vk都服从正态分布,因此 e k e_{k} ek也服从正态分布。现在假设 e k e_{k} ek服从正态分布 P ( e k ) ∼ ( 0 , P k ) P(e_{k})\sim (0,P_{k}) P(ek)(0,Pk) P k P_{k} Pk e k e_{k} ek的协方差矩阵,按照概率论的知识我们可以知道 P k = E ( e k ⋅ e k T ) P_{k}=E(e_{k}\cdot e_{k}^{T}) Pk=E(ekekT)E代表求数学期望, e k e_{k} ek是列向量,其数学期望为0,满足正态分布(关于协方差不太懂可以转到https://blog.csdn.net/deng17182901338/article/details/79912444)。为了使 X k ^ \hat{X_{k}} Xk^更加接近真实值 X k X_{k} Xk我们需要选择合适的 K k K_{k} Kk使 e k e_{k} ek的方差最小,即 P k P_{k} Pk的对角线之和最小,所以接下来化简 P k P_{k} Pk
P k = E ( e k ⋅ e k T ) = E [ ( X k − X k ^ ) ( X k − X k ^ ) T ] ( 1 ) \begin{aligned} P_{k}&=E(e_{k}\cdot e_{k}^{T})\\ &=E[(X_{k}-\hat{X_{k}})(X_{k}-\hat{X_{k}})^{T}](1) \end{aligned} Pk=E(ekekT)=E[(XkXk^)(XkXk^)T](1) 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}}^{-}) Xk^=Xk^+Kk(ZkHXk^)带入 ( X k − X k ^ ) (X_{k}-\hat{X_{k}}) (XkXk^),可得 X k − X k ^ = X k − X k ^ − − K k Z k + K k H X k ^ − ( 2 ) X_{k}-\hat{X_{k}}=X_{k}-\hat{X_{k}}^{-}-K_{k}Z_{k}+K_{k}H\hat{X_{k}}^{-}(2) XkXk^=XkXk^KkZk+KkHXk^2 Z k = H X k + v k Z_{k}=HX_{k}+v_{k} Zk=HXk+vk代入(2),得到 ( 2 ) = 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 − X k ^ − ) − K k v k = ( I − K k H ) ( X k − X k ^ − ) − K k v k ( 3 ) \begin{aligned} (2)&=X_{k}-\hat{X_{k}}^{-}-K_{k}HX_{k}-K_{k}v_{k}+K_{k}H\hat{X_{k}}^{-}\\ &=(X_{k}-\hat{X_{k}}^{-})-K_{k}H(X_{k}-\hat{X_{k}}^{-})-K_{k}v_{k}\\ &=(I-K_{k}H)(X_{k}-\hat{X_{k}}^{-})-K_{k}v_{k}(3) \end{aligned} (2)=XkXk^KkHXkKkvk+KkHXk^=(XkXk^)KkH(XkXk^)Kkvk=(IKkH)(XkXk^)Kkvk3仿照 e k e_{k} ek的定义,我们定义 e k − = X k − X k − ^ e_{k}^{-}=X_{k}-\hat{X_{k}^{-}} ek=XkXk^将(3)式和(4)式代入(1),并化简 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_{k}H)e_{k}^{-}-K_{k}v_{k})((I-K_{k}H)e_{k}^{-}-K_{k}v_{k})^{T}] Pk=E[((IKkH)ekKkvk)((IKkH)ekKkvk)T]因为 ( A B ) T = B T A T (AB)^{T}=B^{T}A^{T} (AB)T=BTAT; ( A + B ) T = A T + B T (A+B)^{T}=A^{T}+B^{T} (A+B)T=AT+BT,所以 P k = 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 ] = 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 ] \begin{aligned} P_{k}&=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}]\\ &=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}] \end{aligned} Pk=E[(IKkH)ek(ek)T(IKkH)T(IKkH)ekvkTKkTKkvk(ek)T(IKkH)T+KkvkvkTKkT]=E[(IKkH)ek(ek)T(IKkH)T]E[(IKkH)ekvkTKkT]E[Kkvk(ek)T(IKkH)T]+E[KkvkvkTKkT]因为 ( I − K k H ) (I-K_{k}H) (IKkH) K k K_{k} Kk都是常数,所以
E [ ( I − K k H ) e k − ( e k − ) T ( I − K k H ) T ] = ( I − K k H ) E [ e k − ( e k − ) T ] ( I − K k H ) T E[(I-K_{k}H)e_{k}^{-}(e_{k}^{-})^{T}(I-K_{k}H)^{T}]=(I-K_{k}H)E[e_{k}^{-}(e_{k}^{-})^{T}](I-K_{k}H)^{T} E[(IKkH)ek(ek)T(IKkH)T]=(IKkH)E[ek(ek)T](IKkH)T
E [ ( I − K k H ) e k − v k T K k T ] = ( I − K k H ) E [ e k − v k T ] K k T E[(I-K_{k}H)e_{k}^{-}v_{k}^{T}K_{k}^{T}]=(I-K_{k}H)E[e_{k}^{-}v_{k}^{T}]K_{k}^{T} E[(IKkH)ekvkTKkT]=(IKkH)E[ekvkT]KkT
E [ K k v k ( e k − ) T ( I − K k H ) T ] = K k E [ v k ( e k − ) T ] ( I − K k H ) T E[K_{k}v_{k}(e_{k}^{-})^{T}(I-K_{k}H)^{T}]=K_{k}E[v_{k}(e_{k}^{-})^{T}](I-K_{k}H)^{T} E[Kkvk(ek)T(IKkH)T]=KkE[vk(ek)T](IKkH)T
E [ K k v k v k T K k T ] = K k E [ v k v k T ] K k T E[K_{k}v_{k}v_{k}^{T}K_{k}^{T}]=K_{k}E[v_{k}v_{k}^{T}]K_{k}^{T} E[KkvkvkTKkT]=KkE[vkvkT]KkT
由概率论知识可知,当A与B相互独立,E(AB)=E(A)E(B),所以 E [ v k ( e k − ) T ] = E [ v k ] E [ ( e k − ) T ] E[v_{k}(e_{k}^{-})^{T}]=E[v_{k}]E[(e_{k}^{-})^{T}] E[vk(ek)T]=E[vk]E[(ek)T];因为 e k − = X k − X k − ^ e_{k}^{-}=X_{k}-\hat{X_{k}^{-}} ek=XkXk^,而 v k v_{k} vk是测量噪声,两者之间相互独立,又因为 v k v_{k} vk满足正态分布,所以 E [ v k ( e k − ) T ] = E [ v k ] E [ ( e k − ) T ] = 0 E[v_{k}(e_{k}^{-})^{T}]=E[v_{k}]E[(e_{k}^{-})^{T}]=0 E[vk(ek)T]=E[vk]E[(ek)T]=0,因此,我们可以得到以下式子:
P k = ( I − K k H ) E [ e k − ( e k − ) T ] ( I − K k H ) T + K k E [ v k v k T ] K k T P_{k}=(I-K_{k}H)E[e_{k}^{-}(e_{k}^{-})^{T}](I-K_{k}H)^{T}+K_{k}E[v_{k}v_{k}^{T}]K_{k}^{T} Pk=(IKkH)E[ek(ek)T](IKkH)T+KkE[vkvkT]KkT
仔细观察这个式子,出现了 E [ e k − ( e k − ) T ] E[e_{k}^{-}(e_{k}^{-})^{T}] E[ek(ek)T],参考前面 e k e_{k} ek的协方差矩阵的计算公式 P k = E ( e k ⋅ e k T ) P_{k}=E(e_{k}\cdot e_{k}^{T}) Pk=E(ekekT),我们可以将 E [ e k − ( e k − ) T ] E[e_{k}^{-}(e_{k}^{-})^{T}] E[ek(ek)T]定义为 P k − P_{k}^{-} Pk,即先验误差的协方差矩阵,即 P k − = E [ e k − ( e k − ) T ] P_{k}^{-}=E[e_{k}^{-}(e_{k}^{-})^{T}] Pk=E[ek(ek)T]又因为测量噪声 v k v_{k} vk满足 P ( v ) ∼ ( 0 , R ) P(v)\sim (0,R) P(v)(0,R),所以 R = E [ v k v k T ] R=E[v_{k}v_{k}^{T}] R=E[vkvkT]
此时 P k P_{k} Pk的表达式为
P k = ( I − K k H ) P k − ( I − K k H ) T + K k E [ v k v k T ] K k T = ( P k − − K k H P k − ) ( I − K k H ) T + K k R K k T = P k − − K k H P k − − P k − H T K k T + K k H P k − H T K k T + K k R K k T = P k − − K k H P k − − ( K k H P k − ) T + K k H P k − H T K k T + K k R K k T \begin{aligned} P_{k}&=(I-K_{k}H)P_{k}^{-}(I-K_{k}H)^{T}+K_{k}E[v_{k}v_{k}^{T}]K_{k}^{T}\\ &=(P_{k}^{-}-K_{k}HP_{k}^{-})(I-K_{k}H)^{T}+K_{k}RK_{k}^{T}\\ &=P_{k}^{-}-K_{k}HP_{k}^{-}-P_{k}^{-}H^{T}K_{k}^{T}+K_{k}HP_{k}^{-}H^{T}K_{k}^{T}+K_{k}RK_{k}^{T}\\ &=P_{k}^{-}-K_{k}HP_{k}^{-}-(K_{k}HP_{k}^{-})^{T}+K_{k}HP_{k}^{-}H^{T}K_{k}^{T}+K_{k}RK_{k}^{T} \end{aligned} Pk=(IKkH)Pk(IKkH)T+KkE[vkvkT]KkT=(PkKkHPk)(IKkH)T+KkRKkT=PkKkHPkPkHTKkT+KkHPkHTKkT+KkRKkT=PkKkHPk(KkHPk)T+KkHPkHTKkT+KkRKkT此时 P k P_{k} Pk化简完毕,对 P k P_{k} Pk矩阵取迹,即 P k P_{k} Pk对角线元素之和,对 P k P_{k} Pk矩阵取迹写作 t r ( P k ) tr(P_{k}) tr(Pk)所以 t r ( P k ) = t r ( P k − ) − t r ( K k H P k − ) − t r ( ( K k H P k − ) T ) + t r ( K k H P k − H T K k T ) + t r ( K k R K k T ) = t r ( P k − ) − 2 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 ) \begin{aligned} tr(P_{k})&=tr(P_{k}^{-})-tr(K_{k}HP_{k}^{-})-tr((K_{k}HP_{k}^{-})^{T})+tr(K_{k}HP_{k}^{-}H^{T}K_{k}^{T})+tr(K_{k}RK_{k}^{T})\\ &=tr(P_{k}^{-})-2tr(K_{k}HP_{k}^{-})+tr(K_{k}HP_{k}^{-}H^{T}K_{k}^{T})+tr(K_{k}RK_{k}^{T}) \end{aligned} tr(Pk)=tr(Pk)tr(KkHPk)tr((KkHPk)T)+tr(KkHPkHTKkT)+tr(KkRKkT)=tr(Pk)2tr(KkHPk)+tr(KkHPkHTKkT)+tr(KkRKkT)矩阵转置并不会改变主对角线上元素,所以 t r ( K k H P k − ) = t r ( ( K k H P k − ) T ) tr(K_{k}HP_{k}^{-})=tr((K_{k}HP_{k}^{-})^{T}) tr(KkHPk)=tr((KkHPk)T)
为了求取参数 K k K_{k} Kk的值,我们令 d t r ( P k ) d K k = 0 \frac{dtr(P_{k})}{dK_{k}}=0 dKkdtr(Pk)=0
补充两个数学公式 d t r ( A B ) d A = B T \frac{dtr(AB)}{dA}=B^{T} dAdtr(AB)=BT d t r ( A B A T ) d A = 2 A B \frac{dtr(ABA^{T})}{dA}=2AB dAdtr(ABAT)=2AB
将这两个公式运用于 t r ( P k ) tr(P_{k}) tr(Pk) K k K_{k} Kk求导,推导过程如下: d t r ( P k ) d K k = 0 − 2 ( H P k − ) T + 2 K k H P k − H T + 2 K k R = 0 \frac{dtr(P_{k})}{dK_{k}}=0-2(HP_{k}^{-})^T+2K_{k}HP_{k}^{-}H^{T}+2K_{k}R=0 dKkdtr(Pk)=02(HPk)T+2KkHPkHT+2KkR=0
− ( P k − ) T H T + K k H P k − H T + K k R = 0 -(P_{k}^{-})^TH^{T}+K_{k}HP_{k}^{-}H^{T}+K_{k}R=0 (Pk)THT+KkHPkHT+KkR=0又因为 P k − P_{k}^{-} Pk是协方差矩阵,所以 ( P k − ) T = P k − (P_{k}^{-})^T=P_{k}^{-} (Pk)T=Pk,即 − P k − H T + K k H P k − H T + K k R = 0 -P_{k}^{-}H^{T}+K_{k}HP_{k}^{-}H^{T}+K_{k}R=0 PkHT+KkHPkHT+KkR=0
K k H P k − H T + K k R = P k − H T K_{k}HP_{k}^{-}H^{T}+K_{k}R=P_{k}^{-}H^{T} KkHPkHT+KkR=PkHT
K k ( H P k − H T + R ) = P k − H T K_{k}(HP_{k}^{-}H^{T}+R)=P_{k}^{-}H^{T} Kk(HPkHT+R)=PkHT
K k = P k − H T H P k − H T + R {\color{Red} K_{k}=\frac{P_{k}^{-}H^{T}}{HP_{k}^{-}H^{T}+R}} Kk=HPkHT+RPkHT K k K_{k} Kk的值推导完毕,结合后验估计公式 X k ^ = X k ^ − + K k ( Z k − H X k ^ − ) {\color{Red} \hat{X_{k}}=\hat{X_{k}}^{-}+K_{k}(Z_{k}-H\hat{X_{k}}^{-})} Xk^=Xk^+Kk(ZkHXk^)来分析一下式子
(1)、当R大时,代表测量噪声大, K k K_{k} Kk小,表示我们更愿意使用先验估计,即计算值
(2)、当R小时,代表测量噪声小, K k K_{k} Kk大,表示我们更愿意相信测量值
其实这篇文章标红的公式便是卡尔曼滤波的五大公式,在本文中我们完成了最困难的3个公式的推导,下一篇将完成卡尔曼滤波的五大公式推导

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值