gmapping_particle_filter.h
Go to the documentation of this file.
1 #ifndef SLAM_CTOR_GMAPPING_PARTICLE_FILTER_H
2 #define SLAM_CTOR_GMAPPING_PARTICLE_FILTER_H
3 
4 #include <memory>
5 #include <vector>
6 #include <cmath>
7 #include <iostream>
8 #include <iomanip>
9 
10 #include "../../core/states/laser_scan_grid_world.h"
11 #include "../../core/particle_filter.h"
12 #include "gmapping_world.h"
13 
14 class GmappingParticleFactory : public ParticleFactory<GmappingWorld> {
15 public:
17  const GMappingParams& gprms)
18  : _shw_p(shw_p), _gprms(gprms) {}
19 
20  std::shared_ptr<GmappingWorld> create_particle() override {
21  return std::make_shared<GmappingWorld>(_shw_p, _gprms);
22  }
23 private:
26 };
27 
28 // TODO: add restriction on particle type
30  public LaserScanGridWorld<GmappingWorld::MapType> {
31 public:
34 public: // methods
35 
37  const GMappingParams& gprms, unsigned n = 1):
38  _pf(std::make_shared<GmappingParticleFactory>(shw_p, gprms), n) {
39 
40  for (auto &p : _pf.particles()) {
41  p->sample();
42  }
43  _pf.heaviest_particle().mark_master();
44  }
45 
47  update_robot_pose(scan.pose_delta);
48  handle_observation(scan);
49  notify_with_pose(pose());
50  notify_with_map(map());
51  }
52 
53  void update_robot_pose(const RobotPoseDelta& delta) override {
54  for (auto &world : _pf.particles()) {
55  world->update_robot_pose(delta);
56  }
57  _traversed_since_last_resample += delta.abs();
58  }
59 
60  const WorldT& world() const override {
61  return _pf.heaviest_particle();
62  }
63 
64  const RobotPose& pose() const override { return world().pose(); }
65  const GmappingWorld::MapType& map() const override { return world().map(); }
66 
67 protected:
68 
70  for (auto &world : _pf.particles()) {
71  world->handle_observation(obs);
72  }
73 
74  // NB: weights are updated during scan update for performance reasons
75  _pf.normalize_weights();
76  try_resample();
77 
78  /*
79  std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
80  std::cout << std::setprecision(4);
81  for (auto &p : _pf.particles()) { std::cout << p->weight() << " "; }
82  std::cout << std::endl;
83  */
84  }
85 private:
86 
87  bool try_resample() {
88  if (_traversed_since_last_resample.sq_dist() <= 0.5 &&
89  std::fabs(_traversed_since_last_resample.theta <= 0.2)) {
90  return false;
91  }
92  bool is_resampled = _pf.try_resample();
93  if (!is_resampled) { return false; }
94  _traversed_since_last_resample.reset();
95  ensure_master_exists();
96 
97  return true;
98  }
99 private:
100 
102  auto master_pred = [](std::shared_ptr<GmappingWorld> p) {
103  return p->is_master();
104  };
105  auto prts = _pf.particles();
106  bool master_survived = prts.end() !=
107  std::find_if(prts.begin(), prts.end(), master_pred);
108 
109  if (!master_survived) {
110  _pf.heaviest_particle().mark_master();
111  }
112  }
113 
114 private: // fields
117 };
118 
119 #endif // header-guard
void handle_observation(TransformedLaserScan &obs) override
const SingleStateHypothesisLSGWProperties _shw_p
RobotPoseDelta _traversed_since_last_resample
RobotPoseDelta abs() const
Definition: robot_pose.h:44
GmappingParticleFactory(const SingleStateHypothesisLSGWProperties &shw_p, const GMappingParams &gprms)
void update_robot_pose(const RobotPoseDelta &delta) override
const WorldT & world() const override
std::shared_ptr< GmappingWorld > create_particle() override
UnboundedLazyTiledGridMap MapType
ParticleFilter< GmappingWorld > _pf
RobotPoseDelta pose_delta
Definition: sensor_data.h:177
void handle_sensor_data(TransformedLaserScan &scan) override
GmappingParticleFilter(const SingleStateHypothesisLSGWProperties &shw_p, const GMappingParams &gprms, unsigned n=1)
const RobotPose & pose() const override
const GmappingWorld::MapType & map() const override


slam_constructor
Author(s): JetBrains Research, OSLL team
autogenerated on Mon Jun 10 2019 15:08:25