JointCombinedFilter.cpp
Go to the documentation of this file.
1 #include <boost/foreach.hpp>
2 
9 
10 using namespace omip;
11 using namespace MatrixWrapper;
12 using namespace BFL;
13 
15 
17  _joint_id(JointCombinedFilter::_joint_id_generator++),
18  _normalizing_term(0.25)
19 {
24 
25  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
26  {
27  joint_filter_it.second->setJointId(_joint_id);
28  }
29 
34 }
35 
36 void JointCombinedFilter::setJointLikelihoodDisconnected(double disconnected_joint_likelihood)
37 {
38  boost::static_pointer_cast<DisconnectedJointFilter>(this->_joint_filters[DISCONNECTED_JOINT])->setLikelihoodOfLastMeasurements(disconnected_joint_likelihood);
39 }
40 
41 void JointCombinedFilter::setLoopPeriodNS(double loop_period_ns)
42 {
43  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
44  {
45  joint_filter_it.second->setLoopPeriodNS(loop_period_ns);
46  }
47 }
48 
50 {
51  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
52  {
53  joint_filter_it.second->setNumSamplesForLikelihoodEstimation(likelihood_sample_num);
54  }
55 }
56 
57 void JointCombinedFilter::setNormalizingTerm(double normalizing_term)
58 {
59  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
60  {
61  joint_filter_it.second->setNormalizingTerm(normalizing_term);
62  }
63 }
64 
65 void JointCombinedFilter::setCovarianceDeltaMeasurementLinear(double sigma_delta_meas_uncertainty_linear)
66 {
67  boost::static_pointer_cast<PrismaticJointFilter>(this->_joint_filters[PRISMATIC_JOINT])->setCovarianceDeltaMeasurementLinear(sigma_delta_meas_uncertainty_linear);
68 }
69 
70 void JointCombinedFilter::setCovarianceDeltaMeasurementAngular(double sigma_delta_meas_uncertainty_angular)
71 {
72  boost::static_pointer_cast<RevoluteJointFilter>(this->_joint_filters[REVOLUTE_JOINT])->setCovarianceDeltaMeasurementAngular(sigma_delta_meas_uncertainty_angular);
73 }
74 
76 {
77  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
78  {
79  joint_filter_it.second->initialize();
80  }
81 }
82 
83 void JointCombinedFilter::setMaxTranslationRigid(double rig_max_translation)
84 {
85  boost::static_pointer_cast<RigidJointFilter>(this->_joint_filters[RIGID_JOINT])->setMaxTranslationRigid(rig_max_translation);
86 }
87 
88 void JointCombinedFilter::setMaxRotationRigid(double rig_max_rotation)
89 {
90  boost::static_pointer_cast<RigidJointFilter>(this->_joint_filters[RIGID_JOINT])->setMaxRotationRigid(rig_max_rotation);
91 }
92 
94 {
95  boost::static_pointer_cast<RevoluteJointFilter>(this->_joint_filters[REVOLUTE_JOINT])->setMinRotationRevolute(value);
96 }
97 
99 {
100  boost::static_pointer_cast<RevoluteJointFilter>(this->_joint_filters[REVOLUTE_JOINT])->setMaxRadiusDistanceRevolute(value);
101 }
102 
103 void JointCombinedFilter::setCovariancePrior(const JointFilterType& joint_type, double prior_cov_vel)
104 {
105  this->_joint_filters[joint_type]->setCovariancePrior(prior_cov_vel);
106 }
107 
109 {
110  this->_joint_filters[joint_type]->setCovarianceAdditiveSystemNoisePhi(sys_noise_phi);
111 }
112 
114 {
115  this->_joint_filters[joint_type]->setCovarianceAdditiveSystemNoiseTheta(sys_noise_theta);
116 }
117 
119 {
120  this->_joint_filters[joint_type]->setCovarianceAdditiveSystemNoisePx(sys_noise_px);
121 }
122 
124 {
125  this->_joint_filters[joint_type]->setCovarianceAdditiveSystemNoisePy(sys_noise_py);
126 }
127 
129 {
130  this->_joint_filters[joint_type]->setCovarianceAdditiveSystemNoisePz(sys_noise_pz);
131 }
132 
134 {
135  this->_joint_filters[joint_type]->setCovarianceAdditiveSystemNoiseJointState(sys_noise_js);
136 }
137 
139 {
140  this->_joint_filters[joint_type]->setCovarianceAdditiveSystemNoiseJointVelocity(sys_noise_jv);
141 }
142 
143 void JointCombinedFilter::setCovarianceMeasurementNoise(const JointFilterType& joint_type, double meas_noise)
144 {
145  this->_joint_filters[joint_type]->setCovarianceMeasurementNoise(meas_noise);
146 }
147 
149  const Eigen::Twistd& rrb_pose_at_srb_birth_in_sf,
150  const Eigen::Twistd& srb_pose_at_srb_birth_in_sf)
151 {
152  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
153  {
154  joint_filter_it.second->setInitialMeasurement(initial_measurement,
155  rrb_pose_at_srb_birth_in_sf,
156  srb_pose_at_srb_birth_in_sf);
157  }
158 }
159 
161 {
162 
163 }
164 
166 {
167  this->_joint_id = joint._joint_id;
168  this->_joint_filters = joint._joint_filters;
170  this->_normalizing_term = joint._normalizing_term;
171 }
172 
174 {
175  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
176  {
177  joint_filter_it.second->predictMeasurement();
178  }
179 }
180 
181 std::map<JointFilterType, Eigen::Twistd> JointCombinedFilter::getPredictedMeasurement()
182 {
183  std::map<JointFilterType, Eigen::Twistd> second_rb_hypotheses;
184  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
185  {
186  second_rb_hypotheses[joint_filter_it.first] = joint_filter_it.second->getPredictedMeasurement();
187  }
188  return second_rb_hypotheses;
189 }
190 
191 void JointCombinedFilter::setMeasurement(joint_measurement_t acquired_measurement, const double &measurement_timestamp_ns)
192 {
193  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
194  {
195  joint_filter_it.second->setMeasurement(acquired_measurement, measurement_timestamp_ns);
196  }
197 }
198 
200 {
201  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
202  {
203  joint_filter_it.second->correctState();
204  }
205 }
206 
207 void JointCombinedFilter::predictState(double time_interval_ns)
208 {
209  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
210  {
211  joint_filter_it.second->predictState(time_interval_ns);
212  }
213 }
214 
216 {
217  this->_normalizing_term = 0.0;
218  double sum_of_unnormalized_model_probabilities = 0.0;
219 
220  // First we iterate over all the joints and collect their unnormalized likelihoods
221  // Except the disconnected joint that is already normalized!
222  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
223  {
224  //if(joint_filter_it.second->getJointFilterType() != DISCONNECTED_JOINT)
225  //{
226  sum_of_unnormalized_model_probabilities += joint_filter_it.second->getUnnormalizedProbabilityOfJointFilter();
227  //}
228  }
229 
230  double normalized_disconnected_probability = this->_joint_filters[DISCONNECTED_JOINT]->getProbabilityOfJointFilter();
231  this->_normalizing_term =
232  (sum_of_unnormalized_model_probabilities);// / (1.0 - normalized_disconnected_probability);
233 
234  // If the normalizing term is 0 the probabilities would become infinite!
235  if(_normalizing_term < 1e-5)
236  {
237  _normalizing_term = 1e-5;
238  }
239 
240  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
241  {
242  joint_filter_it.second->setNormalizingTerm(this->_normalizing_term);
243  }
244 }
245 
247 {
248  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
249  {
250  joint_filter_it.second->estimateMeasurementHistoryLikelihood();
251  joint_filter_it.second->estimateUnnormalizedModelProbability();
252  }
254 }
255 
257 {
258  double max_probability_of_a_model = 0.0;
259  JointFilterPtr most_probable_joint_type = this->_joint_filters.at(DISCONNECTED_JOINT);
260  BOOST_FOREACH(joint_filters_map::value_type joint_filter_it, this->_joint_filters)
261  {
262  double probability_of_a_model = joint_filter_it.second->getProbabilityOfJointFilter();
263  if (probability_of_a_model > max_probability_of_a_model)
264  {
265  max_probability_of_a_model = probability_of_a_model;
266  most_probable_joint_type = this->_joint_filters.at(joint_filter_it.first);
267  }
268  }
269  return most_probable_joint_type;
270 }
271 
273 {
274  return this->_joint_filters.at(joint_type);
275 }
276 
278 {
279  return this->_joint_id;
280 }
281 
283 {
284  this->_joint_id = new_joint_combined_filter_id;
285 }
286 
virtual JointFilterPtr getJointFilter(JointFilterType joint_type) const
Get the joint filter of the type given.
virtual void setCovarianceAdditiveSystemNoisePhi(const JointFilterType &joint_type, double sys_noise_phi)
std::pair< omip_msgs::RigidBodyPoseAndVelMsg, omip_msgs::RigidBodyPoseAndVelMsg > joint_measurement_t
virtual void setCovarianceAdditiveSystemNoisePx(const JointFilterType &joint_type, double sys_noise_px)
virtual void setJointLikelihoodDisconnected(double disconnected_joint_likelihood)
boost::shared_ptr< PrismaticJointFilter > PrismaticJointFilterPtr
joint_filters_map _joint_filters
std::map< JointFilterType, double > _joint_normalized_prediction_errors
JointFilterType
Definition: JointFilter.h:71
std::map< JointFilterType, Eigen::Twistd > getPredictedMeasurement()
virtual void setCovarianceAdditiveSystemNoisePy(const JointFilterType &joint_type, double sys_noise_py)
boost::shared_ptr< DisconnectedJointFilter > DisconnectedJointFilterPtr
virtual void setCovariancePrior(const JointFilterType &joint_type, double prior_cov_vel)
virtual void setCovarianceDeltaMeasurementAngular(double sigma_delta_meas_uncertainty_angular)
virtual void setCovarianceAdditiveSystemNoiseJointState(const JointFilterType &joint_type, double sys_noise_js)
static JointCombinedFilterId _joint_id_generator
virtual void setMinRotationRevolute(const double &value)
virtual void setCovarianceMeasurementNoise(const JointFilterType &joint_type, double meas_noise)
virtual void setMaxRotationRigid(double rig_max_rotation)
virtual void setCovarianceAdditiveSystemNoiseTheta(const JointFilterType &joint_type, double sys_noise_theta)
virtual void normalizeJointFilterProbabilities()
Estimate the probability of each joint filter type. NOTE: Using the Bayes Rule, the probability of a ...
virtual void estimateJointFilterProbabilities()
virtual void setMaxTranslationRigid(double rig_max_translation)
boost::shared_ptr< RevoluteJointFilter > RevoluteJointFilterPtr
virtual void predictState(double time_interval_ns)
First step when updating the filter. The next state is predicted from current state and system model...
virtual void setCovarianceAdditiveSystemNoiseJointVelocity(const JointFilterType &joint_type, double sys_noise_jv)
void setJointCombinedFilterId(JointCombinedFilterId new_joint_combined_filter_id)
virtual void setNormalizingTerm(double normalizing_term)
int long JointCombinedFilterId
Definition: JointFilter.h:69
virtual void setMaxRadiusDistanceRevolute(const double &value)
virtual void setInitialMeasurement(const joint_measurement_t &initial_measurement, const Eigen::Twistd &rrb_pose_at_srb_birth_in_sf, const Eigen::Twistd &srb_pose_at_srb_birth_in_sf)
virtual void setLoopPeriodNS(double loop_period_ns)
JointCombinedFilterId _joint_id
boost::shared_ptr< RigidJointFilter > RigidJointFilterPtr
virtual void setCovarianceDeltaMeasurementLinear(double sigma_delta_meas_uncertainty_linear)
virtual void setNumSamplesForLikelihoodEstimation(int likelihood_sample_num)
virtual JointFilterPtr getMostProbableJointFilter()
virtual void setCovarianceAdditiveSystemNoisePz(const JointFilterType &joint_type, double sys_noise_pz)
virtual JointCombinedFilterId getJointCombinedFilterId() const
virtual void setMeasurement(joint_measurement_t acquired_measurement, const double &measurement_timestamp_ns)
Set the latest acquired measurement.


joint_tracker
Author(s): Roberto Martín-Martín
autogenerated on Mon Jun 10 2019 14:06:16