34 #include <mrpt/maps/COccupancyGridMap2D.h> 35 #include <mrpt/maps/CSimplePointsMap.h> 36 #include <mrpt/opengl/CEllipsoid2D.h> 37 #include <mrpt/opengl/COpenGLScene.h> 38 #include <mrpt/opengl/CPointCloud.h> 39 #include <mrpt/ros1bridge/map.h> 40 #include <mrpt/system/filesystem.h> 62 using mrpt::maps::COccupancyGridMap2D;
63 using mrpt::maps::CSimplePointsMap;
86 string iniSectionName(
"LocalizationExperiment");
91 iniSectionName,
"particles_count", std::vector<int>(1, 0),
97 param_->
map_file = ini_file.read_string(iniSectionName,
"map_file",
"");
101 SCENE3D_FREQ_ = ini_file.read_int(iniSectionName,
"3DSceneFrequency", 10);
103 ini_file.read_bool(iniSectionName,
"3DSceneFollowRobot",
true);
106 ini_file.read_bool(iniSectionName,
"SHOW_PROGRESS_3D_REAL_TIME",
false);
108 iniSectionName,
"SHOW_PROGRESS_3D_REAL_TIME_DELAY_MS", 1);
110 #if !MRPT_HAS_WXWIDGETS 118 CActionRobotMovement2D::mmGaussian;
121 ini_file.read_double(
"DummyOdometryParams",
"minStdXY", 0.04);
123 ini_file.read_double(
"DefaultOdometryParams",
"minStdPHI", 2.0));
127 ini_file.read_bool(iniSectionName,
"init_PDF_mode",
false,
true);
129 ini_file.read_float(iniSectionName,
"init_PDF_min_x", 0,
true);
131 ini_file.read_float(iniSectionName,
"init_PDF_max_x", 0,
true);
133 ini_file.read_float(iniSectionName,
"init_PDF_min_y", 0,
true);
135 ini_file.read_float(iniSectionName,
"init_PDF_max_y", 0,
true);
137 ini_file.read_float(iniSectionName,
"init_PDF_min_phi_deg", -180));
139 ini_file.read_float(iniSectionName,
"init_PDF_max_phi_deg", 180));
140 mrpt::poses::CPose2D p;
141 mrpt::math::CMatrixDouble33 cov;
145 min_phi < max_phi ? max_phi - min_phi : (max_phi + 2 *
M_PI) - min_phi;
148 p.phi() = min_phi + cov(2, 2) / 2.0;
150 "----------- phi: %4.3f: %4.3f <-> %4.3f, %4.3f\n", p.phi(), min_phi,
160 if (!mrpt::ros1bridge::MapHdl::loadMap(
176 CParticleFilter::TParticleFilterOptions pfOptions;
177 pfOptions.loadFromConfigFile(_configFile,
"PF_options");
178 pfOptions.dumpToConsole();
182 TMonteCarloLocalizationParams pdfPredictionOptions;
183 pdfPredictionOptions.KLD_params.loadFromConfigFile(
184 _configFile,
"KLD_options");
189 pdf_.options = pdfPredictionOptions;
194 pf_.m_options = pfOptions;
203 win3D_ = CDisplayWindow3D::Create(
204 "pf-localization - The MRPT project", 1000, 600);
205 win3D_->setCameraZoom(20);
206 win3D_->setCameraAzimuthDeg(-45);
211 COccupancyGridMap2D::TEntropyInfo grid_info;
213 if (
metric_map_->countMapsByClass<COccupancyGridMap2D>())
215 metric_map_->mapByClass<COccupancyGridMap2D>()->computeEntropy(
224 "The gridmap has %.04fm2 observed area, %u observed cells\n",
225 grid_info.effectiveMappedArea,
226 (
unsigned)grid_info.effectiveMappedCells);
228 "Initial PDF: %f particles/m2\n",
236 COpenGLScene::Ptr ptr_scene =
win3D_->get3DSceneAndLock();
238 ptr_scene->insert(plane);
240 ptr_scene->enableFollowCamera(
true);
242 win3D_->unlockAccess3DScene();
246 ROS_INFO(
" --------------------------- init3DDebug done \n");
255 TTimeStamp cur_obs_timestamp = INVALID_TIMESTAMP;
256 if (_observations->size() > 0)
258 _observations->getObservationByIndex(0)->timestamp;
260 const auto [cov, meanPose] =
pdf_.getCovarianceAndMean();
262 COpenGLScene::Ptr ptr_scene =
win3D_->get3DSceneAndLock();
264 win3D_->setCameraPointingToPoint(meanPose.x(), meanPose.y(), 0);
266 mrpt::opengl::TFontParams fp;
267 fp.color = TColorf(.8
f, .8
f, .8
f);
268 fp.vfont_name =
"mono";
275 cur_obs_timestamp != INVALID_TIMESTAMP
276 ? mrpt::system::dateTimeLocalToString(cur_obs_timestamp)
284 "#particles= %7u", static_cast<unsigned int>(
pdf_.size())),
290 "mean pose (x y phi_deg)= %s", meanPose.asString().c_str()),
295 CRenderizable::Ptr parts = ptr_scene->getByName(
"particles");
296 if (parts) ptr_scene->removeObject(parts);
298 CSetOfObjects::Ptr p =
pdf_.getAs3DObject<CSetOfObjects::Ptr>();
299 p->setName(
"particles");
300 ptr_scene->insert(p);
305 CRenderizable::Ptr ellip = ptr_scene->getByName(
"parts_cov");
308 auto o = CEllipsoid2D::Create();
310 ellip->setName(
"parts_cov");
311 ellip->setColor(1, 0, 0, 0.6);
315 o->set2DsegmentsCount(60);
316 ptr_scene->insert(ellip);
318 ellip->setLocation(meanPose.x(), meanPose.y(), 0.05);
319 dynamic_cast<CEllipsoid2D*
>(ellip.get())
320 ->setCovMatrix(cov.blockCopy<2, 2>());
325 CRenderizable::Ptr scan_pts = ptr_scene->getByName(
"scan");
328 auto o = CPointCloud::Create();
330 scan_pts->setName(
"scan");
331 scan_pts->setColor(1, 0, 0, 0.9);
332 o->enableColorFromZ(
false);
334 ptr_scene->insert(scan_pts);
337 CSimplePointsMap map;
338 static CSimplePointsMap last_map;
340 CPose3D robot_pose_3D(meanPose);
343 _observations->insertObservationsInto(map);
345 dynamic_cast<CPointCloud*
>(scan_pts.get())
346 ->loadFromPointsMap(&last_map);
347 dynamic_cast<CPointCloud*
>(scan_pts.get())->setPose(robot_pose_3D);
352 ptr_scene->enableFollowCamera(
true);
355 COpenGLViewport::Ptr view1 = ptr_scene->getViewport(
"main");
357 CCamera& cam = view1->getCamera();
358 cam.setAzimuthDegrees(-90);
359 cam.setElevationDegrees(90);
360 cam.setPointingAt(meanPose);
361 cam.setZoomDistance(5);
365 win3D_->unlockAccess3DScene();
374 std::this_thread::sleep_for(
bool SHOW_PROGRESS_3D_REAL_TIME_
virtual ~PFLocalization()
mrpt::gui::CDisplayWindow3D::Ptr win3D_
mrpt::opengl::COpenGLScene scene_
int SHOW_PROGRESS_3D_REAL_TIME_DELAY_MS_
int initial_particle_count_
number of particles for initialization
float init_PDF_min_x
any cell
mrpt::slam::CMonteCarloLocalization2D pdf_
the filter
mrpt::poses::CPosePDFGaussian initial_pose_
initial posed used in initializeFilter()
virtual bool waitForMap()
#define ROS_INFO_STREAM(args)
void show3DDebug(CSensoryFrame::Ptr _observations)
PFLocalization(Parameters *parm)
mrpt::bayes::CParticleFilter pf_
common interface for particle filters
CActionRobotMovement2D::TMotionModelOptions motion_model_default_options_
used if there are is not odom
void configureFilter(const mrpt::config::CConfigFile &_configFile)
CMultiMetricMap::Ptr metric_map_
map