位置和速度的卡尔曼滤波器:引入速度估计


24

感谢昨天在我的查询中发布评论/答案的每个人(为位置,速度,加速度实现Kalman过滤器)。我一直在研究推荐的内容,尤其是在(a)关于一维位置和速度的Wikipedia示例以及另一个考虑类似内容的网站上

2013年4月26日更新:此处的原始问题包含一些错误,这与以下事实有关:我没有正确理解Wikipedia示例中的一维位置和速度。随着我对正在发生的事情有了更好的理解,我现在重新起草了这个问题,并更加集中了它。

我在上面的介绍性段落中提到的两个示例均假设仅是对位置进行了衡量。但是,两个示例都没有任何类型的速度计算Xķ-Xķ-1个/dŤ。例如,Wikipedia示例将H矩阵指定为,这意味着仅输入位置。以Wikipedia为例为例,卡尔曼滤波器的状态向量包含位置和速度,即X ķ X ķ ˙ X ķH=[1个   0]XķXķX˙ķ

Xķ=XķX˙ķ

假设在时间处的位置度量为。那么,如果在时间的位置和速度分别为和,并且是在时间间隔应用于的恒定加速度,从测量有可能推断出的值用于使用公式X ķ ķ - 1 X ķ - 1 ˙ X ķ - 1ķ - 1 ķ XķX^ķķ-1个Xķ-1个X˙ķ-1个一种ķ-1个ķX^一种

x^k=xk1+x˙k1dt+12adt2

这意味着在时间,速度的测量值\ hat {\ dot {x}} _ k由下式给出ķX˙^ķ

X˙^ķ=X˙ķ-1个+一种dŤ=2X^ķ-Xķ-1个dŤ-X˙ķ-1个

该方程右边的所有量(即,和)都是具有已知均值和标准偏差的正态分布随机变量,因此测量向量的矩阵X^ķXķ-1个X˙ķ-1个[R

X^ķ=X^ķX˙^ķ

可以计算。这是将速度估算引入流程的有效方法吗?


2
我没有仔细检查您的所有计算。但是,以Wikipedia为例,您似乎对它的结构有些困惑。您是正确的,因为只有位置可以测量。但是,使用了所谓的“恒定速度”模型。这意味着在状态转移矩阵中速度被认为是恒定的。
Jason R

3
使用过程噪声矩阵对速度的变化进行建模。因此,您固有地假设速度将以某些指定的协方差随机变化。令人惊讶的是,这通常效果很好。通常以这种方式在最高状态变量导数之上使用过程噪声一阶导数。例如,如果您在模型中包括了加速度,那么您的过程噪声中可能包含一个随机的冲击部分。
Jason R

@JasonR与Wikipedia模型(假设位置和速度之间的初始协方差为零)一起,速度估算始终是其初始值(如您所说的“恒定速度”模型)。但是,速度的方差会因过程噪声而单调增长,并且没有任何可以降低它的测量方法。与仅对位置建模并假设速度恒定的模型相比,此方法有什么优势?
随机

2
速度估计值的方差不应单调增加。过程噪声只是在状态转移方程中引入了随机成分,使您可以准确地表达系统状态如何随时间变化的不确定性。如果不包括过程噪声,则您的滤波器将真正输出恒定速度。那可能不是您想要的。
Jason R

好吧,@ JasonR,如果您查看维基百科模型,您会发现速度的单调增加是它所提供的!
2013年

Answers:


24

这是将速度估算引入流程的有效方法吗?

如果您适当选择状态,则速度估算是“免费”的。请参见下面的信号模型推导(对于我们一直在研究的简单一维情况)。

信号模型,取2

因此,我们确实需要在信号模型上达成共识,然后才能继续前进。从您的编辑看来,位置模型看起来是:Xķ

Xķ+1个=Xķ+X˙ķΔŤ+1个2一种ΔŤ2X˙ķ+1个=X˙ķ+一种ΔŤ

如果我们的状态与以前一样: 则状态更新方程仅仅是: Xķ+1= 1个Δ 0 1Xķ+Δ 2

Xķ=XķX˙ķ
其中现在我们的一个ķ是正态分布加速度。
Xķ+1个=1个  ΔŤ0  1个Xķ+ΔŤ22ΔŤ一种ķ
一种ķ

这给出了与先前版本不同的矩阵,但是FH矩阵应该相同。GFH


如果我实现了这一点scilab(对不起,无法访问matlab),它看起来像:

// Signal Model
DeltaT = 0.1;
F = [1 DeltaT; 0 1];
G = [DeltaT^2/2; DeltaT];
H = [1 0];

x0 = [0;0];
sigma_a = 0.1;

Q = sigma_a^2;
R = 0.1;

N = 1000;

a = rand(1,N,"normal")*sigma_a;

x_truth(:,1) = x0;
for t=1:N,
    x_truth(:,t+1) = F*x_truth(:,t) + G*a(t);
    y(t) = H*x_truth(:,t) + rand(1,1,"normal")*sqrt(R);
end

然后,我可以将Kalman滤波器方程式应用于此(噪声测量)。ÿ

// Kalman Filter
p0 = 100*eye(2,2);

xx(:,1) = x0;
pp = p0;
pp_norm(1) = norm(pp);
for t=1:N,
    [x1,p1,x,p] = kalm(y(t),xx(:,t),pp,F,G,H,Q,R);
    xx(:,t+1) = x1;
    pp = p1;
    pp_norm(t+1) = norm(pp);
end

因此,我们得到了噪声测量,并对其应用了卡尔曼滤波器,并使用与应用卡尔曼滤波器相同的信号模型来生成y(有时是一个很大的假设!)。ÿÿ

然后,下面的图显示结果。

ÿXķ

在此处输入图片说明

图2:前几个样本的放大视图:

在此处输入图片说明

情节3:您在现实生活中从未获得过的东西,是真实的职位与职位的状态估计。

在此处输入图片说明

情节4:您在现实生活中也从未获得过的东西,即真实速度与速度的状态估计值。

在此处输入图片说明

图5:状态协方差矩阵的范数(在现实生活中您应该始终监视的东西!)。请注意,它很快从最初的很大的值变成很小的值,所以我只显示了前几个示例。

在此处输入图片说明

图6:真实位置和速度及其估计值之间的误差图。

在此处输入图片说明

žķ+1个=Xķ+1个Pķ=0Pķ+1个-=ķķ+1个

ķķ+1个=1个2/dŤ

这意味着卡尔曼更新过程会产生

X^ķ+1个=Fķ+1个Xķ+ķķ+1个žķ+1个-Hķ+1个Fķ+1个Xķ=Xķ+X˙ķdŤX˙ķ+1个2/dŤXķ+1个-Xķ+X˙ķdŤ=Xķ+1个2Xķ+1个-Xķ/dŤ-X˙ķ

Xķ-Xķ-1个/dŤ


感谢您到目前为止的所有帮助。我最初的问题确实包含一些误解,所以我试图重新调整重点,并试图回答您有关z_k的问题。
随机

1
感谢vm的所有努力:-)。你的工作促使我继续做一些数学运算,我一直坚持着你的答案,希望你不要介意。无论如何,我现在100%相信标准方法是好的,因为我毕竟可以在其中看到速度公式。再次感谢
2013年

很高兴能够提供帮助!添加到答案没有问题。
Peter K.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.