有很多关于从加速度计数据中去除噪声,其他传感器数据,计算时空状态以及在
Android和其他设备中使用卡尔曼滤波器的问题.
显然,最简单的方法是在Android上实现JKalman过滤器,以便为汽车提供稳定的移动设备.
但是看看JKalman代码包中的示例实现,它并没有说太多,它实际上与其他Kalman实现非常不同.
他们像这样实例化一个卡尔曼类:
JKalman kalman = new JKalman(4,2);
根据定义在哪里
public JKalman(int dynam_params,int measure_params) throws Exception { this(dynam_params,measure_params,0); }
dynam_params是“测量矢量维数”,measure_params是“状态矢量维数”.
如何将Android中读取的传感器数据映射到这些?
以下是加速度计的数据,每500ms采样一次.在其他听众中,有来自陀螺仪和指南针的数据.我该如何将这些数据转换为输入到卡尔曼?
@Override public void onSensorChanged(SensorEvent event) { actualTime = System.currentTimeMillis(); if(actualTime - lastUpdateAcc < 500) return; else{ lastUpdateAcc = actualTime; //update myPosition TextView tv = (TextView)findViewById(R.id.textView3); tv.setText(String.format("X: %8.4f -- Y: %8.4f -- Z: %8.4f",event.values[0],event.values[1],event.values[2])); //draw on the screen //draw new path,if one exists } }
解决方法
看来你需要3D JKalman滤镜.你可以试试这个:
JKalman kalman = new JKalman(6,3); Matrix s = new Matrix(6,1); // state [x,y,z,dx,dy,dz] Matrix c = new Matrix(6,1); // corrected state Matrix m = new Matrix(3,1); // measurement [x,z] // the initial values follow (sorry for programming in stackoverflow): m.set(0,x); m.set(1,y); m.set(2,z); // transitions for x,dz (velocity transitions) double[][] tr = { {1,1,0},{0,1},1} }; kalman.setTransition_matrix(new Matrix(tr));
请遵循KalmanTest.java中的示例并检查此错误.