mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-03 16:27:46 +08:00
Split RawDataKept parameter into Raw and Binary parameters to save RAM when keeping raw data in the core is not required
This commit is contained in:
@@ -103,6 +103,7 @@ public:
|
|||||||
std::map<int, Link> getLoopClosureLinks(int signatureId,
|
std::map<int, Link> getLoopClosureLinks(int signatureId,
|
||||||
bool lookInDatabase = false) const;
|
bool lookInDatabase = false) const;
|
||||||
bool isRawDataKept() const {return _rawDataKept;}
|
bool isRawDataKept() const {return _rawDataKept;}
|
||||||
|
bool isBinDataKept() const {return _binDataKept;}
|
||||||
float getSimilarityThreshold() const {return _similarityThreshold;}
|
float getSimilarityThreshold() const {return _similarityThreshold;}
|
||||||
std::map<int, int> getWeights() const;
|
std::map<int, int> getWeights() const;
|
||||||
int getLastSignatureId() const;
|
int getLastSignatureId() const;
|
||||||
@@ -183,7 +184,6 @@ private:
|
|||||||
void copyData(const Signature * from, Signature * to);
|
void copyData(const Signature * from, Signature * to);
|
||||||
Signature * createSignature(
|
Signature * createSignature(
|
||||||
const SensorData & data,
|
const SensorData & data,
|
||||||
bool keepRawData=false,
|
|
||||||
Statistics * stats = 0);
|
Statistics * stats = 0);
|
||||||
|
|
||||||
//keypoint stuff
|
//keypoint stuff
|
||||||
@@ -199,6 +199,7 @@ private:
|
|||||||
// parameters
|
// parameters
|
||||||
float _similarityThreshold;
|
float _similarityThreshold;
|
||||||
bool _rawDataKept;
|
bool _rawDataKept;
|
||||||
|
bool _binDataKept;
|
||||||
bool _keepRehearsedNodesInDb;
|
bool _keepRehearsedNodesInDb;
|
||||||
bool _incrementalMemory;
|
bool _incrementalMemory;
|
||||||
int _maxStMemSize;
|
int _maxStMemSize;
|
||||||
|
|||||||
@@ -183,7 +183,8 @@ class RTABMAP_EXP Parameters
|
|||||||
|
|
||||||
// Memory
|
// Memory
|
||||||
RTABMAP_PARAM(Mem, RehearsalSimilarity, float, 0.6, "Rehearsal similarity.");
|
RTABMAP_PARAM(Mem, RehearsalSimilarity, float, 0.6, "Rehearsal similarity.");
|
||||||
RTABMAP_PARAM(Mem, ImageKept, bool, true, "Keep images in db.");
|
RTABMAP_PARAM(Mem, ImageKept, bool, false, "Keep raw images in RAM.");
|
||||||
|
RTABMAP_PARAM(Mem, BinDataKept, bool, true, "Keep binary data in db.");
|
||||||
RTABMAP_PARAM(Mem, RehearsedNodesKept, bool, true, "Keep rehearsed ndoes in db.");
|
RTABMAP_PARAM(Mem, RehearsedNodesKept, bool, true, "Keep rehearsed ndoes in db.");
|
||||||
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, othwersize it is Localization mode.");
|
RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, othwersize it is Localization mode.");
|
||||||
|
|||||||
+12
-7
@@ -57,6 +57,7 @@ Memory::Memory(const ParametersMap & parameters) :
|
|||||||
_dbDriver(0),
|
_dbDriver(0),
|
||||||
_similarityThreshold(Parameters::defaultMemRehearsalSimilarity()),
|
_similarityThreshold(Parameters::defaultMemRehearsalSimilarity()),
|
||||||
_rawDataKept(Parameters::defaultMemImageKept()),
|
_rawDataKept(Parameters::defaultMemImageKept()),
|
||||||
|
_binDataKept(Parameters::defaultMemBinDataKept()),
|
||||||
_keepRehearsedNodesInDb(Parameters::defaultMemRehearsedNodesKept()),
|
_keepRehearsedNodesInDb(Parameters::defaultMemRehearsedNodesKept()),
|
||||||
_incrementalMemory(Parameters::defaultMemIncrementalMemory()),
|
_incrementalMemory(Parameters::defaultMemIncrementalMemory()),
|
||||||
_maxStMemSize(Parameters::defaultMemSTMSize()),
|
_maxStMemSize(Parameters::defaultMemSTMSize()),
|
||||||
@@ -363,6 +364,7 @@ void Memory::parseParameters(const ParametersMap & parameters)
|
|||||||
ParametersMap::const_iterator iter;
|
ParametersMap::const_iterator iter;
|
||||||
|
|
||||||
Parameters::parse(parameters, Parameters::kMemImageKept(), _rawDataKept);
|
Parameters::parse(parameters, Parameters::kMemImageKept(), _rawDataKept);
|
||||||
|
Parameters::parse(parameters, Parameters::kMemBinDataKept(), _binDataKept);
|
||||||
Parameters::parse(parameters, Parameters::kMemRehearsedNodesKept(), _keepRehearsedNodesInDb);
|
Parameters::parse(parameters, Parameters::kMemRehearsedNodesKept(), _keepRehearsedNodesInDb);
|
||||||
Parameters::parse(parameters, Parameters::kMemRehearsalIdUpdatedToNewOne(), _idUpdatedToNewOneRehearsal);
|
Parameters::parse(parameters, Parameters::kMemRehearsalIdUpdatedToNewOne(), _idUpdatedToNewOneRehearsal);
|
||||||
Parameters::parse(parameters, Parameters::kMemGenerateIds(), _generateIds);
|
Parameters::parse(parameters, Parameters::kMemGenerateIds(), _generateIds);
|
||||||
@@ -514,7 +516,7 @@ bool Memory::update(const SensorData & data, Statistics * stats)
|
|||||||
//============================================================
|
//============================================================
|
||||||
// Create a signature with the image received.
|
// Create a signature with the image received.
|
||||||
//============================================================
|
//============================================================
|
||||||
Signature * signature = this->createSignature(data, this->isRawDataKept(), stats);
|
Signature * signature = this->createSignature(data, stats);
|
||||||
if (signature == 0)
|
if (signature == 0)
|
||||||
{
|
{
|
||||||
UERROR("Failed to create a signature...");
|
UERROR("Failed to create a signature...");
|
||||||
@@ -2484,7 +2486,7 @@ cv::Mat Memory::getImageCompressed(int signatureId) const
|
|||||||
{
|
{
|
||||||
image = s->getImageCompressed();
|
image = s->getImageCompressed();
|
||||||
}
|
}
|
||||||
if(image.empty() && this->isRawDataKept() && _dbDriver)
|
if(image.empty() && this->isBinDataKept() && _dbDriver)
|
||||||
{
|
{
|
||||||
_dbDriver->getNodeData(signatureId, image);
|
_dbDriver->getNodeData(signatureId, image);
|
||||||
}
|
}
|
||||||
@@ -2877,7 +2879,7 @@ private:
|
|||||||
VWDictionary * _vwp;
|
VWDictionary * _vwp;
|
||||||
};
|
};
|
||||||
|
|
||||||
Signature * Memory::createSignature(const SensorData & data, bool keepRawData, Statistics * stats)
|
Signature * Memory::createSignature(const SensorData & data, Statistics * stats)
|
||||||
{
|
{
|
||||||
UASSERT(data.image().empty() || data.image().type() == CV_8UC1 || data.image().type() == CV_8UC3);
|
UASSERT(data.image().empty() || data.image().type() == CV_8UC1 || data.image().type() == CV_8UC3);
|
||||||
UASSERT(data.depth().empty() || data.depth().type() == CV_16UC1 || data.depth().type() == CV_32FC1);
|
UASSERT(data.depth().empty() || data.depth().type() == CV_16UC1 || data.depth().type() == CV_32FC1);
|
||||||
@@ -3283,7 +3285,7 @@ Signature * Memory::createSignature(const SensorData & data, bool keepRawData, S
|
|||||||
}
|
}
|
||||||
|
|
||||||
Signature * s;
|
Signature * s;
|
||||||
if(keepRawData)
|
if(this->isBinDataKept())
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> imageBytes;
|
std::vector<unsigned char> imageBytes;
|
||||||
std::vector<unsigned char> depthBytes;
|
std::vector<unsigned char> depthBytes;
|
||||||
@@ -3323,9 +3325,6 @@ Signature * Memory::createSignature(const SensorData & data, bool keepRawData, S
|
|||||||
data.cx(),
|
data.cx(),
|
||||||
data.cy(),
|
data.cy(),
|
||||||
data.localTransform());
|
data.localTransform());
|
||||||
s->setImageRaw(data.image());
|
|
||||||
s->setDepthRaw(depthOrRightImage);
|
|
||||||
s->setLaserScanRaw(data.laserScan());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -3336,6 +3335,12 @@ Signature * Memory::createSignature(const SensorData & data, bool keepRawData, S
|
|||||||
data.pose(),
|
data.pose(),
|
||||||
util3d::compressData2(data.laserScan()));
|
util3d::compressData2(data.laserScan()));
|
||||||
}
|
}
|
||||||
|
if(this->isRawDataKept())
|
||||||
|
{
|
||||||
|
s->setImageRaw(data.image());
|
||||||
|
s->setDepthRaw(data.depth());
|
||||||
|
s->setLaserScanRaw(data.laserScan());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
t = timer.ticks();
|
t = timer.ticks();
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ OdometryBOW::OdometryBOW(const ParametersMap & parameters) :
|
|||||||
customParameters.insert(ParametersPair(Parameters::kKpMaxDepth(), uNumber2Str(this->getMaxDepth())));
|
customParameters.insert(ParametersPair(Parameters::kKpMaxDepth(), uNumber2Str(this->getMaxDepth())));
|
||||||
customParameters.insert(ParametersPair(Parameters::kKpRoiRatios(), this->getRoiRatios()));
|
customParameters.insert(ParametersPair(Parameters::kKpRoiRatios(), this->getRoiRatios()));
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemImageKept(), "false"));
|
customParameters.insert(ParametersPair(Parameters::kMemBinDataKept(), "false"));
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemSTMSize(), "0"));
|
customParameters.insert(ParametersPair(Parameters::kMemSTMSize(), "0"));
|
||||||
int nn = Parameters::defaultOdomBowNNType();
|
int nn = Parameters::defaultOdomBowNNType();
|
||||||
float nndr = Parameters::defaultOdomBowNNDR();
|
float nndr = Parameters::defaultOdomBowNNDR();
|
||||||
|
|||||||
@@ -1256,7 +1256,7 @@ bool Rtabmap::process(const SensorData & data)
|
|||||||
// override some parameters
|
// override some parameters
|
||||||
uInsert(customParameters, ParametersPair(Parameters::kMemIncrementalMemory(), "true")); // make sure it is incremental
|
uInsert(customParameters, ParametersPair(Parameters::kMemIncrementalMemory(), "true")); // make sure it is incremental
|
||||||
uInsert(customParameters, ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
uInsert(customParameters, ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
||||||
uInsert(customParameters, ParametersPair(Parameters::kMemImageKept(), "false"));
|
uInsert(customParameters, ParametersPair(Parameters::kMemBinDataKept(), "false"));
|
||||||
uInsert(customParameters, ParametersPair(Parameters::kMemSTMSize(), "0"));
|
uInsert(customParameters, ParametersPair(Parameters::kMemSTMSize(), "0"));
|
||||||
uInsert(customParameters, ParametersPair(Parameters::kKpIncrementalDictionary(), "true")); // make sure it is incremental
|
uInsert(customParameters, ParametersPair(Parameters::kKpIncrementalDictionary(), "true")); // make sure it is incremental
|
||||||
uInsert(customParameters, ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false"));
|
uInsert(customParameters, ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false"));
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ bool DataRecorder::init(const QString & path, bool recordInRAM)
|
|||||||
ParametersMap customParameters;
|
ParametersMap customParameters;
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
||||||
customParameters.insert(ParametersPair(Parameters::kKpWordsPerImage(), "-1")); // desactivate keypoints extraction
|
customParameters.insert(ParametersPair(Parameters::kKpWordsPerImage(), "-1")); // desactivate keypoints extraction
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemImageKept(), "true")); // to keep images
|
customParameters.insert(ParametersPair(Parameters::kMemBinDataKept(), "true")); // to keep images
|
||||||
if(!recordInRAM)
|
if(!recordInRAM)
|
||||||
{
|
{
|
||||||
customParameters.insert(ParametersPair(Parameters::kDbSqlite3InMemory(), "false")); // to keep images
|
customParameters.insert(ParametersPair(Parameters::kDbSqlite3InMemory(), "false")); // to keep images
|
||||||
|
|||||||
@@ -2839,7 +2839,7 @@ void MainWindow::postProcessing()
|
|||||||
ParametersMap customParameters;
|
ParametersMap customParameters;
|
||||||
// override some parameters
|
// override some parameters
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemImageKept(), "false"));
|
customParameters.insert(ParametersPair(Parameters::kMemBinDataKept(), "false"));
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemSTMSize(), "0"));
|
customParameters.insert(ParametersPair(Parameters::kMemSTMSize(), "0"));
|
||||||
customParameters.insert(ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false"));
|
customParameters.insert(ParametersPair(Parameters::kKpNewWordsComparedTogether(), "false"));
|
||||||
customParameters.insert(ParametersPair(Parameters::kKpNNStrategy(), parameters.at(Parameters::kLccReextractNNType())));
|
customParameters.insert(ParametersPair(Parameters::kKpNNStrategy(), parameters.at(Parameters::kLccReextractNNType())));
|
||||||
|
|||||||
@@ -327,6 +327,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
|
|
||||||
// Memory
|
// Memory
|
||||||
_ui->general_checkBox_keepRawData->setObjectName(Parameters::kMemImageKept().c_str());
|
_ui->general_checkBox_keepRawData->setObjectName(Parameters::kMemImageKept().c_str());
|
||||||
|
_ui->general_checkBox_keepBinaryData->setObjectName(Parameters::kMemBinDataKept().c_str());
|
||||||
_ui->general_checkBox_keepRehearsedNodes->setObjectName(Parameters::kMemRehearsedNodesKept().c_str());
|
_ui->general_checkBox_keepRehearsedNodes->setObjectName(Parameters::kMemRehearsedNodesKept().c_str());
|
||||||
_ui->general_spinBox_maxStMemSize->setObjectName(Parameters::kMemSTMSize().c_str());
|
_ui->general_spinBox_maxStMemSize->setObjectName(Parameters::kMemSTMSize().c_str());
|
||||||
_ui->doubleSpinBox_similarityThreshold->setObjectName(Parameters::kMemRehearsalSimilarity().c_str());
|
_ui->doubleSpinBox_similarityThreshold->setObjectName(Parameters::kMemRehearsalSimilarity().c_str());
|
||||||
|
|||||||
@@ -64,8 +64,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>732</width>
|
<width>744</width>
|
||||||
<height>1302</height>
|
<height>1056</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29">
|
<layout class="QVBoxLayout" name="verticalLayout_29">
|
||||||
@@ -2811,6 +2811,16 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
<layout class="QVBoxLayout" name="verticalLayout_10">
|
<layout class="QVBoxLayout" name="verticalLayout_10">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_42" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout_42" columnstretch="0,1">
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLabel" name="label_retrieved_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Initialize the Woking Memory with all nodes from Long-Term memory, instead of only nodes of the last session. This may be useful in localization mode, where less processing time is required than in SLAM mode, so more nodes can be kept in Working Memory.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QSpinBox" name="general_spinBox_maxStMemSize">
|
<widget class="QSpinBox" name="general_spinBox_maxStMemSize">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
@@ -2936,16 +2946,26 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QLabel" name="label_retrieved_4">
|
<widget class="QLabel" name="label_retrieved_5">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Initialize the Woking Memory with all nodes from Long-Term memory, instead of only nodes of the last session. This may be useful in localization mode, where less processing time is required than in SLAM mode, so more nodes can be kept in Working Memory.</string>
|
<string>Keep raw sensor data. Only useful to save loop closure computation time when features re-extraction is enabled. Disable to save RAM memory.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="6" column="0">
|
||||||
|
<widget class="QCheckBox" name="general_checkBox_keepRawData">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -3021,7 +3041,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_11" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout_11" columnstretch="0,1">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="general_checkBox_keepRawData">
|
<widget class="QCheckBox" name="general_checkBox_keepBinaryData">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@@ -3033,7 +3053,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
<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">
|
||||||
<string>Keep raw sensor data.</string>
|
<string>Keep sensor compressed data.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
|||||||
Reference in New Issue
Block a user