【发布时间】:2013-03-07 15:45:14
【问题描述】:
我正在尝试用陀螺仪、加速度计和磁力计构建指南针。
我将 acc 值与 magnometer 值融合以获取方向(使用旋转矩阵),它工作得很好。
但是现在我想添加陀螺仪来帮助补偿磁传感器不准确的情况。所以我想用卡尔曼滤波器来融合这两个结果,得到一个很好的过滤结果(acc和mag已经用lpf过滤了)。
我的矩阵是:
state(Xk) => {Compass Heading, Rate from the gyro in that axis}.
transition(Fk) => {{1,dt},{0,1}}
measurement(Zk) => {Compass Heading, Rate from the gyro in that axis}
Hk => {{1,0},{0,1}}
Qk = > {0,0},{0,0}
Rk => {e^2(compass),0},{0,e^2(gyro)}
这是我的卡尔曼滤波器实现:
public class KalmanFilter {
private Matrix x,F,Q,P,H,K,R;
private Matrix y,s;
public KalmanFilter(){
}
public void setInitialState(Matrix _x, Matrix _p){
this.x = _x;
this.P = _p;
}
public void update(Matrix z){
try {
y = MatrixMath.subtract(z, MatrixMath.multiply(H, x));
s = MatrixMath.add(MatrixMath.multiply(MatrixMath.multiply(H, P),
MatrixMath.transpose(H)), R);
K = MatrixMath.multiply(MatrixMath.multiply(P, H), MatrixMath.inverse(s));
x = MatrixMath.add(x, MatrixMath.multiply(K, y));
P = MatrixMath.subtract(P,
MatrixMath.multiply(MatrixMath.multiply(K, H), P));
} catch (IllegalDimensionException e) {
e.printStackTrace();
} catch (NoSquareException e) {
e.printStackTrace();
}
predict();
}
private void predict(){
try {
x = MatrixMath.multiply(F, x);
P = MatrixMath.add(Q, MatrixMath.multiply(MatrixMath.multiply(F, P),
MatrixMath.transpose(F)));
} catch (IllegalDimensionException e) {
e.printStackTrace();
}
}
public Matrix getStateMatirx(){
return x;
}
public Matrix getCovarianceMatrix(){
return P;
}
public void setMeasurementMatrix(Matrix h){
this.H = h;
}
public void setProcessNoiseMatrix(Matrix q){
this.Q = q;
}
public void setMeasurementNoiseMatrix(Matrix r){
this.R = r;
}
public void setTransformationMatrix(Matrix f){
this.F = f;
}
}
首先给出这个起始值:
Xk => {0,0}
Pk => {1000,0},{0,1000}
然后我观察两个结果(卡尔曼结果和罗盘结果)。卡尔曼卡从 0 开始并以某种速度增加,无论测量的卡尔曼(罗盘)如何,它都不会停止,只是继续增加......
我不明白我做错了什么?
【问题讨论】:
-
你为什么要自己融合这些数据?平台提供的那个有什么问题?
-
如果我错了,请纠正我,但 android 只提供 acc+mag 融合
-
不,AFAIK 陀螺仪也被考虑在内。
-
好的,我会检查一下,但无论如何,出于学习目的,任何人都可以回答我的问题吗?
-
是的.. 你是对的.. android 只在本地融合了 mag 和 acc.. 不用多说,没有多少设备有陀螺仪。我发现你的帖子研究了在将低通或卡尔曼滤波器直接传递到罗盘之前将其融合到加速度计的选项。如果有上帝,我们希望他/她是堆栈溢出的开发人员。它是如此头脑麻木的问题。
标签: android kalman-filter