@@ -8,8 +8,9 @@ namespace kf
88namespace motionmodel
99{
1010// / @brief Base class for motion models used by kalman filters
11+ // / @tparam Derived Derived class which implement the interfaces
1112// / @tparam DIM_X State space vector dimension
12- template <int32_t DIM_X >
13+ template <class Derived , int32_t DIM_X >
1314class MotionModel
1415{
1516 public:
@@ -18,28 +19,34 @@ class MotionModel
1819 // / @param vecX State space vector \vec{x}
1920 // / @param vecQ State white gaussian noise vector \vec{q}
2021 // / @return Predicted/ propagated state space vector
21- virtual Vector<DIM_X > f (
22- Vector<DIM_X > const & vecX,
23- Vector<DIM_X > const & vecQ = Vector<DIM_X >::Zero()) const = 0;
22+ Vector<DIM_X > f (Vector<DIM_X > const & vecX,
23+ Vector<DIM_X > const & vecQ = Vector<DIM_X >::Zero()) const
24+ {
25+ return static_cast <Derived const *>(this )->f (vecX, vecQ);
26+ }
2427
2528 // / @brief Get the process noise covariance Q
2629 // / @param vecX State space vector \vec{x}
2730 // / @return The process noise covariance Q
28- virtual Matrix<DIM_X , DIM_X > getProcessNoiseCov (
29- Vector<DIM_X > const & vecX) const = 0;
31+ Matrix<DIM_X , DIM_X > getProcessNoiseCov (Vector<DIM_X > const & vecX) const
32+ {
33+ return static_cast <Derived const *>(this )->getProcessNoiseCov (vecX);
34+ }
3035
3136 // / @brief Method that calculates the jacobians of the state transition model.
3237 // / @param vecX State Space vector \vec{x}
3338 // / @return The jacobians of the state transition model.
34- virtual Matrix<DIM_X , DIM_X > getJacobianFk (
35- Vector<DIM_X > const & vecX) const = 0;
39+ Matrix<DIM_X , DIM_X > getJacobianFk (Vector<DIM_X > const & vecX) const
40+ {
41+ return static_cast <Derived const *>(this )->getJacobianFk (vecX);
42+ }
3643};
3744
3845// / @brief Base class for motion models with external inputs used by kalman
3946// / filters
4047// / @tparam DIM_X State space vector dimension
4148// / @tparam DIM_U Input space vector dimension
42- template <int32_t DIM_X , int32_t DIM_U >
49+ template <class Derived , int32_t DIM_X , int32_t DIM_U >
4350class MotionModelExtInput
4451{
4552 public:
@@ -49,37 +56,51 @@ class MotionModelExtInput
4956 // / @param vecU Input space vector \vec{u}
5057 // / @param vecQ State white gaussian noise vector \vec{q}
5158 // / @return Predicted/ propagated state space vector
52- virtual Vector<DIM_X > f (
53- Vector<DIM_X > const & vecX, Vector<DIM_U > const & vecU,
54- Vector<DIM_X > const & vecQ = Vector<DIM_X >::Zero()) const = 0;
59+ Vector<DIM_X > f (Vector<DIM_X > const & vecX, Vector<DIM_U > const & vecU,
60+ Vector<DIM_X > const & vecQ = Vector<DIM_X >::Zero()) const
61+ {
62+ return static_cast <Derived const *>(this )->f (vecX, vecU, vecQ);
63+ }
5564
5665 // / @brief Get the process noise covariance Q
5766 // / @param vecX State space vector \vec{x}
5867 // / @param vecU Input space vector \vec{u}
5968 // / @return The process noise covariance Q
60- virtual Matrix<DIM_X , DIM_X > getProcessNoiseCov (
61- Vector<DIM_X > const & vecX, Vector<DIM_U > const & vecU) const = 0;
69+ Matrix<DIM_X , DIM_X > getProcessNoiseCov (Vector<DIM_X > const & vecX,
70+ Vector<DIM_U > const & vecU) const
71+ {
72+ return static_cast <Derived const *>(this )->getProcessNoiseCov (vecX, vecU);
73+ }
6274
6375 // / @brief Get the input noise covariance U
6476 // / @param vecX State space vector \vec{x}
6577 // / @param vecU Input space vector \vec{u}
6678 // / @return The input noise covariance U
67- virtual Matrix<DIM_X , DIM_X > getInputNoiseCov (
68- Vector<DIM_X > const & vecX, Vector<DIM_U > const & vecU) const = 0;
79+ Matrix<DIM_X , DIM_X > getInputNoiseCov (Vector<DIM_X > const & vecX,
80+ Vector<DIM_U > const & vecU) const
81+ {
82+ return static_cast <Derived const *>(this )->getInputNoiseCov (vecX, vecU);
83+ }
6984
7085 // / @brief Method that calculates the jacobians of the state transition model.
7186 // / @param vecX State Space vector \vec{x}
7287 // / @param vecU Input Space vector \vec{u}
7388 // / @return The jacobians of the state transition model.
74- virtual Matrix<DIM_X , DIM_X > getJacobianFk (
75- Vector<DIM_X > const & vecX, Vector<DIM_U > const & vecU) const = 0;
89+ Matrix<DIM_X , DIM_X > getJacobianFk (Vector<DIM_X > const & vecX,
90+ Vector<DIM_U > const & vecU) const
91+ {
92+ return static_cast <Derived const *>(this )->getJacobianFk (vecX, vecU);
93+ }
7694
7795 // / @brief Method that calculates the jacobians of the input transition model.
7896 // / @param vecX State Space vector \vec{x}
7997 // / @param vecU Input Space vector \vec{u}
8098 // / @return The jacobians of the input transition model.
81- virtual Matrix<DIM_X , DIM_U > getJacobianBk (
82- Vector<DIM_X > const & vecX, Vector<DIM_U > const & vecU) const = 0;
99+ Matrix<DIM_X , DIM_U > getJacobianBk (Vector<DIM_X > const & vecX,
100+ Vector<DIM_U > const & vecU) const
101+ {
102+ return static_cast <Derived const *>(this )->getJacobianBk (vecX, vecU);
103+ }
83104};
84105} // namespace motionmodel
85106} // namespace kf
0 commit comments