如何在Apache Commons Kalman过滤器实现中填充矩阵

时间:2016-03-14 19:26:26

标签: java gps smoothing kalman-filter apache-commons-math

背景:为了给每个人一些背景,我试图使用卡尔曼滤波器(Apache)来平滑从设备接收的GPS数据  共同实施)。我应该包括什么样的动态噪音  在我的实现中关于矩阵P0,Q和R知道这一点  除了位置(X和Y)之外,我唯一的输入是水平的  X和Y分量的准确度和速度。这不是一个常数  速度示例,因为速度可能会从一次ping变为  另一个ping。

实施库:Apache Common
   - http://commons.apache.org/proper/commons-math/userguide/filter.html

用法:我现在只考虑2D空间

我和我一起输入的内容:  纬度
 经度
 3.水平精度或水平精度(HDOP),以米/秒为单位  4.两次ping(dt)= 30秒之间的时间

我关心的输出  1.新纬度
 2.新经度

计算值:Vx(X方向的速度)Vy(Y方向的速度)物体将不断移动但是  不同的速度,所以我可以使用公式计算Vx和Vy  V * sin(θ)和V *余弦(θ)

我应该如何将我的值映射到Apache Common实现。

当前设置:

X = Initial State = [  

     {X Y X-Vel Y-Vel}

    ]  

 // I only care about X and Y coordinates so this is a 2 * 4 matrix  
 H = Observation variables = [   

     {1, 0, 0, 0},  
     {0, 1, 0, 0} 



 ]  

 // This is a 4 * 4 matrix  
 P0 = Cov(X) = [     

     {(horizontal accuracy from i/p), 0, 0, 0},  
     {0, (horizontal accuracy from i/p), 0, 0},  
     {0, 0, (some initial value for VY), 0},  
     {0, 0, 0, (some initial value for VX) }

    ]  

 // Copied this from somewhere. What values should I have in this?   //
 This is a 4 * 4 matrix  
 Q = Cov(Dynamic noise) = [          

     { Math.pow(dt, 4d)/4d, 0d, Math.pow(dt, 3d)/2d, 0d },  
     { 0d, Math.pow(dt, 4d)/4d, 0d, Math.pow(dt, 3d)/2d },  
     { Math.pow(dt, 3d)/2d, 0d, Math.pow(dt, 2d), 0d },  
     { 0d, Math.pow(dt, 3d)/2d, 0d, Math.pow(dt, 2d) }

    ]  

 // This is a 2 * 2 matrix  
 R = Cov(measurement noise) = [  

     { Math.pow((horizontal accuracy from i/p), 2d) , 0},  
     { 0, Math.pow((horizontal accuracy from i/p), 2d)} 

 ]  

 // This is a 4 * 4 matrix  
 A = State transition matrix =   [

     { 1d, 0d, dt, 0d },  
     { 0d, 1d, 0d, dt },  
     { 0d, 0d, 1d, 0  },  
     { 0d, 0d, 0d, 1d }  

 ] 

我的矩阵是否符合我的目的?我跑的时候我  继续得到MatrixDimensionMismatchException,因此我决定  问一个问题。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我能够通过使用最新版本的Apache Commons Math库来解决这个问题。

事实证明,Apache Commons Math 3.2和早期版本有一个主要的bug 在此报道:https://issues.apache.org/jira/browse/MATH-1033

问题是measNoise列维度必须始终为1,这意味着矩阵R应始终只有1列

@prefix : <http://example.org/rs#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

:A   rdfs:subClassOf :B .
:B   rdfs:subClassOf :C .
:i  a   :A .