二维卡尔曼滤波位置,速度融合

二维卡尔曼滤波位置速度融合

内容简介

  1. 小车速度位置建模
  2. 基本卡尔曼滤波
  3. 最优加权数据融合

小车的位置,速度建模

x t = [ 1 Δ t 0 1 ] x x − 1 + [ 1 2 Δ t 2 Δ t ] a t − 1 x_t=\begin{bmatrix} 1 & \Delta t \\ 0 & 1\\ \end{bmatrix}\quad x_{x-1}+ \begin{bmatrix} \frac{1}{2} \Delta t^2 \\ \Delta t\\ \end{bmatrix}\quad a_{t-1} xt=[10Δt1]xx1+[21Δt2Δt]at1
这个公式就是根据速度公式来的,是非常简单的速度,加速度公式。 其中 x t x_t xt 是位置和速度的矩阵。 x t = [ p v ] x_t = \begin{bmatrix} p \\ v \end{bmatrix} xt=[pv]。其中速度和位置可以根据传感器来获得,速度可以利用车轮的速度传感器,可以对加速度计的测量尽量积分也可以获得。 位置就可以用GPS来获得。而在本文中,我们假定小车是只走直线忽略GPS的横向噪声,来评价卡尔曼滤波的效果。而在加速度计中也忽略x轴,z轴的加速度只考虑y轴的加速度,然后再对其进行积分。 公式中的加速度 a t − 1 a_{t-1} at1这里面加速度也可以看成是输入,也就是理解为人踩加速度踏板。

现在我们对这个状态进行观测,但是我们的模型也是会有误差的,对此我们加一个过程噪声,所以这个公式就变成了;
x k = F k x k − 1 + B k u k + w k {\textbf {x}}_{{k}}={\textbf {F}}_{{k}}{\textbf {x}}_{{k-1}}+{\textbf {B}}_{{k}}{\textbf {u}}_{{k}}+{\textbf {w}}_{{k}} xk=Fkxk1+Bkuk+wk
对应原公式, w k w_k wk就是过程噪声,并假定其符合均值为零,协方差矩阵为 Q k Q_k Qk的多元正态分布。
然后,我们对这个小车的状态进行观测。观测方程为;
z k = H k x k + v k {\textbf {z}}_{{k}}={\textbf {H}}_{{k}}{\textbf {x}}_{{k}}+{\textbf {v}}_{{k}} zk=Hkxk+vk
对于 H k H_k Hk我的理解就是,你测量到的状态的线性变化方程。比如假定你只能测量到位置,那就是 [ 0 1 ] \begin{bmatrix} 0&1\end{bmatrix} [01]如果能观测到速度,那就是 [ 1 0 ] \begin{bmatrix} 1&0\end{bmatrix} [10].发散一下,如果两个都能观测到就是一种多传感器的融合。如果你测量到的是超声波声音的返回时间,只要计算成对应的状态即可。 v k v_k vk是观测噪声,其均值为零,协方差矩阵为 R k R_k Rk,且服从正态分布。

Kalman Filter卡尔曼滤波

这部分相关的资料太多了,这里就不再赘述了,直接附上维基百科的内容。
卡尔曼滤波是一种递归的估计,即只要获知上一时刻状态的估计值以及当前状态的观测值就可以计算出当前状态的估计值,因此不需要记录观测或者估计的历史信息。卡尔曼滤波器与大多数滤波器不同之處,在於它是一种纯粹的时域滤波器,它不需要像低通滤波器等频域滤波器那样,需要在频域设计再转换到时域实现。

卡尔曼滤波器的状态由以下两个变量表示:

x ^ k ∣ k x ^ k ∣ k {\displaystyle {\hat {\textbf {x}}}_{k|k}} {\hat {{\textbf {x}}}}_{{k|k}} x^kkx^kk,在时刻k的状态的估计;
P k ∣ k P k ∣ k {\displaystyle {\textbf {P}}_{k|k}} {\textbf {P}}_{{k|k}} PkkPkk,后验估计误差协方差矩阵,度量估计值的精确程度。
卡尔曼滤波器的操作包括两个阶段:预测与更新。在预测阶段,滤波器使用上一状态的估计,做出对当前状态的估计。在更新阶段,滤波器利用对当前状态的观测值优化在预测阶段获得的预测值,以获得一个更精确的新估计值。

预测
x ^ k ∣ k − 1 = F k x ^ k − 1 ∣ k − 1 + B k u k x ^ k ∣ k − 1 = F k x ^ k − 1 ∣ k − 1 + B k u k {\displaystyle {\hat {\textbf {x}}}_{k|k-1}={\textbf {F}}_{k}{\hat {\textbf {x}}}_{k-1|k-1}+{\textbf {B}}_{k}{\textbf {u}}_{k}} {\hat {{\textbf {x}}}}_{{k|k-1}}={\textbf {F}}_{{k}}{\hat {{\textbf {x}}}}_{{k-1|k-1}}+{\textbf {B}}_{{k}}{\textbf {u}}_{{k}} x^kk1=Fkx^k1k1+Bkukx^kk1=Fkx^k1k1+Bkuk预测状态方程
P k ∣ k − 1 = F k P k − 1 ∣ k − 1 F k T + Q k P k ∣ k − 1 = F k P k − 1 ∣ k − 1 F k T + Q k {\displaystyle {\textbf {P}}_{k|k-1}={\textbf {F}}_{k}{\textbf {P}}_{k-1|k-1}{\textbf {F}}_{k}^{T}+{\textbf {Q}}_{k}} {\textbf {P}}_{{k|k-1}}={\textbf {F}}_{{k}}{\textbf {P}}_{{k-1|k-1}}{\textbf {F}}_{{k}}^{{T}}+{\textbf {Q}}_{{k}} Pkk1=FkPk1k1FkT+QkPkk1=FkPk1k1FkT+Qk预测估计协方差矩阵
Ref:
https://zh.wikipedia.org/wiki/%E5%8D%A1%E5%B0%94%E6%9B%BC%E6%BB%A4%E6%B3%A2

最优加权数据融合

个人认为这个是数据融合中最简单的一种了,这个就相当于两个传感器占比多少,不同于简单的占比多少,这个具体到某一时刻的占比为多少 w i w_i wi。该系数对上一个时刻有一个评价并且会影响下一个时刻的占比系数。用数学公式来表达是这样的;
假设有 N N N个传感器,
x ^ k = ∑ i = 1 n w i x i k \widehat{x}_k=\sum_{i=1}^n w_i x_{ik} x k=i=1nwixik
为了保证是无偏估计, E [ x ^ k ] = x k E[\widehat{x}_k]=x_k E[x k]=xk 也就是说 w 1 + w 2 + . . . + w n = 1 w_1+w_2+...+w_n=1 w1+w2+...+wn=1, 我们假设 ϵ i \epsilon_i ϵi是第i个传感器的误差,这个误差假定为高斯白噪声 ϵ i ∈ N ( 0 , σ i 2 ) \epsilon_i \in N(0,\sigma^2_i) ϵiN(0,σi2) 各个传感器之间噪声相互独立。 σ i 2 \sigma^2_i σi2为传感器观测噪声的方差。最优的占比系数就为该传感器噪声比上总噪声,即;
w i ′ = 1 σ i 2 ∑ j = 1 n 1 σ j 2 w_i' = \frac{1}{\sigma_i^{2} \sum_{j=1}^{n} \frac{1}{\sigma_j^2}} wi=σi2j=1nσj211

实验仿真

该图由假定的观测到的位置求导得到速度与真实值的误差
该图由假定的观测到的位置求导得到速度与真实值的误差

在这里插入图片描述
该图是GNSS数据求导得到的速度曲线
在这里插入图片描述
该图是加速度计得到的误差
在这里插入图片描述
该图是加速度计的加速度测量曲线

实验初始设定为

在50个采样时间后有一个2米每秒方的加速度持续50个采样时间,这个加速度相当于给速度一个扰动。初始速度为20m/s。所以
v = { 20 , 0 &lt; t ≤ 5 2 t , 5 &lt; t ≤ 10 30 , t &gt; 10 v=\begin{cases} 20,\quad 0&lt;t \leq 5\\ 2t, \quad 5&lt;t \leq 10\\ 30,\quad t&gt; 10 \end{cases} v=20,0<t52t,5<t1030,t>10
融合后数据为;
在这里插入图片描述
这里的融合是加速度融合,利用位置的二次求导得到加速度和加速度计的数据进行融合。

Matlab Code

clear all ;
close all
clc
data = xlsread( ‘MI10_ACC_XY.xlsx’);
a_y = data(:,2) - 0.62;
N = length(a_y);
T = 0.01;
v_y = zeros(N,1);
v_y(:,1) = 0;
for i = 2 : N;
v_y(i,:) = v_y(i-1,:)+a_y(i-1,:)0.01;
end
H = [0 1];
F = [1 T;0 1];
B = [T^2/2 ; T];
x = zeros(2,N);
x(:,1) = [0;0];
xp = zeros(2,N);
xp(:,1) = [0.1;0.1];
v = randn(N,1);
z = v_y + 0.1
v;
w = randn(1,N);
P=[1.2 0.9;0.8 1.3];
Q=cov(w);
R=cov(v);
for j=2:N;
xp(:,j) = Fx(:,j-1) + [(T^2/2)a_y(j-1);Ta_y(j-1)] + [0;0.01w(:,j)];

Pp(:,:,j)=F.*P(:,:,j-1).*F'+[0 0;0 0.01*Q];

K=(Pp(:,:,j)*H')/(H*Pp(:,:,j)*H'+R);

x(:,j)=xp(:,j)+K*(z(j)-H*xp(:,j));

P(:,:,j)=(eye(2)-K*H)*Pp(:,:,j);

end

三传感器融合代码示例;
w1=var(longitude_fil-y);
w2=var(longitude2_fil-j);
w3=var(longitude3_fil-f);
disp(‘w1=’);disp(w1);
disp(‘w2=’);disp(w2);
disp(‘w3=’);disp(w3);
result=(w3/(w1+w2+w3))*longitude_fil+(w1/(w1+w2+w3))*longitude2_fil+(w2/(w1+w2+w3))*longitude3_fil;

谢谢观看!

  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值