卡尔曼滤波器实例:跟踪自由落体运动:设计与Matlab实现

本文所用实例来自于以下书籍:

Fundamentals of Kalman Filtering: A Practical Approach, 3rd Edition.Paul Zarchan, Howard Musoff.

某物体位于距地面400000 ft的高空,初速度为6000 ft/s,重力加速度为32.2 ft/s2。地面雷达位于其正下方测量该物体高度,测量周期0.1s,维持30s。已知雷达测量结果的标准差为1000 ft。

嗯,原书例子所用单位就是ft。与国标折算比例为0.3048。

取地面雷达位置为坐标原点,往上为正向。物理方程如下:

$x=400000-6000t-\frac{1}{2}gt^2$

这是一个二阶多项式,其相应的状态转换矩阵和观测模型为:

$\boldsymbol{\Phi}_k = \left[ \begin{matrix}  1&T_s&0.5T_s^2 \\ 0&1&T_s \\ 0&0&1 \end{matrix} \right]$

$\mathbf{H} = \left[  \begin{matrix} 1&0&0  \end{matrix} \right]$

初始状态向量估计设为0,状态估计误差方差为$\infty$。

matlab程序如下:

order=3; % polynomial order is 3
ts=.1; % sample period
f2m=0.3048; % feet -> meter

t=[0:ts:30-ts];

s_init=400000*f2m; % init distance
v_init=-6000*f2m; % init speed
g_init=-9.8; % gravity
s=s_init + v_init .* t + 0.5 * g_init .* t .* t;
v=v_init + g_init .* t;
g=g_init * ones(1,300);
r=(1000*f2m)^2; % noise var
n=wgn(1, 300, r, ‘linear‘);
sn=s+n; % signal with noise

x=zeros(3, 1); % init state vector
p=99999999999999 * eye(3,3); % estimate covariance
idn=eye(3); % unit matrix
phi=[1 ts 0.5*ts*ts; 0 1 ts; 0 0 1]; % fundmental matrix (p164)
h=[1 0 0];
phis=0; % no process noise
q=phis * [ts^5/20 ts^4/8 ts^3/6; ts^4/8 ts^3/3 ts^2/2; ts^3/6 ts^2/2 ts]; % but we still use q (p185)

xest=zeros(3,300);
xest_curr=zeros(3,1);

for i=[1:1:300]
    xest_pre=phi*xest_curr;
    p_pre = phi*p*phi‘+q;
    y=sn(:,i)-h*xest_pre;
    ycov=h*p_pre*h‘+r;
    k=p_pre*h‘*inv(ycov);
    xest(:,i)=xest_pre+k*y;
    p=(idn-k*h)*p_pre;
    xest_curr=xest(:,i);
end

sest=zeros(1,300);
sest=h*xest;

plot(sest,‘r‘);
hold on;
plot(s,‘g‘);
hold on;
plot(sn,‘b‘);
hold off;

执行结果如下图:

第一张图是全貌,看不出啥;

第二张图是开始约40个点,滤波器输出慢慢靠近理想值;

第三张图是最后约50个点,滤波器输出和理想值几乎重合。

时间: 2024-07-30 03:23:22

卡尔曼滤波器实例:跟踪自由落体运动:设计与Matlab实现的相关文章

canvas动画:自由落体运动

经过前面的文章,我们已经能够在canvas画布上画出各种炫酷的图形和画面,但是这些画面都是禁止的,怎么样才能让他们动起来呢? 如何绘制基本图形可以参考:canvas基本图形绘制 如何对基本图形移动旋转缩放可以参考:canvas图形变换 如何设置基本图形颜色和样式可以参考:canvas样式和颜色 如何使用外部图片以及图形组合可以参考:canvas使用图片,图形组合以及裁剪 canvas如何保存和加载图像可以参考:canvas图像保存 canvas系列教程可以参考:canvas 动画的基本步骤 我们

javascript---之自由落体运动实现

实现自由落体运动需要理解的几个简单属性: clientHeight:浏览器客户端整体高度 offsetHeight:对象(比如div)的高度 offsetTop:对象离客户端最顶端的距离 简单demo如下: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>free_movement</title> <

JS运动-自由落体运动

模拟物理中的自由落体运动:废话不多说,先看效果!! 图片效果不太好,有些卡,可以把代码考出来自己运行看下效果!! 基本过程:鼠标可拖拽div,当鼠标抬起的时候,div会自由下落,然后弹起下落,直到速度为0运动停止,下落和弹起直至停止的过程是模拟 自由落体运动 完成测试代码: <div id="box"></div> <style> #box{ position: absolute;left: 0;top: 0; width: 100px;height

卡尔曼滤波器实例:进一步讨论自由落体运动

上一篇中,我们使用向量[0 0 0]T作为系统的初始状态,并且使用$\infty$作为初始状态误差的方差,也就是假定物体的初始位置.初始速度.加速度都是未知的,所有的状态信息都通过Radar的测量结果估计出来.但实际上,物体的加速度是预先知道的(假定为标准重力加速度),因此,我们可以简化上一篇中的多项式,以得到更好的状态估计. 将物体的位置设为状态$x_1$: $x_1=s_0-v_0t-\frac{1}{2}gt^2$$\frac{dx_1}{dt}=x_2=-v_0t-gt$$\frac{d

js实现自由落体

实现自由落体运动需要理解的几个简单属性: clientHeight:浏览器客户端整体高度 offsetHeight:对象(比如div)的高度 offsetTop:对象离客户端最顶端的距离 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>free_movement</title> 6 &

Javascript摸拟自由落体与上抛运动 说明!

JavaScript 代码 //**************************************** //名称:Javascript摸拟自由落体与上抛运动! //作者:Gloot //邮箱:[email protected] // QQ:345268267 //网站:http://www.cnblogs.com/editor/ //操作:在页面不同地方点几下 //*************************************** var $ = function(el)

对Kalman(卡尔曼)滤波器的理解

1.简介(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫"卡尔曼".跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他是个现代人! 卡尔曼全名Rudolf Emil Kalman,匈牙利数学家,1930年出生于匈牙利首都布达佩斯.1953,1954年于麻省理工学院分别获得电机工程学士及硕士学位.1957年于哥伦比亚大学获得博士学位.我们现在要学习的卡尔曼滤波器,正是源于他的博士论文和1960年发表的论文&

卡尔曼滤波器原理之基本思想

一.卡尔曼滤波器要解决的问题 首先说一下卡尔曼滤波器要解决的是哪一类问题,这类系统应该如何建模.这里说的是线性卡尔曼滤波器,顾名思意,那就是线性动态的离散系统.这类系统可以用如下两个方程来表示: \[\begin{array}{l} x(n + 1) = F(n + 1,n)x(n) + {v_1}(n) \\  y(n) = C(n)x(n) + {v_2}(n) \\  \end{array}\] 其中: x(n)表示系统的状态 F(n+1,n)为状态转移矩阵,表示状态随时间的变化规律.通俗

opencv 卡尔曼滤波器例子,自己修改过

一.卡尔曼滤波器的理论解释 http://blog.csdn.net/lindazhou2005/article/details/1534234(推荐) 二.代码中一些随机数设置函数,在opencv中文网站上没有查到: cvRandInit() 初始化CvRandState数据结构,可以选定随机分布的种类,并给定它种子,有两种情形 cvRandInit(CvRandState数据结构,随机上界,随机下界,均匀分布参数,64bits种子的数字) cvRandInit(CvRandState数据结构