mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-03 10:00:23 +08:00
Added RGBD/MaxLocalizationDistance parameter
This commit is contained in:
@@ -342,6 +342,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(RGBD, NewMapOdomChangeDistance, float, 0, "A new map is created if a change of odometry translation greater than X m is detected (0 m = disabled).");
|
RTABMAP_PARAM(RGBD, NewMapOdomChangeDistance, float, 0, "A new map is created if a change of odometry translation greater than X m is detected (0 m = disabled).");
|
||||||
RTABMAP_PARAM(RGBD, OptimizeFromGraphEnd, bool, false, "Optimize graph from the newest node. If false, the graph is optimized from the oldest node of the current graph (this adds an overhead computation to detect to oldest node of the current graph, but it can be useful to preserve the map referential from the oldest node). Warning when set to false: when some nodes are transferred, the first referential of the local map may change, resulting in momentary changes in robot/map position (which are annoying in teleoperation).");
|
RTABMAP_PARAM(RGBD, OptimizeFromGraphEnd, bool, false, "Optimize graph from the newest node. If false, the graph is optimized from the oldest node of the current graph (this adds an overhead computation to detect to oldest node of the current graph, but it can be useful to preserve the map referential from the oldest node). Warning when set to false: when some nodes are transferred, the first referential of the local map may change, resulting in momentary changes in robot/map position (which are annoying in teleoperation).");
|
||||||
RTABMAP_PARAM(RGBD, OptimizeMaxError, float, 3.0, uFormat("Reject loop closures if optimization error ratio is greater than this value (0=disabled). Ratio is computed as absolute error over standard deviation of each link. This will help to detect when a wrong loop closure is added to the graph. Not compatible with \"%s\" if enabled.", kOptimizerRobust().c_str()));
|
RTABMAP_PARAM(RGBD, OptimizeMaxError, float, 3.0, uFormat("Reject loop closures if optimization error ratio is greater than this value (0=disabled). Ratio is computed as absolute error over standard deviation of each link. This will help to detect when a wrong loop closure is added to the graph. Not compatible with \"%s\" if enabled.", kOptimizerRobust().c_str()));
|
||||||
|
RTABMAP_PARAM(RGBD, MaxLocalizationDistance, float, 0.0, "Reject localizations if the distance from the map is over this distance (0=disabled). Only used in localization mode.");
|
||||||
RTABMAP_PARAM(RGBD, SavedLocalizationIgnored, bool, false, "Ignore last saved localization pose from previous session. If true, RTAB-Map won't assume it is restarting from the same place than where it shut down previously.");
|
RTABMAP_PARAM(RGBD, SavedLocalizationIgnored, bool, false, "Ignore last saved localization pose from previous session. If true, RTAB-Map won't assume it is restarting from the same place than where it shut down previously.");
|
||||||
RTABMAP_PARAM(RGBD, GoalReachedRadius, float, 0.5, "Goal reached radius (m).");
|
RTABMAP_PARAM(RGBD, GoalReachedRadius, float, 0.5, "Goal reached radius (m).");
|
||||||
RTABMAP_PARAM(RGBD, PlanStuckIterations, int, 0, "Mark the current goal node on the path as unreachable if it is not updated after X iterations (0=disabled). If all upcoming nodes on the path are unreachabled, the plan fails.");
|
RTABMAP_PARAM(RGBD, PlanStuckIterations, int, 0, "Mark the current goal node on the path as unreachable if it is not updated after X iterations (0=disabled). If all upcoming nodes on the path are unreachabled, the plan fails.");
|
||||||
|
|||||||
@@ -230,6 +230,7 @@ private:
|
|||||||
unsigned int _maxMemoryAllowed; // signatures count in WM
|
unsigned int _maxMemoryAllowed; // signatures count in WM
|
||||||
float _loopThr;
|
float _loopThr;
|
||||||
float _loopRatio;
|
float _loopRatio;
|
||||||
|
float _localizationMaxDistance;
|
||||||
bool _verifyLoopClosureHypothesis;
|
bool _verifyLoopClosureHypothesis;
|
||||||
unsigned int _maxRetrieved;
|
unsigned int _maxRetrieved;
|
||||||
unsigned int _maxLocalRetrieved;
|
unsigned int _maxLocalRetrieved;
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ Rtabmap::Rtabmap() :
|
|||||||
_maxMemoryAllowed(Parameters::defaultRtabmapMemoryThr()), // 0=inf
|
_maxMemoryAllowed(Parameters::defaultRtabmapMemoryThr()), // 0=inf
|
||||||
_loopThr(Parameters::defaultRtabmapLoopThr()),
|
_loopThr(Parameters::defaultRtabmapLoopThr()),
|
||||||
_loopRatio(Parameters::defaultRtabmapLoopRatio()),
|
_loopRatio(Parameters::defaultRtabmapLoopRatio()),
|
||||||
|
_localizationMaxDistance(Parameters::defaultRGBDMaxLocalizationDistance()),
|
||||||
_verifyLoopClosureHypothesis(Parameters::defaultVhEpEnabled()),
|
_verifyLoopClosureHypothesis(Parameters::defaultVhEpEnabled()),
|
||||||
_maxRetrieved(Parameters::defaultRtabmapMaxRetrieved()),
|
_maxRetrieved(Parameters::defaultRtabmapMaxRetrieved()),
|
||||||
_maxLocalRetrieved(Parameters::defaultRGBDMaxLocalRetrieved()),
|
_maxLocalRetrieved(Parameters::defaultRGBDMaxLocalRetrieved()),
|
||||||
@@ -441,6 +442,7 @@ void Rtabmap::parseParameters(const ParametersMap & parameters)
|
|||||||
Parameters::parse(parameters, Parameters::kRtabmapMemoryThr(), _maxMemoryAllowed);
|
Parameters::parse(parameters, Parameters::kRtabmapMemoryThr(), _maxMemoryAllowed);
|
||||||
Parameters::parse(parameters, Parameters::kRtabmapLoopThr(), _loopThr);
|
Parameters::parse(parameters, Parameters::kRtabmapLoopThr(), _loopThr);
|
||||||
Parameters::parse(parameters, Parameters::kRtabmapLoopRatio(), _loopRatio);
|
Parameters::parse(parameters, Parameters::kRtabmapLoopRatio(), _loopRatio);
|
||||||
|
Parameters::parse(parameters, Parameters::kRGBDMaxLocalizationDistance(), _localizationMaxDistance);
|
||||||
Parameters::parse(parameters, Parameters::kVhEpEnabled(), _verifyLoopClosureHypothesis);
|
Parameters::parse(parameters, Parameters::kVhEpEnabled(), _verifyLoopClosureHypothesis);
|
||||||
Parameters::parse(parameters, Parameters::kRtabmapMaxRetrieved(), _maxRetrieved);
|
Parameters::parse(parameters, Parameters::kRtabmapMaxRetrieved(), _maxRetrieved);
|
||||||
Parameters::parse(parameters, Parameters::kRGBDMaxLocalRetrieved(), _maxLocalRetrieved);
|
Parameters::parse(parameters, Parameters::kRGBDMaxLocalRetrieved(), _maxLocalRetrieved);
|
||||||
@@ -2143,6 +2145,12 @@ bool Rtabmap::process(
|
|||||||
UWARN("Rejected loop closure %d -> %d: %s",
|
UWARN("Rejected loop closure %d -> %d: %s",
|
||||||
_loopClosureHypothesis.first, signature->id(), info.rejectedMsg.c_str());
|
_loopClosureHypothesis.first, signature->id(), info.rejectedMsg.c_str());
|
||||||
}
|
}
|
||||||
|
else if(!_memory->isIncremental() && _localizationMaxDistance>0.0f && transform.getNorm() > _localizationMaxDistance)
|
||||||
|
{
|
||||||
|
rejectedHypothesis = true;
|
||||||
|
UWARN("Rejected localization %d -> %d because distance to map (%fm) is over %s=%fm.",
|
||||||
|
_loopClosureHypothesis.first, signature->id(), transform.getNorm(), Parameters::kRGBDMaxLocalizationDistance().c_str(), _localizationMaxDistance);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
transform = transform.inverse();
|
transform = transform.inverse();
|
||||||
@@ -2266,6 +2274,11 @@ bool Rtabmap::process(
|
|||||||
}
|
}
|
||||||
UDEBUG("nearestPaths=%d proximityMaxPaths=%d", (int)nearestPaths.size(), _proximityMaxPaths);
|
UDEBUG("nearestPaths=%d proximityMaxPaths=%d", (int)nearestPaths.size(), _proximityMaxPaths);
|
||||||
|
|
||||||
|
float proximityFilteringRadius = _proximityFilteringRadius;
|
||||||
|
if(!_memory->isIncremental() && _localizationMaxDistance>0.0f && (proximityFilteringRadius <= 0.0f || _localizationMaxDistance<proximityFilteringRadius))
|
||||||
|
{
|
||||||
|
proximityFilteringRadius = _localizationMaxDistance;
|
||||||
|
}
|
||||||
for(std::map<NearestPathKey, std::map<int, Transform> >::const_reverse_iterator iter=nearestPaths.rbegin();
|
for(std::map<NearestPathKey, std::map<int, Transform> >::const_reverse_iterator iter=nearestPaths.rbegin();
|
||||||
iter!=nearestPaths.rend() &&
|
iter!=nearestPaths.rend() &&
|
||||||
(_memory->isIncremental() || lastProximitySpaceClosureId == 0) &&
|
(_memory->isIncremental() || lastProximitySpaceClosureId == 0) &&
|
||||||
@@ -2294,8 +2307,8 @@ bool Rtabmap::process(
|
|||||||
{
|
{
|
||||||
// nearest pose must not be linked to current location and enough close
|
// 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;
|
++localVisualPathsChecked;
|
||||||
RegistrationInfo info;
|
RegistrationInfo info;
|
||||||
@@ -2304,7 +2317,7 @@ bool Rtabmap::process(
|
|||||||
if(!transform.isNull())
|
if(!transform.isNull())
|
||||||
{
|
{
|
||||||
transform = transform.inverse();
|
transform = transform.inverse();
|
||||||
if(_proximityFilteringRadius <= 0 || transform.getNormSquared() <= _proximityFilteringRadius*_proximityFilteringRadius)
|
if(proximityFilteringRadius <= 0 || transform.getNormSquared() <= proximityFilteringRadius*proximityFilteringRadius)
|
||||||
{
|
{
|
||||||
UINFO("[Visual] Add local loop closure in SPACE (%d->%d) %s",
|
UINFO("[Visual] Add local loop closure in SPACE (%d->%d) %s",
|
||||||
signature->id(),
|
signature->id(),
|
||||||
@@ -2331,7 +2344,7 @@ bool Rtabmap::process(
|
|||||||
{
|
{
|
||||||
UWARN("Ignoring local loop closure with %d because resulting "
|
UWARN("Ignoring local loop closure with %d because resulting "
|
||||||
"transform is too large!? (%fm > %fm)",
|
"transform is too large!? (%fm > %fm)",
|
||||||
nearestId, transform.getNorm(), _proximityFilteringRadius);
|
nearestId, transform.getNorm(), proximityFilteringRadius);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2414,10 +2427,10 @@ bool Rtabmap::process(
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::map<int, Transform> filteredPath;
|
std::map<int, Transform> filteredPath;
|
||||||
if(optimizedLocalPath.size() > 2 && _proximityFilteringRadius > 0.0f)
|
if(optimizedLocalPath.size() > 2 && proximityFilteringRadius > 0.0f)
|
||||||
{
|
{
|
||||||
// path filtering
|
// path filtering
|
||||||
filteredPath = graph::radiusPosesFiltering(optimizedLocalPath, _proximityFilteringRadius, 0, true);
|
filteredPath = graph::radiusPosesFiltering(optimizedLocalPath, proximityFilteringRadius, 0, true);
|
||||||
// make sure the current pose is still here
|
// make sure the current pose is still here
|
||||||
filteredPath.insert(*optimizedLocalPath.find(nearestId));
|
filteredPath.insert(*optimizedLocalPath.find(nearestId));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -947,6 +947,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_ui->groupBox_localDetection_time->setObjectName(Parameters::kRGBDProximityByTime().c_str());
|
_ui->groupBox_localDetection_time->setObjectName(Parameters::kRGBDProximityByTime().c_str());
|
||||||
_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->maxLocalizationDistance->setObjectName(Parameters::kRGBDMaxLocalizationDistance().c_str());
|
||||||
_ui->localDetection_maxDiffID->setObjectName(Parameters::kRGBDProximityMaxGraphDepth().c_str());
|
_ui->localDetection_maxDiffID->setObjectName(Parameters::kRGBDProximityMaxGraphDepth().c_str());
|
||||||
_ui->localDetection_maxNeighbors->setObjectName(Parameters::kRGBDProximityPathMaxNeighbors().c_str());
|
_ui->localDetection_maxNeighbors->setObjectName(Parameters::kRGBDProximityPathMaxNeighbors().c_str());
|
||||||
_ui->localDetection_maxPaths->setObjectName(Parameters::kRGBDProximityMaxPaths().c_str());
|
_ui->localDetection_maxPaths->setObjectName(Parameters::kRGBDProximityMaxPaths().c_str());
|
||||||
|
|||||||
@@ -63,9 +63,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>-354</y>
|
||||||
<width>680</width>
|
<width>681</width>
|
||||||
<height>3082</height>
|
<height>3071</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>5</number>
|
<number>12</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">
|
||||||
@@ -9629,6 +9629,13 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QCheckBox" name="rgbd_savedLocalizationIgnored">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="8" column="1">
|
<item row="8" column="1">
|
||||||
<widget class="QLabel" name="label_scanMatching_9">
|
<widget class="QLabel" name="label_scanMatching_9">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -9655,8 +9662,8 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QCheckBox" name="rgbd_savedLocalizationIgnored">
|
<widget class="QCheckBox" name="odomScanHistory">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
@@ -9672,13 +9679,6 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
|
||||||
<widget class="QCheckBox" name="odomScanHistory">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="13" column="0">
|
<item row="13" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="rgdb_localImmunizationRatio">
|
<widget class="QDoubleSpinBox" name="rgdb_localImmunizationRatio">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
@@ -9731,6 +9731,13 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="9" column="0">
|
||||||
|
<widget class="QCheckBox" name="loopClosure_bunlde">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="9" column="1">
|
||||||
<widget class="QLabel" name="label_scanMatching_10">
|
<widget class="QLabel" name="label_scanMatching_10">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -9757,13 +9764,6 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
|
||||||
<widget class="QCheckBox" name="loopClosure_bunlde">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="rgdb_linearUpdate">
|
<widget class="QDoubleSpinBox" name="rgdb_linearUpdate">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
@@ -9790,6 +9790,13 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="11" column="0">
|
||||||
|
<widget class="QCheckBox" name="rgbd_loopCovLimited">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="rgdb_angularUpdate">
|
<widget class="QDoubleSpinBox" name="rgdb_angularUpdate">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
@@ -9819,13 +9826,6 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="11" column="0">
|
|
||||||
<widget class="QCheckBox" name="rgbd_loopCovLimited">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="14" column="1">
|
<item row="14" column="1">
|
||||||
<widget class="QLabel" name="label_space2">
|
<widget class="QLabel" name="label_space2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -9852,6 +9852,13 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="16" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_maxOdomCacheSize">
|
||||||
|
<property name="maximum">
|
||||||
|
<number>9999</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="rgdb_angularSpeedUpdate">
|
<widget class="QDoubleSpinBox" name="rgdb_angularSpeedUpdate">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
@@ -9881,14 +9888,14 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_maxOdomCacheSize">
|
<widget class="QCheckBox" name="odomGravity">
|
||||||
<property name="maximum">
|
<property name="text">
|
||||||
<number>9999</number>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="15" column="1">
|
<item row="16" column="1">
|
||||||
<widget class="QLabel" name="label_space2_5">
|
<widget class="QLabel" name="label_space2_5">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Maximum odometry cache size. Used only in localization mode and when maximum graph error parameter is not null. This is used to verify localization transforms to make sure we don't teleport to a location very similar to one we previously localized on. When the cache is full, the whole cache is cleared and the next localization is automatically accepted without verification. Set 0 to disable caching.</string>
|
<string>Maximum odometry cache size. Used only in localization mode and when maximum graph error parameter is not null. This is used to verify localization transforms to make sure we don't teleport to a location very similar to one we previously localized on. When the cache is full, the whole cache is cleared and the next localization is automatically accepted without verification. Set 0 to disable caching.</string>
|
||||||
@@ -9914,10 +9921,26 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="15" column="1">
|
||||||
<widget class="QCheckBox" name="odomGravity">
|
<widget class="QLabel" name="label_space2_12">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string>Reject localizations if the distance from the map is over this distance (0=disabled). Only used in localization mode.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="15" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="maxLocalizationDistance">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user