Khangai Robot Play - Naive  01
THe naive play of the Khangai Robot
kalman.h
Go to the documentation of this file.
1 /*
2  * kalman.h
3  *
4  * Created : 11/13/2018
5  * Author : n-is
6  * email : 073bex422.nischal@pcampus.edu.np
7  */
8 
9 #ifndef _KALMAN_H_
10 #define _KALMAN_H_
11 
12 #include "mat.h"
13 
14 class Kalman_Filter;
15 
17 {
18 public:
19  void set_F(const Mat &f) { F_ = f; }
20  void set_B(const Mat &b) { B_ = b; }
21  void set_H(const Mat &h) { H_ = h; }
22  void set_I(uint8_t n) { I_ = Mat::eye(n); }
23  void set_P(const Mat &p) { P_ = p; }
24  void set_Q(const Mat &q) { Q_ = q; }
25  void set_R(const Mat &r) { R_ = r; }
26 
27  friend class Kalman_Filter;
28 
29 private:
30  Mat F_, B_, H_, I_, P_, Q_, R_;
31 };
32 
33 // Trying a Simple Sensor Fusion : Gyroscope and (Accelerometer/Magnetometer)
35 {
36 public:
37  Kalman_Filter(Kalman_Vars *kv, int (*kv_init)(uint32_t)) :
38  x_(2,1), u_(1,1), z_(1,1), K_(2,1)
39  {
40  is_first_ = true;
41  kv_ = kv;
42  kv_init_ = kv_init;
43  }
44  Kalman_Filter(Kalman_Filter &&) = default;
45  Kalman_Filter(const Kalman_Filter &) = default;
46  Kalman_Filter &operator=(Kalman_Filter &&) = default;
47  Kalman_Filter &operator=(const Kalman_Filter &) = default;
49 
50  float filter(float measured, float control_input, uint32_t dt_millis) {
51  // float dt = (float)dt_millis / 1000.0;
52  // For first element of vector
53  if (is_first_) {
54  // Initiaize all the variables at the first call
55  kv_init_(dt_millis);
56 
57  is_first_ = false;
58  x_.at(0,0) = measured;
59  // u_.at(0,0) = control_input;
60  }
61  else {
62  u_.at(0,0) = control_input;
63  z_.at(0,0) = measured;
64 
65  // Predict
66  x_ = (kv_->F_)*(x_) + (kv_->B_)*(u_);
67  kv_->P_ = (kv_->F_)*(kv_->P_)*((kv_->F_).trans()) + kv_->Q_;
68 
69  // Update
70  K_ = kv_->P_*(kv_->H_.trans())*(((kv_->H_*(kv_->P_)*(kv_->H_.trans())) + kv_->R_).inv());
71  x_ += K_*(z_ - (kv_->H_)*(x_));
72  kv_->P_ = (kv_->I_ - K_*(kv_->H_))*(kv_->P_);
73  }
74 
75  return x_.at(0,0);
76  }
77 
78  void clear() {
79  is_first_ = true;
80  }
81 
82 private:
83  int (*kv_init_)(uint32_t);
84  bool is_first_;
86 
87  Mat x_, u_, z_, K_;
88 };
89 
90 #endif // !_KALMAN_H_
Mat P_
Definition: kalman.h:30
Mat x_
Definition: kalman.h:87
void clear()
Definition: kalman.h:78
Mat H_
Definition: kalman.h:30
Definition: mat.h:18
Mat R_
Definition: kalman.h:30
Mat K_
Definition: kalman.h:87
void set_P(const Mat &p)
Definition: kalman.h:23
Mat z_
Definition: kalman.h:87
Mat B_
Definition: kalman.h:30
void set_Q(const Mat &q)
Definition: kalman.h:24
Mat Q_
Definition: kalman.h:30
Mat u_
Definition: kalman.h:87
float filter(float measured, float control_input, uint32_t dt_millis)
Definition: kalman.h:50
Mat I_
Definition: kalman.h:30
Kalman_Filter & operator=(Kalman_Filter &&)=default
Kalman_Filter(Kalman_Vars *kv, int(*kv_init)(uint32_t))
Definition: kalman.h:37
int(* kv_init_)(uint32_t)
Definition: kalman.h:83
float & at(uint8_t i, uint8_t j)
Definition: mat.h:36
Mat F_
Definition: kalman.h:30
void set_R(const Mat &r)
Definition: kalman.h:25
bool is_first_
Definition: kalman.h:84
void set_H(const Mat &h)
Definition: kalman.h:21
void set_F(const Mat &f)
Definition: kalman.h:19
static Mat eye(uint8_t n)
Definition: mat.cpp:140
Mat trans()
Definition: mat.h:83
Definition: kalman.h:34
void set_B(const Mat &b)
Definition: kalman.h:20
Kalman_Vars * kv_
Definition: kalman.h:85
~Kalman_Filter()
Definition: kalman.h:48
void set_I(uint8_t n)
Definition: kalman.h:22
Definition: kalman.h:16