让GNSSRTK不再难【第二天-第6部分】

2024-06-11 09:28

本文主要是介绍让GNSSRTK不再难【第二天-第6部分】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第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 代表位置、速度、加速度在时间 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

解释:

  • 矩阵中的 t t tt tt 表示时间间隔。
  • 矩阵的第一行和第二行包含 t t tt tt 0.5 t t 2 0.5tt^2 0.5tt2,表示加速度对位置的影响。
  • 矩阵的第三行到第六行包含 t t tt tt,表示速度对位置的影响。
  • 矩阵的第七行到第九行为对角线上的1,表示加速度保持不变。

另一个需要注意,我们只需要在加速度上加入过程噪声,即放大预测值的方差信息。因为从状态转移矩阵中,我们就可以知道,加速度的精度信息会传递到速度和位置。
当然,你也可以修改任何状态量的方差信息,只要你认为该状态的精度符合你修改要求。不要去修改协方差信息,尤其是对于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,并且位置和速度之间没有初始的相关性。

这篇关于让GNSSRTK不再难【第二天-第6部分】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050780

相关文章

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品,常闻有言称存在无需考量负债与查询记录之奇品,此等说法十有八九为中介诱人上钩之辞。轻信之下,恐将步入连环陷阱。除非个人资质出类拔萃,如就职于国央企或事业单位,工龄逾年,五险一金完备,还款能力卓越,或能偶遇线下产品对查询记录稍显宽容,然亦非全然无视。宣称全然不顾者,纯属无稽之谈。 银行非慈善机构,不轻易于困境中援手,更偏爱锦上添花之举。若无坚实资质,即便求助于银行亦难获青睐。反

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

项目实战系列三: 家居购项目 第四部分

购物车 🌳购物车🍆显示购物车🍆更改商品数量🍆清空购物车&&删除商品 🌳生成订单 🌳购物车 需求分析 1.会员登陆后, 可以添加家居到购物车 2.完成购物车的设计和实现 3.每添加一个家居,购物车的数量+1, 并显示 程序框架图 1.新建src/com/zzw/furns/entity/CartItem.java, CartItem-家居项模型 /***

码蹄集部分题目(2024OJ赛9.4-9.8;线段树+树状数组)

1🐋🐋配对最小值(王者;树状数组) 时间限制:1秒 占用内存:64M 🐟题目思路 MT3065 配对最小值_哔哩哔哩_bilibili 🐟代码 #include<bits/stdc++.h> using namespace std;const int N=1e5+7;int a[N],b[N],c[N],n,q;struct QUERY{int l,r,id;}que

关于断言的部分用法

1、带变量的断言  systemVerilog assertion 中variable delay的使用,##[variable],带变量的延时(可变延时)_assertion中的延时-CSDN博客 2、until 的使用 systemVerilog assertion 中until的使用_verilog until-CSDN博客 3、throughout的使用   常用于断言和假设中的

牛客小白月赛100部分题解

比赛地址:牛客小白月赛100_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A.ACM中的A题 #include<bits/stdc++.h>using namespace std;#define ll long long#define ull = unsigned long longvoid solve() {ll a,b,c;cin>>a>>b>

VB和51单片机串口通信讲解(只针对VB部分)

标记:该篇文章全部搬自如下网址:http://www.crystalradio.cn/thread-321839-1-1.html,谢谢啦            里面关于中文接收的部分,大家可以好好学习下,题主也在研究中................... Commport;设置或返回串口号。 SettingS:以字符串的形式设置或返回串口通信参数。 Portopen:设置或返回串口