mirror of
https://github.com/introlab/rtabmap.git
synced 2026-10-12 04:49:50 +08:00
Read-only localization mode (#1643)
* Read-only localization mode * Localization: don't update map's node timestamps if statistic after run are not saved * Updated Mem/LocalizationReadOnly description * Updated description of Kp/FlannIndexSaved
This commit is contained in:
+1
-1
@@ -20,7 +20,7 @@ SET(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake_modules")
|
|||||||
#######################
|
#######################
|
||||||
SET(RTABMAP_MAJOR_VERSION 0)
|
SET(RTABMAP_MAJOR_VERSION 0)
|
||||||
SET(RTABMAP_MINOR_VERSION 23)
|
SET(RTABMAP_MINOR_VERSION 23)
|
||||||
SET(RTABMAP_PATCH_VERSION 3)
|
SET(RTABMAP_PATCH_VERSION 4)
|
||||||
SET(RTABMAP_VERSION
|
SET(RTABMAP_VERSION
|
||||||
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
${RTABMAP_MAJOR_VERSION}.${RTABMAP_MINOR_VERSION}.${RTABMAP_PATCH_VERSION})
|
||||||
|
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ public:
|
|||||||
public:
|
public:
|
||||||
// Mutex-protected methods of abstract versions below
|
// Mutex-protected methods of abstract versions below
|
||||||
|
|
||||||
bool openConnection(const std::string & url, bool overwritten = false);
|
bool openConnection(const std::string & url, bool overwritten = false, bool readOnly = false);
|
||||||
void closeConnection(bool save = true, const std::string & outputUrl = "");
|
void closeConnection(bool save = true, const std::string & outputUrl = "");
|
||||||
bool isConnected() const;
|
bool isConnected() const;
|
||||||
unsigned long getMemoryUsed() const; // In bytes
|
unsigned long getMemoryUsed() const; // In bytes
|
||||||
@@ -193,7 +193,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
DBDriver(const ParametersMap & parameters = ParametersMap());
|
DBDriver(const ParametersMap & parameters = ParametersMap());
|
||||||
|
|
||||||
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false) = 0;
|
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false, bool readOnly = false) = 0;
|
||||||
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
|
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "") = 0;
|
||||||
virtual bool isConnectedQuery() const = 0;
|
virtual bool isConnectedQuery() const = 0;
|
||||||
virtual unsigned long getMemoryUsedQuery() const = 0; // In bytes
|
virtual unsigned long getMemoryUsedQuery() const = 0; // In bytes
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ public:
|
|||||||
void setTempStore(int tempStore);
|
void setTempStore(int tempStore);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false);
|
virtual bool connectDatabaseQuery(const std::string & url, bool overwritten = false, bool readOnly = false);
|
||||||
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "");
|
virtual void disconnectDatabaseQuery(bool save = true, const std::string & outputUrl = "");
|
||||||
virtual bool isConnectedQuery() const;
|
virtual bool isConnectedQuery() const;
|
||||||
virtual unsigned long getMemoryUsedQuery() const; // In bytes
|
virtual unsigned long getMemoryUsedQuery() const; // In bytes
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ public:
|
|||||||
std::set<int> getAllSignatureIds(bool ignoreChildren = true) const;
|
std::set<int> getAllSignatureIds(bool ignoreChildren = true) const;
|
||||||
bool memoryChanged() const {return _memoryChanged;}
|
bool memoryChanged() const {return _memoryChanged;}
|
||||||
bool isIncremental() const {return _incrementalMemory;}
|
bool isIncremental() const {return _incrementalMemory;}
|
||||||
|
bool isReadOnly() const {return !_incrementalMemory && _localizationReadOnly;}
|
||||||
bool isLocalizationDataSaved() const {return _localizationDataSaved;}
|
bool isLocalizationDataSaved() const {return _localizationDataSaved;}
|
||||||
const Signature * getSignature(int id) const;
|
const Signature * getSignature(int id) const;
|
||||||
bool isInSTM(int signatureId) const {return _stMem.find(signatureId) != _stMem.end();}
|
bool isInSTM(int signatureId) const {return _stMem.find(signatureId) != _stMem.end();}
|
||||||
@@ -307,6 +308,7 @@ private:
|
|||||||
std::string _rgbCompressionFormat;
|
std::string _rgbCompressionFormat;
|
||||||
std::string _depthCompressionFormat;
|
std::string _depthCompressionFormat;
|
||||||
bool _incrementalMemory;
|
bool _incrementalMemory;
|
||||||
|
bool _localizationReadOnly;
|
||||||
bool _localizationDataSaved;
|
bool _localizationDataSaved;
|
||||||
bool _flannIndexSaved;
|
bool _flannIndexSaved;
|
||||||
bool _reduceGraph;
|
bool _reduceGraph;
|
||||||
|
|||||||
@@ -213,6 +213,7 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM_STR(Mem, DepthCompressionFormat, ".rvl", "Depth image compression format for 16UC1 depth type. It should be \".png\" or \".rvl\". If depth type is 32FC1, \".png\" is used.");
|
RTABMAP_PARAM_STR(Mem, DepthCompressionFormat, ".rvl", "Depth image compression format for 16UC1 depth type. It should be \".png\" or \".rvl\". If depth type is 32FC1, \".png\" is used.");
|
||||||
RTABMAP_PARAM(Mem, STMSize, unsigned int, 10, "Short-term memory size.");
|
RTABMAP_PARAM(Mem, STMSize, unsigned int, 10, "Short-term memory size.");
|
||||||
RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, otherwise it is Localization mode.");
|
RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, otherwise it is Localization mode.");
|
||||||
|
RTABMAP_PARAM(Mem, LocalizationReadOnly, bool, false, uFormat("In localization mode, open the database in read-only mode (ignored if %s=true). Currrenty incompatible with memory management (%s and %s cannot be used) and if there are disjoint sessions in working memory. Last localization pose won't be saved back in the database at the end of the session, so the robot will always restart to original last localization pose, unless %s is used or an external initial pose is provided on initialization.", kMemIncrementalMemory().c_str(), kRtabmapLoopThr().c_str(), kRtabmapMemoryThr().c_str(), kRGBDStartAtOrigin().c_str()).c_str());
|
||||||
RTABMAP_PARAM(Mem, LocalizationDataSaved, bool, false, uFormat("Save localization data during localization session (when %s=false). When enabled, the database will then also grow in localization mode. This mode would be used only for debugging purpose.", kMemIncrementalMemory().c_str()).c_str());
|
RTABMAP_PARAM(Mem, LocalizationDataSaved, bool, false, uFormat("Save localization data during localization session (when %s=false). When enabled, the database will then also grow in localization mode. This mode would be used only for debugging purpose.", kMemIncrementalMemory().c_str()).c_str());
|
||||||
RTABMAP_PARAM(Mem, ReduceGraph, bool, false, uFormat("Reduce graph. Merge nodes when loop closures are added (ignoring those with user data). Note that this approach assumes that 100%% of the loop closures accepted are good, so it is highly recommended to enable \"%s\" at the same time.", kRGBDOptimizeMaxError().c_str()));
|
RTABMAP_PARAM(Mem, ReduceGraph, bool, false, uFormat("Reduce graph. Merge nodes when loop closures are added (ignoring those with user data). Note that this approach assumes that 100%% of the loop closures accepted are good, so it is highly recommended to enable \"%s\" at the same time.", kRGBDOptimizeMaxError().c_str()));
|
||||||
RTABMAP_PARAM(Mem, RecentWmRatio, float, 0.2, "Ratio of locations after the last loop closure in WM that cannot be transferred.");
|
RTABMAP_PARAM(Mem, RecentWmRatio, float, 0.2, "Ratio of locations after the last loop closure in WM that cannot be transferred.");
|
||||||
@@ -261,7 +262,7 @@ class RTABMAP_CORE_EXPORT Parameters
|
|||||||
RTABMAP_PARAM_STR(Kp, RoiRatios, "0.0 0.0 0.0 0.0", "Region of interest ratios [left, right, top, bottom].");
|
RTABMAP_PARAM_STR(Kp, RoiRatios, "0.0 0.0 0.0 0.0", "Region of interest ratios [left, right, top, bottom].");
|
||||||
RTABMAP_PARAM_STR(Kp, DictionaryPath, "", "Path of the pre-computed dictionary");
|
RTABMAP_PARAM_STR(Kp, DictionaryPath, "", "Path of the pre-computed dictionary");
|
||||||
RTABMAP_PARAM(Kp, NewWordsComparedTogether, bool, true, "When adding new words to dictionary, they are compared also with each other (to detect same words in the same signature).");
|
RTABMAP_PARAM(Kp, NewWordsComparedTogether, bool, true, "When adding new words to dictionary, they are compared also with each other (to detect same words in the same signature).");
|
||||||
RTABMAP_PARAM(Kp, FlannIndexSaved, bool, false, uFormat("Save FLANN index during localization session (when %s=false). The FLANN index will be saved to database after the first time localization mode is used, then on next sessions, the index is reloaded from the database instead of being rebuilt again. This can save significant loading time when the visual word dictionary is big (>1M words). Note that if the dictionary is modified (parameters or data), the index will be rebuilt and saved again on the next session.", kMemIncrementalMemory().c_str()).c_str());
|
RTABMAP_PARAM(Kp, FlannIndexSaved, bool, false, uFormat("Save FLANN index during localization session (when %s=false). The FLANN index will be saved to database after the first time localization mode is used, then on next sessions, the index is reloaded from the database instead of being rebuilt again. This can save significant loading time when the visual word dictionary is big (>1M words). Note that if the dictionary is modified (parameters or data), the index will be rebuilt and saved again on the next session. Ignored on initialization if %s is enabled.", kMemIncrementalMemory().c_str(), kMemInitWMWithAllNodes().c_str()).c_str());
|
||||||
RTABMAP_PARAM(Kp, SerializeWithChecksum, bool, true, "On serialization of the FLANN index, compute checksum of the data used by the FLANN index. This adds a slight overhead on serialization/deserialization to make sure that the dictionary data correspond to same data used when the index was built.");
|
RTABMAP_PARAM(Kp, SerializeWithChecksum, bool, true, "On serialization of the FLANN index, compute checksum of the data used by the FLANN index. This adds a slight overhead on serialization/deserialization to make sure that the dictionary data correspond to same data used when the index was built.");
|
||||||
RTABMAP_PARAM(Kp, SubPixWinSize, int, 3, "See cv::cornerSubPix().");
|
RTABMAP_PARAM(Kp, SubPixWinSize, int, 3, "See cv::cornerSubPix().");
|
||||||
RTABMAP_PARAM(Kp, SubPixIterations, int, 0, "See cv::cornerSubPix(). 0 disables sub pixel refining.");
|
RTABMAP_PARAM(Kp, SubPixIterations, int, 0, "See cv::cornerSubPix(). 0 disables sub pixel refining.");
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ DBDriver * DBDriver::create(const ParametersMap & parameters)
|
|||||||
|
|
||||||
DBDriver::DBDriver(const ParametersMap & parameters) :
|
DBDriver::DBDriver(const ParametersMap & parameters) :
|
||||||
_emptyTrashesTime(0),
|
_emptyTrashesTime(0),
|
||||||
_timestampUpdate(true)
|
_timestampUpdate(false)
|
||||||
{
|
{
|
||||||
this->parseParameters(parameters);
|
this->parseParameters(parameters);
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,15 @@ void DBDriver::closeConnection(bool save, const std::string & outputUrl)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
_trashesMutex.lock();
|
_trashesMutex.lock();
|
||||||
|
for(auto & iter: _trashSignatures)
|
||||||
|
{
|
||||||
|
delete iter.second;
|
||||||
|
}
|
||||||
_trashSignatures.clear();
|
_trashSignatures.clear();
|
||||||
|
for(auto & iter: _trashVisualWords)
|
||||||
|
{
|
||||||
|
delete iter.second;
|
||||||
|
}
|
||||||
_trashVisualWords.clear();
|
_trashVisualWords.clear();
|
||||||
_trashesMutex.unlock();
|
_trashesMutex.unlock();
|
||||||
}
|
}
|
||||||
@@ -83,12 +91,12 @@ void DBDriver::closeConnection(bool save, const std::string & outputUrl)
|
|||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DBDriver::openConnection(const std::string & url, bool overwritten)
|
bool DBDriver::openConnection(const std::string & url, bool overwritten, bool readOnly)
|
||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
_url = url;
|
_url = url;
|
||||||
_dbSafeAccessMutex.lock();
|
_dbSafeAccessMutex.lock();
|
||||||
if(this->connectDatabaseQuery(url, overwritten))
|
if(this->connectDatabaseQuery(url, overwritten, readOnly))
|
||||||
{
|
{
|
||||||
_dbSafeAccessMutex.unlock();
|
_dbSafeAccessMutex.unlock();
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -320,7 +320,7 @@ bool DBDriverSqlite3::getDatabaseVersionQuery(std::string & version) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DBDriverSqlite3::connectDatabaseQuery(const std::string & url, bool overwritten)
|
bool DBDriverSqlite3::connectDatabaseQuery(const std::string & url, bool overwritten, bool readOnly)
|
||||||
{
|
{
|
||||||
this->disconnectDatabaseQuery();
|
this->disconnectDatabaseQuery();
|
||||||
// Open a database connection
|
// Open a database connection
|
||||||
@@ -332,7 +332,7 @@ bool DBDriverSqlite3::connectDatabaseQuery(const std::string & url, bool overwri
|
|||||||
if(!url.empty())
|
if(!url.empty())
|
||||||
{
|
{
|
||||||
dbFileExist = UFile::exists(url.c_str());
|
dbFileExist = UFile::exists(url.c_str());
|
||||||
if(dbFileExist && overwritten)
|
if(dbFileExist && overwritten && !readOnly)
|
||||||
{
|
{
|
||||||
UINFO("Deleting database %s...", url.c_str());
|
UINFO("Deleting database %s...", url.c_str());
|
||||||
UASSERT(UFile::erase(url.c_str()) == 0);
|
UASSERT(UFile::erase(url.c_str()) == 0);
|
||||||
@@ -354,12 +354,12 @@ bool DBDriverSqlite3::connectDatabaseQuery(const std::string & url, bool overwri
|
|||||||
{
|
{
|
||||||
ULOGGER_INFO("Using empty database in the memory.");
|
ULOGGER_INFO("Using empty database in the memory.");
|
||||||
}
|
}
|
||||||
rc = sqlite3_open_v2(":memory:", &_ppDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
|
rc = sqlite3_open_v2(":memory:", &_ppDb, readOnly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ULOGGER_INFO("Using database \"%s\" from the hard drive.", url.c_str());
|
ULOGGER_INFO("Using database \"%s\" from the hard drive.", url.c_str());
|
||||||
rc = sqlite3_open_v2(url.c_str(), &_ppDb, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
|
rc = sqlite3_open_v2(url.c_str(), &_ppDb, readOnly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
|
||||||
}
|
}
|
||||||
if(rc != SQLITE_OK)
|
if(rc != SQLITE_OK)
|
||||||
{
|
{
|
||||||
@@ -4343,7 +4343,7 @@ void DBDriverSqlite3::loadLinksQuery(std::list<Signature *> & signatures) const
|
|||||||
|
|
||||||
void DBDriverSqlite3::updateQuery(const std::list<Signature *> & nodes, bool updateTimestamp) const
|
void DBDriverSqlite3::updateQuery(const std::list<Signature *> & nodes, bool updateTimestamp) const
|
||||||
{
|
{
|
||||||
UDEBUG("nodes = %d", nodes.size());
|
UDEBUG("nodes = %d, updateTimestamp = %s", nodes.size(), updateTimestamp?"true":"false");
|
||||||
if(_ppDb && nodes.size())
|
if(_ppDb && nodes.size())
|
||||||
{
|
{
|
||||||
UTimer timer;
|
UTimer timer;
|
||||||
@@ -4382,7 +4382,7 @@ void DBDriverSqlite3::updateQuery(const std::list<Signature *> & nodes, bool upd
|
|||||||
{
|
{
|
||||||
s = *i;
|
s = *i;
|
||||||
int index = 1;
|
int index = 1;
|
||||||
if(s)
|
if(s && (s->isModified() || updateTimestamp))
|
||||||
{
|
{
|
||||||
rc = sqlite3_bind_int(ppStmt, index++, s->getWeight());
|
rc = sqlite3_bind_int(ppStmt, index++, s->getWeight());
|
||||||
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str());
|
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str());
|
||||||
@@ -4406,7 +4406,7 @@ void DBDriverSqlite3::updateQuery(const std::list<Signature *> & nodes, bool upd
|
|||||||
|
|
||||||
//step
|
//step
|
||||||
rc=sqlite3_step(ppStmt);
|
rc=sqlite3_step(ppStmt);
|
||||||
UASSERT_MSG(rc == SQLITE_DONE, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str());
|
UASSERT_MSG(rc == SQLITE_DONE, uFormat("DB error (%s): %s (node id = %d map=%d)", _version.c_str(), sqlite3_errmsg(_ppDb), s->id(), s->mapId()).c_str());
|
||||||
|
|
||||||
rc = sqlite3_reset(ppStmt);
|
rc = sqlite3_reset(ppStmt);
|
||||||
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str());
|
UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str());
|
||||||
@@ -5751,7 +5751,7 @@ cv::Mat DBDriverSqlite3::loadOptimizedMeshQuery(
|
|||||||
|
|
||||||
void DBDriverSqlite3::saveFlannIndexQuery(const std::vector<unsigned char> & data) const
|
void DBDriverSqlite3::saveFlannIndexQuery(const std::vector<unsigned char> & data) const
|
||||||
{
|
{
|
||||||
UDEBUG("");
|
UDEBUG("data size = %ld bytes", data.size());
|
||||||
if(_ppDb && uStrNumCmp(_version, "0.23.0") >= 0)
|
if(_ppDb && uStrNumCmp(_version, "0.23.0") >= 0)
|
||||||
{
|
{
|
||||||
UTimer timer;
|
UTimer timer;
|
||||||
|
|||||||
+19
-16
@@ -83,6 +83,7 @@ Memory::Memory(const ParametersMap & parameters) :
|
|||||||
_rgbCompressionFormat(Parameters::defaultMemImageCompressionFormat()),
|
_rgbCompressionFormat(Parameters::defaultMemImageCompressionFormat()),
|
||||||
_depthCompressionFormat(Parameters::defaultMemDepthCompressionFormat()),
|
_depthCompressionFormat(Parameters::defaultMemDepthCompressionFormat()),
|
||||||
_incrementalMemory(Parameters::defaultMemIncrementalMemory()),
|
_incrementalMemory(Parameters::defaultMemIncrementalMemory()),
|
||||||
|
_localizationReadOnly(Parameters::defaultMemLocalizationReadOnly()),
|
||||||
_localizationDataSaved(Parameters::defaultMemLocalizationDataSaved()),
|
_localizationDataSaved(Parameters::defaultMemLocalizationDataSaved()),
|
||||||
_flannIndexSaved(Parameters::defaultKpFlannIndexSaved()),
|
_flannIndexSaved(Parameters::defaultKpFlannIndexSaved()),
|
||||||
_reduceGraph(Parameters::defaultMemReduceGraph()),
|
_reduceGraph(Parameters::defaultMemReduceGraph()),
|
||||||
@@ -185,10 +186,6 @@ bool Memory::init(const std::string & dbUrl, bool dbOverwritten, const Parameter
|
|||||||
_dbDriver = 0; // HACK for the clear() below to think that there is no db
|
_dbDriver = 0; // HACK for the clear() below to think that there is no db
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(!_memoryChanged && _linksChanged)
|
|
||||||
{
|
|
||||||
_dbDriver->setTimestampUpdateEnabled(false); // update links only
|
|
||||||
}
|
|
||||||
this->clear();
|
this->clear();
|
||||||
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit("Clearing memory, done!"));
|
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit("Clearing memory, done!"));
|
||||||
|
|
||||||
@@ -212,10 +209,10 @@ bool Memory::init(const std::string & dbUrl, bool dbOverwritten, const Parameter
|
|||||||
bool success = true;
|
bool success = true;
|
||||||
if(_dbDriver)
|
if(_dbDriver)
|
||||||
{
|
{
|
||||||
_dbDriver->setTimestampUpdateEnabled(true); // make sure that timestamp update is enabled (may be disabled above)
|
|
||||||
success = false;
|
success = false;
|
||||||
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(std::string("Connecting to database \"") + dbUrl + "\"..."));
|
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(std::string("Connecting to database \"") + dbUrl + "\"..."));
|
||||||
if(_dbDriver->openConnection(dbUrl, dbOverwritten))
|
if(_dbDriver->openConnection(dbUrl, dbOverwritten, isReadOnly()))
|
||||||
{
|
{
|
||||||
success = true;
|
success = true;
|
||||||
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(std::string("Connecting to database \"") + dbUrl + "\", done!"));
|
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(std::string("Connecting to database \"") + dbUrl + "\", done!"));
|
||||||
@@ -245,6 +242,7 @@ void Memory::loadDataFromDb(bool postInitClosingEvents)
|
|||||||
|
|
||||||
if(loadAllNodesInWM)
|
if(loadAllNodesInWM)
|
||||||
{
|
{
|
||||||
|
UDEBUG("Loading all nodes to WM...");
|
||||||
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(std::string("Loading all nodes to WM...")));
|
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(std::string("Loading all nodes to WM...")));
|
||||||
std::set<int> ids;
|
std::set<int> ids;
|
||||||
_dbDriver->getAllNodeIds(ids, true);
|
_dbDriver->getAllNodeIds(ids, true);
|
||||||
@@ -252,6 +250,7 @@ void Memory::loadDataFromDb(bool postInitClosingEvents)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
UDEBUG("Loading last nodes to WM...");
|
||||||
// load previous session working memory
|
// load previous session working memory
|
||||||
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(std::string("Loading last nodes to WM...")));
|
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(std::string("Loading last nodes to WM...")));
|
||||||
_dbDriver->loadLastNodes(dbSignatures, !_loadVisualLocalFeaturesOnInit);
|
_dbDriver->loadLastNodes(dbSignatures, !_loadVisualLocalFeaturesOnInit);
|
||||||
@@ -531,16 +530,23 @@ void Memory::close(bool databaseSaved, bool postInitClosingEvents, const std::st
|
|||||||
|
|
||||||
UDEBUG("_memoryChanged=%d _linksChanged=%d databaseNameChanged=%d", _memoryChanged?1:0, _linksChanged?1:0, databaseNameChanged?1:0);
|
UDEBUG("_memoryChanged=%d _linksChanged=%d databaseNameChanged=%d", _memoryChanged?1:0, _linksChanged?1:0, databaseNameChanged?1:0);
|
||||||
|
|
||||||
if(!databaseSaved || (!_memoryChanged && !_linksChanged && !databaseNameChanged))
|
if(!databaseSaved || (!_memoryChanged && !_linksChanged && !databaseNameChanged) || this->isReadOnly())
|
||||||
{
|
{
|
||||||
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(uFormat("No changes added to database.")));
|
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(uFormat("No changes added to database.")));
|
||||||
|
|
||||||
UINFO("No changes added to database.");
|
UINFO("No changes added to database.");
|
||||||
if(_dbDriver)
|
if(_dbDriver)
|
||||||
{
|
{
|
||||||
saveFlannIndex(postInitClosingEvents);
|
if(!this->isReadOnly()) {
|
||||||
|
saveFlannIndex(postInitClosingEvents);
|
||||||
|
}
|
||||||
|
else if(_memoryChanged || _linksChanged || databaseNameChanged)
|
||||||
|
{
|
||||||
|
UWARN("Memory has been modified (nodes=%s links=%s name=%s) but the database is read-only, changes are not saved to database.",
|
||||||
|
_memoryChanged?"true":"false", _linksChanged?"true":"false", databaseNameChanged?"true":"false");
|
||||||
|
}
|
||||||
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(uFormat("Closing database \"%s\"...", _dbDriver->getUrl().c_str())));
|
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit(uFormat("Closing database \"%s\"...", _dbDriver->getUrl().c_str())));
|
||||||
_dbDriver->closeConnection(false, ouputDatabasePath);
|
_dbDriver->closeConnection(false);
|
||||||
delete _dbDriver;
|
delete _dbDriver;
|
||||||
_dbDriver = 0;
|
_dbDriver = 0;
|
||||||
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit("Closing database, done!"));
|
if(postInitClosingEvents) UEventsManager::post(new RtabmapEventInit("Closing database, done!"));
|
||||||
@@ -556,12 +562,6 @@ void Memory::close(bool databaseSaved, bool postInitClosingEvents, const std::st
|
|||||||
if(!_memoryChanged && _dbDriver)
|
if(!_memoryChanged && _dbDriver)
|
||||||
{
|
{
|
||||||
saveFlannIndex(postInitClosingEvents);
|
saveFlannIndex(postInitClosingEvents);
|
||||||
|
|
||||||
if(_linksChanged) {
|
|
||||||
// don't update the time stamps!
|
|
||||||
UDEBUG("");
|
|
||||||
_dbDriver->setTimestampUpdateEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this->clear();
|
this->clear();
|
||||||
if(_dbDriver)
|
if(_dbDriver)
|
||||||
@@ -663,6 +663,7 @@ void Memory::parseParameters(const ParametersMap & parameters)
|
|||||||
Parameters::parse(params, Parameters::kMarkerVarianceOrientationIgnored(), _markerOrientationIgnored);
|
Parameters::parse(params, Parameters::kMarkerVarianceOrientationIgnored(), _markerOrientationIgnored);
|
||||||
Parameters::parse(params, Parameters::kMemLocalizationDataSaved(), _localizationDataSaved);
|
Parameters::parse(params, Parameters::kMemLocalizationDataSaved(), _localizationDataSaved);
|
||||||
Parameters::parse(params, Parameters::kKpFlannIndexSaved(), _flannIndexSaved);
|
Parameters::parse(params, Parameters::kKpFlannIndexSaved(), _flannIndexSaved);
|
||||||
|
Parameters::parse(params, Parameters::kMemLocalizationReadOnly(), _localizationReadOnly);
|
||||||
|
|
||||||
if(_markerAngVariance>=9999)
|
if(_markerAngVariance>=9999)
|
||||||
{
|
{
|
||||||
@@ -1865,6 +1866,7 @@ void Memory::clear()
|
|||||||
uInsert(parameters, parameters_);
|
uInsert(parameters, parameters_);
|
||||||
parameters.erase(Parameters::kRtabmapWorkingDirectory()); // don't save working directory as it is machine dependent
|
parameters.erase(Parameters::kRtabmapWorkingDirectory()); // don't save working directory as it is machine dependent
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
|
_dbDriver->setTimestampUpdateEnabled(true); // Only re-stamp if we updated the memory
|
||||||
_dbDriver->addInfoAfterRun(memSize,
|
_dbDriver->addInfoAfterRun(memSize,
|
||||||
_lastSignature?_lastSignature->id():0,
|
_lastSignature?_lastSignature->id():0,
|
||||||
UProcessInfo::getMemoryUsage(),
|
UProcessInfo::getMemoryUsage(),
|
||||||
@@ -1938,6 +1940,7 @@ void Memory::clear()
|
|||||||
_dbDriver->join(true);
|
_dbDriver->join(true);
|
||||||
cleanUnusedWords();
|
cleanUnusedWords();
|
||||||
_dbDriver->emptyTrashes();
|
_dbDriver->emptyTrashes();
|
||||||
|
_dbDriver->setTimestampUpdateEnabled(false);
|
||||||
}
|
}
|
||||||
_vwd->clear(_dbDriver!=NULL);
|
_vwd->clear(_dbDriver!=NULL);
|
||||||
UDEBUG("");
|
UDEBUG("");
|
||||||
@@ -3626,7 +3629,7 @@ void Memory::updateLink(const Link & link, bool updateInDatabase)
|
|||||||
|
|
||||||
if(oldType!=Link::kVirtualClosure || link.type()!=Link::kVirtualClosure)
|
if(oldType!=Link::kVirtualClosure || link.type()!=Link::kVirtualClosure)
|
||||||
{
|
{
|
||||||
_linksChanged = true;
|
_linksChanged = _incrementalMemory || (fromS->isSaved() && toS->isSaved());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -507,6 +507,11 @@ void Rtabmap::close(bool databaseSaved, const std::string & ouputDatabasePath)
|
|||||||
}
|
}
|
||||||
if(_memory)
|
if(_memory)
|
||||||
{
|
{
|
||||||
|
if(_memory->isReadOnly() && databaseSaved)
|
||||||
|
{
|
||||||
|
UWARN("Database is read-only, latest optimized poses, latest localization pose and latest state of the memory are not saved.");
|
||||||
|
databaseSaved = false;
|
||||||
|
}
|
||||||
if(databaseSaved)
|
if(databaseSaved)
|
||||||
{
|
{
|
||||||
if(_memory->isGraphReduced() && _memory->isIncremental())
|
if(_memory->isGraphReduced() && _memory->isIncremental())
|
||||||
|
|||||||
@@ -1070,6 +1070,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
|
|
||||||
// Database
|
// Database
|
||||||
_ui->checkBox_dbInMemory->setObjectName(Parameters::kDbSqlite3InMemory().c_str());
|
_ui->checkBox_dbInMemory->setObjectName(Parameters::kDbSqlite3InMemory().c_str());
|
||||||
|
_ui->checkBox_dbReadOnly->setObjectName(Parameters::kMemLocalizationReadOnly().c_str());
|
||||||
_ui->spinBox_dbCacheSize->setObjectName(Parameters::kDbSqlite3CacheSize().c_str());
|
_ui->spinBox_dbCacheSize->setObjectName(Parameters::kDbSqlite3CacheSize().c_str());
|
||||||
_ui->comboBox_dbJournalMode->setObjectName(Parameters::kDbSqlite3JournalMode().c_str());
|
_ui->comboBox_dbJournalMode->setObjectName(Parameters::kDbSqlite3JournalMode().c_str());
|
||||||
_ui->comboBox_dbSynchronous->setObjectName(Parameters::kDbSqlite3Synchronous().c_str());
|
_ui->comboBox_dbSynchronous->setObjectName(Parameters::kDbSqlite3Synchronous().c_str());
|
||||||
|
|||||||
+196
-176
@@ -63,7 +63,7 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-747</y>
|
<y>0</y>
|
||||||
<width>684</width>
|
<width>684</width>
|
||||||
<height>5110</height>
|
<height>5110</height>
|
||||||
</rect>
|
</rect>
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>5</number>
|
<number>10</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,0">
|
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,0">
|
||||||
@@ -12114,6 +12114,47 @@ When set to false, no new words are added to dictionary, so no more updates are
|
|||||||
<string>Database</string>
|
<string>Database</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_11" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout_11" columnstretch="0,1">
|
||||||
|
<item row="8" column="1">
|
||||||
|
<widget class="QLabel" name="label_77">
|
||||||
|
<property name="text">
|
||||||
|
<string>Sqlite3 journal mode,
|
||||||
|
see Sqlite3 doc 'PRAGMA journal_mode'.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="QLabel" name="label_75">
|
||||||
|
<property name="text">
|
||||||
|
<string>Sqlite3 cache size,
|
||||||
|
see Sqlite3 doc 'PRAGMA cache_size'.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="1">
|
||||||
|
<widget class="QLabel" name="label_610">
|
||||||
|
<property name="text">
|
||||||
|
<string>Target database version for backward compatibility purpose. Only Major and minor versions are used and should be set (e.g., "0.19" vs "0.20" or "1.0" vs "2.0"). Patch version is ignored (e.g., "0.20.1" and "0.20.3" will generate a "0.20" database).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="general_checkBox_keepBinaryData">
|
<widget class="QCheckBox" name="general_checkBox_keepBinaryData">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -12124,6 +12165,146 @@ When set to false, no new words are added to dictionary, so no more updates are
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLabel" name="label_74">
|
||||||
|
<property name="text">
|
||||||
|
<string>Using database in the memory instead of a file on the hard disk (this greatly improve database access performance but it requires more RAM memory).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="1">
|
||||||
|
<widget class="QLabel" name="label_89">
|
||||||
|
<property name="text">
|
||||||
|
<string>Sqlite3 synchronous,
|
||||||
|
see Sqlite3 doc 'PRAGMA synchronous'.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="general_checkBox_keepNotLinkedNodes">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_dbCacheSize">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>999999</number>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<number>100</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>2000</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="0">
|
||||||
|
<widget class="QComboBox" name="comboBox_dbSynchronous">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>OFF</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>NORMAL</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>FULL</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="10" column="0">
|
||||||
|
<widget class="QComboBox" name="comboBox_dbTempStore">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>DEFAULT</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>FILE</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>MEMORY</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLabel" name="label_760">
|
||||||
|
<property name="text">
|
||||||
|
<string>Depth image compression format (should be ".png" or ".rvl").</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_keepRehearsed">
|
||||||
|
<property name="text">
|
||||||
|
<string>Keep not linked nodes in db (rehearsed nodes and deleted nodes are saved).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QLineEdit" name="lineEdit_targetDatabaseVersion">
|
||||||
|
<property name="placeholderText">
|
||||||
|
<string>major.minor</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QLabel" name="label_299">
|
||||||
|
<property name="text">
|
||||||
|
<string>RGB image compression format (should be ".jpg" or ".png").</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QLabel" name="label_keepRawData">
|
<widget class="QLabel" name="label_keepRawData">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -12137,14 +12318,7 @@ When set to false, no new words are added to dictionary, so no more updates are
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="8" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_dbInMemory">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="0">
|
|
||||||
<widget class="QComboBox" name="comboBox_dbJournalMode">
|
<widget class="QComboBox" name="comboBox_dbJournalMode">
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -12173,20 +12347,7 @@ When set to false, no new words are added to dictionary, so no more updates are
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="label_74">
|
|
||||||
<property name="text">
|
|
||||||
<string>Using database in the memory instead of a file on the hard disk (this greatly improve database access performance but it requires more RAM memory).</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="9" column="1">
|
|
||||||
<widget class="QLabel" name="label_120">
|
<widget class="QLabel" name="label_120">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Sqlite3 temp store,
|
<string>Sqlite3 temp store,
|
||||||
@@ -12200,132 +12361,23 @@ see Sqlite3 doc 'PRAGMA temp_store'.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QComboBox" name="comboBox_dbTempStore">
|
<widget class="QLineEdit" name="lineEdit_rgbCompressionFormat"/>
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>DEFAULT</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>FILE</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>MEMORY</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QCheckBox" name="general_checkBox_keepNotLinkedNodes">
|
<widget class="QLineEdit" name="lineEdit_depthCompressionFormat"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_dbInMemory">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="0">
|
|
||||||
<widget class="QSpinBox" name="spinBox_dbCacheSize">
|
|
||||||
<property name="minimum">
|
|
||||||
<number>10</number>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
|
||||||
<number>999999</number>
|
|
||||||
</property>
|
|
||||||
<property name="singleStep">
|
|
||||||
<number>100</number>
|
|
||||||
</property>
|
|
||||||
<property name="value">
|
|
||||||
<number>2000</number>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="6" column="1">
|
|
||||||
<widget class="QLabel" name="label_75">
|
|
||||||
<property name="text">
|
|
||||||
<string>Sqlite3 cache size,
|
|
||||||
see Sqlite3 doc 'PRAGMA cache_size'.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="7" column="1">
|
|
||||||
<widget class="QLabel" name="label_77">
|
|
||||||
<property name="text">
|
|
||||||
<string>Sqlite3 journal mode,
|
|
||||||
see Sqlite3 doc 'PRAGMA journal_mode'.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="1">
|
|
||||||
<widget class="QLabel" name="label_89">
|
|
||||||
<property name="text">
|
|
||||||
<string>Sqlite3 synchronous,
|
|
||||||
see Sqlite3 doc 'PRAGMA synchronous'.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="8" column="0">
|
|
||||||
<widget class="QComboBox" name="comboBox_dbSynchronous">
|
|
||||||
<property name="currentIndex">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>OFF</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>NORMAL</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<property name="text">
|
|
||||||
<string>FULL</string>
|
|
||||||
</property>
|
|
||||||
</item>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QLabel" name="label_keepRehearsed">
|
|
||||||
<property name="text">
|
|
||||||
<string>Keep not linked nodes in db (rehearsed nodes and deleted nodes are saved).</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QLabel" name="label_299">
|
<widget class="QLabel" name="label_787">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>RGB image compression format (should be ".jpg" or ".png").</string>
|
<string>In localization mode, open the database in read-only mode (ignored in SLAM mode). Currrenty incompatible with memory management (i.e., Time and/or Memory thresholds cannot be used) and if there are disjoint sessions in working memory. Last localization pose won't be saved back in the database at the end of the session, so the robot will always restart to original last localization pose, unless RGBD/StartAtOrigin is used or an external initial pose is provided on initialization.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -12336,41 +12388,9 @@ see Sqlite3 doc 'PRAGMA synchronous'.</string>
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QLineEdit" name="lineEdit_rgbCompressionFormat"/>
|
<widget class="QCheckBox" name="checkBox_dbReadOnly">
|
||||||
</item>
|
|
||||||
<item row="4" column="1">
|
|
||||||
<widget class="QLabel" name="label_760">
|
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Depth image compression format (should be ".png" or ".rvl").</string>
|
<string/>
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QLineEdit" name="lineEdit_depthCompressionFormat"/>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="1">
|
|
||||||
<widget class="QLabel" name="label_610">
|
|
||||||
<property name="text">
|
|
||||||
<string>Target database version for backward compatibility purpose. Only Major and minor versions are used and should be set (e.g., "0.19" vs "0.20" or "1.0" vs "2.0"). Patch version is ignored (e.g., "0.20.1" and "0.20.3" will generate a "0.20" database).</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="0">
|
|
||||||
<widget class="QLineEdit" name="lineEdit_targetDatabaseVersion">
|
|
||||||
<property name="placeholderText">
|
|
||||||
<string>major.minor</string>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user