This repository has been archived by the owner on Sep 11, 2020. It is now read-only.
forked from Octogonapus/kalman-cpp
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkalman.cpp
74 lines (63 loc) · 1.41 KB
/
kalman.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <stdexcept>
#include "kalman.hpp"
KalmanFilter::KalmanFilter(
double dt,
const Eigen::MatrixXd& A,
const Eigen::MatrixXd& B,
const Eigen::MatrixXd& H,
const Eigen::MatrixXd& Q,
const Eigen::MatrixXd& R,
const Eigen::MatrixXd& P):
A(A), B(B), H(H), Q(Q), R(R), P0(P),
m(H.rows()), n(A.rows()), dt(dt), initialized(false),
I(n, n), x_hat(n), x_hat_new(n), u(n)
{
I.setIdentity();
}
void KalmanFilter::init()
{
x_hat.setZero();
P = P0;
t0 = 0;
t = t0;
u = u.Zero(B.cols());
initialized = true;
}
void KalmanFilter::init(double t0, const Eigen::VectorXd& x0)
{
x_hat = x0;
P = P0;
this->t0 = t0;
t = t0;
u = u.Zero(B.cols());
initialized = true;
}
void KalmanFilter::update(const Eigen::VectorXd& z)
{
if(!initialized)
throw std::runtime_error("Cannot update: Kalman filter not initialized.");
x_hat_new = A * x_hat + B * u;
P = A*P*A.transpose() + Q;
K = P*H.transpose()*(H*P*H.transpose() + R).inverse();
x_hat_new += K * (z - H*x_hat_new);
P = (I - K*H)*P;
x_hat = x_hat_new;
t += dt;
}
void KalmanFilter::update(const Eigen::VectorXd& z, const Eigen::VectorXd& u)
{
this->u = u;
update(z);
}
void KalmanFilter::update(const Eigen::VectorXd& z, const double dt)
{
this->dt = dt;
update(z);
}
void KalmanFilter::update(const Eigen::VectorXd& z, const double dt, const Eigen::MatrixXd A)
{
this->A = A;
this->dt = dt;
update(z);
}