10 #ifndef CGRAPHSLAMHANDLER_IMPL_H 11 #define CGRAPHSLAMHANDLER_IMPL_H 16 template <
class GRAPH_T>
18 mrpt::utils::COutputLogger* logger,
20 const bool enable_visuals )
22 m_options_checker(options_checker),
23 m_do_save_results(true),
24 m_has_set_fnames(false),
25 m_enable_visuals(enable_visuals)
44 template <
class GRAPH_T>
49 m_logger->logFmt(LVL_WARN,
"graphslam-engine has finished.");
56 "Application will exit when the display window is closed.");
57 bool break_exec =
false;
61 std::this_thread::sleep_for(100ms);
85 LVL_DEBUG,
"Releasing CDisplayWindow3D instance...");
92 LVL_DEBUG,
"Releasing CWindowObserver instance...");
98 m_logger->logFmt(LVL_DEBUG,
"Releasing CWindowManager instance...");
102 m_logger->logFmt(LVL_INFO,
"Exited.");
105 template <
class GRAPH_T>
113 using namespace mrpt;
116 LVL_INFO,
"Setting up output directory: %s", output_dir_fname.c_str());
130 stringstream question;
133 question <<
"Directory exists. Choose between the " 134 <<
"following options" << std::endl;
135 question <<
"\t 1: Rename current folder and start new " 136 <<
"output directory (default)" << std::endl;
137 question <<
"\t 2: Remove existing contents and continue execution " 139 question <<
"\t 3: Handle potential conflict manually " 140 "(Halts program execution)" 142 question <<
"\t [ 1 | 2 | 3 ] --> ";
143 std::cout << question.str();
145 getline(cin, answer);
147 answer_int = atoi(&answer[0]);
158 m_logger->logFmt(LVL_INFO,
"Deleting existing files...");
174 string dst_fname = output_dir_fname + cur_date_validstr;
176 LVL_INFO,
"Renaming directory to: %s", dst_fname.c_str());
179 renameFile(output_dir_fname, dst_fname, &error_msg);
182 "\nError while trying to rename the output " 191 m_logger->logFmt(LVL_INFO,
"Creating the new directory structure...");
196 m_logger->logFmt(LVL_INFO,
"Finished initializing output directory.");
202 template <
class GRAPH_T>
218 template <
class GRAPH_T>
225 mrpt::format(
"\nConfiguration file not found: \n%s\n", fname.c_str()));
227 m_logger->logFmt(LVL_INFO,
"Reading the .ini file... ");
232 "GeneralConfiguration",
"user_decides_about_output_dir",
false,
false);
234 "GeneralConfiguration",
"output_dir_fname",
"graphslam_results",
false);
236 cfg_file.
read_bool(
"GeneralConfiguration",
"save_graph",
true,
false);
238 cfg_file.
read_bool(
"GeneralConfiguration",
"save_3DScene",
true,
false);
240 cfg_file.
read_bool(
"GeneralConfiguration",
"save_map",
true,
false);
242 "GeneralConfiguration",
"save_graph_fname",
"output_graph.graph",
245 "GeneralConfiguration",
"save_3DScene_fname",
"scene.3DScene",
false);
247 "GeneralConfiguration",
"save_map_fname",
"output_map",
false);
250 template <
class GRAPH_T>
255 using namespace mrpt;
262 "\nNode Registration Decider %s is not available.\n",
263 node_reg_str.c_str()));
267 "\nEdge Registration Decider %s is not available.\n",
268 edge_reg_str.c_str()));
271 format(
"\nOptimizer %s is not available\n", optimizer_str.c_str()));
282 template <
class GRAPH_T>
290 template <
class GRAPH_T>
297 stringstream ss_out(
"");
299 ss_out <<
"\n------------[ graphslam-engine_app Parameters ]------------" 303 ss_out <<
"User decides about output dir? = " 307 ss_out <<
"Generate .graph file? = " 309 ss_out <<
"Generate .3DScene file? = " 327 template <
class GRAPH_T>
337 template <
class GRAPH_T>
344 LVL_WARN,
"Overriding .ini Results directory -> %s...",
348 template <
class GRAPH_T>
355 m_logger->logFmt(LVL_INFO,
"Generating overall report...");
356 m_engine->generateReportFiles(output_dir_fname);
362 m_engine->saveGraph(&save_graph_fname);
368 m_engine->save3DScene(&save_3DScene_fname);
377 m_logger->logFmt(LVL_INFO,
"Generated report.");
380 template <
class GRAPH_T>
384 mrpt::make_aligned_shared<mrpt::maps::COccupancyGridMap2D>();
387 map->saveMetricMapRepresentationToFile(fname);
390 template <
class GRAPH_T>
402 size_t curr_rawlog_entry;
405 bool cont_exec =
true;
406 while (CRawlog::getActionObservationPairOrObservation(
407 rawlog_stream, action, observations, observation,
408 curr_rawlog_entry) &&
413 cont_exec =
m_engine->_execGraphSlamStep(
414 action, observations, observation, curr_rawlog_entry);
416 m_logger->logFmt(LVL_WARN,
"Finished graphslam execution.");
420 template <
class GRAPH_T>
439 m_logger->logFmt(LVL_DEBUG,
"Initialized CDisplayWindow3D...");
440 m_logger->logFmt(LVL_DEBUG,
"Listening to CDisplayWindow3D events...");
449 template <
class GRAPH_T>
452 std::map<std::string, bool> events_occurred;
456 bool request_to_exit = events_occurred.find(
"Ctrl+c")->second;
458 return !request_to_exit;
void setResultsDirName(const std::string &dirname)
Override the results directory filename that was initially set in the .ini file.
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1...
void setCDisplayWindow3DPtr(mrpt::gui::CDisplayWindow3D *win_in)
Store the CDisplayWindow3D pointer in the CWindowManager instance.
void readConfigFname(const std::string &fname)
Read configuration variables for the current graphSLAM execution from a .ini file.
virtual bool checkRegistrationDeciderExists(std::string given_reg, std::string reg_type) const
Check if the given registrator decider exists in the vector of deciders.
void unlockAccess3DScene()
Unlocks the access to the internal 3D scene.
void printParams() const
Print in a formatted manner the general configuraiton variables for the current graphSLAM execution...
bool createDirectory(const std::string &dirName)
Creates a directory.
bool read_bool(const std::string §ion, const std::string &name, bool defaultValue, bool failIfNotFound=false) const
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
std::shared_ptr< COpenGLViewport > Ptr
std::string m_rawlog_fname
optimizers_t optimizers_map
std::string m_save_graph_fname
This namespace provides a OS-independent interface to many useful functions: filenames manipulation...
bool m_user_decides_about_output_dir
mrpt::opengl::COpenGLScene::Ptr & get3DSceneAndLock()
Gets a reference to the smart shared pointer that holds the internal scene (carefuly read introductio...
mrpt::system::TTimeStamp getCurrentTime()
Returns the current (UTC) system time.
void setWindowObserverPtr(mrpt::graphslam::CWindowObserver *obsever_in)
Store the CWindowObserver pointer in the CWindowManager instance.
void saveResults(const std::string &output_dir_fname)
This class allows loading and storing values and vectors of different types from ".ini" files easily.
edge_regs_t edge_regs_map
node_regs_t node_regs_map
bool queryObserverForEvents()
Query the CWindowObserver instance for any pressed keys that might be of interest (e...
std::string m_output_dir_fname
bool fileExists(const std::string &fileName)
Test if a given file (or directory) exists.
bool renameFile(const std::string &oldFileName, const std::string &newFileName, std::string *error_msg=nullptr)
Renames a file - If the target path is different and the filesystem allows it, it will be moved to th...
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
void returnEventsStruct(std::map< std::string, bool > *codes_to_pressed, bool reset_keypresses=true)
Return a map of key code to a boolean indicating whether it was pressed since the previous time the c...
std::string timeToString(const mrpt::system::TTimeStamp t)
Convert a timestamp into this textual form (UTC): HH:MM:SS.MMMMMM.
std::string fileNameStripInvalidChars(const std::string &filename, const char replacement_to_invalid_chars='_')
Replace invalid filename chars by underscores ('_') or any other user-given char. ...
std::string m_save_map_fname
std::shared_ptr< COccupancyGridMap2D > Ptr
std::string getParamsAsString() const
void initVisualization()
Initialize visualization (e.g.
SLAM methods related to graphs of pose constraints.
CGraphSlamHandler(mrpt::utils::COutputLogger *logger, mrpt::graphslam::apps::TUserOptionsChecker< GRAPH_T > *options_checker, const bool enable_visuals)
Constructor.
void setPos(int x, int y) override
Changes the position of the window on the screen.
bool isOpen()
Returns false if the user has already closed the window.
void observeBegin(CObservable &obj)
Starts the subscription of this observer to the given object.
Main file for the GraphSlamEngine.
This namespace contains representation of robot actions and observations.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
std::shared_ptr< CSensoryFrame > Ptr
void saveMap(const std::string &fname)
std::shared_ptr< CObservation > Ptr
GLsizei const GLchar ** string
mrpt::graphslam::CWindowManager * m_win_manager
void forceRepaint()
Repaints the window.
void execute()
Method to be called for parsing the rawlog file provided and for running graphSLAM using that informa...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
mrpt::gui::CDisplayWindow3D * m_win
std::shared_ptr< CActionCollection > Ptr
mrpt::utils::COutputLogger * m_logger
Monitor events in the visualization window.
void setFNames(const std::string &ini_fname, const std::string &rawlog_fname, const std::string &ground_truth_fname=std::string())
Set the relevant filenames for instantiating CGraphSlamEngine instance.
std::shared_ptr< COpenGLScene > Ptr
The namespace for 3D scene representation and rendering.
bool deleteFilesInDirectory(const std::string &s, bool deleteDirectoryAsWell=false)
Delete all the files in a given directory (nothing done if directory does not exists, or path is a file).
std::string trim(const std::string &str)
Removes leading and trailing spaces.
GLenum GLsizei GLenum format
Classes for creating GUI windows for 2D and 3D visualization.
virtual bool checkOptimizerExists(std::string given_opt) const
Check if the given optimizer exists in the vector of optimizers.
bool directoryExists(const std::string &fileName)
Test if a given directory exists (it fails if the given path refers to an existing file)...
void initEngine(const std::string &node_reg_str, const std::string &edge_reg_str, const std::string &optimizer_str)
std::string m_save_3DScene_fname
mrpt::graphslam::CGraphSlamEngine< GRAPH_T > * m_engine
Pointer to the engine instance.
void initOutputDir(const std::string &output_dir_fname="graphslam_results")
Initialize (clean up and create new files) the output directory.
#define ASSERTMSG_(f, __ERROR_MSG)
mrpt::graphslam::CWindowObserver * m_win_observer
~CGraphSlamHandler()
Destructor.
Class acts as a container for storing pointers to mrpt::gui::CDisplayWindow3D, mrpt::graphslam::CWind...
A graphical user interface (GUI) for efficiently rendering 3D scenes in real-time.
mrpt::graphslam::apps::TUserOptionsChecker< GRAPH_T > * m_options_checker
TUserOptionsChecker instance whose task is to evaluate the Registration Decider, Optimizer instances ...