pose_estimation
UnscentedKalmanFilter.hpp
Go to the documentation of this file.
1 #ifndef _POSE_ESTIMATION_UKF_HPP
2 #define _POSE_ESTIMATION_UKF_HPP
3 
4 #include <iostream>
5 #include <stdexcept>
6 #include <ukfom/ukf.hpp>
7 #include <ukfom/mtkwrap.hpp>
8 #include <boost/shared_ptr.hpp>
9 #include <base/Time.hpp>
10 #include <boost/noncopyable.hpp>
11 
12 namespace pose_estimation
13 {
14 
15 template<typename Manifold>
16 class UnscentedKalmanFilter : private boost::noncopyable
17 {
18 public:
19  enum {
20  DOF = Manifold::DOF
21  };
22  typedef Manifold State;
23  typedef ukfom::mtkwrap<Manifold> WState;
24  typedef ukfom::ukf<WState> MTK_UKF;
25  typedef typename MTK_UKF::cov Covariance;
26 
28  {
29  process_noise_cov = Covariance::Zero();
30  last_measurement_time.microseconds = 0;
31  min_time_delta = 1.0e-9;
32  max_time_delta = std::numeric_limits<double>::max();
33  }
34 
36 
40  void initializeFilter(const State& initial_state, const Covariance& state_cov)
41  {
42  ukf.reset(new MTK_UKF(initial_state, state_cov));
43  last_measurement_time.microseconds = 0;
44  }
45 
51  bool getCurrentState(State& state, Covariance& state_cov) const
52  {
53  if(ukf.get() != NULL)
54  {
55  state = ukf->mu();
56  state_cov = ukf->sigma();
57  return true;
58  }
59  return false;
60  }
61 
67  bool getCurrentState(State& state) const
68  {
69  if(ukf.get() != NULL)
70  {
71  state = ukf->mu();
72  return true;
73  }
74  return false;
75  }
76 
83  void predictionStepFromSampleTime(const base::Time& sample_time)
84  {
85  // first call
86  if(last_measurement_time.isNull())
87  {
88  last_measurement_time = sample_time;
89  return;
90  }
91 
92  // compute delta t
93  double delta_t = (sample_time - last_measurement_time).toSeconds();
94 
95  // set new last measurement time
96  if(delta_t > min_time_delta)
97  last_measurement_time = sample_time;
98 
99  predictionStep(delta_t);
100  }
101 
107  void predictionStep(double delta_t)
108  {
109  // check delta time
110  if(delta_t < 0.0)
111  {
112  throw std::runtime_error("Delta time is negative!");
113  }
114  else if(delta_t <= min_time_delta)
115  {
116  // delta time is zero or close to zero
117  return;
118  }
119  else if(delta_t > max_time_delta)
120  {
121  throw std::runtime_error("Delta time is greater then the allowed maximum!");
122  }
123 
124  predictionStepImpl(delta_t);
125  }
126 
127  unsigned getStateSize() const {return unsigned(WState::DOF);}
128  bool isInitialized() const {return ukf.get() != NULL;}
129  const Covariance& getProcessNoiseCovariance() const {return process_noise_cov;}
130  void setProcessNoiseCovariance(const Covariance& noise_cov) {process_noise_cov = noise_cov;}
131  const base::Time& getLastMeasurementTime() const {return last_measurement_time;}
133  {this->last_measurement_time = last_measurement_time;}
134  double getMaxTimeDelta() const {return max_time_delta;}
135  void setMaxTimeDelta(double max_time_delta) {this->max_time_delta = max_time_delta;}
136  double getMinTimeDelta() const {return min_time_delta;}
137  void setMinTimeDelta(double min_time_delta) {this->min_time_delta = min_time_delta;}
138 
139 protected:
140  virtual void predictionStepImpl(double delta_t) = 0;
141 
142  template<int DIM, typename scalar_type>
143  void checkMeasurment(const Eigen::Matrix<scalar_type, DIM, 1>& mu, const Eigen::Matrix<scalar_type, DIM, DIM>& cov) const
144  {
145  if(!mu.allFinite() || !cov.allFinite())
146  throw std::runtime_error("Measurement or covariance contains non-finite values!");
147  }
148 
149 protected:
150  boost::shared_ptr<MTK_UKF> ukf;
151  Covariance process_noise_cov;
155 };
156 
157 }
158 
159 #endif
base::Time last_measurement_time
Definition: UnscentedKalmanFilter.hpp:152
const Covariance & getProcessNoiseCovariance() const
Definition: UnscentedKalmanFilter.hpp:129
virtual ~UnscentedKalmanFilter()
Definition: UnscentedKalmanFilter.hpp:35
bool getCurrentState(State &state) const
Definition: UnscentedKalmanFilter.hpp:67
const base::Time & getLastMeasurementTime() const
Definition: UnscentedKalmanFilter.hpp:131
double min_time_delta
Definition: UnscentedKalmanFilter.hpp:154
void initializeFilter(const State &initial_state, const Covariance &state_cov)
Definition: UnscentedKalmanFilter.hpp:40
double getMaxTimeDelta() const
Definition: UnscentedKalmanFilter.hpp:134
Definition: UnscentedKalmanFilter.hpp:16
boost::shared_ptr< MTK_UKF > ukf
Definition: UnscentedKalmanFilter.hpp:150
void setLastMeasurementTime(const base::Time &last_measurement_time)
Definition: UnscentedKalmanFilter.hpp:132
UnscentedKalmanFilter()
Definition: UnscentedKalmanFilter.hpp:27
void predictionStepFromSampleTime(const base::Time &sample_time)
Definition: UnscentedKalmanFilter.hpp:83
MTK_UKF::cov Covariance
Definition: UnscentedKalmanFilter.hpp:25
ukfom::mtkwrap< Manifold > WState
Definition: UnscentedKalmanFilter.hpp:23
bool isInitialized() const
Definition: UnscentedKalmanFilter.hpp:128
double getMinTimeDelta() const
Definition: UnscentedKalmanFilter.hpp:136
void setMinTimeDelta(double min_time_delta)
Definition: UnscentedKalmanFilter.hpp:137
Definition: UnscentedKalmanFilter.hpp:20
Definition: GeographicProjection.hpp:9
virtual void predictionStepImpl(double delta_t)=0
bool getCurrentState(State &state, Covariance &state_cov) const
Definition: UnscentedKalmanFilter.hpp:51
unsigned getStateSize() const
Definition: UnscentedKalmanFilter.hpp:127
ukfom::ukf< WState > MTK_UKF
Definition: UnscentedKalmanFilter.hpp:24
Manifold State
Definition: UnscentedKalmanFilter.hpp:22
void checkMeasurment(const Eigen::Matrix< scalar_type, DIM, 1 > &mu, const Eigen::Matrix< scalar_type, DIM, DIM > &cov) const
Definition: UnscentedKalmanFilter.hpp:143
void setMaxTimeDelta(double max_time_delta)
Definition: UnscentedKalmanFilter.hpp:135
Covariance process_noise_cov
Definition: UnscentedKalmanFilter.hpp:151
void predictionStep(double delta_t)
Definition: UnscentedKalmanFilter.hpp:107
double max_time_delta
Definition: UnscentedKalmanFilter.hpp:153
void setProcessNoiseCovariance(const Covariance &noise_cov)
Definition: UnscentedKalmanFilter.hpp:130