我正在将加速度计数据直接传输到ThreeJs摄像机旋转中,但是我们在信号上获得了大量噪声,这导致了抖动.
有人建议使用卡尔曼滤波器作为处理平滑信号处理噪声的最佳方法,我在gitHub上找到了这个简单的Javascript库
https://github.com/itamarwe/kalman
但是它的文档真的很明亮.
我明白,我需要通过提供一个Vector和3个矩阵作为参数来创建一个卡尔曼模型,然后再次以一个向量和矩阵作为参数在一个时间范围内更新模型.
我也明白卡尔曼滤波器方程有几个不同的部分:当前估计位置,卡尔曼增益值,从定向API的当前读数和以前的估计位置.
我可以看到3D空间中的一个点可以被描述为一个向量,所以任何一个位置值,如估计的位置,或当前的读数可以是一个矢量.
我不明白的是,这些部分如何被翻译成矩阵,以形成Javascript库的参数.
解决方法
让我很快解释什么是所有不同的矩阵和向量,以及它们应该如何导出:
x – 这是您尝试估计的矢量.在你的情况下,它可能是3个角加速度.
P – 是估计的协方差矩阵,意味着估计的不确定性.在卡尔曼滤波器的每个步骤以及x中也估计.
F – 根据模型描述X的发展.通常,模型是x [k] = Fx [k-1] w [k].在您的情况下,如果您希望角加速度完全不可预测,如果您希望角加速度相对平滑,则F可能是单位矩阵,或者是零矩阵.在任何情况下,w将表示您期望加速度从一步到一步变化的程度.
w – 描述过程噪音,意思是,模型与“完美”模型分歧多少.它被定义为具有协方差矩阵Q的零均值多元正态分布.
以上所有变量定义您的模型,这意味着您正在尝试估计.在下一部分中,我们将讨论观察模型 – 您为了估计您的模型而进行的测量.
z – 这是你测量的.在您的情况下,由于您正在使用加速度计,您正在测量您所估计的内容.这将是角加速度.
H – 描述你的模型和观察之间的关系. z [k] = H [k] x [k] v [k].在你的情况下,它是身份矩阵.
v – 是测量噪声,假定为具有协方差R [k]的零均值高斯白噪声.在这里,您需要测量加速度计的噪声,并计算噪声协方差矩阵.
总而言之,使用卡尔曼滤波器的步骤:
>确定x [0]和P [0] – 您的模型的初始状态,以及您如何准确地知道x [0]的初始估计.
>根据您的模型确定F,以及如何逐步发展.
>根据您的模型的随机性质确定Q.
>根据您测量的内容与您想要估计的内容(模型与测量值之间)之间的关系确定H.
>根据测量噪声确定R.你的测量有多嘈杂
然后,通过每次新的观察,您可以使用卡尔曼滤波器更新模型状态估计,并对模型状态(x [k])以及该估计精度(P [k])进行最佳估计. .