Je travaille sur un processeur de bras stm32f417ve et j'essaie de mettre en œuvre un filtre kalman pour fusionner des données d'accéléromètre avec des données de hauteur (capteur de pression). Je veux connaître la vitesse et la position verticales estimées. Les lectures d'accéléromètre sont tournées du cadre de corps à la terre, ce n'est pas le problème. J'ai déjà beaucoup cherché sur internet et j'ai aussi trouvé des choses intéressantes, mais je ne sais pas si ma situation correspond aux autres que j'ai trouvées, donc je suis là :) Cet article (Using Kalman filter with acceleration and position inputs) est très similaire à celui-ci, mais j'ai besoin d'un peu plus d'aide. J'ai aussi un MPU6000 comme 6DOF imu et un MS5611 baro. Je pense que la meilleure façon de combiner ces données est d'utiliser l'accélération comme entrée de contrôle, n'est-ce pas? Peut-être que quelqu'un pourrait regarder mes matrices et formules pour me dire, si c'est vrai ou non.Kalman Filtre de hauteur et d'accélération
Formules:
//PREDICT
x = A*x + B*u
p = A*p*AT + Q
//UPDATE
Innovation = (H*p*HT + R)^-1
K = p*HT*Innovation
x = x + K*(y-H*x)
p = (I-K*H)*p
Matrizes:
#define NumState 3
#define NumInput 1
#define NumOutput 1
static float32_t xAr[NumState][1];
static float32_t uAr[NumInput][1];
static float32_t yAr[NumOutput][1];
static float32_t AAr[NumState][NumState];
static float32_t BAr[NumState][NumInput];
static float32_t HAr[NumOutput][NumState];
static float32_t QAr[NumState][NumState];
static float32_t RAr[NumOutput][NumOutput];
static float32_t PAr[NumState][NumState];
static float32_t kAr[NumState][NumOutput];
static float32_t IAr[NumState][NumState];
I mettent l'accélération dans le vecteur u et la hauteur en y. La matrice IAR est juste une matrice d'identité, de sorte que ses éléments sont en diagonale 1.
RAr[0][0] = 0.1f;
QAr[0][0] = 1.0f;
QAr[0][1] = 1.0f;
QAr[0][2] = 0.0f;
QAr[1][0] = 1.0f;
QAr[1][1] = 1.0f;
QAr[1][2] = 0.0f;
QAr[2][0] = 0.0f;
QAr[2][1] = 0.0f;
QAr[2][2] = 0.0f;
uAr[0][0] = AccZEarth;
yAr[0][0] = Height;
HAr[0][0] = 1.0f;
HAr[0][1] = 0.0f;
HAr[0][2] = 0.0f;
BAr[0][0] = (dt*dt)/2;
BAr[1][0] = dt;
BAr[2][0] = 0.0f;
AAr[0][0] = 1.0f;
AAr[0][1] = dt;
AAr[0][2] = 0.0f - ((dt*dt)/2.0f);
AAr[1][0] = 0.0f;
AAr[1][1] = 1.0f;
AAr[1][2] = 0.0f - dt;
AAr[2][0] = 0.0f;
AAr[2][1] = 0.0f;
AAr[2][2] = 1.0f;
IAr[0][0] = 1.0f;
IAr[0][1] = 0.0f;
IAr[0][2] = 0.0f;
IAr[1][0] = 0.0f;
IAr[1][1] = 1.0f;
IAr[1][2] = 0.0f;
IAr[2][0] = 0.0f;
IAr[2][1] = 0.0f;
IAr[2][2] = 1.0f;
PAr[0][0] = 100.0f;
PAr[0][1] = 0.0f;
PAr[0][2] = 0.0f;
PAr[1][0] = 0.0f;
PAr[1][1] = 100.0f;
PAr[1][2] = 0.0f;
PAr[2][0] = 0.0f;
PAr[2][1] = 0.0f;
PAr[2][2] = 100.0f;
Ce serait vraiment super si certains d'entre vous pouvez jeter un oeil et me dire wheter im bon ou mauvais!
Merci, Chris