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_H
00030 #define HECTOR_POSE_ESTIMATION_MEASUREMENT_H
00031
00032 #include <bfl/filter/kalmanfilter.h>
00033 #include "measurement_model.h"
00034 #include "measurement_update.h"
00035 #include "queue.h"
00036
00037 namespace hector_pose_estimation {
00038
00039 class PoseEstimation;
00040
00041 class Measurement
00042 {
00043 public:
00044 Measurement(const std::string& name);
00045 virtual ~Measurement();
00046
00047 virtual const std::string& getName() const { return name_; }
00048 void setName(const std::string& name) { name_ = name; }
00049
00050 virtual MeasurementModel* getModel() const { return 0; }
00051
00052 virtual bool init();
00053 virtual void cleanup();
00054 virtual void reset();
00055
00056 virtual SystemStatus getStatusFlags() const { return status_flags_; }
00057 virtual bool active(const SystemStatus& status) { return enabled(); }
00058
00059 virtual ParameterList& parameters() { return parameters_; }
00060 virtual const ParameterList& parameters() const { return parameters_; }
00061
00062 virtual void add(const MeasurementUpdate &update);
00063 virtual bool update(PoseEstimation &estimator, const MeasurementUpdate &update) = 0;
00064 virtual void process(PoseEstimation &estimator);
00065
00066 bool enabled() const { return enabled_; }
00067 void enable() { enabled_ = true; }
00068 void disable() { enabled_ = false; }
00069
00070 void increase_timer(double dt);
00071 void updated();
00072 bool timedout() const;
00073
00074 protected:
00075 virtual Queue& queue() = 0;
00076 void updateInternal(PoseEstimation &estimator, ColumnVector const& y);
00077
00078 virtual bool onInit() { return true; }
00079 virtual void onReset() { }
00080 virtual void onCleanup() { }
00081
00082 protected:
00083 std::string name_;
00084 ParameterList parameters_;
00085 SystemStatus status_flags_;
00086
00087 bool enabled_;
00088 double min_interval_;
00089
00090 double timeout_;
00091 double timer_;
00092 };
00093
00094 typedef boost::shared_ptr<Measurement> MeasurementPtr;
00095
00096 template <class ConcreteModel, class ConcreteUpdate = typename Update_<ConcreteModel>::Type >
00097 class Measurement_ : public Measurement {
00098 public:
00099 typedef ConcreteModel Model;
00100 typedef ConcreteUpdate Update;
00101 static const unsigned int MeasurementDimension = Model::MeasurementDimension;
00102 typedef typename Model::MeasurementVector MeasurementVector;
00103 typedef typename Model::NoiseCovariance NoiseCovariance;
00104
00105 Measurement_(const std::string& name)
00106 : Measurement(name)
00107 , model_(new Model)
00108 {
00109 parameters_.add(model_->parameters());
00110 }
00111
00112 Measurement_(Model *model, const std::string& name)
00113 : Measurement(name)
00114 , model_(model)
00115 {
00116 parameters_.add(model_->parameters());
00117 }
00118
00119 virtual ~Measurement_() {
00120 }
00121
00122 virtual bool init() { return model_->init() && Measurement::init(); }
00123 virtual void cleanup() { model_->cleanup(); Measurement::cleanup(); }
00124 virtual void reset() { model_->reset(); Measurement::reset(); }
00125
00126 virtual Model* getModel() const { return model_.get(); }
00127 virtual bool active(const SystemStatus& status) { return enabled() && model_->applyStatusMask(status); }
00128
00129 virtual MeasurementVector const& getVector(const Update &update) { return internal::UpdateInspector<ConcreteModel,ConcreteUpdate>::getVector(update, getModel()); }
00130 virtual NoiseCovariance const& getCovariance(const Update &update) { return update.hasCovariance() ? internal::UpdateInspector<ConcreteModel,ConcreteUpdate>::getCovariance(update, getModel()) : static_cast<NoiseCovariance const&>(model_->AdditiveNoiseSigmaGet()); }
00131 virtual void setNoiseCovariance(NoiseCovariance const& sigma);
00132
00133 virtual bool update(PoseEstimation &estimator, const MeasurementUpdate &update);
00134
00135 protected:
00136 boost::shared_ptr<Model> model_;
00137
00138 Queue_<Update> queue_;
00139 virtual Queue& queue() { return queue_; }
00140
00141 virtual bool beforeUpdate(PoseEstimation &estimator, const Update &update) { return true; }
00142 virtual void afterUpdate(PoseEstimation &estimator) { }
00143 };
00144
00145 template <class ConcreteModel, class ConcreteUpdate>
00146 bool Measurement_<ConcreteModel, ConcreteUpdate>::update(PoseEstimation &estimator, const MeasurementUpdate &update_)
00147 {
00148 if (!enabled()) return false;
00149 if (min_interval_ > 0.0 && timer_ < min_interval_) return false;
00150
00151 try {
00152 Update const &update = dynamic_cast<Update const &>(update_);
00153 if (!beforeUpdate(estimator, update)) return false;
00154
00155 if (update.hasCovariance()) setNoiseCovariance(getCovariance(update));
00156 updateInternal(estimator, getVector(update));
00157 } catch(std::bad_cast& e) {
00158 std::cerr << "In measurement " << getName() << ": " << e.what() << std::endl;
00159 }
00160
00161 afterUpdate(estimator);
00162 return true;
00163 }
00164
00165 template <class ConcreteModel, class ConcreteUpdate>
00166 void Measurement_<ConcreteModel, ConcreteUpdate>::setNoiseCovariance(Measurement_<ConcreteModel, ConcreteUpdate>::NoiseCovariance const& sigma)
00167 {
00168 model_->AdditiveNoiseSigmaSet(sigma);
00169 }
00170
00171 }
00172
00173 #endif // HECTOR_POSE_ESTIMATION_MEASUREMENT_H