我的系统如下。我使用移动设备的相机跟踪对象。通过此跟踪,我获得了在屏幕上投影的四个3D点,从而获得了四个2D点。由于检测到,这8个值有点嘈杂,因此我想对其进行过滤以使运动更平滑,更真实。作为第二次测量,我使用设备的陀螺仪输出,该输出提供了三个欧拉角(即设备姿态)。它们比2D位置(大约20 Hz)更精确,并且具有更高的频率(高达100 Hz)。

我的第一次尝试是使用简单的低通滤波器,但是滞后很重要,因此我现在尝试使用卡尔曼滤波器,希望它能够在几乎不延迟的情况下平滑位置。如上一个问题所示,卡尔曼滤波器的一个关键点是测量值与内部状态变量之间的关系。这里的测量值既是我的8个2D点坐标,也是3个Euler角,但是我不确定应该使用什么作为内部状态变量以及如何将Euler角连接到2D点。因此,主要问题是,卡尔曼滤波器是否甚至适用于该问题?如果可以,怎么办?

评论

如果整个目的是用最小的延迟来平滑值,那么如果您还没有尝试过,可以尝试使用最小相位滤波器。如果卡尔曼滤波比“最小相位延迟”能给您带来更好的效果,我会感到惊讶。对于线性滤波器,我希望最小相位滤波器可以提供最小的延迟。

@niaren:感谢您的评论,我也会对此进行研究。

尚不清楚您的测量是什么。在卡尔曼滤波器框架中,“度量”是指您实际观察到的数量。如果要测量四个3D点(例如,通过将多个摄像机图像融合在一起),则这些就是您的测量。您还需要确定要估计的状态变量。您是否试图随时间跟踪3D对象位置?如果是这样,那就是您的状态变量。可以仅将2D表示仅用于显示,而不能将其作为模型的一部分包含在内。其他详细信息将有助于建议一种方法。

正如Jsaon所说,您的测量尚不清楚。您说:通过此跟踪,我得到了在移动设备屏幕上投影的四个3D点,从而获得了四个2D点。这8个值有点吵,然后您说我可以使用的是设备的陀螺仪输出,它提供了三个欧拉角(即设备的姿态)。是什么?四个2D点还是三个欧拉角?还是加工火车走了欧拉角-> 3D点-> 2D点?

我实际上有两套测量值:从相机检测到的点位置和欧拉角,但联系起来并不容易。另外,我只对作为输出的筛选位置感兴趣。我将编辑问题进行澄清。

#1 楼

低通滤波

最好了解“简单低通滤波器”的含义。

例如,如果您在时间$ k $处的测量值

$$
p_ {k} = \ left [\ begin {array} {c} x_k \\ y_k \ end {array} \ right]
$$

和经过低通滤波的估计值是:

$$
p ^ {\ tt LPF} _k = \ alpha p ^ {\ tt LPF} _ {k-1} +(1- \ alpha)p_k
$$

,那么您在过滤器中会有大约$ 1 /(1- \ alpha)$的较大组延迟(对于接近1的alpha)。

建模信号:简单方法

要使用卡尔曼滤波器(或任何类似方法),您需要具有一个模型,用于获取和更新测量值。

通常看起来像:

$$
p ^ {\ tt TRUE} _ {k + 1} = {\ mathbf A} p ^ {\ tt TRUE} _k + {\ mathbf B} \ epsilon_k
$$
其中$ \ epsilon_k $是过程(驱动)噪声,$ {\ mathbf A} $是状态转换矩阵,而$ {\ mathbf B} $是您的输入矩阵。 br />
然后测得的$ p_k $是:
$$
p_k = {\ mathbf C} p ^ {\ tt TRUE} _k + {\ mathbf D} \ nu_k
$$
其中$ \ nu_k $是输出(测量)噪声,$ {\ mathbf C} $是输出矩阵,而$ {\ mathbf D} $是您的测量噪声矩阵。 br />
在这里,将模型的“状态”选择为真实位置,然后将您测量的内容作为输出。

然后您可以将Kalman滤波器方程式应用于此以获得状态估计值$ \ hat {p ^ {\ tt TRUE} _k} $的真实位置。

但是,这种方法过于简单,因为它没有使用任何关于点如何移动的知识(它也不会使用您的4点知识以及您可能会掌握的有关它们如何运动的任何知识。)

建模信号:开始更好的方法

此页面显示了如何设置涉及位置和欧拉角的问题。
它所做的事情与您所需的有所不同,但是状态为:

$$
p ^ {\ tt TRUE} _ {k} = \ left [
x_k \ y_k \ z_k \
\ dot {x} _k \ \ dot {y} _k \ \ dot {z} _k \
\ ddot {x} _k \ \ ddot {y} _k \ \ ddot {z} _k \
\ phi \ \ psi \ \ theta \
\ dot {\ phi} \ \ dot {\ psi} \ \ dot {\ theta} \
\ ddot {\ phi} \ \ ddot {\ psi} \ \ ddot {\ theta} \
\ right] ^ T
$$

,测量值(输出)为

$$
p_k = \ left [x_k \ y_k \ z_k \ \ phi \ \ psi \ \ theta \ \ right] ^ T
$$

该页面上的所有模型实际上都在说:
$$
x ^ {\ tt TRUE} _k = \ sum_ {n = 0} ^ k \ dot {x} ^ {\ tt TRUE} _n n \ Delta t + \ frac {1} {2} \ sum_ { n = 0} ^ k \ ddot {x} ^ {\ tt TRUE} _n(n \ Delta t)^ 2
$$
(但是每个$ x,y,$和$ z $)。

这只是经典的“运动方程式”。请参见公式(3)。

评论


$ \ begingroup $
我的低通滤波后的估计值是:$$ p_k = \ alpha p_ {k-1} +(\ alpha-1)p_k $$
$ \ endgroup $
–StéphanePéchard
2011-09-27 8:46

$ \ begingroup $
@StéphanePéchard:糟糕!是的,我想念您通常想要一个直流单位增益。即使这样,对于接近1的\ alpha $,组延迟仍然非常大,这可能是用这种方法不能令人满意的。
$ \ endgroup $
– Peter K.♦
2011-09-27 11:34

$ \ begingroup $
我尝试应用您链接到我的文章。当At矩阵包含微分时间值时,例如$$ \ Delta t \ qquad; \ qquad \ frac {1} {2}(\ Delta ^ 2)$$,我每次更新Kalman测量值时都需要自己计算它们吗?
$ \ endgroup $
–StéphanePéchard
2011-09-27 13:17



$ \ begingroup $
@StéphanePéchard:这些不是“微分时间值”。 $ \ Delta t $仅是$ 1 / f_s $,即采样时刻之间的时间。
$ \ endgroup $
– Peter K.♦
2011-09-27 13:20



$ \ begingroup $
您需要知道采样率($ f_s $)是多少,然后$ \ Delta t $将恰好相反。除非采样率发生变化,否则您只需一次“计算” $ \ Delta t $ nd $ \ frac {1} {2} \ Delta t ^ 2 $即可,因为它们是恒定的(假设采样率恒定)。
$ \ endgroup $
– Peter K.♦
2011-09-27 13:38



#2 楼

您的低通滤波器可能像;

$$
$$

其中$ z_k $是第k个观测数据。 $ p_k $是第k个估计值。

LPF可以变形为下一个形式:

$$ p_k = p_ {k-1} + K(z_k- p_ {k-1})$$
其中$ K =(1- \ alpha)$。

这与Kalman过滤器非常相似。在卡尔曼滤波器中,$ K $是卡尔曼增益,通常是可变的。