LArSoft  v10_06_00
Liquid Argon Software toolkit - https://larsoft.org/
KalmanFilter.cc
Go to the documentation of this file.
1 
10 
11 using namespace Eigen;
12 
13 namespace lar_content
14 {
15 
16 KalmanFilter3D::KalmanFilter3D(double dt, double processVariance, double measurementVariance, const VectorXd &x) :
17  m_dt{dt}
18 {
19  m_x = VectorXd::Zero(6);
20  m_x.head(3) = x;
21  m_P = MatrixXd::Identity(6, 6);
22  m_F = MatrixXd::Identity(6, 6);
23  for (int i = 0; i < 3; ++i)
24  {
25  m_F(i, i + 3) = dt;
26  }
27  m_H = MatrixXd::Zero(3, 6);
28  m_H.block<3, 3>(0, 0) = MatrixXd::Identity(3, 3);
29  m_Q = MatrixXd::Zero(6, 6);
30  for (int i = 0; i < 3; ++i)
31  {
32  m_Q(i, i) = (0.25 * dt * dt * dt * dt) * processVariance;
33  m_Q(i, i + 3) = (0.5 * dt * dt * dt) * processVariance;
34  m_Q(i + 3, i) = (0.5 * dt * dt * dt) * processVariance;
35  m_Q(i + 3, i + 3) = (dt * dt) * processVariance;
36  }
37  m_R = MatrixXd::Identity(3, 3) * measurementVariance;
38 }
39 
40 //------------------------------------------------------------------------------------------------------------------------------------------
41 
43 {
44 }
45 
46 //------------------------------------------------------------------------------------------------------------------------------------------
47 
49 {
50  m_xTemp = m_F * m_x;
51  m_PTemp = m_F * m_P * m_F.transpose() + m_Q;
52 }
53 
54 //------------------------------------------------------------------------------------------------------------------------------------------
55 
56 void KalmanFilter3D::Update(const VectorXd &z)
57 {
58  m_x = m_xTemp;
59  m_P = m_PTemp;
60  VectorXd y = z - m_H * m_x;
61  MatrixXd S = m_H * m_P * m_H.transpose() + m_R;
62  MatrixXd K = m_P * m_H.transpose() * S.inverse();
63  m_x += K * y;
64  m_P = (MatrixXd::Identity(6, 6) - K * m_H) * m_P;
65 }
66 
67 //------------------------------------------------------------------------------------------------------------------------------------------
68 
69 const VectorXd &KalmanFilter3D::GetState() const
70 {
71  return m_x;
72 }
73 
74 //------------------------------------------------------------------------------------------------------------------------------------------
75 
76 const VectorXd KalmanFilter3D::GetPosition() const
77 {
78  return m_x.head(3);
79 }
80 
81 //------------------------------------------------------------------------------------------------------------------------------------------
82 
83 const VectorXd KalmanFilter3D::GetDirection() const
84 {
85  return m_x.tail(3).normalized();
86 }
87 
88 //------------------------------------------------------------------------------------------------------------------------------------------
89 
90 const VectorXd &KalmanFilter3D::GetTemporaryState() const
91 {
92  return m_xTemp;
93 }
94 
95 //------------------------------------------------------------------------------------------------------------------------------------------
96 //------------------------------------------------------------------------------------------------------------------------------------------
97 
98 KalmanFilter2D::KalmanFilter2D(double dt, double processVariance, double measurementVariance, const VectorXd &x) :
99  m_dt{dt}
100 {
101  m_x = VectorXd::Zero(4);
102  m_x.head(2) = x;
103  m_P = MatrixXd::Identity(4, 4);
104  m_F = MatrixXd::Identity(4, 4);
105  for (int i = 0; i < 2; ++i)
106  {
107  m_F(i, i + 2) = dt;
108  }
109  m_H = MatrixXd::Zero(2, 4);
110  m_H.block<2, 2>(0, 0) = MatrixXd::Identity(3, 3);
111  m_Q = MatrixXd::Zero(4, 4);
112  for (int i = 0; i < 2; ++i)
113  {
114  m_Q(i, i) = (0.25 * dt * dt * dt * dt) * processVariance;
115  m_Q(i, i + 2) = (0.5 * dt * dt * dt) * processVariance;
116  m_Q(i + 2, i) = (0.5 * dt * dt * dt) * processVariance;
117  m_Q(i + 2, i + 2) = (dt * dt) * processVariance;
118  }
119  m_R = MatrixXd::Identity(2, 2) * measurementVariance;
120 }
121 
122 //------------------------------------------------------------------------------------------------------------------------------------------
123 
125 {
126 }
127 
128 //------------------------------------------------------------------------------------------------------------------------------------------
129 
131 {
132  m_xTemp = m_F * m_x;
133  m_PTemp = m_F * m_P * m_F.transpose() + m_Q;
134 }
135 
136 //------------------------------------------------------------------------------------------------------------------------------------------
137 
138 void KalmanFilter2D::Update(const VectorXd &z)
139 {
140  m_x = m_xTemp;
141  m_P = m_PTemp;
142  VectorXd y{z - m_H * m_x};
143  MatrixXd S{m_H * m_P * m_H.transpose() + m_R};
144  MatrixXd K{m_P * m_H.transpose() * S.inverse()};
145  m_x += K * y;
146  m_P = (MatrixXd::Identity(4, 4) - K * m_H) * m_P;
147 }
148 
149 //------------------------------------------------------------------------------------------------------------------------------------------
150 
151 const VectorXd &KalmanFilter2D::GetState() const
152 {
153  return m_x;
154 }
155 
156 //------------------------------------------------------------------------------------------------------------------------------------------
157 
158 const VectorXd KalmanFilter2D::GetPosition() const
159 {
160  return m_x.head(2);
161 }
162 
163 //------------------------------------------------------------------------------------------------------------------------------------------
164 
165 const VectorXd KalmanFilter2D::GetDirection() const
166 {
167  return m_x.tail(2).normalized();
168 }
169 
170 //------------------------------------------------------------------------------------------------------------------------------------------
171 
172 const VectorXd &KalmanFilter2D::GetTemporaryState() const
173 {
174  return m_xTemp;
175 }
176 
177 } // namespace lar_content
Float_t x
Definition: compare.C:6
Eigen::MatrixXd m_R
Measurement covariance matrix.
Definition: KalmanFilter.h:83
Eigen::MatrixXd m_P
Covariance matrix.
Definition: KalmanFilter.h:80
const Eigen::VectorXd & GetState() const
Get the current state vector.
Definition: KalmanFilter.cc:69
const Eigen::VectorXd GetDirection() const
Get the current direction vector.
Definition: KalmanFilter.cc:83
Float_t y
Definition: compare.C:6
const Eigen::VectorXd GetPosition() const
Get the current position vector.
Definition: KalmanFilter.cc:76
const Eigen::VectorXd & GetState() const
Get the current state vector.
Double_t z
Definition: plot.C:276
Eigen::MatrixXd m_H
Measurement matrix.
Definition: KalmanFilter.h:82
Eigen::MatrixXd m_F
State transition matrix.
Definition: KalmanFilter.h:154
Eigen::VectorXd m_x
State vector (tracks position and &#39;velocity&#39;)
Definition: KalmanFilter.h:152
void Predict()
Uses the state transition matrix to predict the next state.
Definition: KalmanFilter.cc:48
Eigen::VectorXd m_xTemp
Temporary state vector.
Definition: KalmanFilter.h:85
Eigen::MatrixXd m_P
Covariance matrix.
Definition: KalmanFilter.h:153
Eigen::VectorXd m_xTemp
Temporary state vector.
Definition: KalmanFilter.h:158
const Eigen::VectorXd GetDirection() const
Get the current direction vector.
Eigen::MatrixXd m_H
Measurement matrix.
Definition: KalmanFilter.h:155
const Eigen::VectorXd GetPosition() const
Get the current position vector.
KalmanFilter2D(double dt, double processVariance, double measurementVariance, const Eigen::VectorXd &x)
Default constructor.
Definition: KalmanFilter.cc:98
const Eigen::VectorXd & GetTemporaryState() const
Get the temporary state vector.
Definition: KalmanFilter.cc:90
Eigen::VectorXd m_x
State vector (tracks position and &#39;velocity&#39;)
Definition: KalmanFilter.h:79
Eigen::MatrixXd m_PTemp
Temporary covariance matrix.
Definition: KalmanFilter.h:159
Kalman filter for predicting 3D trajectories.
Eigen::MatrixXd m_PTemp
Temporary covariance matrix.
Definition: KalmanFilter.h:86
Eigen::MatrixXd m_F
State transition matrix.
Definition: KalmanFilter.h:81
void Predict()
Uses the state transition matrix to predict the next state.
double m_dt
Time step.
Definition: KalmanFilter.h:78
Eigen::MatrixXd m_R
Measurement covariance matrix.
Definition: KalmanFilter.h:156
void Update(const Eigen::VectorXd &z)
Uses the measurement matrix to update the state estimate.
Definition: KalmanFilter.cc:56
Eigen::MatrixXd m_Q
Process covariance matrix.
Definition: KalmanFilter.h:157
const Eigen::VectorXd & GetTemporaryState() const
Get the temporary state vector.
void Update(const Eigen::VectorXd &z)
Uses the measurement matrix to update the state estimate.
Eigen::MatrixXd m_Q
Process covariance matrix.
Definition: KalmanFilter.h:84