mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-13 23:10:20 +08:00
Fixed bug where very long paths (over maxGraphDepth) were used for scan matching. Added "RGBD/ProximityMaxPaths" parameter (default 3) to limit the number of path comparisons for proximity detection.
This commit is contained in:
@@ -324,7 +324,8 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(RGBD, ProximityByTime, bool, false, "Detection over all locations in STM.");
|
RTABMAP_PARAM(RGBD, ProximityByTime, bool, false, "Detection over all locations in STM.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityBySpace, bool, true, "Detection over locations (in Working Memory or STM) near in space.");
|
RTABMAP_PARAM(RGBD, ProximityBySpace, bool, true, "Detection over locations (in Working Memory or STM) near in space.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityMaxGraphDepth, int, 50, "Maximum depth from the current/last loop closure location and the local loop closure hypotheses. Set 0 to ignore.");
|
RTABMAP_PARAM(RGBD, ProximityMaxGraphDepth, int, 50, "Maximum depth from the current/last loop closure location and the local loop closure hypotheses. Set 0 to ignore.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityPathFilteringRadius, float, 0.5, "Path filtering radius.");
|
RTABMAP_PARAM(RGBD, ProximityMaxPaths, int, 3, "Maximum paths compared (from the most recent) for proximity detection by space. 0 means no limit.");
|
||||||
|
RTABMAP_PARAM(RGBD, ProximityPathFilteringRadius, float, 0.5, "Path filtering radius to reduce the number of nodes to compare in a path. A path should also be inside that radius to be considered for proximity detection.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityPathRawPosesUsed, bool, true, "When comparing to a local path, merge the scan using the odometry poses (with neighbor link optimizations) instead of the ones in the optimized local graph.");
|
RTABMAP_PARAM(RGBD, ProximityPathRawPosesUsed, bool, true, "When comparing to a local path, merge the scan using the odometry poses (with neighbor link optimizations) instead of the ones in the optimized local graph.");
|
||||||
RTABMAP_PARAM(RGBD, ProximityAngle, float, 45, "Maximum angle (degrees) for visual proximity detection.");
|
RTABMAP_PARAM(RGBD, ProximityAngle, float, 45, "Maximum angle (degrees) for visual proximity detection.");
|
||||||
|
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ public:
|
|||||||
const Transform & getPathTransformToGoal() const {return _pathTransformToGoal;}
|
const Transform & getPathTransformToGoal() const {return _pathTransformToGoal;}
|
||||||
|
|
||||||
std::map<int, Transform> getForwardWMPoses(int fromId, int maxNearestNeighbors, float radius, int maxDiffID) const;
|
std::map<int, Transform> getForwardWMPoses(int fromId, int maxNearestNeighbors, float radius, int maxDiffID) const;
|
||||||
std::list<std::map<int, Transform> > getPaths(std::map<int, Transform> poses) const;
|
std::map<int, std::map<int, Transform> > getPaths(std::map<int, Transform> poses, const Transform & target, int maxGraphDepth = 0) const;
|
||||||
void adjustLikelihood(std::map<int, float> & likelihood) const;
|
void adjustLikelihood(std::map<int, float> & likelihood) const;
|
||||||
std::pair<int, float> selectHypothesis(const std::map<int, float> & posterior,
|
std::pair<int, float> selectHypothesis(const std::map<int, float> & posterior,
|
||||||
const std::map<int, float> & likelihood) const;
|
const std::map<int, float> & likelihood) const;
|
||||||
@@ -195,6 +195,7 @@ private:
|
|||||||
float _localRadius;
|
float _localRadius;
|
||||||
float _localImmunizationRatio;
|
float _localImmunizationRatio;
|
||||||
int _proximityMaxGraphDepth;
|
int _proximityMaxGraphDepth;
|
||||||
|
int _proximityMaxPaths;
|
||||||
float _proximityFilteringRadius;
|
float _proximityFilteringRadius;
|
||||||
bool _proximityRawPosesUsed;
|
bool _proximityRawPosesUsed;
|
||||||
float _proximityAngle;
|
float _proximityAngle;
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ class RTABMAP_EXP Statistics
|
|||||||
RTABMAP_STATS(Proximity, Time_detections,);
|
RTABMAP_STATS(Proximity, Time_detections,);
|
||||||
RTABMAP_STATS(Proximity, Space_last_detection_id,);
|
RTABMAP_STATS(Proximity, Space_last_detection_id,);
|
||||||
RTABMAP_STATS(Proximity, Space_paths,);
|
RTABMAP_STATS(Proximity, Space_paths,);
|
||||||
|
RTABMAP_STATS(Proximity, Space_visual_paths_checked,);
|
||||||
|
RTABMAP_STATS(Proximity, Space_scan_paths_checked,);
|
||||||
RTABMAP_STATS(Proximity, Space_detections_added_visually,);
|
RTABMAP_STATS(Proximity, Space_detections_added_visually,);
|
||||||
RTABMAP_STATS(Proximity, Space_detections_added_icp_only,);
|
RTABMAP_STATS(Proximity, Space_detections_added_icp_only,);
|
||||||
|
|
||||||
|
|||||||
+9
-13
@@ -1479,20 +1479,16 @@ int findNearestNode(
|
|||||||
ids[oi++] = iter->first;
|
ids[oi++] = iter->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<int, float> foundNodes;
|
pcl::search::KdTree<pcl::PointXYZ>::Ptr kdTree(new pcl::search::KdTree<pcl::PointXYZ>);
|
||||||
if(cloud->size())
|
kdTree->setInputCloud(cloud);
|
||||||
|
std::vector<int> ind;
|
||||||
|
std::vector<float> dist;
|
||||||
|
pcl::PointXYZ pt(targetPose.x(), targetPose.y(), targetPose.z());
|
||||||
|
kdTree->nearestKSearch(pt, 1, ind, dist);
|
||||||
|
if(ind.size() && dist.size() && ind[0] >= 0)
|
||||||
{
|
{
|
||||||
pcl::search::KdTree<pcl::PointXYZ>::Ptr kdTree(new pcl::search::KdTree<pcl::PointXYZ>);
|
UDEBUG("Nearest node = %d: %f", ids[ind[0]], dist[0]);
|
||||||
kdTree->setInputCloud(cloud);
|
id = ids[ind[0]];
|
||||||
std::vector<int> ind;
|
|
||||||
std::vector<float> dist;
|
|
||||||
pcl::PointXYZ pt(targetPose.x(), targetPose.y(), targetPose.z());
|
|
||||||
kdTree->nearestKSearch(pt, 1, ind, dist);
|
|
||||||
if(ind.size() && dist.size() && ind[0] >= 0)
|
|
||||||
{
|
|
||||||
UDEBUG("Nearest node = %d: %f", ids[ind[0]], dist[0]);
|
|
||||||
id = ids[ind[0]];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
|
|||||||
@@ -348,13 +348,15 @@ Transform RegistrationIcp::computeTransformationImpl(
|
|||||||
correspondencesRatio = float(correspondences)/float(toScan.cols>fromScan.cols?toScan.cols:fromScan.cols);
|
correspondencesRatio = float(correspondences)/float(toScan.cols>fromScan.cols?toScan.cols:fromScan.cols);
|
||||||
}
|
}
|
||||||
|
|
||||||
UDEBUG("%d->%d hasConverged=%s, variance=%f, correspondences=%d/%d (%f%%)",
|
UDEBUG("%d->%d hasConverged=%s, variance=%f, correspondences=%d/%d (%f%%), from guess: trans=%f rot=%f",
|
||||||
dataTo.id(), dataFrom.id(),
|
dataTo.id(), dataFrom.id(),
|
||||||
hasConverged?"true":"false",
|
hasConverged?"true":"false",
|
||||||
variance,
|
variance,
|
||||||
correspondences,
|
correspondences,
|
||||||
maxLaserScans>0?maxLaserScans:(int)(toScan.cols>fromScan.cols?toScan.cols:fromScan.cols),
|
maxLaserScans>0?maxLaserScans:(int)(toScan.cols>fromScan.cols?toScan.cols:fromScan.cols),
|
||||||
correspondencesRatio*100.0f);
|
correspondencesRatio*100.0f,
|
||||||
|
info.icpTranslation,
|
||||||
|
info.icpRotation);
|
||||||
|
|
||||||
info.variance = variance>0.0f?variance:0.0001; // epsilon if exact transform
|
info.variance = variance>0.0f?variance:0.0001; // epsilon if exact transform
|
||||||
info.icpInliersRatio = correspondencesRatio;
|
info.icpInliersRatio = correspondencesRatio;
|
||||||
|
|||||||
+57
-24
@@ -98,6 +98,7 @@ Rtabmap::Rtabmap() :
|
|||||||
_localRadius(Parameters::defaultRGBDLocalRadius()),
|
_localRadius(Parameters::defaultRGBDLocalRadius()),
|
||||||
_localImmunizationRatio(Parameters::defaultRGBDLocalImmunizationRatio()),
|
_localImmunizationRatio(Parameters::defaultRGBDLocalImmunizationRatio()),
|
||||||
_proximityMaxGraphDepth(Parameters::defaultRGBDProximityMaxGraphDepth()),
|
_proximityMaxGraphDepth(Parameters::defaultRGBDProximityMaxGraphDepth()),
|
||||||
|
_proximityMaxPaths(Parameters::defaultRGBDProximityMaxPaths()),
|
||||||
_proximityFilteringRadius(Parameters::defaultRGBDProximityPathFilteringRadius()),
|
_proximityFilteringRadius(Parameters::defaultRGBDProximityPathFilteringRadius()),
|
||||||
_proximityRawPosesUsed(Parameters::defaultRGBDProximityPathRawPosesUsed()),
|
_proximityRawPosesUsed(Parameters::defaultRGBDProximityPathRawPosesUsed()),
|
||||||
_proximityAngle(Parameters::defaultRGBDProximityAngle()*M_PI/180.0f),
|
_proximityAngle(Parameters::defaultRGBDProximityAngle()*M_PI/180.0f),
|
||||||
@@ -409,6 +410,7 @@ void Rtabmap::parseParameters(const ParametersMap & parameters)
|
|||||||
Parameters::parse(parameters, Parameters::kRGBDLocalRadius(), _localRadius);
|
Parameters::parse(parameters, Parameters::kRGBDLocalRadius(), _localRadius);
|
||||||
Parameters::parse(parameters, Parameters::kRGBDLocalImmunizationRatio(), _localImmunizationRatio);
|
Parameters::parse(parameters, Parameters::kRGBDLocalImmunizationRatio(), _localImmunizationRatio);
|
||||||
Parameters::parse(parameters, Parameters::kRGBDProximityMaxGraphDepth(), _proximityMaxGraphDepth);
|
Parameters::parse(parameters, Parameters::kRGBDProximityMaxGraphDepth(), _proximityMaxGraphDepth);
|
||||||
|
Parameters::parse(parameters, Parameters::kRGBDProximityMaxPaths(), _proximityMaxPaths);
|
||||||
Parameters::parse(parameters, Parameters::kRGBDProximityPathFilteringRadius(), _proximityFilteringRadius);
|
Parameters::parse(parameters, Parameters::kRGBDProximityPathFilteringRadius(), _proximityFilteringRadius);
|
||||||
Parameters::parse(parameters, Parameters::kRGBDProximityPathRawPosesUsed(), _proximityRawPosesUsed);
|
Parameters::parse(parameters, Parameters::kRGBDProximityPathRawPosesUsed(), _proximityRawPosesUsed);
|
||||||
Parameters::parse(parameters, Parameters::kRGBDProximityAngle(), _proximityAngle);
|
Parameters::parse(parameters, Parameters::kRGBDProximityAngle(), _proximityAngle);
|
||||||
@@ -1766,6 +1768,8 @@ bool Rtabmap::process(
|
|||||||
int proximityDetectionsAddedByICPOnly = 0;
|
int proximityDetectionsAddedByICPOnly = 0;
|
||||||
int lastProximitySpaceClosureId = 0;
|
int lastProximitySpaceClosureId = 0;
|
||||||
int proximitySpacePaths = 0;
|
int proximitySpacePaths = 0;
|
||||||
|
int localVisualPathsChecked = 0;
|
||||||
|
int localScanPathsChecked = 0;
|
||||||
if(_proximityBySpace &&
|
if(_proximityBySpace &&
|
||||||
_localRadius > 0 &&
|
_localRadius > 0 &&
|
||||||
_rgbdSlamMode &&
|
_rgbdSlamMode &&
|
||||||
@@ -1813,14 +1817,16 @@ bool Rtabmap::process(
|
|||||||
UDEBUG("nearestPoses=%d", (int)nearestPoses.size());
|
UDEBUG("nearestPoses=%d", (int)nearestPoses.size());
|
||||||
|
|
||||||
// segment poses by paths, only one detection per path
|
// segment poses by paths, only one detection per path
|
||||||
std::list<std::map<int, Transform> > nearestPaths = getPaths(nearestPoses);
|
std::map<int, std::map<int, Transform> > nearestPaths = getPaths(nearestPoses, _optimizedPoses.at(signature->id()), _proximityMaxGraphDepth);
|
||||||
UDEBUG("nearestPaths=%d", (int)nearestPaths.size());
|
UDEBUG("nearestPaths=%d proximityMaxPaths=%d", (int)nearestPaths.size(), _proximityMaxPaths);
|
||||||
|
|
||||||
for(std::list<std::map<int, Transform> >::const_iterator iter=nearestPaths.begin();
|
for(std::map<int, std::map<int, Transform> >::const_reverse_iterator iter=nearestPaths.rbegin();
|
||||||
iter!=nearestPaths.end() && (_memory->isIncremental() || lastProximitySpaceClosureId == 0);
|
iter!=nearestPaths.rend() &&
|
||||||
|
(_memory->isIncremental() || lastProximitySpaceClosureId == 0) &&
|
||||||
|
(_proximityMaxPaths <= 0 || localVisualPathsChecked < _proximityMaxPaths);
|
||||||
++iter)
|
++iter)
|
||||||
{
|
{
|
||||||
std::map<int, Transform> path = *iter;
|
std::map<int, Transform> path = iter->second;
|
||||||
UASSERT(path.size());
|
UASSERT(path.size());
|
||||||
|
|
||||||
//find the nearest pose on the path looking in the same direction
|
//find the nearest pose on the path looking in the same direction
|
||||||
@@ -1829,11 +1835,12 @@ bool Rtabmap::process(
|
|||||||
int nearestId = rtabmap::graph::findNearestNode(path, _optimizedPoses.at(signature->id()));
|
int nearestId = rtabmap::graph::findNearestNode(path, _optimizedPoses.at(signature->id()));
|
||||||
if(nearestId > 0)
|
if(nearestId > 0)
|
||||||
{
|
{
|
||||||
// nearest pose must not be linked to current location and enough
|
// nearest pose must not be linked to current location and enough close
|
||||||
if(!signature->hasLink(nearestId) &&
|
if(!signature->hasLink(nearestId) &&
|
||||||
(_proximityFilteringRadius <= 0.0f ||
|
(_proximityFilteringRadius <= 0.0f ||
|
||||||
_optimizedPoses.at(signature->id()).getDistanceSquared(_optimizedPoses.at(nearestId)) < _proximityFilteringRadius*_proximityFilteringRadius))
|
_optimizedPoses.at(signature->id()).getDistanceSquared(_optimizedPoses.at(nearestId)) < _proximityFilteringRadius*_proximityFilteringRadius))
|
||||||
{
|
{
|
||||||
|
++localVisualPathsChecked;
|
||||||
RegistrationInfo info;
|
RegistrationInfo info;
|
||||||
Transform guess = _optimizedPoses.at(signature->id()).inverse() * _optimizedPoses.at(nearestId);
|
Transform guess = _optimizedPoses.at(signature->id()).inverse() * _optimizedPoses.at(nearestId);
|
||||||
Transform transform = _memory->computeTransform(signature->id(), nearestId, guess, &info);
|
Transform transform = _memory->computeTransform(signature->id(), nearestId, guess, &info);
|
||||||
@@ -1883,18 +1890,19 @@ bool Rtabmap::process(
|
|||||||
// local visual closure above.
|
// local visual closure above.
|
||||||
|
|
||||||
proximitySpacePaths = (int)nearestPaths.size();
|
proximitySpacePaths = (int)nearestPaths.size();
|
||||||
|
for(std::map<int, std::map<int, Transform> >::const_reverse_iterator iter=nearestPaths.rbegin();
|
||||||
for(std::list<std::map<int, Transform> >::iterator iter=nearestPaths.begin();
|
iter!=nearestPaths.rend() &&
|
||||||
iter!=nearestPaths.end() && (_memory->isIncremental() || lastProximitySpaceClosureId == 0);
|
(_memory->isIncremental() || lastProximitySpaceClosureId == 0) &&
|
||||||
|
(_proximityMaxPaths <= 0 || localScanPathsChecked < _proximityMaxPaths);
|
||||||
++iter)
|
++iter)
|
||||||
{
|
{
|
||||||
std::map<int, Transform> & path = *iter;
|
std::map<int, Transform> path = iter->second;
|
||||||
UASSERT(path.size());
|
UASSERT(path.size());
|
||||||
|
|
||||||
//find the nearest pose on the path
|
//find the nearest pose on the path
|
||||||
int nearestId = rtabmap::graph::findNearestNode(path, _optimizedPoses.at(signature->id()));
|
int nearestId = rtabmap::graph::findNearestNode(path, _optimizedPoses.at(signature->id()));
|
||||||
UASSERT(nearestId > 0);
|
UASSERT(nearestId > 0);
|
||||||
UDEBUG("Path %d distance=%fm", nearestId, _optimizedPoses.at(signature->id()).getDistance(_optimizedPoses.at(nearestId)));
|
UDEBUG("Path %d (size=%d) distance=%fm", nearestId, (int)path.size(), _optimizedPoses.at(signature->id()).getDistance(_optimizedPoses.at(nearestId)));
|
||||||
|
|
||||||
// nearest pose must be close and not linked to current location
|
// nearest pose must be close and not linked to current location
|
||||||
if(!signature->hasLink(nearestId) &&
|
if(!signature->hasLink(nearestId) &&
|
||||||
@@ -1930,6 +1938,7 @@ bool Rtabmap::process(
|
|||||||
//The nearest will be the reference for a loop closure transform
|
//The nearest will be the reference for a loop closure transform
|
||||||
if(signature->getLinks().find(nearestId) == signature->getLinks().end())
|
if(signature->getLinks().find(nearestId) == signature->getLinks().end())
|
||||||
{
|
{
|
||||||
|
++localScanPathsChecked;
|
||||||
RegistrationInfo info;
|
RegistrationInfo info;
|
||||||
Transform transform = _memory->computeIcpTransformMulti(signature->id(), nearestId, filteredPath, &info);
|
Transform transform = _memory->computeIcpTransformMulti(signature->id(), nearestId, filteredPath, &info);
|
||||||
if(!transform.isNull())
|
if(!transform.isNull())
|
||||||
@@ -2238,6 +2247,8 @@ bool Rtabmap::process(
|
|||||||
statistics_.addStatistic(Statistics::kProximitySpace_detections_added_visually(), proximityDetectionsAddedVisually);
|
statistics_.addStatistic(Statistics::kProximitySpace_detections_added_visually(), proximityDetectionsAddedVisually);
|
||||||
statistics_.addStatistic(Statistics::kProximitySpace_detections_added_icp_only(), proximityDetectionsAddedByICPOnly);
|
statistics_.addStatistic(Statistics::kProximitySpace_detections_added_icp_only(), proximityDetectionsAddedByICPOnly);
|
||||||
statistics_.addStatistic(Statistics::kProximitySpace_paths(), proximitySpacePaths);
|
statistics_.addStatistic(Statistics::kProximitySpace_paths(), proximitySpacePaths);
|
||||||
|
statistics_.addStatistic(Statistics::kProximitySpace_visual_paths_checked(), localVisualPathsChecked);
|
||||||
|
statistics_.addStatistic(Statistics::kProximitySpace_scan_paths_checked(), localScanPathsChecked);
|
||||||
statistics_.addStatistic(Statistics::kProximitySpace_last_detection_id(), lastProximitySpaceClosureId);
|
statistics_.addStatistic(Statistics::kProximitySpace_last_detection_id(), lastProximitySpaceClosureId);
|
||||||
statistics_.setProximityDetectionId(lastProximitySpaceClosureId);
|
statistics_.setProximityDetectionId(lastProximitySpaceClosureId);
|
||||||
if(_loopClosureHypothesis.first || lastProximitySpaceClosureId)
|
if(_loopClosureHypothesis.first || lastProximitySpaceClosureId)
|
||||||
@@ -2818,29 +2829,51 @@ std::map<int, Transform> Rtabmap::getForwardWMPoses(
|
|||||||
return poses;
|
return poses;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<std::map<int, Transform> > Rtabmap::getPaths(std::map<int, Transform> poses) const
|
std::map<int, std::map<int, Transform> > Rtabmap::getPaths(std::map<int, Transform> poses, const Transform & target, int maxGraphDepth) const
|
||||||
{
|
{
|
||||||
std::list<std::map<int, Transform> > paths;
|
std::map<int, std::map<int, Transform> > paths;
|
||||||
if(_memory && poses.size())
|
if(_memory && poses.size() && !target.isNull())
|
||||||
{
|
{
|
||||||
// Segment poses connected only by neighbor links
|
// Segment poses connected only by neighbor links
|
||||||
while(poses.size())
|
while(poses.size())
|
||||||
{
|
{
|
||||||
std::map<int, Transform> path;
|
std::map<int, Transform> path;
|
||||||
for(std::map<int, Transform>::iterator iter=poses.begin(); iter!=poses.end();)
|
// select nearest pose and iterate neighbors from there
|
||||||
|
int nearestId = rtabmap::graph::findNearestNode(poses, target);
|
||||||
|
std::map<int, int> ids = _memory->getNeighborsId(nearestId, maxGraphDepth, 0, true, true, true);
|
||||||
|
|
||||||
|
for(std::map<int, int>::iterator iter=ids.begin(); iter!=ids.end(); ++iter)
|
||||||
{
|
{
|
||||||
if(path.size() == 0 || uContains(_memory->getNeighborLinks(path.rbegin()->first), iter->first))
|
std::map<int, Transform>::iterator jter = poses.find(iter->first);
|
||||||
|
if(jter != poses.end())
|
||||||
{
|
{
|
||||||
path.insert(*iter);
|
bool valid = path.empty();
|
||||||
poses.erase(iter++);
|
if(!valid)
|
||||||
}
|
{
|
||||||
else
|
// make sure it has a neighbor added to path
|
||||||
{
|
std::map<int, Link> links = _memory->getNeighborLinks(iter->first);
|
||||||
break;
|
for(std::map<int, Link>::iterator kter=links.begin(); kter!=links.end() && !valid; ++kter)
|
||||||
|
{
|
||||||
|
valid = path.find(kter->first) != path.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(valid)
|
||||||
|
{
|
||||||
|
UDEBUG("%d <- %d", nearestId, jter->first);
|
||||||
|
path.insert(*jter);
|
||||||
|
poses.erase(jter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UASSERT(path.size());
|
UASSERT_MSG(path.size(), uFormat("nearestId=%d ids=%d", nearestId, (int)ids.size()).c_str());
|
||||||
paths.push_back(path);
|
if(maxGraphDepth > 0)
|
||||||
|
{
|
||||||
|
UASSERT_MSG((int)path.size() <= maxGraphDepth*2+1,
|
||||||
|
uFormat("nearestId=%d path=%d ids=%d maxGraphDepth=%d",
|
||||||
|
nearestId, (int)path.size(), (int)ids.size(), maxGraphDepth).c_str());
|
||||||
|
}
|
||||||
|
paths.insert(std::make_pair(nearestId, path));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -721,6 +721,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_ui->groupBox_localDetection_space->setObjectName(Parameters::kRGBDProximityBySpace().c_str());
|
_ui->groupBox_localDetection_space->setObjectName(Parameters::kRGBDProximityBySpace().c_str());
|
||||||
_ui->localDetection_radius->setObjectName(Parameters::kRGBDLocalRadius().c_str());
|
_ui->localDetection_radius->setObjectName(Parameters::kRGBDLocalRadius().c_str());
|
||||||
_ui->localDetection_maxDiffID->setObjectName(Parameters::kRGBDProximityMaxGraphDepth().c_str());
|
_ui->localDetection_maxDiffID->setObjectName(Parameters::kRGBDProximityMaxGraphDepth().c_str());
|
||||||
|
_ui->localDetection_maxPaths->setObjectName(Parameters::kRGBDProximityMaxPaths().c_str());
|
||||||
_ui->localDetection_pathFilteringRadius->setObjectName(Parameters::kRGBDProximityPathFilteringRadius().c_str());
|
_ui->localDetection_pathFilteringRadius->setObjectName(Parameters::kRGBDProximityPathFilteringRadius().c_str());
|
||||||
_ui->localDetection_angle->setObjectName(Parameters::kRGBDProximityAngle().c_str());
|
_ui->localDetection_angle->setObjectName(Parameters::kRGBDProximityAngle().c_str());
|
||||||
_ui->checkBox_localSpacePathOdomPosesUsed->setObjectName(Parameters::kRGBDProximityPathRawPosesUsed().c_str());
|
_ui->checkBox_localSpacePathOdomPosesUsed->setObjectName(Parameters::kRGBDProximityPathRawPosesUsed().c_str());
|
||||||
|
|||||||
@@ -64,24 +64,15 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>685</width>
|
<width>686</width>
|
||||||
<height>1896</height>
|
<height>2023</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -95,7 +86,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>5</number>
|
<number>13</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
|
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
|
||||||
@@ -4187,16 +4178,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
|
|||||||
<string>Directory of images (optional settings)</string>
|
<string>Directory of images (optional settings)</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_93">
|
<layout class="QVBoxLayout" name="verticalLayout_93">
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -7457,20 +7439,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_50" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout_50" columnstretch="0,1">
|
||||||
<item row="3" column="1">
|
<item row="3" column="0">
|
||||||
<widget class="QLabel" name="label_scanMatching_4">
|
|
||||||
<property name="text">
|
|
||||||
<string>When comparing to a local path, merge the laser scans using the odometry poses instead of the ones in the optimized local graph.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="textInteractionFlags">
|
|
||||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="localDetection_pathFilteringRadius">
|
<widget class="QDoubleSpinBox" name="localDetection_pathFilteringRadius">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> m</string>
|
<string> m</string>
|
||||||
@@ -7486,10 +7455,10 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="QLabel" name="label_space3_3">
|
<widget class="QLabel" name="label_scanMatching_4">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Path filtering radius to avoid merging laser scans which are close. 0 to ignore.</string>
|
<string>When comparing to a local path, merge the laser scans using the odometry poses instead of the ones in the optimized local graph.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -7499,7 +7468,20 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="3" column="1">
|
||||||
|
<widget class="QLabel" name="label_space3_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Path filtering radius to avoid merging laser scans which are close. 0 to ignore. A path should also be inside that radius to be considered for proximity detection.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_localSpacePathOdomPosesUsed">
|
<widget class="QCheckBox" name="checkBox_localSpacePathOdomPosesUsed">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -7529,7 +7511,7 @@ 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_scanMatching_6">
|
<widget class="QLabel" name="label_scanMatching_6">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Save scan matching IDs in link's user data.</string>
|
<string>Save scan matching IDs in link's user data.</string>
|
||||||
@@ -7542,14 +7524,14 @@ 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="0">
|
<item row="6" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_localSpaceScanMatchingIDsSaved">
|
<widget class="QCheckBox" name="checkBox_localSpaceScanMatchingIDsSaved">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QLabel" name="label_scanMatching_8">
|
<widget class="QLabel" name="label_scanMatching_8">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Maximum angle for visual proximity detection.</string>
|
<string>Maximum angle for visual proximity detection.</string>
|
||||||
@@ -7562,7 +7544,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="localDetection_angle">
|
<widget class="QDoubleSpinBox" name="localDetection_angle">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> degrees</string>
|
<string> degrees</string>
|
||||||
@@ -7578,6 +7560,29 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_space3_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum paths compared (from the most recent). 0 means no limit.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QSpinBox" name="localDetection_maxPaths">
|
||||||
|
<property name="maximum">
|
||||||
|
<number>999</number>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
@@ -9373,16 +9378,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_54">
|
<widget class="QWidget" name="page_54">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_85">
|
<layout class="QVBoxLayout" name="verticalLayout_85">
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -9522,16 +9518,7 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="page_55">
|
<widget class="QWidget" name="page_55">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_86">
|
<layout class="QVBoxLayout" name="verticalLayout_86">
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -9689,16 +9676,7 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -9778,16 +9756,7 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
@@ -9899,16 +9868,7 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
Reference in New Issue
Block a user