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;
std::string m_save_map_fname
void setResultsDirName(const std::string &dirname)
Override the results directory filename that was initially set in the .ini file.
mrpt::utils::COutputLogger * m_logger
void execute()
Method to be called for parsing the rawlog file provided and for running graphSLAM using that informa...
mrpt::graphslam::CGraphSlamEngine< GRAPH_T > * m_engine
Pointer to the engine instance.
mrpt::gui::CDisplayWindow3D * m_win
mrpt::graphslam::apps::TUserOptionsChecker< GRAPH_T > * m_options_checker
TUserOptionsChecker instance whose task is to evaluate the Registration Decider, Optimizer instances ...
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::string m_rawlog_fname
mrpt::graphslam::CWindowObserver * m_win_observer
std::string m_save_3DScene_fname
void readConfigFname(const std::string &fname)
Read configuration variables for the current graphSLAM execution from a .ini file.
void saveResults(const std::string &output_dir_fname)
void initEngine(const std::string &node_reg_str, const std::string &edge_reg_str, const std::string &optimizer_str)
void initVisualization()
Initialize visualization (e.g.
void saveMap(const std::string &fname)
void initOutputDir(const std::string &output_dir_fname="graphslam_results")
Initialize (clean up and create new files) the output directory.
std::string m_save_graph_fname
void printParams() const
Print in a formatted manner the general configuraiton variables for the current graphSLAM execution.
CGraphSlamHandler(mrpt::utils::COutputLogger *logger, mrpt::graphslam::apps::TUserOptionsChecker< GRAPH_T > *options_checker, const bool enable_visuals)
Constructor.
mrpt::graphslam::CWindowManager * m_win_manager
std::string getParamsAsString() const
std::string m_output_dir_fname
~CGraphSlamHandler()
Destructor.
bool queryObserverForEvents()
Query the CWindowObserver instance for any pressed keys that might be of interest (e....
bool m_user_decides_about_output_dir
Main file for the GraphSlamEngine.
Class acts as a container for storing pointers to mrpt::gui::CDisplayWindow3D, mrpt::graphslam::CWind...
void setCDisplayWindow3DPtr(mrpt::gui::CDisplayWindow3D *win_in)
Store the CDisplayWindow3D pointer in the CWindowManager instance.
void setWindowObserverPtr(mrpt::graphslam::CWindowObserver *obsever_in)
Store the CWindowObserver pointer in the CWindowManager instance.
Monitor events in the visualization window.
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...
bool isOpen()
Returns false if the user has already closed the window.
A graphical user interface (GUI) for efficiently rendering 3D scenes in real-time.
void forceRepaint()
Repaints the window.
void unlockAccess3DScene()
Unlocks the access to the internal 3D scene.
void setPos(int x, int y) override
Changes the position of the window on the screen.
mrpt::opengl::COpenGLScene::Ptr & get3DSceneAndLock()
Gets a reference to the smart shared pointer that holds the internal scene (carefuly read introductio...
std::shared_ptr< COccupancyGridMap2D > Ptr
std::shared_ptr< CActionCollection > Ptr
std::shared_ptr< CObservation > Ptr
std::shared_ptr< CSensoryFrame > Ptr
std::shared_ptr< COpenGLScene > Ptr
std::shared_ptr< COpenGLViewport > Ptr
bool read_bool(const std::string §ion, const std::string &name, bool defaultValue, bool failIfNotFound=false) const
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
This class allows loading and storing values and vectors of different types from "....
void observeBegin(CObservable &obj)
Starts the subscription of this observer to the given object.
GLenum GLsizei GLenum format
GLsizei const GLchar ** string
bool deleteFilesInDirectory(const std::string &s, bool deleteDirectoryAsWell=false)
Delete all the files in a given directory (nothing done if directory does not exists,...
bool createDirectory(const std::string &dirName)
Creates a directory.
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 fileNameStripInvalidChars(const std::string &filename, const char replacement_to_invalid_chars='_')
Replace invalid filename chars by underscores ('_') or any other user-given char.
bool directoryExists(const std::string &fileName)
Test if a given directory exists (it fails if the given path refers to an existing file).
bool fileExists(const std::string &fileName)
Test if a given file (or directory) exists.
std::string trim(const std::string &str)
Removes leading and trailing spaces.
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1,...
std::string timeToString(const mrpt::system::TTimeStamp t)
Convert a timestamp into this textual form (UTC): HH:MM:SS.MMMMMM.
mrpt::system::TTimeStamp getCurrentTime()
Returns the current (UTC) system time.
#define ASSERTMSG_(f, __ERROR_MSG)
SLAM methods related to graphs of pose constraints.
Classes for creating GUI windows for 2D and 3D visualization.
This namespace contains representation of robot actions and observations.
The namespace for 3D scene representation and rendering.
This namespace provides a OS-independent interface to many useful functions: filenames manipulation,...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
Class containing the declarations of supplementary methods that can be used in application-related co...