From f2d6ff6748124d7b5fc349b3ff4432273009d07a Mon Sep 17 00:00:00 2001 From: matlabbe Date: Fri, 27 Nov 2015 17:59:38 -0500 Subject: [PATCH] Fixed signatures not saved after switching online from Mapping to Localization mode --- corelib/src/Memory.cpp | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/corelib/src/Memory.cpp b/corelib/src/Memory.cpp index 1e6f7621..b4750b64 100644 --- a/corelib/src/Memory.cpp +++ b/corelib/src/Memory.cpp @@ -157,7 +157,7 @@ bool Memory::init(const std::string & dbUrl, bool dbOverwritten, const Parameter if(_postInitClosingEvents) UEventsManager::post(new RtabmapEventInit("Clearing memory...")); DBDriver * tmpDriver = 0; - if(!_memoryChanged && !_linksChanged) + if((!_memoryChanged && !_linksChanged) || dbOverwritten) { if(_dbDriver) { @@ -428,19 +428,6 @@ void Memory::parseParameters(const ParametersMap & parameters) UASSERT(_rehearsalMaxDistance >= 0.0f); UASSERT(_rehearsalMaxAngle >= 0.0f); - // SLAM mode vs Localization mode - iter = parameters.find(Parameters::kMemIncrementalMemory()); - if(iter != parameters.end()) - { - bool value = uStr2Bool(iter->second.c_str()); - if(value == false && _incrementalMemory) - { - // From SLAM to localization, change map id - this->incrementMapId(); - } - _incrementalMemory = value; - } - if(_dbDriver) { _dbDriver->parseParameters(parameters); @@ -539,6 +526,28 @@ void Memory::parseParameters(const ParametersMap & parameters) { _feature2D->parseParameters(parameters); } + + // do this after all parameters are parsed + // SLAM mode vs Localization mode + iter = parameters.find(Parameters::kMemIncrementalMemory()); + if(iter != parameters.end()) + { + bool value = uStr2Bool(iter->second.c_str()); + if(value == false && _incrementalMemory) + { + // From SLAM to localization, change map id + this->incrementMapId(); + + // The easiest way to make sure that the mapping session is saved + // is to save the memory in the database and reload it. + if((_memoryChanged || _linksChanged) && _dbDriver) + { + UWARN("Switching from Mapping to Localization mode, the database will be saved and reloaded."); + this->init(_dbDriver->getUrl()); + } + } + _incrementalMemory = value; + } } void Memory::preUpdate()