system_model.h
Go to the documentation of this file.
1 //=================================================================================================
2 // Copyright (c) 2011, Johannes Meyer and Martin Nowara, TU Darmstadt
3 // All rights reserved.
4 
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 // * Redistributions in binary form must reproduce the above copyright
10 // notice, this list of conditions and the following disclaimer in the
11 // documentation and/or other materials provided with the distribution.
12 // * Neither the name of the Flight Systems and Automatic Control group,
13 // TU Darmstadt, nor the names of its contributors may be used to
14 // endorse or promote products derived from this software without
15 // specific prior written permission.
16 
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
21 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 //=================================================================================================
28 
29 #ifndef HECTOR_POSE_ESTIMATION_SYSTEM_MODEL_H
30 #define HECTOR_POSE_ESTIMATION_SYSTEM_MODEL_H
31 
35 
36 namespace hector_pose_estimation {
37 
38 class SystemModel : public Model {
39 public:
40  virtual ~SystemModel() {}
41 
42  virtual bool init(PoseEstimation& estimator, System &system, State& state) { return true; }
43 
45  virtual SystemTypeEnum getSystemType() const { return UNKNOWN_SYSTEM_TYPE; }
46 
47  virtual SystemStatus getStatusFlags(const State& state) { return SystemStatus(0); }
48  virtual bool active(const State& state) { return true; }
49 
50  virtual void getPrior(State &state) {}
51 
52  virtual bool prepareUpdate(State& state, double dt) { return true; }
53  virtual void afterUpdate(State& state) {}
54 
55  virtual bool limitState(State& state) { return true; }
56 };
57 
58 namespace traits {
59 
60  template <class Derived, int _VectorDimension = Derived::VectorDimension, int _CovarianceDimension = _VectorDimension>
61  struct SystemModel {
62  enum { VectorDimension = _VectorDimension };
63  enum { CovarianceDimension = _CovarianceDimension };
64 
68 
69  enum { InputDimension = traits::Input<Derived>::Dimension };
73 
76 
80  typedef Block<SystemMatrix,VectorDimension,SystemMatrix::ColsAtCompileTime> SystemMatrixBlock;
81 
85  typedef Block<const SystemMatrix,VectorDimension,SystemMatrix::ColsAtCompileTime> ConstSystemMatrixBlock;
86  };
87 
88  #define SYSTEM_MODEL_TRAIT(Derived, _VectorDimension, _CovarianceDimension) \
89  typedef traits::SystemModel<Derived, _VectorDimension, _CovarianceDimension> trait; \
90  \
91  enum { VectorDimension = trait::VectorDimension }; \
92  enum { CovarianceDimension = trait::CovarianceDimension }; \
93  \
94  typedef typename trait::StateVector StateVector; \
95  typedef typename trait::NoiseVariance NoiseVariance; \
96  typedef typename trait::SystemMatrix SystemMatrix; \
97  \
98  enum { InputDimension = trait::InputDimension }; \
99  typedef typename trait::InputType InputType; \
100  typedef typename trait::InputVector InputVector; \
101  typedef typename trait::InputMatrix InputMatrix; \
102  \
103  typedef typename trait::SubState SubState; \
104  typedef typename trait::Vector Vector; \
105  \
106  typedef typename trait::VectorSegment VectorSegment; \
107  typedef typename trait::CovarianceBlock CovarianceBlock; \
108  typedef typename trait::CrossVarianceBlock CrossVarianceBlock; \
109  typedef typename trait::SystemMatrixBlock SystemMatrixBlock; \
110  \
111  typedef typename trait::ConstVectorSegment ConstVectorSegment; \
112  typedef typename trait::ConstCovarianceBlock ConstCovarianceBlock; \
113  typedef typename trait::ConstCrossVarianceBlock ConstCrossVarianceBlock; \
114  typedef typename trait::ConstSystemMatrixBlock ConstSystemMatrixBlock; \
115 
116 } // namespace traits
117 
118 template <class Derived, int _VectorDimension = Dynamic, int _CovarianceDimension = _VectorDimension>
119 class SystemModel_ : public SystemModel {
120 public:
121  SYSTEM_MODEL_TRAIT(Derived, _VectorDimension, _CovarianceDimension)
122  virtual ~SystemModel_() {}
123 
125 
126  virtual void getPrior(State &state);
127 
128  Derived *derived() { return static_cast<Derived *>(this); }
129  const Derived *derived() const { return static_cast<const Derived *>(this); }
130 
131  virtual void getExpectedDiff(StateVector& x_diff, const State& state, double dt);
132  virtual void getStateJacobian(SystemMatrix& A, const State& state, double dt, bool init = true);
133  virtual void getInputJacobian(InputMatrix& B, const State& state, double dt, bool init = true);
134  virtual void getSystemNoise(NoiseVariance& Q, const State& state, double dt, bool init = true);
135 };
136 
137 template <class Derived, int _VectorDimension = Dynamic, int _CovarianceDimension = _VectorDimension>
138 class TimeContinuousSystemModel_ : public SystemModel_<Derived, _VectorDimension, _CovarianceDimension> {
139 public:
140  SYSTEM_MODEL_TRAIT(Derived, _VectorDimension, _CovarianceDimension)
141 
143  virtual ~TimeContinuousSystemModel_();
144 
146 
147  virtual void getDerivative(StateVector& x_dot, const State& state);
148  virtual void getStateJacobian(SystemMatrix& A, const State& state, bool init = true);
149  virtual void getInputJacobian(InputMatrix& B, const State& state, bool init = true);
150  virtual void getSystemNoise(NoiseVariance& Q, const State& state, bool init = true);
151 
152  // the overwritten time discrete model functions are implemented in system_model.inl
153  void getExpectedDiff(StateVector& x_diff, const State& state, double dt);
154  void getStateJacobian(SystemMatrix& A, const State& state, double dt, bool init = true);
155  void getInputJacobian(InputMatrix& B, const State& state, double dt, bool init = true);
156  void getSystemNoise(NoiseVariance& Q, const State& state, double dt, bool init = true);
157 
158 private:
159  struct internal;
160  struct internal *internal_;
161 };
162 
163 } // namespace hector_pose_estimation
164 
165 #include "system_model.inl"
166 
167 #endif // HECTOR_POSE_ESTIMATION_SYSTEM_MODEL_H
virtual bool active(const State &state)
Definition: system_model.h:48
virtual void getPrior(State &state)
Definition: system_model.h:50
SymmetricMatrix Covariance
Definition: state.h:45
SubState::CovarianceBlock CovarianceBlock
Definition: system_model.h:78
virtual SystemStatus getStatusFlags(const State &state)
Definition: system_model.h:47
virtual bool limitState(State &state)
Definition: system_model.h:55
const Derived * derived() const
Definition: system_model.h:129
#define SYSTEM_MODEL_TRAIT(Derived, _VectorDimension, _CovarianceDimension)
Definition: system_model.h:88
Matrix_< State::Covariance::RowsAtCompileTime, InputDimension >::type InputMatrix
Definition: system_model.h:72
SubState::CrossVarianceBlock CrossVarianceBlock
Definition: system_model.h:79
virtual SystemTypeEnum getSystemType() const
Definition: system_model.h:45
Block< const SystemMatrix, VectorDimension, SystemMatrix::ColsAtCompileTime > ConstSystemMatrixBlock
Definition: system_model.h:85
SubState::ConstCrossVarianceBlock ConstCrossVarianceBlock
Definition: system_model.h:84
traits::Input< Derived >::Type InputType
Definition: system_model.h:70
SubState_< VectorDimension, CovarianceDimension > SubState
Definition: system_model.h:74
virtual bool init(PoseEstimation &estimator, System &system, State &state)
Definition: system_model.h:42
SubState::ConstVectorSegment ConstVectorSegment
Definition: system_model.h:82
Eigen::Matrix< ScalarType, Rows, Cols,(Rows==1 &&Cols!=1?Eigen::RowMajor:Eigen::ColMajor),(Rows!=Dynamic?Rows:MaxMatrixRowsCols),(Cols!=Dynamic?Cols:MaxMatrixRowsCols) > type
Definition: matrix.h:77
virtual SystemModel::SystemTypeEnum getSystemType() const
Definition: system_model.h:145
Block< const State::Covariance, CovarianceDimension, CovarianceDimension > ConstCovarianceBlock
Definition: substate.h:96
unsigned int SystemStatus
Definition: types.h:70
Block< State::Covariance, CovarianceDimension, CovarianceDimension > CovarianceBlock
Definition: substate.h:92
VectorBlock< State::Vector, VectorDimension > VectorSegment
Definition: substate.h:91
virtual bool prepareUpdate(State &state, double dt)
Definition: system_model.h:52
Block< const State::Covariance, Dynamic, CovarianceDimension > ConstCrossVarianceBlock
Definition: substate.h:97
virtual void afterUpdate(State &state)
Definition: system_model.h:53
Block< SystemMatrix, VectorDimension, SystemMatrix::ColsAtCompileTime > SystemMatrixBlock
Definition: system_model.h:80
VectorBlock< const State::Vector, VectorDimension > ConstVectorSegment
Definition: substate.h:95
virtual SystemModel::SystemTypeEnum getSystemType() const
Definition: system_model.h:124
SubState::ConstCovarianceBlock ConstCovarianceBlock
Definition: system_model.h:83
Eigen::Matrix< ScalarType, Rows, 1, Eigen::ColMajor,(Rows!=Dynamic?Rows:MaxVectorSize), 1 > type
Definition: matrix.h:56
Block< State::Covariance, Dynamic, CovarianceDimension > CrossVarianceBlock
Definition: substate.h:93
traits::Input< Derived >::Vector InputVector
Definition: system_model.h:71
ColumnVector_< VectorDimension >::type Vector
Definition: system_model.h:75


hector_pose_estimation_core
Author(s): Johannes Meyer
autogenerated on Thu Feb 18 2021 03:29:31