Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Kalman.cpp
1 #include <StateEstimator/Kalman.hh>
2 
3 #include <Base/Common/BIASpragma.hh>
4 
5 using namespace BIAS;
6 using namespace std;
7 
8 
9 
11 {
12  SystemStateDim_=MeasurementDim_=0;
13 }
14 
15 Kalman::Kalman(const Matrix<double>& SystemMatrix,
16  const Matrix<double>& MeasurementMatrix,
17  const Vector<double>& InitialSystemState,
18  const Matrix<double>& InitialSystemCovariance)
19 {
20  Init(SystemMatrix, MeasurementMatrix, InitialSystemState,
21  InitialSystemCovariance);
22 }
23 
25 {}
26 
27 void Kalman::Init(const Matrix<double>& SystemMatrix,
28  const Matrix<double>& MeasurementMatrix,
29  const Vector<double>& InitialSystemState,
30  const Matrix<double>& InitialSystemCovariance)
31 {
32  State_ = InitialSystemState;
33  Covariance_ = InitialSystemCovariance;
34  SystemStateDim_ = InitialSystemState.size();
35  MeasurementDim_ = MeasurementMatrix.num_rows();
36 
37  A_ = SystemMatrix;
38  AT_ = A_.Transpose();
39  H_ = MeasurementMatrix;
40  HT_ = H_.Transpose();
41 
42  Identity_.newsize(SystemStateDim_, SystemStateDim_);
43  Identity_.SetIdentity();
44 
45  BIASASSERT(A_.num_cols()==SystemStateDim_);
46  BIASASSERT(A_.num_rows()==SystemStateDim_);
47 
48  BIASASSERT(H_.num_cols()==SystemStateDim_);
49 }
50 
51 void Kalman::Predict(const Matrix<double>& ProcessCovariance)
52 {
53  BIASASSERT(A_.num_cols()!=0);
54  BIASASSERT(A_.num_rows()!=0);
55  State_ = A_ * State_;
56  Covariance_ = A_ * Covariance_ * AT_ + ProcessCovariance;
57 }
58 
59 void Kalman::Predict(const Matrix<double>& SystemMatrix,
60  const Matrix<double>& ProcessCovariance)
61 {
62  A_=SystemMatrix;
63 
64  BIASASSERT(A_.num_cols()==SystemStateDim_);
65  BIASASSERT(A_.num_rows()==SystemStateDim_);
66 
67  AT_=A_.Transpose();
68 
69  Predict(ProcessCovariance);
70 }
71 
72 void Kalman::Update(const Vector<double>& Measurement,
73  const Matrix<double>& MeasurementCovariance)
74 {
75  BIASASSERT(Measurement.size()==MeasurementDim_);
76  BIASASSERT(MeasurementCovariance.num_cols()==MeasurementDim_);
77  BIASASSERT(MeasurementCovariance.num_rows()==MeasurementDim_);
78 
79  Matrix<double> denominator;
80  denominator = H_ * Covariance_ * HT_ + MeasurementCovariance;
81  Matrix<double> inv;
82  inv = svd_.Invert(denominator);
83 
85  K = Covariance_ * HT_ * inv;
86 
87  State_ = State_ + K*(Measurement - H_*State_);
88 
89  Covariance_ = (Identity_ - K * H_) * Covariance_;
90 }
Subscript num_cols() const
Definition: cmat.h:320
Matrix< T > Transpose() const
transpose function, storing data destination matrix
Definition: Matrix.hh:823
void Init(const Matrix< double > &SystemMatrix, const Matrix< double > &MeasurementMatrix, const Vector< double > &InitialSystemState, const Matrix< double > &InitialSystemCovariance)
Definition: Kalman.cpp:27
Matrix< T > & newsize(Subscript M, Subscript N)
Definition: cmat.h:269
void Update(const Vector< double > &Measurement, const Matrix< double > &MeasurementCovariance)
Calculates the update step.
Definition: Kalman.cpp:72
void Predict(const Matrix< double > &ProcessCovariance)
Calculates the prediction using the system matrix A.
Definition: Kalman.cpp:51
Subscript num_rows() const
Definition: cmat.h:319
Subscript size() const
Definition: vec.h:262