changeset 86:e0fc40139163

Kalman filter
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 12 Oct 2014 12:42:34 +0200
parents ea63674fe408
children 35a851c68621
files kalman.py
diffstat 1 files changed, 29 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kalman.py	Sun Oct 12 12:42:34 2014 +0200
@@ -0,0 +1,29 @@
+
+class KalmanFilter(object):
+    Q_angle = 0.001
+    Q_bias = 0.003
+    R_measure = 0.03
+
+    def __init__(self, angle):
+        self.angle = angle
+        self.bias = 0
+        self.P = [[0, 0], [0, 0]]
+
+    def get_and_update(self, angle, rate, dt):
+        new_rate = rate - self.bias
+        self.angle += dt * new_rate
+        P = self.P
+        P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + self.Q_angle)
+        P[0][1] -= dt * P[1][1]
+        P[1][0] -= dt * P[1][1]
+        P[1][1] += self.Q_bias * dt
+        S = P[0][0] + self.R_measure
+        K = (P[0][0] / S, P[1][0] / S)
+        y = angle - self.angle
+        self.angle += K[0] * y
+        self.bias += K[1] * y
+        P[0][0] -= K[0] * P[0][0]
+        P[0][1] -= K[0] * P[0][1]
+        P[1][0] -= K[1] * P[0][0]
+        P[1][1] -= K[1] * P[0][1]
+        return self.angle, new_rate