加速度・ジャイロによるカルマンフィルタ―用ライブラリ

Dependents:   Kalman_test 201903_pf_lower_judgment_sashida 201903_pf_lower_judgment 201903_pf_lower_judgment

Files at this revision

API Documentation at this revision

Comitter:
mikawataru
Date:
Fri Jan 19 10:41:41 2018 +0000
Commit message:
initialize

Changed in this revision

Kalman.cpp Show annotated file Show diff for this revision Revisions of this file
Kalman.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Kalman.cpp	Fri Jan 19 10:41:41 2018 +0000
@@ -0,0 +1,57 @@
+#include "Kalman.h"
+
+KalmanFilter::KalmanFilter() {
+  angle = 0.0;
+  bias = 0.0;
+  P[0][0] = 0.0;
+  P[0][1] = 0.0;
+  P[1][0] = 0.0;
+  P[1][1] = 0.0;
+};
+
+void KalmanFilter::setAngle(float newAngle) {
+  angle = newAngle;
+};
+
+float KalmanFilter::calcAngle(float newAngle, float newRate, float dt) {
+
+  // variances
+  float Q_angle = 0.001;
+  float Q_bias = 0.003;
+  float R_measure = 0.03;
+
+  // step 1
+  float rate = newRate - bias;
+  angle += dt * rate;
+
+  // step 2
+  P[0][0] += dt * (dt * P[1][1] - P[0][1] - P[1][0] + Q_angle);
+  P[0][1] -= dt * P[1][1];
+  P[1][0] -= dt * P[1][1];
+  P[1][1] += Q_bias * dt;
+
+  // step 3
+  float y = newAngle - angle;
+
+  // step 4
+  float S = P[0][0] + R_measure;
+
+  // step 5
+  float K[2];
+  K[0] = P[0][0] / S;
+  K[1] = P[1][0] / S;
+
+  // step 6
+  angle += K[0] * y;
+  bias += K[1] * y;
+
+  // step 7
+  float P00_temp = P[0][0];
+  float P01_temp = P[0][1];
+  P[0][0] -= K[0] * P00_temp;
+  P[0][1] -= K[0] * P01_temp;
+  P[1][0] -= K[1] * P00_temp;
+  P[1][1] -= K[1] * P01_temp;
+
+  return angle;
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Kalman.h	Fri Jan 19 10:41:41 2018 +0000
@@ -0,0 +1,15 @@
+#ifndef _KALMAN_H
+#define _KALMAN_H
+
+class KalmanFilter {
+private:
+    float angle;
+    float bias;
+    float P[2][2];
+public:
+    KalmanFilter();
+    void setAngle(float newAngle);
+    float calcAngle(float newAngle, float newRate, float dt);
+};
+
+#endif
\ No newline at end of file