mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 00:37:46 +08:00
RTAB-Map.exe can be started with parameters as arguments (in similar way than rtabmap-console)
This commit is contained in:
+7
-1
@@ -47,6 +47,8 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
/* Create tasks */
|
/* Create tasks */
|
||||||
QApplication * app = new QApplication(argc, argv);
|
QApplication * app = new QApplication(argc, argv);
|
||||||
|
|
||||||
|
ParametersMap parameters = Parameters::parseArguments(argc, argv, true);
|
||||||
MainWindow * mainWindow = new MainWindow();
|
MainWindow * mainWindow = new MainWindow();
|
||||||
app->installEventFilter(mainWindow); // to catch FileOpen events.
|
app->installEventFilter(mainWindow); // to catch FileOpen events.
|
||||||
|
|
||||||
@@ -82,7 +84,11 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
if(!database.empty())
|
if(!database.empty())
|
||||||
{
|
{
|
||||||
QMetaObject::invokeMethod(mainWindow, "openDatabase", Qt::QueuedConnection, Q_ARG(QString, QString(database.c_str())));
|
mainWindow->openDatabase(database.c_str());
|
||||||
|
}
|
||||||
|
if(parameters.size())
|
||||||
|
{
|
||||||
|
mainWindow->updateParameters(parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now wait for application to finish
|
// Now wait for application to finish
|
||||||
|
|||||||
@@ -531,7 +531,7 @@ public:
|
|||||||
static void parse(const ParametersMap & parameters, ParametersMap & parametersOut);
|
static void parse(const ParametersMap & parameters, ParametersMap & parametersOut);
|
||||||
|
|
||||||
static const char * showUsage();
|
static const char * showUsage();
|
||||||
static ParametersMap parseArguments(int argc, char * argv[]);
|
static ParametersMap parseArguments(int argc, char * argv[], bool onlyParameters = false);
|
||||||
|
|
||||||
static std::string getVersion();
|
static std::string getVersion();
|
||||||
static std::string getDefaultDatabaseName();
|
static std::string getDefaultDatabaseName();
|
||||||
|
|||||||
+137
-125
@@ -507,160 +507,172 @@ const char * Parameters::showUsage()
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
ParametersMap Parameters::parseArguments(int argc, char * argv[])
|
ParametersMap Parameters::parseArguments(int argc, char * argv[], bool onlyParameters)
|
||||||
{
|
{
|
||||||
ParametersMap out;
|
ParametersMap out;
|
||||||
const ParametersMap & parameters = getDefaultParameters();
|
const ParametersMap & parameters = getDefaultParameters();
|
||||||
const std::map<std::string, std::pair<bool, std::string> > & removedParams = getRemovedParameters();
|
const std::map<std::string, std::pair<bool, std::string> > & removedParams = getRemovedParameters();
|
||||||
for(int i=0;i<argc;++i)
|
for(int i=0;i<argc;++i)
|
||||||
{
|
{
|
||||||
if(strcmp(argv[i], "--nolog") == 0)
|
bool checkParameters = onlyParameters;
|
||||||
|
if(!checkParameters)
|
||||||
{
|
{
|
||||||
ULogger::setType(ULogger::kTypeNoLog);
|
if(strcmp(argv[i], "--nolog") == 0)
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--logconsole") == 0)
|
|
||||||
{
|
|
||||||
ULogger::setType(ULogger::kTypeConsole);
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--logfile") == 0)
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
if(i < argc)
|
|
||||||
{
|
{
|
||||||
ULogger::setType(ULogger::kTypeFile, argv[i], false);
|
ULogger::setType(ULogger::kTypeNoLog);
|
||||||
}
|
}
|
||||||
else
|
else if(strcmp(argv[i], "--logconsole") == 0)
|
||||||
{
|
{
|
||||||
UERROR("\"--logfile\" argument requires following file path");
|
ULogger::setType(ULogger::kTypeConsole);
|
||||||
}
|
}
|
||||||
}
|
else if(strcmp(argv[i], "--logfile") == 0)
|
||||||
else if(strcmp(argv[i], "--logfilea") == 0)
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
if(i < argc)
|
|
||||||
{
|
|
||||||
ULogger::setType(ULogger::kTypeFile, argv[i], true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UERROR("\"--logfilea\" argument requires following file path");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--udebug") == 0)
|
|
||||||
{
|
|
||||||
ULogger::setLevel(ULogger::kDebug);
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--uinfo") == 0)
|
|
||||||
{
|
|
||||||
ULogger::setLevel(ULogger::kInfo);
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--uwarn") == 0)
|
|
||||||
{
|
|
||||||
ULogger::setLevel(ULogger::kWarning);
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--uerror") == 0)
|
|
||||||
{
|
|
||||||
ULogger::setLevel(ULogger::kError);
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--ulogtime") == 0)
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
if(i < argc)
|
|
||||||
{
|
|
||||||
ULogger::setPrintTime(uStr2Bool(argv[i]));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UERROR("\"--ulogtime\" argument requires a following boolean value");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--ulogwhere") == 0)
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
if(i < argc)
|
|
||||||
{
|
|
||||||
ULogger::setPrintWhere(uStr2Bool(argv[i]));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UERROR("\"--ulogwhere\" argument requires a following boolean value");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--ulogthread") == 0)
|
|
||||||
{
|
|
||||||
++i;
|
|
||||||
if(i < argc)
|
|
||||||
{
|
|
||||||
ULogger::setPrintThreadId(uStr2Bool(argv[i]));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UERROR("\"--ulogthread\" argument requires a following boolean value");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(strcmp(argv[i], "--params") == 0)
|
|
||||||
{
|
|
||||||
for(rtabmap::ParametersMap::const_iterator iter=parameters.begin(); iter!=parameters.end(); ++iter)
|
|
||||||
{
|
|
||||||
std::string str = "Param: " + iter->first + " = \"" + iter->second + "\"";
|
|
||||||
std::cout <<
|
|
||||||
str <<
|
|
||||||
std::setw(60 - str.size()) <<
|
|
||||||
" [" <<
|
|
||||||
rtabmap::Parameters::getDescription(iter->first).c_str() <<
|
|
||||||
"]" <<
|
|
||||||
std::endl;
|
|
||||||
}
|
|
||||||
UWARN("App will now exit after showing default RTAB-Map parameters because "
|
|
||||||
"argument \"--params\" is detected!");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
else // check for parameters
|
|
||||||
{
|
|
||||||
std::string key = uReplaceChar(argv[i], '-', "");
|
|
||||||
ParametersMap::const_iterator iter = parameters.find(key);
|
|
||||||
if(iter != parameters.end())
|
|
||||||
{
|
{
|
||||||
++i;
|
++i;
|
||||||
if(i < argc)
|
if(i < argc)
|
||||||
{
|
{
|
||||||
uInsert(out, ParametersPair(iter->first, argv[i]));
|
ULogger::setType(ULogger::kTypeFile, argv[i], false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("\"--logfile\" argument requires following file path");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[i], "--logfilea") == 0)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
if(i < argc)
|
||||||
|
{
|
||||||
|
ULogger::setType(ULogger::kTypeFile, argv[i], true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("\"--logfilea\" argument requires following file path");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[i], "--udebug") == 0)
|
||||||
|
{
|
||||||
|
ULogger::setLevel(ULogger::kDebug);
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[i], "--uinfo") == 0)
|
||||||
|
{
|
||||||
|
ULogger::setLevel(ULogger::kInfo);
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[i], "--uwarn") == 0)
|
||||||
|
{
|
||||||
|
ULogger::setLevel(ULogger::kWarning);
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[i], "--uerror") == 0)
|
||||||
|
{
|
||||||
|
ULogger::setLevel(ULogger::kError);
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[i], "--ulogtime") == 0)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
if(i < argc)
|
||||||
|
{
|
||||||
|
ULogger::setPrintTime(uStr2Bool(argv[i]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("\"--ulogtime\" argument requires a following boolean value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[i], "--ulogwhere") == 0)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
if(i < argc)
|
||||||
|
{
|
||||||
|
ULogger::setPrintWhere(uStr2Bool(argv[i]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("\"--ulogwhere\" argument requires a following boolean value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(strcmp(argv[i], "--ulogthread") == 0)
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
if(i < argc)
|
||||||
|
{
|
||||||
|
ULogger::setPrintThreadId(uStr2Bool(argv[i]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("\"--ulogthread\" argument requires a following boolean value");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// backward compatibility
|
checkParameters = true;
|
||||||
std::map<std::string, std::pair<bool, std::string> >::const_iterator jter = removedParams.find(key);
|
}
|
||||||
if(jter!=removedParams.end())
|
}
|
||||||
|
|
||||||
|
if(checkParameters) // check for parameters
|
||||||
|
{
|
||||||
|
if(strcmp(argv[i], "--params") == 0)
|
||||||
|
{
|
||||||
|
for(rtabmap::ParametersMap::const_iterator iter=parameters.begin(); iter!=parameters.end(); ++iter)
|
||||||
{
|
{
|
||||||
if(jter->second.first)
|
std::string str = "Param: " + iter->first + " = \"" + iter->second + "\"";
|
||||||
|
std::cout <<
|
||||||
|
str <<
|
||||||
|
std::setw(60 - str.size()) <<
|
||||||
|
" [" <<
|
||||||
|
rtabmap::Parameters::getDescription(iter->first).c_str() <<
|
||||||
|
"]" <<
|
||||||
|
std::endl;
|
||||||
|
}
|
||||||
|
UWARN("App will now exit after showing default RTAB-Map parameters because "
|
||||||
|
"argument \"--params\" is detected!");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string key = uReplaceChar(argv[i], '-', "");
|
||||||
|
ParametersMap::const_iterator iter = parameters.find(key);
|
||||||
|
if(iter != parameters.end())
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
if(i < argc)
|
||||||
{
|
{
|
||||||
++i;
|
uInsert(out, ParametersPair(iter->first, argv[i]));
|
||||||
if(i < argc)
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// backward compatibility
|
||||||
|
std::map<std::string, std::pair<bool, std::string> >::const_iterator jter = removedParams.find(key);
|
||||||
|
if(jter!=removedParams.end())
|
||||||
|
{
|
||||||
|
if(jter->second.first)
|
||||||
{
|
{
|
||||||
std::string value = argv[i];
|
++i;
|
||||||
if(!value.empty())
|
if(i < argc)
|
||||||
{
|
{
|
||||||
value = uReplaceChar(value, ',', ' '); // for table
|
std::string value = argv[i];
|
||||||
key = jter->second.second;
|
if(!value.empty())
|
||||||
UWARN("Parameter migration from \"%s\" to \"%s\" (value=%s).",
|
{
|
||||||
jter->first.c_str(), jter->second.second.c_str(), value.c_str());
|
value = uReplaceChar(value, ',', ' '); // for table
|
||||||
uInsert(out, ParametersPair(key, value));
|
key = jter->second.second;
|
||||||
|
UWARN("Parameter migration from \"%s\" to \"%s\" (value=%s).",
|
||||||
|
jter->first.c_str(), jter->second.second.c_str(), value.c_str());
|
||||||
|
uInsert(out, ParametersPair(key, value));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UERROR("Value missing for argument \"%s\"", argv[i-1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(jter->second.second.empty())
|
||||||
|
{
|
||||||
|
UERROR("Parameter \"%s\" doesn't exist anymore.", jter->first.c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UERROR("Value missing for argument \"%s\"", argv[i-1]);
|
UERROR("Parameter \"%s\" doesn't exist anymore, check this similar parameter \"%s\".", jter->first.c_str(), jter->second.second.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(jter->second.second.empty())
|
|
||||||
{
|
|
||||||
UERROR("Parameter \"%s\" doesn't exist anymore.", jter->first.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UERROR("Parameter \"%s\" doesn't exist anymore, check this similar parameter \"%s\".", jter->first.c_str(), jter->second.second.c_str());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ public slots:
|
|||||||
void processStats(const rtabmap::Statistics & stat);
|
void processStats(const rtabmap::Statistics & stat);
|
||||||
void updateCacheFromDatabase(const QString & path);
|
void updateCacheFromDatabase(const QString & path);
|
||||||
void openDatabase(const QString & path);
|
void openDatabase(const QString & path);
|
||||||
|
void updateParameters(const rtabmap::ParametersMap & parameters);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void closeEvent(QCloseEvent* event);
|
virtual void closeEvent(QCloseEvent* event);
|
||||||
|
|||||||
+51
-14
@@ -3821,6 +3821,22 @@ void MainWindow::configGUIModified()
|
|||||||
this->setWindowModified(true);
|
this->setWindowModified(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::updateParameters(const ParametersMap & parameters)
|
||||||
|
{
|
||||||
|
if(parameters.size())
|
||||||
|
{
|
||||||
|
for(ParametersMap::const_iterator iter= parameters.begin(); iter!=parameters.end(); ++iter)
|
||||||
|
{
|
||||||
|
QString msg = tr("Parameter update \"%1\"=\"%2\"")
|
||||||
|
.arg(iter->first.c_str())
|
||||||
|
.arg(iter->second.c_str());
|
||||||
|
_ui->widget_console->appendMsg(msg);
|
||||||
|
UWARN(msg.toStdString().c_str());
|
||||||
|
}
|
||||||
|
_preferencesDialog->updateParameters(parameters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//ACTIONS
|
//ACTIONS
|
||||||
void MainWindow::saveConfigGUI()
|
void MainWindow::saveConfigGUI()
|
||||||
{
|
{
|
||||||
@@ -4089,22 +4105,43 @@ void MainWindow::startDetection()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(bufferingSize != 0 &&
|
if(_preferencesDialog->getSourceDriver() != PreferencesDialog::kSrcDatabase || !_preferencesDialog->isSourceDatabaseStampsUsed())
|
||||||
(_preferencesDialog->getSourceDriver() != PreferencesDialog::kSrcDatabase || !_preferencesDialog->isSourceDatabaseStampsUsed()))
|
|
||||||
{
|
{
|
||||||
int button = QMessageBox::question(this,
|
if(bufferingSize != 0)
|
||||||
tr("Some images may be skipped!"),
|
|
||||||
tr("\"RTAB-Map/Images buffer size\" is not infinite (size=%1). As the "
|
|
||||||
"source input is a directory of images/video/database, some images may be "
|
|
||||||
"skipped by the detector if the \"Source/Input rate\" (which is %2 Hz) is higher than the "
|
|
||||||
"rate at which RTAB-Map can process the images. You may want to set the "
|
|
||||||
"\"RTAB-Map/Images buffer size\" to 0 (infinite) to guaranty that all "
|
|
||||||
"images are processed. Would you want to start the detection "
|
|
||||||
"anyway?").arg(bufferingSize).arg(inputRate),
|
|
||||||
QMessageBox::Yes | QMessageBox::No);
|
|
||||||
if(button == QMessageBox::No)
|
|
||||||
{
|
{
|
||||||
return;
|
int button = QMessageBox::question(this,
|
||||||
|
tr("Some images may be skipped!"),
|
||||||
|
tr("\"RTAB-Map/Images buffer size\" is not infinite (size=%1). As the "
|
||||||
|
"source input is a directory of images/video/database, some images may be "
|
||||||
|
"skipped by the detector if the \"Source/Input rate\" (which is %2 Hz) is higher than the "
|
||||||
|
"rate at which RTAB-Map can process the images. You may want to set the "
|
||||||
|
"\"RTAB-Map/Images buffer size\" to 0 (infinite) to guaranty that all "
|
||||||
|
"images are processed. Would you want to start the detection "
|
||||||
|
"anyway?").arg(bufferingSize).arg(inputRate),
|
||||||
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
if(button == QMessageBox::No)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(inputRate == 0)
|
||||||
|
{
|
||||||
|
int button = QMessageBox::question(this,
|
||||||
|
tr("Large number of images may be buffered!"),
|
||||||
|
tr("\"RTAB-Map/Images buffer size\" is infinite. As the "
|
||||||
|
"source input is a directory of images/video/database and "
|
||||||
|
"that \"Source/Input rate\" is infinite too, a lot of images "
|
||||||
|
"could be buffered at the same time (e.g., reading all images "
|
||||||
|
"of a directory at once). This could make the GUI not responsive. "
|
||||||
|
"You may want to set \"Source/Input rate\" at the rate at "
|
||||||
|
"which the images have been recorded. "
|
||||||
|
"Would you want to start the detection "
|
||||||
|
"anyway?").arg(bufferingSize).arg(inputRate),
|
||||||
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
if(button == QMessageBox::No)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user