SigPack - the C++ signal processing library
kalman_linear.cpp
Go to the documentation of this file.
1 
8 #include "sigpack.h"
9 
10 using namespace std;
11 using namespace sp;
12 
13 int main()
14 {
15  // Number of samples
16  arma::uword Nsamp = 120;
17  arma::uword N = 6; // Nr of states
18  arma::uword M = 2; // Nr of measurements
19  arma::uword L = 1; // Nr of inputs
20 
21  // Instatiate a Kalman Filter
22  KF kalman(N, M, L);
23 
24  // Initialisation and setup of system
25  double P0 = 100;
26  double Q0 = 0.00003;
27  double R0 = 25;
28 
29  // Meas interval
30  double dT = 0.1;
31 
32  arma::mat x = {0, 10, 1, 50, -0.08, -9};
33  kalman.set_state_vec(0.9 * x.t());
34  // [X,Y,Vx,Vy,Ax,Ay] use position, velocity and acceleration as states
35  arma::mat A = {{1, 0, dT, 0, dT * dT / 2, 0},
36  {0, 1, 0, dT, 0, dT * dT / 2},
37  {0, 0, 1, 0, dT, 0},
38  {0, 0, 0, 1, 0, dT},
39  {0, 0, 0, 0, 1, 0},
40  {0, 0, 0, 0, 0, 1}};
41  kalman.set_trans_mat(A);
42 
43  arma::mat H = {{1, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}};
44  kalman.set_meas_mat(H);
45 
46  arma::mat P = P0 * arma::eye(N, N);
47  kalman.set_err_cov(P);
48  arma::mat Q = arma::zeros(N, N);
49  Q(N - 2, N - 2) = 1;
50  Q(N - 1, N - 1) = 1;
51  Q = Q0 * Q;
52  kalman.set_proc_noise(Q);
53 
54  arma::mat R = R0 * arma::eye(M, M);
55  kalman.set_meas_noise(R);
56 
57  // Create simulation data
58  arma::mat z(M, Nsamp, arma::fill::zeros);
59  arma::mat z0(M, Nsamp, arma::fill::zeros);
60 
61  arma::mat xx(N, 1, arma::fill::zeros);
62  xx = x.t();
63  for (arma::uword n = 1; n < Nsamp; n++)
64  {
65  xx = A * xx + 0.1 * Q * arma::randn(N, 1);
66  z0.col(n) = H * xx; //
67  }
68 
69  z.row(0) = z0.row(0) + 0.001 * R0 * arma::randn(1, Nsamp);
70  z.row(1) = z0.row(1) + 0.8 * R0 * arma::randn(1, Nsamp);
71 
72  arma::mat x_log(N, Nsamp);
73  arma::mat e_log(M, Nsamp);
74  arma::cube P_log(N, N, Nsamp);
75  arma::mat xs_log(M, Nsamp);
76  arma::cube Ps_log(N, N, Nsamp);
77 
78  // Kalman filter loop
79  for (arma::uword n = 0; n < Nsamp; n++)
80  {
81  kalman.predict();
82  kalman.update(z.col(n));
83 
84  x_log.col(n) = kalman.get_state_vec();
85  e_log.col(n) = kalman.get_err();
86  P_log.slice(n) = kalman.get_err_cov();
87  }
88 
89  // RTS smoother
90  kalman.rts_smooth(x_log, P_log, xs_log, Ps_log);
91 
92  // Display result
93  gplot gp0;
94  gp0.window("Plot", 10, 10, 500, 500);
95  gp0.set_term("qt");
96  gp0.plot_add(z0.row(0), z0.row(1), "True Y",
97  "lines dashtype 2 linecolor \"black\"");
98  gp0.plot_add(z.row(0), z.row(1), "Meas Y", "points");
99  gp0.plot_add(x_log.row(0), x_log.row(1), "Kalman");
100  gp0.plot_add(xs_log.row(0), xs_log.row(1), "RTS smooth");
101  gp0.plot_show();
102 
103  return 0;
104 }
arma::mat get_state_vec(void)
Definition: kalman.h:237
Gnuplot class.
Definition: gplot.h:25
void update(const arma::mat z)
Correct and update the internal states.
Definition: kalman.h:264
void set_meas_mat(const arma::mat &_H)
Definition: kalman.h:206
Definition: base.h:7
int main()
void plot_show(void)
Show plots.
Definition: gplot.h:395
void set_state_vec(const arma::mat &_x)
Definition: kalman.h:197
void set_proc_noise(const arma::mat &_Q)
Definition: kalman.h:214
void set_term(const char *ttype)
Set output terminal.
Definition: gplot.h:759
Kalman filter class.
Definition: kalman.h:129
void predict(const arma::mat u)
Predict the internal states using a control input.
Definition: kalman.h:246
void set_err_cov(const arma::mat &_P)
Definition: kalman.h:210
void set_trans_mat(const arma::mat &_A)
Definition: kalman.h:198
void window(const int fig, const char *name, const int x, const int y, const int width, const int height)
Configure the figure used Windows environment.
Definition: gplot.h:182
void plot_add(const T1 &x, const T2 &y, const std::string lb, const std::string ls="lines")
Push plot y vs. x with label and linespec.
Definition: gplot.h:316
void rts_smooth(const arma::mat &Xf, const arma::cube &Pf, arma::mat &Xs, arma::cube &Ps)
Rauch-Tung-Striebel smoother. See http://www.lce.hut.fi/~ssarkka/course_k2011/pdf/course_booklet_2011...
Definition: kalman.h:283
arma::mat get_err(void)
Definition: kalman.h:238
void set_meas_noise(const arma::mat &_R)
Definition: kalman.h:218
arma::mat get_err_cov(void)
Definition: kalman.h:240