substate.h
Go to the documentation of this file.
1 //=================================================================================================
2 // Copyright (c) 2013, Johannes Meyer, 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_SUBSTATE_H
30 #define HECTOR_POSE_ESTIMATION_SUBSTATE_H
31 
33 
34 namespace hector_pose_estimation {
35 
36 class SubState
37 {
38 public:
39  SubState(State& state) : state_(state) {}
40  virtual ~SubState() {}
41 
42  virtual int getVectorDimension() const = 0;
43  virtual int getCovarianceDimension() const = 0;
44  virtual int getVectorIndex() const = 0;
45  virtual int getCovarianceIndex() const = 0;
46 
47  virtual void reset() {}
48  virtual void updated() {}
49  virtual void normalize() {}
50 
51 protected:
53  template <int _VectorDimension, int _CovarianceDimension> class initializer;
54 };
55 
56 template <int _VectorDimension, int _CovarianceDimension> class SubState::initializer {
57 public:
58  enum { VectorDimension = _VectorDimension };
59  enum { CovarianceDimension = _CovarianceDimension };
60  initializer(State& state) : index_(state.getVector().rows()), covariance_index_(state.getCovariance().rows()) {
61  assert(index_ + VectorDimension <= MaxVectorSize);
62  state.x().conservativeResize(index_ + VectorDimension);
63  assert(covariance_index_ + CovarianceDimension <= MaxMatrixRowsCols);
64  state.P().conservativeResize(covariance_index_ + CovarianceDimension, covariance_index_ + CovarianceDimension);
65  }
66 protected:
69 };
70 
71 template <> class SubState::initializer<Dynamic,Dynamic> {
72 public:
73  enum { VectorDimension = Dynamic };
74  enum { CovarianceDimension = Dynamic };
75  initializer(State& state) : index_(0), covariance_index_(0)
76  {}
77 protected:
80 };
81 extern template class SubState::initializer<Dynamic,Dynamic>;
82 
83 template <int _VectorDimension, int _CovarianceDimension = _VectorDimension>
85 {
86 public:
90 
91  typedef VectorBlock<State::Vector,VectorDimension> VectorSegment;
92  typedef Block<State::Covariance,CovarianceDimension,CovarianceDimension> CovarianceBlock;
93  typedef Block<State::Covariance,Dynamic,CovarianceDimension> CrossVarianceBlock;
94 
95  typedef VectorBlock<const State::Vector,VectorDimension> ConstVectorSegment;
96  typedef Block<const State::Covariance,CovarianceDimension,CovarianceDimension> ConstCovarianceBlock;
97  typedef Block<const State::Covariance,Dynamic,CovarianceDimension> ConstCrossVarianceBlock;
98 
100 
103 
104 public:
105  SubState_(State& state)
106  : SubState(state)
107  , SubState::initializer<_VectorDimension, _CovarianceDimension>(state)
108  {}
109  virtual ~SubState_() {}
110 
111  int getVectorDimension() const { return VectorDimension; }
112  int getCovarianceDimension() const { return CovarianceDimension; }
113  int getVectorIndex() const { return index_; }
114  int getCovarianceIndex() const { return covariance_index_; }
115 
116  ConstVectorSegment getVector() const { return ConstVectorSegment(state_.getVector(), index_, getVectorDimension()); }
117  ConstCovarianceBlock getCovariance() const { return ConstCovarianceBlock(state_.getCovariance(), covariance_index_, covariance_index_, getCovarianceDimension(), getCovarianceDimension()); }
118  template <typename OtherSubState> Block<const State::Covariance,CovarianceDimension,OtherSubState::CovarianceDimension> getCrossVariance(const OtherSubState &other) const { return Block<const State::Covariance,CovarianceDimension,OtherSubState::CovarianceDimension>(state_.getCovariance(), covariance_index_, covariance_index_, getCovarianceDimension(), other.getCovarianceDimension()); }
119  template <int Size> VectorBlock<const Vector, Size> getSegment(IndexType start) const { return VectorBlock<const Vector, Size>(state_.getVector(), index_ + start); }
120 
121  VectorSegment vector() { return VectorSegment(state_.x(), index_, getVectorDimension()); }
122  CovarianceBlock P() { return CovarianceBlock(state_.P(), covariance_index_, covariance_index_, getCovarianceDimension(), getCovarianceDimension()); }
123  CrossVarianceBlock P01() { return CrossVarianceBlock(state_.P(), 0, covariance_index_, state_.getCovarianceDimension(), getCovarianceDimension()); }
124 
125  template <typename VectorType> VectorBlock<VectorType,VectorDimension> segment(VectorType &vector) { return VectorBlock<VectorType,VectorDimension>(vector, index_, getVectorDimension()); }
126  template <typename MatrixType> Block<MatrixType,CovarianceDimension,CovarianceDimension> block(MatrixType &matrix) { return Block<MatrixType,CovarianceDimension,CovarianceDimension>(matrix, covariance_index_, covariance_index_, getCovarianceDimension(), getCovarianceDimension()); }
127  template <typename MatrixType, typename OtherSubState> Block<MatrixType,CovarianceDimension,OtherSubState::CovarianceDimension> block(MatrixType &matrix, const OtherSubState &other) { return Block<MatrixType,CovarianceDimension,OtherSubState::CovarianceDimension>(matrix, covariance_index_, other.getCovarianceIndex(), getCovarianceDimension(), other.getCovarianceDimension()); }
128  template <typename MatrixType> Block<MatrixType,CovarianceDimension,MatrixType::ColsAtCompileTime> rows(MatrixType &matrix) { return Block<MatrixType,CovarianceDimension,MatrixType::ColsAtCompileTime>(matrix, covariance_index_, 0, getCovarianceDimension(), matrix.cols()); }
129  template <typename MatrixType> Block<MatrixType,MatrixType::RowsAtCompileTime,CovarianceDimension> cols(MatrixType &matrix) { return Block<MatrixType,MatrixType::RowsAtCompileTime,CovarianceDimension>(matrix, 0, covariance_index_, matrix.rows(), getCovarianceDimension()); }
130 };
131 extern template class SubState_<Dynamic,Dynamic>;
132 
134 {
135 public:
136  BaseState(State& state, int vector_dimension, int covariance_dimension)
137  : SubState_<Dynamic,Dynamic>(state)
138  , dimension_(vector_dimension)
139  , covariance_dimension_(covariance_dimension)
140  {}
141  virtual ~BaseState() {}
142 
143  int getVectorDimension() const { return dimension_; }
144  int getCovarianceDimension() const { return covariance_dimension_; }
145 
146 private:
149 };
150 
151 template <int _VectorDimension, int _CovarianceDimension>
153  return boost::dynamic_pointer_cast<SubState_<_VectorDimension, _CovarianceDimension> >(substates_by_model_.count(model) ? substates_by_model_.at(model).lock() : SubStatePtr());
154 }
155 
156 //template <>
157 //inline boost::shared_ptr<BaseState> State::getSubState<Dynamic>(const Model *) const {
158 // return base_;
159 //}
160 
161 template <int _VectorDimension, int _CovarianceDimension>
163  return boost::dynamic_pointer_cast<SubState_<_VectorDimension, _CovarianceDimension> >(substates_by_name_.count(name) ? substates_by_name_.at(name).lock() : SubStatePtr());
164 }
165 
166 template <int _VectorDimension, int _CovarianceDimension>
168  return addSubState<_VectorDimension, _CovarianceDimension>(0, name);
169 }
170 
171 template <int _VectorDimension, int _CovarianceDimension>
174  if (!name.empty()) substate = getSubState<_VectorDimension, _CovarianceDimension>(name);
175  if (!substate) {
176  if (substates_by_name_.count(name)) return substate; // state already exists but with a different type
177  substate.reset(new SubState_<_VectorDimension, _CovarianceDimension>(*this));
178  substates_.push_back(boost::static_pointer_cast<SubState>(substate));
179  if (!name.empty()) substates_by_name_[name] = SubStateWPtr(boost::static_pointer_cast<SubState>(substate));
180  }
181  if (model) {
182  substates_by_model_[model] = SubStateWPtr(boost::static_pointer_cast<SubState>(substate));
183  }
184  return substate;
185 }
186 
187 } // namespace hector_pose_estimation
188 
189 #endif // HECTOR_POSE_ESTIMATION_SUBSTATE_H
boost::shared_ptr< SubState_< SubVectorDimension, SubCovarianceDimension > > getSubState(const Model *model) const
boost::shared_ptr< SubState_< SubVectorDimension, SubCovarianceDimension > > addSubState(const std::string &name=std::string())
Block< const State::Covariance, CovarianceDimension, OtherSubState::CovarianceDimension > getCrossVariance(const OtherSubState &other) const
Definition: substate.h:118
Block< MatrixType, CovarianceDimension, CovarianceDimension > block(MatrixType &matrix)
Definition: substate.h:126
ConstVectorSegment getVector() const
Definition: substate.h:116
Block< MatrixType, MatrixType::RowsAtCompileTime, CovarianceDimension > cols(MatrixType &matrix)
Definition: substate.h:129
virtual const Covariance & getCovariance() const
Definition: state.h:89
Eigen::DenseIndex IndexType
Definition: matrix.h:47
ConstCovarianceBlock getCovariance() const
Definition: substate.h:117
virtual int getCovarianceDimension() const =0
virtual int getVectorIndex() const =0
virtual IndexType getCovarianceDimension() const
Definition: state.h:77
virtual const Vector & getVector() const
Definition: state.h:88
virtual Covariance & P()
Definition: state.h:93
Block< MatrixType, CovarianceDimension, OtherSubState::CovarianceDimension > block(MatrixType &matrix, const OtherSubState &other)
Definition: substate.h:127
boost::shared_ptr< SubState_< _VectorDimension, _CovarianceDimension > > Ptr
Definition: substate.h:99
VectorBlock< const Vector, Size > getSegment(IndexType start) const
Definition: substate.h:119
virtual int getVectorDimension() const =0
Block< const State::Covariance, CovarianceDimension, CovarianceDimension > ConstCovarianceBlock
Definition: substate.h:96
ColumnVector_< VectorDimension > Vector
Definition: substate.h:89
Block< State::Covariance, CovarianceDimension, CovarianceDimension > CovarianceBlock
Definition: substate.h:92
VectorBlock< State::Vector, VectorDimension > VectorSegment
Definition: substate.h:91
Block< MatrixType, CovarianceDimension, MatrixType::ColsAtCompileTime > rows(MatrixType &matrix)
Definition: substate.h:128
BaseState(State &state, int vector_dimension, int covariance_dimension)
Definition: substate.h:136
boost::shared_ptr< SubState > SubStatePtr
Definition: types.h:107
const IndexType covariance_dimension_
Definition: substate.h:148
Block< const State::Covariance, Dynamic, CovarianceDimension > ConstCrossVarianceBlock
Definition: substate.h:97
virtual Vector & x()
Definition: state.h:92
VectorBlock< const State::Vector, VectorDimension > ConstVectorSegment
Definition: substate.h:95
VectorBlock< VectorType, VectorDimension > segment(VectorType &vector)
Definition: substate.h:125
virtual int getCovarianceIndex() const =0
Block< State::Covariance, Dynamic, CovarianceDimension > CrossVarianceBlock
Definition: substate.h:93
boost::weak_ptr< SubState > SubStateWPtr
Definition: types.h:109
CrossVarianceBlock P01()
Definition: substate.h:123


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