mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-01 17:10:26 +08:00
Creating a new map when variance >= 9999 is detected
This commit is contained in:
@@ -2599,6 +2599,7 @@ bool Memory::rehearsalMerge(int oldId, int newId)
|
||||
Signature * newS = _getSignature(newId);
|
||||
if(oldS && newS && _incrementalMemory)
|
||||
{
|
||||
UASSERT_MSG(oldS->getWeight() >= 0 && newS->getWeight() >= 0, uFormat("%d %d", oldS->getWeight(), newS->getWeight()).c_str());
|
||||
std::map<int, Link>::const_iterator iter = oldS->getLinks().find(newS->id());
|
||||
if(iter != oldS->getLinks().end() &&
|
||||
iter->second.type() != Link::kNeighbor &&
|
||||
@@ -2610,7 +2611,9 @@ bool Memory::rehearsalMerge(int oldId, int newId)
|
||||
}
|
||||
UASSERT(!newS->isSaved());
|
||||
|
||||
UINFO("Rehearsal merging %d and %d", oldS->id(), newS->id());
|
||||
UINFO("Rehearsal merging %d (w=%d) and %d (w=%d)",
|
||||
oldS->id(), oldS->getWeight(),
|
||||
newS->id(), newS->getWeight());
|
||||
|
||||
bool fullMerge;
|
||||
bool intermediateMerge = false;
|
||||
|
||||
@@ -117,6 +117,8 @@ Transform OdometryF2F::computeTransform(
|
||||
{
|
||||
//return Identity
|
||||
output = Transform::getIdentity();
|
||||
// a very high variance tells that the new pose is not linked with the previous one
|
||||
regInfo.variance = 9999;
|
||||
}
|
||||
|
||||
if(!output.isNull())
|
||||
|
||||
@@ -331,6 +331,8 @@ Transform OdometryLocalMap::computeTransform(
|
||||
if(fixedLocalMapPath_.empty() && (int)uniques.size() >= regVis_->getMinInliers())
|
||||
{
|
||||
output.setIdentity();
|
||||
// a very high variance tells that the new pose is not linked with the previous one
|
||||
regInfo.variance = 9999;
|
||||
|
||||
Transform t = this->getPose(); // initial pose maybe not identity...
|
||||
for(std::list<int>::iterator iter = uniques.begin(); iter!=uniques.end(); ++iter)
|
||||
|
||||
@@ -981,6 +981,11 @@ Transform OdometryMono::computeTransform(const SensorData & data, OdometryInfo *
|
||||
{
|
||||
//return Identity
|
||||
output = Transform::getIdentity();
|
||||
if(info)
|
||||
{
|
||||
// a very high variance tells that the new pose is not linked with the previous one
|
||||
info->variance = 9999;
|
||||
}
|
||||
|
||||
// generate kpts
|
||||
if(memory_->update(SensorData(newFrame)))
|
||||
|
||||
@@ -1204,8 +1204,8 @@ bool Rtabmap::process(
|
||||
// Bayes filter update
|
||||
//============================================================
|
||||
int previousId = signature->getLinks().size() == 1?signature->getLinks().begin()->first:0;
|
||||
// Not a bad signature, not a small displacement unless the previous signature didn't have a loop closure
|
||||
if(!signature->isBadSignature() && (!smallDisplacement || _memory->getLoopClosureLinks(previousId, false).size() == 0))
|
||||
// Not a bad signature, not an intermediate node, not a small displacement unless the previous signature didn't have a loop closure
|
||||
if(!signature->isBadSignature() && signature->getWeight()>=0 && (!smallDisplacement || _memory->getLoopClosureLinks(previousId, false).size() == 0))
|
||||
{
|
||||
// If the working memory is empty, don't do the detection. It happens when it
|
||||
// is the first time the detector is started (there needs some images to
|
||||
|
||||
@@ -544,9 +544,9 @@ void RtabmapThread::addData(const OdometryEvent & odomEvent)
|
||||
ignoreFrame = true;
|
||||
}
|
||||
}
|
||||
if(_dataBufferMaxSize > 0 && !lastPose_.isIdentity() && odomEvent.pose().isIdentity())
|
||||
if(_dataBufferMaxSize > 0 && !lastPose_.isIdentity() && (odomEvent.pose().isIdentity() || odomEvent.info().variance>=9999))
|
||||
{
|
||||
UWARN("Odometry is reset (identity pose detected). Increment map id!");
|
||||
UWARN("Odometry is reset (identity pose or high variance (%f) detected). Increment map id!", odomEvent.info().variance);
|
||||
pushNewState(kStateTriggeringMap);
|
||||
_rotVariance = 0;
|
||||
_transVariance = 0;
|
||||
|
||||
Reference in New Issue
Block a user