【多源融合】自适应卡尔曼滤波的多种形式:遗忘卡尔曼滤波、渐消记忆卡尔曼滤波和自适应卡尔曼滤波

自适应卡尔曼滤波的多种形式

在卡尔曼滤波量测更新过程中,按照平差中的数学模型分为函数模型和随机模型,那么动力学方法和观测方程均为函数模型,P和R矩阵的确定则为随机模型的建立。

对于P矩阵来说,其核心思想在于重用当前时刻观测值。在融合初始化过程中,我们会对P矩阵进行初始化,之后随状态更新和量测更新而更新,一旦预测状态或者观测值突然出现问题,经验随机模型无法描述这种误差。

因此,研究者们提出了自适应滤波,使得滤波更相信当前时刻的观测(这也是合理的,对于观测是否合理则采用抗差滤波的方式),进而补偿P这部分随机模型误差。随之,遗忘滤波、渐消记忆滤波和自适应滤波逐渐发展,但是这些滤波容易混淆。本文将对四种形式的自适应滤波进行系统的总结,按照自适应因子的构建分为遗忘滤波、渐消记忆滤波、自适应滤波、sage-husa自适应滤波。前三种都需要构建自适应因子(遗忘因子、渐消记忆因子和自适应因子),最后一种则采用开窗平均的方法代替自适应因子的构建。

注意:其实遗忘因子是渐消记忆因子的另一种叫法,但是本文根据不同模型将遗忘因子和渐消记忆因子进行了区分,可以看成把简单问题复杂化了吧,而且遗忘因子/渐消记忆因子的求解也不止这两种方法。

经典卡尔曼滤波

遗忘滤波

渐消记忆滤波

自适应滤波

Sage-Husa自适应滤波

1 经典卡尔曼滤波

推导过程不再细述,直接上公式

系统动力学方程和观测方程(平差中的函数模型):
x k = A k x ^ k − 1 + w k (1) x_k=A_k\hat x_{k-1}+w_k\tag{1} xk=Akx^k1+wk(1)
z k = H k x k + v k (2) z_k=H_kx_k+v_k\tag{2} zk=Hkxk+vk(2)

状态更新方程:
x k = A k x ^ k − 1 (3) x_k=A_k\hat x_{k-1}\tag{3} xk=Akx^k1(3)
P k = A k P ^ k − 1 A k T + Q k (4) P_k=A_k\hat P_{k-1}A_k^T+Q_k\tag{4} Pk=AkP^k1AkT+Qk(4)

量测更新方程:
K k = P k H k T ( H k P k H k T + R k ) − 1 (5) K_k=P_kH_k^T(H_kP_kH_k^T+R_k)^{-1}\tag{5} Kk=PkHkT(HkPkHkT+Rk)1(5)
x ^ k = x k + K k ( Z k − H k x k ) (6) \hat x_k=x_k+K_k(Z_k-H_kx_k)\tag{6} x^k=xk+Kk(ZkHkxk)(6)
P ^ k = ( I − K k H k ) P k (7) \hat P_k=(I-K_kH_k)P_k\tag{7} P^k=(IKkHk)Pk(7)

式中, Q k Q_k Qk R k R_k Rk分别是 w k w_k wk v k v_k vk的协方差矩阵,两种噪声互不相关。在每个历元进行状态更新,每个观测历元进行量测更新,形成时间上的迭代估计最优状态。

2 遗忘滤波

遗忘滤波相比经典卡尔曼滤波多了遗忘因子,记为 λ \lambda λ,改进公式(4)为公式(8)
P k = A k 1 λ P ^ k − 1 A k T + Q k (8) P_k=A_k\frac{1}{\lambda}\hat P_{k-1}A_k^T+Q_k\tag{8} Pk=Akλ1P^k1AkT+Qk(8)
其中遗忘因子 λ \lambda λ为一常数,取值0.95-0.995。

遗忘因子通过修改先验协方差矩阵 P k P_k Pk,调节当前历元中预测和量测之间的权比关系。遗忘因子设置越大,则前一历元先验协方差矩阵 P k − 1 P_{k-1} Pk1越接近传统卡尔曼滤波后验协方差矩阵 P ^ k − 1 \hat P_{k-1} P^k1,预测和量测之间权比关系越接近没有改变,特殊情况 λ = 1 \lambda=1 λ=1;反之,遗忘因子设置的越小,那么当前历元先验协方差矩阵 P k P_{k} Pk就会越大,使得卡尔曼滤波增益矩阵 K k + 1 K_{k+1} Kk+1越大,越相信下当前时刻的量测。也就是说,新数据(观测值)的权重要大于历史数据(预测值)。
总结一下,遗忘因子的作用在于通过调节协方差矩阵,权衡预测状态和观测值的权重,遗忘因子一般大于1。

但是,遗忘因子存在一定的缺陷,因为采用的是常值遗忘因子,无法适应环境变化;其次,人为降低历史状态信息,在预测准确而量测不准确的情况下,得到效果不好。因此,有学者对探究对遗忘因子常值取指数的方法, ( 1 λ ) N − k {(\frac{1}{\lambda})}^{N-k} (λ1)Nk,N是一个参考时刻,要大于k,k为当前历元数目,通过指数遗忘因子可以看出,距离N越远,则遗忘因子越大,预测越不可靠,但是理论推导也不是很严谨,也存在预测准确量测不准确时面临的问题。

3 渐消记忆滤波

渐消记忆滤波构造了渐消记忆因子,渐消记忆因子其实是遗忘因子的另一种叫法,渐消记忆因子也有很多求解方法,本质上也是对式(4)进行修改至式(9),这里记渐消记忆因子为 s s s s ≥ 1 s\ge1 s1
P k = A k s P ^ k − 1 A k T + Q k (9) P_k=A_ks\hat P_{k-1}A_k^T+Q_k\tag{9} Pk=AksP^k1AkT+Qk(9)

夏启军学者在90年发表于自动化学报中的论文《渐消卡尔曼滤波的最佳自适应算及其应用》一直延续到现在,最常用的还是他第二类算法,最佳遗忘因子的一步算法,本文将介绍该算法模型。

渐消记忆因子求解
s = m a x { 1 , 1 n t r ( N k M k − 1 ) } (10) s=max\{1,\frac{1}{n}tr(N_kM_k^{-1})\}\tag{10} s=max{1,n1tr(NkMk1)}(10)
其中tr()是矩阵求迹的符号, M k M_k Mk N k N_k Nk表达式为
M k = H k A k P ^ k − 1 A k T H k T (11) M_k=H_kA_k\hat P_{k-1}A_k^TH_k^T\tag{11} Mk=HkAkP^k1AkTHkT(11)
N k = P v k − H k Q k H k T − R k (12) N_k=P_{vk}-H_kQ_kH_k^T-R_k\tag{12} Nk=PvkHkQkHkTRk(12)
其中, P v k = E ( V k V k T ) P_{vk}=E(V_kV_k^T) Pvk=E(VkVkT) V k = A k x k − L k V_k=A_kx_k-L_k Vk=AkxkLk V k V_k Vk称为预测残差,一般通过开窗估计法确定 P v k P_{vk} Pvk
P ~ v k = 1 k ∑ i = 1 k V i V i T (13) \tilde{P}_{vk}=\frac{1}{k}\sum\limits_{i=1}^{k}V_iV_i^T\tag{13} P~vk=k1i=1kViViT(13)

通过对式(11)进行分析 M k = P k = E ( x k x k T ) = E ( H k A k x ^ k − 1 ( H k A k x ^ k − 1 ) T ) M_k=P_k=E(x_kx_k^T)=E(H_kA_k\hat x_{k-1}(H_kA_k\hat x_{k-1})^T) Mk=Pk=E(xkxkT)=E(HkAkx^k1(HkAkx^k1)T),同理,式(12)也代表先验状态 x k x_k xk的协方差矩阵不过相比于 M k M_k Mk N k N_k Nk中包含了量测更新结果,即 N k N_k Nk M k M_k Mk迹的比值为先验状态协方差矩阵在量测和预测时的比值。

式(9)的简便估计算法
s = m a x { 1 , t r ( N k ) t r ( M k ) } (14) s=max\{1,\frac{tr(N_k)}{tr(M_k)}\}\tag{14} s=max{1,tr(Mk)tr(Nk)}(14)

但是,式(12)中,由于开窗估计法难以解决环境突变问题,即观测突变,带来的随机模型误差,有的学者对此进行了改进
P ~ v k = { s k − 1 V k V k T 1 + s k − 1 k > 1 1 2 V 0 V 0 T k = 1 (15) \tilde{P}_{vk}=\left\{ \begin{array}{rcl} \frac{s_{k-1}V_kV_k^T}{1+s_{k-1}} & & {k>1} \\ \frac{1}{2}V_0V_0^T & & {k=1} \end{array} \right. \tag{15} P~vk={1+sk1sk1VkVkT21V0V0Tk>1k=1(15)
通过对比式(13)和(15)经过修改后的自适应因子对本历元的环境突变更加敏感。

渐消记忆因子也是对随机模型的误差进行补偿,经过修改后,下一历元的先验协方差矩阵大于等于当前时刻传统卡尔曼滤波后验状态协方差矩阵(对比),进而调整预测值和观测值间的权重关系。

注意:如果按照严恭敏老师《捷联惯导算法与组合导航原理》P163中的说法,单重渐消记忆因子卡尔曼滤波又被称为强跟踪卡尔曼滤波。
按照字面意思理解,强跟踪滤波跟踪的是目标的运动状态,假设运动状态匀速开始,突然变为加速,此时先验残差增加,自适应因子增加,导致先验P矩阵增加。(感谢师弟的例子)

4 自适应滤波

自适应滤波的目标是通过自适应因子调节先验P矩阵,平衡历史状态和观测值的权。严格来说,遗忘因子、渐消记忆因子都是自适应因子的一种。具有和式(8)式(9)一样的公式调节形式,这里我们定义自适应因子为 α \alpha α
P k = A k α P ^ k − 1 A k T + Q k (16) P_k=A_k\alpha\hat P_{k-1}A_k^T+Q_k\tag{16} Pk=AkαP^k1AkT+Qk(16)

4.1 误差判别统计量

对比遗忘因子和渐消记忆因子来说,自适应因子具有更直观的理论依据,主要通过构建误差判别统计量估计自适应因子,详细内容可见杨院士论文《自适应抗差滤波理论及应用的主要进展》,误差判别统计量有状态不符值统计量、速度不符值统计量、预测残差统计量和方差分量比统计量。

4.1.1 状态不符值统计量

利用状态参数估计向量 x ^ k \hat x_k x^k(滤波解)和预测状态向量 x k x_k xk构建统计量
x ^ k − x k = ( Δ x ^ 1 2 + Δ x ^ 2 2 + … + Δ x ^ k 2 ) 1 2 (17) \hat x_k-x_k=(\Delta \hat x_1^2+\Delta \hat x_2^2+\ldots+\Delta \hat x_k^2)^\frac{1}{2}\tag{17} x^kxk=(Δx^12+Δx^22++Δx^k2)21(17)
判别统计量
Δ x ^ k = x ^ k − x k t r ( P k ) (18) \Delta \hat x_k=\frac{\hat x_k-x_k}{\sqrt{tr(P_k)}}\tag{18} Δx^k=tr(Pk) x^kxk(18)
简单分析:(1)计算历元的观测数量要大于待估状态参数的数量;(2)观测量估计的状态参数向量 x ^ k \hat x_k x^k应尽可能精确,否则统计量 Δ x ^ k \Delta \hat x_k Δx^k不能反映动力学模型的误差;(3)统计量 Δ x ^ k \Delta \hat x_k Δx^k反映模型的整体误差,任何状态分量的扰动都将视为整体模型存在扰动。

4.1.2 速度不符值统计量

根据状态得到相邻历元 k k k k − 1 k-1 k1时间内速度估计为
x ^ k ˙ = x ^ k − x ^ k t k − t k − 1 (19) \dot {\hat x_k}=\frac{\hat x_k-\hat x_k}{t_k-t_{k-1}}\tag{19} x^k˙=tktk1x^kx^k(19)
相应的滤波速度与估计速度不符值函数为
Δ x ^ k ˙ = x ^ k ˙ − x k ˙ t r ( P k ) (20) \Delta \dot {\hat x_k}=\frac{\dot{\hat x_k}-\dot {x_k}}{\sqrt{tr(P_k)}}\tag{20} Δx^k˙=tr(Pk) x^k˙xk˙(20)
此时的 P k P_k Pk对应于 x ^ k ˙ \dot {\hat x_k} x^k˙的协方差矩阵。
简单分析:(1)如果 Δ x ^ k ˙ \Delta \dot {\hat x_k} Δx^k˙显著异常,则表明预测速度存在异常,或动力学模型存在较大误差;(2) Δ x ^ k ˙ \Delta \dot {\hat x_k} Δx^k˙的计算要求有多余观测信息。

4.1.3 预测残差统计量

Δ V k = ( V k T V k t r ( P v k ) ) 1 2 (21) \Delta V_k=(\frac{V_k^TV_k}{tr(P_{v_k})})^\frac{1}{2}\tag{21} ΔVk=(tr(Pvk)VkTVk)21(21)
简单分析:(1)不需要在滤波前计算状态向量参考值;(2)不需要观测量个数一定大于状态参数个数;(3)与统计量 Δ x ^ k \Delta \hat x_k Δx^k相比,可能含有更多的测量误差(不只是观测误差)。

4.1.4 方差分量比统计量

如果将 t k t_k tk时刻的观测值 L k L_k Lk和状态先验 x k x_k xk看成两组观测向量,则他们的方差分量应能反映其相应的观测精度和模型精度(量测与预测),于是可用方差分量比构造误差判别统计量。其中, L k L_k Lk x k x_k xk的Helmert方差分量估计公式为
σ ^ v k 2 = V k T P k V k r k (21) \hat \sigma_{v_k}^2=\frac{V_k^TP_kV_k}{r_k}\tag{21} σ^vk2=rkVkTPkVk(21)
σ ^ x k 2 = V x k T P x k V x k r x (22) \hat \sigma_{x_k}^2=\frac{V_{x_k}^TP_{x_k}V_{x_k}}{r_x}\tag{22} σ^xk2=rxVxkTPxkVxk(22)
式(21)和(22)分别为观测值和先验值得方差分量, r k r_k rk r x r_x rx分别为观测值和先验值冗余数目, V k V_k Vk V x k V_{x_k} Vxk分别为k时刻观测值和先验值的残差向量。
V x k = x ^ k − x k (23) V_{x_k}=\hat x_k-x_k\tag{23} Vxk=x^kxk(23)
由方差分量比构造的模型误差统计量为
S k = σ ^ x k 2 σ ^ v k 2 ≈ V x k T P x k V x k r x σ ^ v k 2 (24) S_k=\frac{\hat \sigma_{x_k}^2}{\hat \sigma_{v_k}^2}\approx \frac{V_{x_k}^TP_{x_k}V_{x_k}}{r_x \hat \sigma_{v_k}^2}\tag{24} Sk=σ^vk2σ^xk2rxσ^vk2VxkTPxkVxk(24)
简单分析:(1) S k S_k Sk的计算需要冗余观测,否则统计量不能有效地反映模型误差;(2) V k V_k Vk V x k V_{x_k} Vxk对应相同的状态估计量 x ^ k \hat x_{k} x^k;(3)如果采用迭代计算 S k S_k Sk的计算量稍大于 Δ x ^ k \Delta \hat x_k Δx^k Δ V ^ k \Delta \hat V_{k} ΔV^k

4.2 自适应因子

自适应因子的构建以其分段数目分为了二段式和三段式,还有指数函数表示的自适应因子和选权法表示的自适应因子,主要使用形式为前两种。接下来,以统计量 Δ x k \Delta x_k Δxk为例进行说明。

4.2.1 三段式自适应因子

α k = { 1 Δ x k ≤ c 0 c 0 Δ x k ( c 1 − ∣ Δ x k ∣ c 1 − c 0 ) 2 k > 1 0 Δ x k > c 1 (25) {\alpha}_{k}=\left\{ \begin{array}{rcl} 1 & & {\Delta x_k \le c_0} \\ \frac{c_0}{\Delta x_k} (\frac{c_1- \lvert \Delta x_k \rvert}{c_1-c_0})^2 & & {k>1} \\ 0 & & {\Delta x_k > c_1} \end{array} \right. \tag{25} αk= 1Δxkc0(c1c0c1Δxk)20Δxkc0k>1Δxk>c1(25)
其中, c 0 c_0 c0 c 1 c_1 c1均为常值,取值范围 c 0 = 1.0 − 1.5 c_0=1.0-1.5 c0=1.01.5 c 1 = 3.0 − 8.0 c_1=3.0-8.0 c1=3.08.0

4.2.2 二段式自适应因子

α k = { 1 Δ x k ≤ c c Δ x k Δ x k > c (26) {\alpha}_{k}=\left\{ \begin{array}{rcl} 1 & & {\Delta x_k \le c} \\ \frac{c}{\Delta x_k} & & {\Delta x_k > c} \end{array} \right. \tag{26} αk={1ΔxkcΔxkcΔxk>c(26)
式中, c 1 c_1 c1为常数,取值范围 c 1 = 1.0 − 2.5 c_1=1.0-2.5 c1=1.02.5
相比于三段式自适应因子,二段式自适应因子永不为0,即历史状态信息影响最优状态估计结果,并且其减小趋势缓于三段式。

4.2.3 指数函数表示的自适应因子

α k = { 1 Δ x k ≤ c e − ( Δ x k − c ) 2 Δ x k > c (27) {\alpha}_{k}=\left\{ \begin{array}{rcl} 1 & & {\Delta x_k \le c} \\ e^{-(\Delta x_k-c)^2} & & {\Delta x_k > c} \end{array} \right. \tag{27} αk={1e(Δxkc)2ΔxkcΔxk>c(27)
其中,c也为常数,与4.2.2中结构类似。

4.2.4 选权法表示的自适应因子

α k = { 1 Δ x k ≤ c 0 Δ x k > c (26) {\alpha}_{k}=\left\{ \begin{array}{rcl} 1 & & {\Delta x_k \le c} \\ 0 & & {\Delta x_k > c} \end{array} \right. \tag{26} αk={10ΔxkcΔxk>c(26)

5 Sage-Husa自适应滤波

Sage-Husa滤波方法采用开窗法,即滑动窗口,确定当前历元观测向量协方差矩阵 R k R_k Rk和模型误差协方差矩阵 Q k Q_k Qk。相比于第4章中的自适应滤波,Sage滤波不需要已知各种方差等参数,但是需要提前确定窗口大小,窗口大小的选择影响到定位精度。窗口选择太大,遇到突变情况无法反映真实结果,窗口选择太小,又不足以刻画相应误差特征。

在开窗估计法之前先介绍一下残差向量和新息向量,即预测残差向量,分别为
V ^ k = z k − H k x ^ k (27) \hat V_k=z_k-H_k \hat x_k \tag{27} V^k=zkHkx^k(27)
V k = z k − H k x k (28) V_k=z_k-H_kx_k \tag{28} Vk=zkHkxk(28)
V ^ k \hat V_k V^k经过观测信息修正,包含动力学模型误差和量测误差, V k V_k Vk未经过观测值修正,称为新息,新息向量更能反应动态系统的扰动误差,二者之间的关系为
V ^ k = ( I − H k K k ) V k (29) \hat V_k=(I-H_kK_k) V_k \tag{29} V^k=(IHkKk)Vk(29)
V ^ k \hat V_k V^k V k V_k Vk的协方差矩阵分别为
P ^ V ^ k = R k − H k P ^ k H k T (30) \hat P_{\hat V_k}=R_k-H_k \hat P_kH_k^T \tag{30} P^V^k=RkHkP^kHkT(30)
P V k = R k + H k P k H k T (31) P_{V_k}=R_k+H_kP_kH_k^T \tag{31} PVk=Rk+HkPkHkT(31)
一开始,楼主通过式(27)和(28)利用协方差传播律去解释式(30)和(31),但是发现(31)符号有误。其实,二者函数式不一样。在新息向量中,新息由观测值和预测值组成,残差向量中,观测值由后验状态和残差组成,再按照协方差传播律去解释就行了。要搞清楚谁加谁,谁减谁。(不知道理解是否正确,欢迎指教)

5.1 观测噪声协方差矩阵的开窗估计

观测噪声协方差矩阵的开窗估计方法可以采用预测残差向量或观测残差向量进行估计,前者为先验状态估计的预测残差,后者为后验状态的验后残差。

第一种,预测残差向量开窗估计法。
P V k = 1 N ∑ j = 0 N V k − j V k − j T (32) P_{V_k}=\frac{1}{N} \sum_{j=0}^NV_{k-j}V_{k-j}^T \tag{32} PVk=N1j=0NVkjVkjT(32)
t k t_k tk时刻观测值协方差矩阵
R k = P V k − H k P k H k T (33) R_k=P_{V_k}-H_kP_kH_k^T \tag{33} Rk=PVkHkPkHkT(33)

第二种,观测残差向量开窗估计法
P V ^ k = 1 N ∑ j = 0 N V ^ k − j V ^ k − j T (34) P_{\hat V_k}=\frac{1}{N} \sum_{j=0}^N\hat V_{k-j}\hat V_{k-j}^T \tag{34} PV^k=N1j=0NV^kjV^kjT(34)
t k t_k tk时刻观测值协方差矩阵
R k = P V ^ k + H k P ^ k H k T (35) R_k=P_{\hat V_k}+H_k\hat P_kH_k^T \tag{35} Rk=PV^k+HkP^kHkT(35)
然而,由式(35)估计 R k R_k Rk时,需要先得到 P ^ k \hat P_k P^k,二者相悖,因此可以利用前 N N N个历元估计当前时刻的 R k R_k Rk,式(34)和(35)转化为(36)和(37)
P V ^ k = 1 N ∑ j = 1 N + 1 V ^ k − j V ^ k − j T (36) P_{\hat V_k}=\frac{1}{N} \sum_{j=1}^{N+1}\hat V_{k-j}\hat V_{k-j}^T \tag{36} PV^k=N1j=1N+1V^kjV^kjT(36)
R k = P V ^ k − 1 + H k − 1 P ^ k − 1 H k − 1 T (37) R_k=P_{\hat V_{k-1}}+H_{k-1}\hat P_{k-1}H_{k-1}^T \tag{37} Rk=PV^k1+Hk1P^k1Hk1T(37)

注意:(1)第一种方法内包含历史状态中的误差,若 x k x_k xk误差越大,则 V k V_k Vk误差越大,计算的 R k R_k Rk稳定性也就越差;
(2)第一种方法可能出现负定现象;
(3)两种方法都是对前N个历元观测信息进行了平均,要求当前时刻观测环境要与历史的N个观测环境一致,“这种自适应估计,很难真正实现‘自适应’”。
(4)两种方法都要求矩阵同类别、同分布、同维度。

5.2 动态模型噪声矩阵的开窗估计

令状态改正值 V x k = x ^ k − x k V_{x_k}=\hat x_k-x_k Vxk=x^kxk,容易得到
Q k = P V x k + P ^ k − A k P ^ k − 1 A k T (38) Q_k=P_{V_{x_k}}+\hat P_k-A_{k}\hat P_{k-1}A_{k}^T \tag{38} Qk=PVxk+P^kAkP^k1AkT(38)
V x k V_{x_k} Vxk协方差矩阵为(开窗估计)
P V x k = 1 N ∑ j = 0 N V x k V x k T (39) P_{V_{x_k}}=\frac{1}{N} \sum_{j=0}^{N}V_{x_k}V_{x_k}^T \tag{39} PVxk=N1j=0NVxkVxkT(39)
然而,该方法求 V x k V_{x_k} Vxk要先求 Q k Q_k Qk,为了避免这个问题,直接估计 Q k Q_k Qk
注意到 V x k V_{x_k} Vxk V k V_k Vk
V x k = − K k V k (40) V_{x_k}=-K_kV_k\tag{40} Vxk=KkVk(40)
进一步有
P V x k = K k P V k K k T (41) P_{V{x_k}}=K_kP_{V_k}K_k^T\tag{41} PVxk=KkPVkKkT(41)
在由5.1节估计出 P V k P_{V_k} PVk之后,在稳态情况下,可以直接用 P V x k P_{V_{x_k}} PVxk近似代替 Q k Q_k Qk

注意:利用自适应估计时,状态噪声协方差矩阵和观测噪声协方差矩阵应当一方减小一方增加,若二者同时增加或减小可能会导致滤波发散。

参考文献

1、卡尔曼滤波器的遗忘因子. https://blog.csdn.net/qwe900/article/details/105867521.
2、信息滤波、UD滤波、遗忘滤波和自适应滤波. https://blog.csdn.net/Ruins_LEE/article/details/116769786.
3、夏启军,孙优贤,周春晖.渐消卡尔曼滤波器的最佳自适应算法及其应用[J].自动化学报,1990(03):210-216.
4、杨元喜. 自适应动态导航定位(第二版)。(强烈推荐)
5、严恭敏.捷联惯导算法与组合导航原理。
6、杨元喜,任夏,许艳. 自适应抗差滤波理论及应用的主要进展。

  • 26
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
按键消抖是指在按下或松开按键时,由于机械性能、电气性能等原因,会产生一些抖动信号。这些抖动信号可能会被误认为是多次按下或松开按键,导致系统出现错误。因此,需要对按键信号进行消抖处理,以确保系统正常运行。 一般的按键消抖算法是基于滤波的,常见的滤波算法有移动平均滤波和中值滤波。其中,移动平均滤波是指对一段时间内的信号取平均值,以减小信号的波动;中值滤波是指对一段时间内的信号取中值,以排除信号中的异常值。 以下是一个基于移动平均滤波的按键消抖的例程: ``` #define KEY_PIN 2 // 定义按键所在引脚 #define KEY_THRESHOLD 3 // 定义按键触发的阈值 #define SAMPLE_NUM 10 // 定义采样次数 #define DELAY_TIME 5 // 定义采样间隔时间 void setup() { pinMode(KEY_PIN, INPUT_PULLUP); // 将按键所在引脚设置为输入模式,并开启上拉电阻 } void loop() { static int samples[SAMPLE_NUM] = {0}; // 定义采样数组 static int sampleIndex = 0; // 定义采样索引 int sum = 0; // 定义采样和 int average = 0; // 定义采样平均值 samples[sampleIndex] = digitalRead(KEY_PIN); // 读取按键状态,并存入采样数组 sampleIndex = (sampleIndex + 1) % SAMPLE_NUM; // 更新采样索引 for (int i = 0; i < SAMPLE_NUM; i++) { sum += samples[i]; // 计算采样和 } average = sum / SAMPLE_NUM; // 计算采样平均值 if (average < KEY_THRESHOLD) { // 判断按键是否被触发 // 执行按键触发后的操作 } delay(DELAY_TIME); // 等待采样间隔时间 } ``` 在上述例程中,首先定义了按键所在引脚、按键触发的阈值、采样次数和采样间隔时间等参数。然后在`setup()`函数中将按键所在引脚设置为输入模式,并开启上拉电阻。在`loop()`函数中,定义了一个静态的采样数组和采样索引,用于存储按键状态的采样值。读取按键状态后,将其存入采样数组中,并更新采样索引。然后计算采样和和采样平均值,判断按键是否被触发,并执行相应的操作。最后延时一定时间,等待下一次采样。这样就实现了对按键信号的消抖处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值