mrs_lib
Various reusable classes, functions and utilities for use in MRS projects
Loading...
Searching...
No Matches
dkf.h
1// clang: MatousFormat
7#ifndef DKF_H
8#define DKF_H
9
10#include <mrs_lib/lkf.h>
12#include <iostream>
13
14namespace mrs_lib
15{
16
17 /* class DKF //{ */
26 template <int n_states, int n_inputs>
27 class DKF : public LKF<n_states, n_inputs, -1>
28 {
29 public:
30 /* DKF definitions (typedefs, constants etc) //{ */
31 using Base_class = LKF<n_states, n_inputs, -1>;
33 static constexpr int n = Base_class::n;
34 static constexpr int m = Base_class::m;
35 static constexpr int p = Base_class::p;
37 using x_t = typename Base_class::x_t;
38 using u_t = typename Base_class::u_t;
39 using z_t = typename Base_class::z_t;
40 using P_t = typename Base_class::P_t;
41 using R_t = typename Base_class::R_t;
42 using Q_t = typename Base_class::Q_t;
45 typedef Eigen::Matrix<double, n, n> A_t;
46 typedef Eigen::Matrix<double, n, m> B_t;
47 typedef Eigen::Matrix<double, p, n> H_t;
48 typedef Eigen::Matrix<double, n, p> K_t;
50 using mat2_t = Eigen::Matrix<double, 2, 2>;
51 using mat3_t = Eigen::Matrix<double, 3, 3>;
52 using pt3_t = mrs_lib::geometry::vec3_t;
53 using pt2_t = mrs_lib::geometry::vec2_t;
54 using vec3_t = mrs_lib::geometry::vec3_t;
55 //}
56
57 public:
64 DKF(){};
65
73 DKF(const A_t& A, const B_t& B) : Base_class(A, B, {}){};
74
75 /* correctLine() method //{ */
89 virtual std::enable_if_t<((n > 3) || (n == Eigen::Dynamic)), statecov_t> correctLine(const statecov_t& sc, const pt3_t& line_origin,
90 const vec3_t& line_direction, const double line_variance) const
91 {
92 assert(line_direction.norm() > 0.0);
93
94 using M_t = Eigen::Matrix<double, 3, n>;
95 using W_t = Eigen::Matrix<double, 3, 1>;
96 using N_t = Eigen::Matrix<double, 3, 2>;
97 using o_t = Eigen::Matrix<double, 3, 1>;
98 using R_t = Eigen::Matrix<double, 2, 2>;
99
100 const M_t M = M_t::Identity(3, sc.P.cols());
101 const W_t W = line_direction;
102 const o_t o = line_origin;
103
104 // doesn't work - the kernel is always zero for some reason
105 /* const Eigen::FullPivLU<W_t> lu(W); */
106 /* const N_t N = lu.kernel(); */
107 // works for a line measurement
108 const mat3_t rot = mrs_lib::geometry::rotationBetween(W_t::UnitX(), W);
109 // the first column should have the same direction as W - we don't care about it,
110 // take the second and third column vectors, those are the null space of W
111 const N_t N = rot.block<3, 2>(0, 1);
112 const z_t z = N.transpose() * o;
113 const H_t H = N.transpose() * M;
114 const R_t R = line_variance * N.transpose() * N;
115
116 return this->correction_impl(sc, z, R, H);
117 };
118 //}
119
120 /* correctPlane() method //{ */
134 virtual std::enable_if_t<((n > 3) || (n == Eigen::Dynamic)), statecov_t> correctPlane(const statecov_t& sc, const pt3_t& plane_origin,
135 const vec3_t& plane_normal, const double plane_variance) const
136 {
137 assert(plane_normal.norm() > 0.0);
138
139 // we don't need W, since the plane is minimally defined by its origin and normal, where the normal is a basis for its null space
140 using M_t = Eigen::Matrix<double, 3, n>;
141 using N_t = Eigen::Matrix<double, 3, 1>;
142 using o_t = Eigen::Matrix<double, 3, 1>;
143 using R_t = Eigen::Matrix<double, 1, 1>;
144
145 const M_t M = M_t::Identity(3, sc.P.cols());
146 const o_t o = plane_origin;
147
148 const N_t N = plane_normal.normalized(); // works for plane
149 const z_t z = N.transpose() * o;
150 const H_t H = N.transpose() * M;
151 const R_t R = (R_t() << plane_variance).finished(); // R is a scalar here
152
153 return this->correction_impl(sc, z, R, H);
154 };
155 //}
156 };
157 //}
158
159} // namespace mrs_lib
160
161#endif // DKF_H
Implementation of the Degenerate measurement Linear Kalman filter.
Definition dkf.h:28
Eigen::Matrix< double, n, n > A_t
System transition matrix type .
Definition dkf.h:45
Eigen::Matrix< double, n, p > K_t
Kalman gain matrix type .
Definition dkf.h:48
typename Base_class::statecov_t statecov_t
Helper struct for passing around the state and its covariance in one variable.
Definition dkf.h:43
typename Base_class::z_t z_t
Measurement vector type .
Definition dkf.h:39
typename Base_class::P_t P_t
State uncertainty covariance matrix type .
Definition dkf.h:40
virtual std::enable_if_t<((n > 3)||(n==Eigen::Dynamic)), statecov_t > correctPlane(const statecov_t &sc, const pt3_t &plane_origin, const vec3_t &plane_normal, const double plane_variance) const
Applies the correction (update, measurement, data) step of the Kalman filter.
Definition dkf.h:134
typename Base_class::u_t u_t
Input vector type .
Definition dkf.h:38
typename Base_class::Q_t Q_t
Process noise covariance matrix type .
Definition dkf.h:42
typename Base_class::R_t R_t
Measurement noise covariance matrix type .
Definition dkf.h:41
static constexpr int p
Length of the measurement vector of the system.
Definition dkf.h:35
static constexpr int m
Length of the input vector of the system.
Definition dkf.h:34
DKF()
Convenience default constructor.
Definition dkf.h:64
Eigen::Matrix< double, n, m > B_t
Input to state mapping matrix type .
Definition dkf.h:46
typename Base_class::x_t x_t
State vector type .
Definition dkf.h:37
static constexpr int n
Length of the state vector of the system.
Definition dkf.h:33
virtual std::enable_if_t<((n > 3)||(n==Eigen::Dynamic)), statecov_t > correctLine(const statecov_t &sc, const pt3_t &line_origin, const vec3_t &line_direction, const double line_variance) const
Applies the correction (update, measurement, data) step of the Kalman filter.
Definition dkf.h:89
DKF(const A_t &A, const B_t &B)
The main constructor.
Definition dkf.h:73
Eigen::Matrix< double, p, n > H_t
State to measurement mapping matrix type .
Definition dkf.h:47
Implementation of the Linear Kalman filter .
Definition lkf.h:39
A_t A
The system transition matrix .
Definition lkf.h:148
static constexpr int n
Length of the state vector of the system.
Definition lkf.h:42
B_t B
The input to state mapping matrix .
Definition lkf.h:149
typename Base_class::statecov_t statecov_t
Helper struct for passing around the state and its covariance in one variable.
Definition lkf.h:53
H_t H
The state to measurement mapping matrix .
Definition lkf.h:150
typename Base_class::R_t R_t
Measurement noise covariance matrix type .
Definition lkf.h:51
typename Base_class::P_t P_t
State uncertainty covariance matrix type .
Definition lkf.h:50
typename Base_class::Q_t Q_t
Process noise covariance matrix type .
Definition lkf.h:52
static constexpr int p
Length of the measurement vector of the system.
Definition lkf.h:44
typename Base_class::u_t u_t
Input vector type .
Definition lkf.h:48
static constexpr int m
Length of the input vector of the system.
Definition lkf.h:43
typename Base_class::x_t x_t
State vector type .
Definition lkf.h:47
typename Base_class::z_t z_t
Measurement vector type .
Definition lkf.h:49
Defines useful geometry utilities and functions.
All mrs_lib functions, classes, variables and definitions are contained in this namespace.
Definition attitude_converter.h:24