mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 09:30:25 +08:00
Reduced local bundle on loop closure iterations to 5. Updated graph::filterLinks() to handle selfRef link type. DbViewer: removed gravity constraints from constraints view.
This commit is contained in:
@@ -1117,7 +1117,7 @@ std::multimap<int, Link> filterDuplicateLinks(
|
||||
std::multimap<int, Link> output;
|
||||
for(std::multimap<int, Link>::const_iterator iter=links.begin(); iter!=links.end(); ++iter)
|
||||
{
|
||||
if(graph::findLink(output, iter->second.from(), iter->second.to(), true) == output.end())
|
||||
if(graph::findLink(output, iter->second.from(), iter->second.to(), true, iter->second.type()) == output.end())
|
||||
{
|
||||
output.insert(*iter);
|
||||
}
|
||||
@@ -1132,7 +1132,14 @@ std::multimap<int, Link> filterLinks(
|
||||
std::multimap<int, Link> output;
|
||||
for(std::multimap<int, Link>::const_iterator iter=links.begin(); iter!=links.end(); ++iter)
|
||||
{
|
||||
if(iter->second.type() != filteredType)
|
||||
if(filteredType == Link::kSelfRefLink)
|
||||
{
|
||||
if(iter->second.from() != iter->second.to())
|
||||
{
|
||||
output.insert(*iter);
|
||||
}
|
||||
}
|
||||
else if(iter->second.type() != filteredType)
|
||||
{
|
||||
output.insert(*iter);
|
||||
}
|
||||
|
||||
@@ -2838,8 +2838,9 @@ Transform Memory::computeTransform(
|
||||
for(std::multimap<int, Link>::iterator iter=links.begin(); iter!=links.end(); ++iter)
|
||||
{
|
||||
int id = iter->first;
|
||||
if(id != fromS.id())
|
||||
if(id != fromS.id() || iter->second.transform().isNull())
|
||||
{
|
||||
UDEBUG("%d", id);
|
||||
const Signature * s;
|
||||
if(id == tmpTo.id())
|
||||
{
|
||||
@@ -2873,15 +2874,19 @@ Transform Memory::computeTransform(
|
||||
}
|
||||
bundleModels.insert(std::make_pair(id, model));
|
||||
Transform invLocalTransform = model.localTransform().inverse();
|
||||
if(iter->second.isValid())
|
||||
UASSERT(iter->second.isValid() || iter->first == fromS.id());
|
||||
|
||||
if(iter->second.transform().isNull())
|
||||
{
|
||||
// fromId pose
|
||||
bundlePoses.insert(std::make_pair(id, Transform::getIdentity()));
|
||||
}
|
||||
else
|
||||
{
|
||||
bundleLinks.insert(std::make_pair(iter->second.from(), iter->second));
|
||||
bundlePoses.insert(std::make_pair(id, iter->second.transform()));
|
||||
}
|
||||
else
|
||||
{
|
||||
bundlePoses.insert(std::make_pair(id, Transform::getIdentity()));
|
||||
}
|
||||
|
||||
const std::map<int,cv::KeyPoint> & words = uMultimapToMapUnique(s->getWords());
|
||||
for(std::map<int, cv::KeyPoint>::const_iterator jter=words.begin(); jter!=words.end(); ++jter)
|
||||
{
|
||||
@@ -2903,6 +2908,7 @@ Transform Memory::computeTransform(
|
||||
std::set<int> sbaOutliers;
|
||||
UTimer bundleTimer;
|
||||
OptimizerG2O sba;
|
||||
sba.setIterations(5);
|
||||
UTimer bundleTime;
|
||||
bundlePoses = sba.optimizeBA(-toS.id(), bundlePoses, bundleLinks, bundleModels, points3DMap, wordReferences, &sbaOutliers);
|
||||
UDEBUG("sba...end");
|
||||
|
||||
@@ -2533,8 +2533,8 @@ bool Rtabmap::process(
|
||||
(_loopClosureHypothesis.first>0 ||
|
||||
lastProximitySpaceClosureId>0 || // can be different map of the current one
|
||||
statistics_.reducedIds().size() ||
|
||||
(signature->hasLink(signature->id(), Link::kPosePrior) && !_graphOptimizer->priorsIgnored()) || // prior edge
|
||||
(signature->hasLink(signature->id(), Link::kGravity) && _graphOptimizer->gravitySigma()>0.0f) || // gravity edge
|
||||
(signature->hasLink(signature->id(), Link::kPosePrior) && !_graphOptimizer->priorsIgnored() && !_memory->isIncremental()) || // prior edge
|
||||
(signature->hasLink(signature->id(), Link::kGravity) && _graphOptimizer->gravitySigma()>0.0f && !_memory->isIncremental()) || // gravity edge
|
||||
proximityDetectionsInTimeFound>0 ||
|
||||
landmarkDetected!=0 ||
|
||||
((_memory->isIncremental() || graph::filterLinks(signature->getLinks(), Link::kSelfRefLink).size()) && // In localization mode, the new node should be linked
|
||||
@@ -3251,9 +3251,15 @@ bool Rtabmap::process(
|
||||
}
|
||||
else
|
||||
{
|
||||
UASSERT_MSG(uContains(_optimizedPoses, _lastLocalizationNodeId), uFormat("id=%d isInWM?=%d", _lastLocalizationNodeId, _memory->isInWM(_lastLocalizationNodeId)?1:0).c_str());
|
||||
id = _lastLocalizationNodeId;
|
||||
UDEBUG("Refresh local map from %d", id);
|
||||
if(uContains(_optimizedPoses, _lastLocalizationNodeId))
|
||||
{
|
||||
id = _lastLocalizationNodeId;
|
||||
UDEBUG("Refresh local map from %d", id);
|
||||
}
|
||||
else
|
||||
{
|
||||
_lastLocalizationNodeId = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(_memory->isIncremental() &&
|
||||
|
||||
Reference in New Issue
Block a user