Skip to content

Commit e24f1b5

Browse files
authored
adding kalman filter
contains basic 1-D implementation of Kalman filter concepts
1 parent 0cc3b6a commit e24f1b5

7 files changed

+136
-0
lines changed

Kalman_filter/gaussian.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include <iostream>
2+
#include <math.h>
3+
4+
using namespace std;
5+
6+
float gauss(float,float,float);
7+
8+
float gauss(float mu,float sigma2,float x)
9+
{
10+
float prob=(1.0/2.0*M_PI*sigma2)*exp(-0.5*(pow((x-mu),2)/sigma2));
11+
return prob;
12+
}

Kalman_filter/main.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "gaussian.hpp"
2+
#include "measurement_update.hpp"
3+
#include "motion_update.hpp"
4+
5+
int main()
6+
{
7+
double measurements[5] = { 5, 6, 7, 9, 10 };
8+
double measurement_sig = 4;
9+
10+
//Motions and motion variance
11+
double motion[5] = { 1, 1, 2, 1, 1 };
12+
double motion_sig = 2;
13+
14+
//Initial state
15+
double mu = 50;
16+
double sig = 28;
17+
18+
for(int i=0;i<sizeof(measurements)/sizeof(measurements[0]);i++)
19+
{
20+
tie(mu,sig)=parameter_update(mu,measurements[i],sig,measurement_sig);
21+
printf("update: [%f, %f]\n", mu, sig);
22+
tie(mu, sig) = state_update(mu, motion[i],sig, motion_sig);
23+
printf("predict: [%f, %f]\n", mu, sig);
24+
25+
}
26+
}

Kalman_filter/main.exe

288 KB
Binary file not shown.

Kalman_filter/measurement_update.exe

23.8 MB
Binary file not shown.

Kalman_filter/measurement_update.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include <iostream>
2+
#include <math.h>
3+
#include <tuple>
4+
5+
double newmu,newvar;
6+
tuple<double,double> parameter_update(double mu1,double mu2,double sigma2a, double sigma2b)
7+
{
8+
newmu=(sigma2b*mu1+sigma2a*mu2)/(sigma2b+sigma2a);
9+
newvar=1.0/(1.0/sigma2a+1.0/sigma2b);
10+
11+
return make_tuple(newmu,newvar);
12+
}

Kalman_filter/motion_update.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include <iostream>
2+
#include <math.h>
3+
#include <tuple>
4+
5+
double mu,var;
6+
tuple<double,double> state_update(double mu1,double mu2,double sigma2a, double sigma2b)
7+
{
8+
mu=mu1+mu2;
9+
var=sigma2a+sigma2b;
10+
11+
return make_tuple(mu,var);
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#include <iostream>
2+
#include <math.h>
3+
#include <tuple>
4+
#include "Core" // Eigen Library
5+
#include "LU" // Eigen Library
6+
7+
using namespace std;
8+
using namespace Eigen;
9+
10+
float measurements[3] = { 1, 2, 3 };
11+
12+
tuple<MatrixXf, MatrixXf> kalman_filter(MatrixXf x, MatrixXf P, MatrixXf u, MatrixXf F, MatrixXf H, MatrixXf R, MatrixXf I)
13+
{
14+
for (int n = 0; n < sizeof(measurements) / sizeof(measurements[0]); n++) {
15+
//****** TODO: Kalman-filter function********//
16+
17+
// Measurement Update
18+
// Code the Measurement Update
19+
// Initialize and Compute Z, y, S, K, x, and P
20+
MatrixXf Z(1,1);
21+
Z<<measurements[n];
22+
23+
MatrixXf y(1,1);
24+
y<<Z-H*x;
25+
26+
MatrixXf S(1,1);
27+
S<<H*P*H.transpose()+R;
28+
29+
MatrixXf K(2,1);
30+
K<<P*H.transpose()*S.inverse();
31+
32+
x<<x+K*y;
33+
34+
P << (I - (K * H)) * P;
35+
36+
// Prediction
37+
x << (F * x) + u;
38+
P << F * P * F.transpose();
39+
40+
}
41+
42+
return make_tuple(x, P);
43+
}
44+
45+
int main()
46+
{
47+
48+
MatrixXf x(2, 1);// Initial state (location and velocity)
49+
x << 0,
50+
0;
51+
MatrixXf P(2, 2);//Initial Uncertainty
52+
P << 100, 0,
53+
0, 100;
54+
MatrixXf u(2, 1);// External Motion
55+
u << 0,
56+
0;
57+
MatrixXf F(2, 2);//Next State Function
58+
F << 1, 1,
59+
0, 1;
60+
MatrixXf H(1, 2);//Measurement Function
61+
H << 1,
62+
0;
63+
MatrixXf R(1, 1); //Measurement Uncertainty
64+
R << 1;
65+
MatrixXf I(2, 2);// Identity Matrix
66+
I << 1, 0,
67+
0, 1;
68+
69+
tie(x, P) = kalman_filter(x, P, u, F, H, R, I);
70+
cout << "x= " << x << endl;
71+
cout << "P= " << P << endl;
72+
73+
return 0;
74+
}

0 commit comments

Comments
 (0)