32 mrpt::gui::CDisplayWindow3D* win, std::string obj_name =
"")
37 COpenGLScene::Ptr& scene = win->get3DSceneAndLock();
41 cout <<
"Clearing entire scene." << endl;
46 CRenderizable::Ptr obj = scene->getByName(obj_name);
49 scene->removeObject(obj);
57 win->unlockAccess3DScene();
64 mrpt::graphslam::CWindowManager* win_manager, std::string obj_name =
"")
70 template <
class RENDERIZABLE_OBJECT>
72 mrpt::gui::CDisplayWindow3D* win,
const RENDERIZABLE_OBJECT& o,
73 const std::string& obj_name =
"",
74 const mrpt::poses::CPose3D& obj_pose =
EMPTY_POSE)
78 COpenGLScene::Ptr& scene = win->get3DSceneAndLock();
79 CSetOfObjects::Ptr obj = o.getVisualization();
81 obj->setPose(obj_pose);
83 if (!obj_name.empty())
85 obj->setName(obj_name);
90 win->unlockAccess3DScene();
94 void addAxis(mrpt::gui::CDisplayWindow3D* win)
100 COpenGLScene::Ptr& scene = win->get3DSceneAndLock();
101 opengl::CAxis::Ptr obj =
102 opengl::CAxis::Create(-6, -6, -6, 6, 6, 6, 2, 2,
true);
103 obj->setLocation(0, 0, 0);
105 win->unlockAccess3DScene();
109 void addGrid(mrpt::gui::CDisplayWindow3D* win)
111 using namespace mrpt;
115 COpenGLScene::Ptr& scene = win->get3DSceneAndLock();
116 opengl::CGridPlaneXY::Ptr obj =
117 opengl::CGridPlaneXY::Create(-20, 20, -20, 20, 0, 1);
118 obj->setColor(0.7, 0.7, 0.7);
119 obj->setLocation(0, 0, 0);
122 win->unlockAccess3DScene();
138 : m_logger(logger_in),
140 m_conn_manager(logger_in, nh_in),
143 quit_keypress2(
"Ctrl+c"),
144 map_merge_keypress(
"n"),
145 save_map_merging_results(true)
170 mrpt::graphslam::CWindowObserver* win_observer)
172 ASSERT_(win_observer);
174 win_observer->registerKeystroke(
quit_keypress1,
"Finish execution");
175 win_observer->registerKeystroke(
182 for (neighbors_t::iterator n_it =
m_neighbors.begin();
196 m_logger->logFmt(LVL_WARN,
"Exiting...");
204 const GraphSlamAgents& nearby_slam_agents =
209 for (GraphSlamAgents::_list_type::const_iterator it =
210 nearby_slam_agents.list.begin();
211 it != nearby_slam_agents.list.end(); ++it)
213 const GraphSlamAgent& gsa = *it;
217 return (neighbor->agent == gsa);
219 typename neighbors_t::iterator n_it =
231 "Initialized NeighborAgentMapProps instance for agent %s...",
232 latest_neighbor->
agent.topic_namespace.data.c_str());
236 win_manager->win->setWindowTitle(
237 latest_neighbor->
agent.topic_namespace.data);
239 make_pair(latest_neighbor, win_manager));
245 bool continue_exec =
true;
246 for (map<TNeighborAgentMapProps*, CWindowManager*>::const_iterator it =
250 CWindowManager* win_manager = it->second;
252 std::map<std::string, bool> events_map;
253 win_manager->observer->returnEventsStruct(&events_map);
259 win_manager->win->forceRepaint();
265 continue_exec =
false;
273 std::map<std::string, bool> events_map;
285 return continue_exec;
293 m_logger->logFmt(LVL_WARN,
"In mergeMaps.");
295 CGridMapAligner gridmap_aligner;
304 for (neighbors_t::const_iterator n_it =
m_neighbors.begin();
319 COccupancyGridMap2D::Ptr map = COccupancyGridMap2D::Create();
321 LVL_INFO,
"Adding map of agent \"%s\" to the stack",
322 neighbor.
agent.topic_namespace.data.c_str());
323 mrpt::ros1bridge::fromROS(*neighbor.
nav_map, *map);
327 mrpt_gridmaps.insert(make_pair(*n_it, map));
332 CSetOfLines::Ptr curr_traj = CSetOfLines::Create();
333 curr_traj->setPose(CPose3D(0, 0, 0.3, 0, 0, 0));
334 curr_traj->setLineWidth(1.5);
335 curr_traj->setColor(TColorf(0, 0, 1));
338 curr_traj->appendLine(
342 for (nav_msgs::Path::_poses_type::const_iterator pth_it =
346 curr_traj->appendLineStrip(
347 pth_it->pose.position.x, pth_it->pose.position.y, 0);
351 COpenGLScene::Ptr& scene =
352 neighbor_win_manager->win->get3DSceneAndLock();
353 scene->insert(curr_traj);
355 neighbor_win_manager->win->unlockAccess3DScene();
356 neighbor_win_manager->win->forceRepaint();
364 auto tmp = CSetOfLines::Ptr(
365 dynamic_cast<CSetOfLines*>(curr_traj->clone()));
366 auto curr_traj = mrpt::ptr_cast<CSetOfLines>::from(tmp);
368 mrpt_trajectories.insert(make_pair(&neighbor, curr_traj));
375 if (mrpt_gridmaps.size() >= 2)
378 LVL_INFO,
"Executing map merging for [%lu] gridmaps",
379 static_cast<unsigned long>(mrpt_gridmaps.size()));
380 int merge_counter = 0;
383 std::string output_dir_fname =
"map_merger_results";
387 LVL_INFO,
"Saving map-merging results to \"%s\"",
388 output_dir_fname.c_str());
396 bool does_exist = directoryExists(output_dir_fname);
399 deleteFilesInDirectory(output_dir_fname);
404 LVL_INFO,
"Initializing gridmaps output directory.\n");
405 createDirectory(output_dir_fname);
410 COccupancyGridMap2D::Ptr fused_map = COccupancyGridMap2D::Create();
411 fused_map->copyMapContentFrom(*mrpt_gridmaps.begin()->second);
417 COpenGLScene::Ptr& fused_scene =
420 m_logger->logFmt(LVL_INFO,
"Clearing the fused map visuals");
425 CSetOfObjects::Ptr first_map_obj = fused_map->getVisualization();
429 first_map_obj->setName(format(
430 "map_%s", mrpt_gridmaps.begin()
431 ->first->agent.topic_namespace.data.c_str()));
432 fused_scene->insert(first_map_obj);
442 ss << output_dir_fname <<
"/" 443 <<
"map" << merge_counter;
444 (mrpt_gridmaps.begin()->second)
445 ->saveMetricMapRepresentationToFile(ss.str());
450 double off_z_step = 1;
461 for (neighbors_t::const_iterator n_it =
m_neighbors.begin();
464 neighbor_to_is_used[*n_it] =
false;
465 neighbor_to_rel_pose[*n_it] = CPose2D();
472 for (maps_t::iterator m_it = std::next(mrpt_gridmaps.begin());
473 m_it != mrpt_gridmaps.end(); ++m_it, ++merge_counter)
476 COccupancyGridMap2D* curr_gridmap = m_it->second.get();
479 CGridMapAligner::TReturnInfo results;
480 CPosePDFGaussian init_estim;
482 LVL_INFO,
"Trying to align the maps, initial estimation: %s",
483 init_estim.mean.asString().c_str());
485 TMetricMapAlignmentResult alignRes;
487 const CPosePDF::Ptr pdf_tmp = gridmap_aligner.AlignPDF(
488 fused_map.get(), curr_gridmap, init_estim, alignRes);
490 const auto run_time = alignRes.executionTime;
492 m_logger->logFmt(LVL_INFO,
"Elapsed Time: %f", run_time);
494 CPosePDFSOG::Ptr pdf_out = CPosePDFSOG::Create();
495 pdf_out->copyFrom(*pdf_tmp);
498 CMatrixDouble33 cov_out;
499 pdf_out->getMostLikelyCovarianceAndMean(cov_out, pose_out);
507 neighbor_to_rel_pose.at(curr_neighbor) = pose_out;
508 neighbor_to_is_used.at(curr_neighbor) =
true;
518 ss << output_dir_fname <<
"/" 519 <<
"map" << merge_counter;
520 curr_gridmap->saveMetricMapRepresentationToFile(ss.str());
527 ss << output_dir_fname <<
"/" 528 <<
"fusing_proc_with" 529 <<
"_" << merge_counter;
530 COccupancyGridMap2D::saveAsEMFTwoMapsWithCorrespondences(
531 ss.str(), fused_map.get(), curr_gridmap,
532 results.correspondences);
537 COpenGLScene::Ptr fused_scene =
543 "Adding map to the fused map visualiztion using " 545 pose_out.asString().c_str());
546 CSetOfObjects::Ptr curr_map_obj =
547 curr_gridmap->getVisualization();
549 curr_map_obj->setName(format(
551 curr_neighbor->
agent.topic_namespace.data.c_str()));
552 curr_map_obj->setPose(pose_out + CPose3D(0, 0, off_z, 0, 0, 0));
554 fused_scene->insert(curr_map_obj);
565 TColorManager traj_color_mngr;
567 for (trajectories_t::const_iterator it = mrpt_trajectories.begin();
568 it != mrpt_trajectories.end(); ++it)
572 if (!neighbor_to_is_used.at(curr_neighbor))
576 "Skipping visualizing trajectory of agent %s in the fused " 578 curr_neighbor->
agent.topic_namespace.data.c_str());
582 CSetOfLines::Ptr curr_traj = it->second;
584 LVL_WARN,
"Adding #%lu lines...",
585 static_cast<unsigned long>(curr_traj->getLineCount()));
588 CPose3D rel_pose(neighbor_to_rel_pose.at(curr_neighbor));
590 rel_pose += CPose3D(0, 0, off_z, 0, 0, 0);
592 curr_traj->setColor(traj_color_mngr.getNextTColorf());
593 curr_traj->setPose(rel_pose);
594 curr_traj->setName(format(
595 "traj_%s", curr_neighbor->
agent.topic_namespace.data.c_str()));
597 COpenGLScene::Ptr fused_scene =
599 fused_scene->insert(curr_traj);
608 COpenGLScene::Ptr fused_scene =
610 std::string fname = output_dir_fname +
"/" +
"output_scene.3DScene";
611 fused_scene->saveToFile(fname);
626 mrpt::graphslam::CWindowManager* win_manager =
new CWindowManager();
634 using namespace mrpt::gui;
636 ASSERT_(win_manager);
638 CWindowObserver* win_observer =
new CWindowObserver();
639 CDisplayWindow3D* win =
640 new CDisplayWindow3D(
"GraphSlam building procedure", 800, 600);
641 win->setPos(400, 200);
642 win_observer->observeBegin(*win);
644 COpenGLScene::Ptr& scene = win->get3DSceneAndLock();
645 COpenGLViewport::Ptr main_view = scene->getViewport(
"main");
646 win_observer->observeBegin(*main_view);
647 win->unlockAccess3DScene();
651 win_manager->setCDisplayWindow3DPtr(win);
652 win_manager->setWindowObserverPtr(win_observer);
655 m_logger->logFmt(LVL_DEBUG,
"Initialized CDisplayWindow3D...");
std::string quit_keypress1
std::map< TNeighborAgentMapProps *, CWindowManager * > m_neighbors_to_windows
void monitorKeystrokes(mrpt::graphslam::CWindowObserver *win_observer)
Compact method for monitoring the given keystrokes for the given observer.
const mrpt::poses::CPose3D EMPTY_POSE
bool save_map_merging_results
std::string map_merge_keypress
mrpt::slam::CGridMapAligner::TConfigParams m_alignment_options
mrpt::graphslam::detail::CConnectionManager m_conn_manager
void addToWindow(mrpt::gui::CDisplayWindow3D *win, const RENDERIZABLE_OBJECT &o, const std::string &obj_name="", const mrpt::poses::CPose3D &obj_pose=EMPTY_POSE)
std::string getGridMapAlignmentResultsAsString(const mrpt::poses::CPosePDF &pdf, const mrpt::slam::CGridMapAligner::TReturnInfo &ret_info)
nav_msgs::Path::ConstPtr nav_robot_trajectory
Trajectory of the correspondign agent - in ROS form.
void addAxis(mrpt::gui::CDisplayWindow3D *win)
std::map< TNeighborAgentMapProps *, COccupancyGridMap2D::Ptr > maps_t
std::string m_global_ns
Topic namespace under which current node is going to be publishing.
mrpt::graphslam::CWindowManager * m_fused_map_win_manager
const mrpt_msgs::GraphSlamAgent & agent
Pointer to the GraphSlamAgent instance of the neighbor.
mrpt::system::COutputLogger * m_logger
neighbors_t m_neighbors
CConnectionManager instance for fetching the running graphSLAM agents.
bool isEssentiallyZero(const mrpt::poses::CPose2D &p)
Struct holding a COccupancyGridMap2D (as well as subscribers for updating it) for a specific running ...
nav_msgs::OccupancyGrid::ConstPtr nav_map
Map generated by the corresponding agent - in ROS form.
std::map< TNeighborAgentMapProps *, mrpt::opengl::CSetOfLines::Ptr > trajectories_t
Robot trajectory visual object type.
CMapMerger(mrpt::system::COutputLogger *logger_in, ros::NodeHandle *nh_in)
void getNearbySlamAgents(mrpt_msgs::GraphSlamAgents *agents_vec, bool ignore_self=true)
Fill the given vector with the SLAM Agents that the current manager can see and communicate with...
void addSupWidgets(mrpt::gui::CDisplayWindow3D *win)
std::map< TNeighborAgentMapProps *, mrpt::poses::CPose2D > neighbor_to_rel_pose_t
std::string quit_keypress2
bool updateState()
Query and fetch the list of new graphSLAM agents.
void addGrid(mrpt::gui::CDisplayWindow3D *win)
bool removeObjectFrom3DScene(mrpt::gui::CDisplayWindow3D *win, std::string obj_name="")
ROSCPP_DECL bool search(const std::string &ns, const std::string &key, std::string &result)
mrpt::graphslam::CWindowManager * initWindowVisuals()
std::map< TNeighborAgentMapProps *, bool > neighbor_to_is_used_t