Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef HECTOR_POSE_ESTIMATION_MEASUREMENT_MODEL_H
00030 #define HECTOR_POSE_ESTIMATION_MEASUREMENT_MODEL_H
00031
00032 #include <hector_pose_estimation/model.h>
00033 #include <hector_pose_estimation/substate.h>
00034 #include <hector_pose_estimation/input.h>
00035
00036 namespace hector_pose_estimation {
00037
00038 class MeasurementModel : public Model {
00039 public:
00040 virtual ~MeasurementModel() {}
00041
00042 virtual int getDimension() const = 0;
00043 virtual bool hasSubsystem() const { return false; }
00044
00045 virtual SystemStatus getStatusFlags() { return SystemStatus(0); }
00046 virtual bool active(const State& state) { return !(state.getSystemStatus() & STATUS_ALIGNMENT); }
00047
00048 virtual bool prepareUpdate(State& state, const MeasurementUpdate& update) { return true; }
00049 virtual void afterUpdate(State& state) {}
00050 };
00051
00052 template <class Derived, int _Dimension, int _SubDimension = 0> class MeasurementModel_;
00053
00054 namespace traits {
00055
00056 template <int _Dimension, int _SubDimension>
00057 struct MeasurementModel {
00058 enum { StateDimension = State::Dimension };
00059 typedef typename State::Vector StateVector;
00060
00061 typedef typename State::VectorSegment StateVectorSegment;
00062 typedef typename State::CovarianceBlock StateCovarianceBlock;
00063 typedef typename State::ConstVectorSegment ConstStateVectorSegment;
00064 typedef typename State::ConstCovarianceBlock ConstStateCovarianceBlock;
00065
00066 enum { MeasurementDimension = _Dimension };
00067 typedef ColumnVector_<MeasurementDimension> MeasurementVector;
00068 typedef SymmetricMatrix_<MeasurementDimension> NoiseVariance;
00069 typedef Matrix_<MeasurementDimension,StateDimension> MeasurementMatrix;
00070 typedef Matrix_<State::Covariance::RowsAtCompileTime,MeasurementDimension> GainMatrix;
00071
00072 enum { SubDimension = _SubDimension };
00073 struct HasSubSystem : public boost::integral_constant<bool, (_SubDimension > 0)> {};
00074 typedef SubState_<SubDimension> SubState;
00075 typedef typename SubState::Ptr SubStatePtr;
00076 typedef typename SubState::Vector SubStateVector;
00077
00078 typedef typename SubState::VectorSegment SubStateVectorSegment;
00079 typedef typename SubState::CovarianceBlock SubStateCovarianceBlock;
00080 typedef typename SubState::ConstVectorSegment ConstSubStateVectorSegment;
00081 typedef typename SubState::ConstCovarianceBlock ConstSubStateCovarianceBlock;
00082 typedef Matrix_<MeasurementDimension,SubDimension> SubMeasurementMatrix;
00083 };
00084
00085 #define MEASUREMENT_MODEL_TRAIT(_Dimension, _SubDimension) \
00086 typedef typename traits::MeasurementModel<_Dimension, _SubDimension> trait; \
00087 \
00088 enum { StateDimension = trait::StateDimension }; \
00089 typedef typename trait::StateVector StateVector; \
00090 typedef typename trait::StateVectorSegment StateVectorSegment; \
00091 typedef typename trait::StateCovarianceBlock StateCovarianceBlock; \
00092 \
00093 enum { MeasurementDimension = _Dimension }; \
00094 typedef typename trait::MeasurementVector MeasurementVector; \
00095 typedef typename trait::NoiseVariance NoiseVariance; \
00096 typedef typename trait::MeasurementMatrix MeasurementMatrix; \
00097 typedef typename trait::GainMatrix GainMatrix; \
00098 \
00099 enum { InputDimension = traits::Input<Derived>::Dimension }; \
00100 typedef typename traits::Input<Derived>::Type InputType; \
00101 typedef typename traits::Input<Derived>::Vector InputVector; \
00102 typedef Matrix_<MeasurementDimension,InputDimension> InputMatrix; \
00103 \
00104 typedef typename trait::HasSubSystem HasSubSystem; \
00105 enum { SubDimension = _SubDimension }; \
00106 typedef typename trait::SubState SubState; \
00107 typedef typename trait::SubStatePtr SubStatePtr; \
00108 typedef typename trait::SubStateVector SubStateVector; \
00109 typedef typename trait::SubStateVectorSegment SubStateVectorSegment; \
00110 typedef typename trait::SubStateCovarianceBlock SubStateCovarianceBlock; \
00111 typedef typename trait::ConstSubStateVectorSegment ConstSubStateVectorSegment; \
00112 typedef typename trait::ConstSubStateCovarianceBlock ConstSubStateCovarianceBlock; \
00113 typedef typename trait::SubMeasurementMatrix SubMeasurementMatrix; \
00114
00115 }
00116
00117 template <class Derived, int _Dimension, int _SubDimension>
00118 class MeasurementModel_ : public MeasurementModel {
00119 public:
00120 MEASUREMENT_MODEL_TRAIT(_Dimension, _SubDimension)
00121 virtual ~MeasurementModel_() {}
00122
00123 virtual int getDimension() const { return trait::MeasurementDimension; }
00124 virtual bool hasSubSystem() const { return trait::HasSubSystem::value; }
00125
00126 Derived *derived() { return static_cast<Derived *>(this); }
00127 const Derived *derived() const { return static_cast<const Derived *>(this); }
00128
00129 SubState& sub(State& state) const { return *state.getSubState<SubDimension>(this); }
00130 const SubState& sub(const State& state) const { return *state.getSubState<SubDimension>(this); }
00131
00132 virtual void getExpectedValue(MeasurementVector& y_pred, const State& state) {}
00133 virtual void getStateJacobian(MeasurementMatrix& C, const State& state, bool init) {}
00134 virtual void getInputJacobian(InputMatrix& D, const State& state, bool init) {}
00135 virtual void getMeasurementNoise(NoiseVariance& R, const State& state, bool init) {}
00136
00137
00138 virtual void getStateJacobian(MeasurementMatrix& C0, SubMeasurementMatrix& C1, const State& state, bool init) {}
00139
00140 virtual void limitError(MeasurementVector& error) {}
00141
00142 virtual const MeasurementVector* getFixedMeasurementVector() { return 0; }
00143 };
00144
00145 }
00146
00147 #endif // HECTOR_POSE_ESTIMATION_MEASUREMENT_MODEL_H