void RtabmapThread::mainLoop() { State state = kStateDetecting; ParametersMap parameters; _stateMutex.lock(); { if(!_state.empty() && !_stateParam.empty()) { state = _state.top(); _state.pop(); parameters = _stateParam.top(); _stateParam.pop(); } } _stateMutex.unlock(); switch(state) { case kStateDetecting: this->process(); break; case kStateInit: UASSERT(!parameters.at("RtabmapThread/DatabasePath").empty()); _rtabmap->init(parameters, parameters.at("RtabmapThread/DatabasePath")); break; case kStateChangingParameters: Parameters::parse(parameters, Parameters::kRtabmapImageBufferSize(), _dataBufferMaxSize); Parameters::parse(parameters, Parameters::kRtabmapDetectionRate(), _rate); UASSERT(_dataBufferMaxSize >= 0); UASSERT(_rate >= 0.0f); _rtabmap->parseParameters(parameters); break; case kStateReseting: _rtabmap->resetMemory(); this->clearBufferedData(); break; case kStateClose: if(_dataBuffer.size()) { UWARN("Closing... %d data still buffered! They will be cleared.", (int)_dataBuffer.size()); this->clearBufferedData(); } _rtabmap->close(); break; case kStateDumpingMemory: _rtabmap->dumpData(); break; case kStateDumpingPrediction: _rtabmap->dumpPrediction(); break; case kStateGeneratingDOTGraph: _rtabmap->generateDOTGraph(parameters.at("path")); break; case kStateGeneratingDOTLocalGraph: _rtabmap->generateDOTGraph(parameters.at("path"), atoi(parameters.at("id").c_str()), atoi(parameters.at("margin").c_str())); break; case kStateGeneratingTOROGraphLocal: _rtabmap->generateTOROGraph(parameters.at("path"), atoi(parameters.at("optimized").c_str())!=0, false); break; case kStateGeneratingTOROGraphGlobal: _rtabmap->generateTOROGraph(parameters.at("path"), atoi(parameters.at("optimized").c_str())!=0, true); break; case kStateCleanDataBuffer: this->clearBufferedData(); break; case kStatePublishingMapLocal: this->publishMap(atoi(parameters.at("optimized").c_str())!=0, false); break; case kStatePublishingMapGlobal: this->publishMap(atoi(parameters.at("optimized").c_str())!=0, true); break; case kStatePublishingTOROGraphLocal: this->publishTOROGraph(atoi(parameters.at("optimized").c_str())!=0, false); break; case kStatePublishingTOROGraphGlobal: this->publishTOROGraph(atoi(parameters.at("optimized").c_str())!=0, true); break; case kStateTriggeringMap: _rtabmap->triggerNewMap(); break; default: UFATAL("Invalid state !?!?"); break; } }