J'essaie de construire une boussole avec gyroscope, accéléromètre et magnétomètre.Kalman Filter - Boussole et Gyro
Je fusionne les valeurs acc avec les valeurs du magnomètre pour obtenir l'orientation (en utilisant la matrice de rotation) et cela fonctionne plutôt bien. Mais maintenant, je veux ajouter un gyroscope pour aider à compenser lorsque le capteur magnétique n'est pas précis. Donc je veux utiliser le filtre kalman pour fusionner les deux résultats et obtenir un filtre bien filtré (les acc et mag sont déjà filtrés en utilisant lpf).
Mes matrices sont:
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)}
Et voici ma mise en œuvre du filtre de Kalman:
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;
}
}
Au début, ces valeurs de départ sont données:
Xk => {0,0}
Pk => {1000,0},{0,1000}
Puis je regarde la deux résultats (le kalman et le compas). Le kalman commence à partir de 0 et augmente à un certain rythme indépendamment de celui mesuré (boussole) et il ne cesse pas de continuer à augmenter ...
Je ne peux pas comprendre ce que je fais mal?
Pourquoi fusionnez-vous ces données vous-même? Quel est le problème avec celui offert par la plateforme? – Ali
Corrent moi si je me trompe, mais Android offre seulement acc + mag fusion – user1396033
Non, AFAIK les gyroscopes sont également considérés. – Ali