Added badSignaturesIgnored parameter, set to false will keep bad images in memory and in the map's graph (useful on RGBD-SLAM with TORO optimizations to propagate more equally errors to nodes with blank images)

git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@1063 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
matlabbe
2014-01-15 20:41:58 +00:00
parent 11eed189c9
commit b8c6014ed2
5 changed files with 54 additions and 16 deletions

View File

@@ -196,6 +196,7 @@ private:
float _recentWmRatio;
bool _idUpdatedToNewOneRehearsal;
bool _generateIds;
bool _badSignaturesIgnored;
int _idCount;
int _idMapCount;

View File

@@ -148,7 +148,8 @@ class RTABMAP_EXP Parameters
RTABMAP_PARAM(Mem, IncrementalMemory, bool, true, "SLAM mode, othwersize it is Localization mode.");
RTABMAP_PARAM(Mem, RecentWmRatio, float, 0.2, "Ratio of locations after the last loop closure in WM that cannot be transferred.");
RTABMAP_PARAM(Mem, RehearsalIdUpdatedToNewOne, bool, false, "On merge, update to new id. When false, no copy.");
RTABMAP_PARAM(Mem, GenerateIds, bool, true, "True=Generate location Ids, False=use input image ids.")
RTABMAP_PARAM(Mem, GenerateIds, bool, true, "True=Generate location Ids, False=use input image ids.");
RTABMAP_PARAM(Mem, BadSignaturesIgnored, bool, true, "Bad signatures are ignored.")
// KeypointMemory (Keypoint-based)
RTABMAP_PARAM(Kp, PublishKeypoints, bool, true, "Publishing keypoints.");

View File

@@ -54,6 +54,7 @@ Memory::Memory(const ParametersMap & parameters) :
_recentWmRatio(Parameters::defaultMemRecentWmRatio()),
_idUpdatedToNewOneRehearsal(Parameters::defaultMemRehearsalIdUpdatedToNewOne()),
_generateIds(Parameters::defaultMemGenerateIds()),
_badSignaturesIgnored(Parameters::defaultMemBadSignaturesIgnored()),
_idCount(kIdStart),
_idMapCount(kIdStart),
_lastSignature(0),
@@ -147,7 +148,7 @@ bool Memory::init(const std::string & dbUrl, bool dbOverwritten, const Parameter
for(std::list<Signature*>::reverse_iterator iter=dbSignatures.rbegin(); iter!=dbSignatures.rend(); ++iter)
{
// ignore bad signatures
if(!(*iter)->isBadSignature())
if(!((*iter)->isBadSignature() && _badSignaturesIgnored))
{
_signatures.insert(std::pair<int, Signature *>((*iter)->id(), *iter));
if((int)_stMem.size() <= _maxStMemSize)
@@ -286,6 +287,7 @@ void Memory::parseParameters(const ParametersMap & parameters)
Parameters::parse(parameters, Parameters::kMemRehearsedNodesKept(), _keepRehearsedNodesInDb);
Parameters::parse(parameters, Parameters::kMemRehearsalIdUpdatedToNewOne(), _idUpdatedToNewOneRehearsal);
Parameters::parse(parameters, Parameters::kMemGenerateIds(), _generateIds);
Parameters::parse(parameters, Parameters::kMemBadSignaturesIgnored(), _badSignaturesIgnored);
Parameters::parse(parameters, Parameters::kMemRehearsalSimilarity(), _similarityThreshold);
Parameters::parse(parameters, Parameters::kMemRecentWmRatio(), _recentWmRatio);
Parameters::parse(parameters, Parameters::kMemSTMSize(), _maxStMemSize);
@@ -466,12 +468,6 @@ bool Memory::update(const Image & image, Statistics * stats)
_lastSignature = signature;
if(_lastLoopClosureId == 0 && !signature->isBadSignature())
{
// If not set use the new one added
_lastLoopClosureId = signature->id();
}
//============================================================
// Rehearsal step...
// Compare with the X last signatures. If different, add this
@@ -1233,7 +1229,7 @@ std::list<int> Memory::cleanup(const std::list<int> & ignoredIds)
std::list<int> signaturesRemoved;
// bad signature
if(_lastSignature->isBadSignature() || !_incrementalMemory)
if((_lastSignature->isBadSignature() && _badSignaturesIgnored) || !_incrementalMemory)
{
if(_lastSignature->isBadSignature())
{
@@ -1448,7 +1444,7 @@ void Memory::moveToTrash(Signature * s, bool saveToDatabase)
if(s)
{
// If not saved to database or it is a bad signature, remove links!
if(!saveToDatabase || s->isBadSignature())
if(!saveToDatabase || (s->isBadSignature() && _badSignaturesIgnored))
{
UASSERT_MSG(this->isInSTM(s->id()),
uFormat("Deleting location (%d) outside the STM is not implemented!", s->id()).c_str());