Added ORB_SLAM3 support. IMU Filter: added base frame conversion option. (#698)

Referred issues:
#655
https://github.com/introlab/rtabmap_ros/issues/492

Note: IMU not supported yet with ORB_SLAM3.

Commits:
* Added orbslam3 support. UI-Source->IMU filtering: Added base frame conversion option of IMU data to uniformize yaw initialization. Madgwick: fixed yaw initialization accordingly to Z acc.

* fixed regression build error with ORB_SLAM2

* Renamed OdometryORBSLAM2 to OdometryORBSLAM (can be 2 or 3 now)
This commit is contained in:
matlabbe
2021-03-09 16:00:41 -05:00
committed by GitHub
parent 736c8aceae
commit db43479e44
26 changed files with 637 additions and 315 deletions

View File

@@ -189,12 +189,17 @@ AboutDialog::AboutDialog(QWidget * parent) :
_ui->label_dvo->setText("No");
_ui->label_dvo_license->setEnabled(false);
#endif
#ifdef RTABMAP_ORB_SLAM2
_ui->label_orbslam2->setText("Yes");
_ui->label_orbslam2_license->setEnabled(true);
#ifdef RTABMAP_ORB_SLAM
#if RTABMAP_ORB_SLAM == 3
_ui->label_orbslam_title->setText("With ORB SLAM3 :");
#elif RTABMAP_ORB_SLAM == 2
_ui->label_orbslam_title->setText("With ORB SLAM2 :");
#endif
_ui->label_orbslam->setText("Yes");
_ui->label_orbslam_license->setEnabled(true);
#else
_ui->label_orbslam2->setText("No");
_ui->label_orbslam2_license->setEnabled(false);
_ui->label_orbslam->setText("No");
_ui->label_orbslam_license->setEnabled(false);
#endif
#ifdef RTABMAP_OKVIS

View File

@@ -1466,7 +1466,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
{
if(_ui->imageView_odometry->isFeaturesShown())
{
if(odom.info().type == (int)Odometry::kTypeF2M || odom.info().type == (int)Odometry::kTypeORBSLAM2)
if(odom.info().type == (int)Odometry::kTypeF2M || odom.info().type == (int)Odometry::kTypeORBSLAM)
{
if(_preferencesDialog->isOdomOnlyInliersShown())
{
@@ -1539,7 +1539,7 @@ void MainWindow::processOdometry(const rtabmap::OdometryEvent & odom, bool dataI
}
if( odom.info().type == (int)Odometry::kTypeF2M ||
odom.info().type == (int)Odometry::kTypeORBSLAM2 ||
odom.info().type == (int)Odometry::kTypeORBSLAM ||
odom.info().type == (int)Odometry::kTypeMSCKF ||
odom.info().type == (int)Odometry::kTypeVINS)
{
@@ -5350,7 +5350,7 @@ void MainWindow::startDetection()
(float)_preferencesDialog->getSourceScanForceGroundNormalsUp());
if(_preferencesDialog->getIMUFilteringStrategy()>0 && dynamic_cast<DBReader*>(camera) == 0)
{
_camera->enableIMUFiltering(_preferencesDialog->getIMUFilteringStrategy()-1, parameters);
_camera->enableIMUFiltering(_preferencesDialog->getIMUFilteringStrategy()-1, parameters, _preferencesDialog->getIMUFilteringBaseFrameConversion());
}
if(_preferencesDialog->isDepthFilteringAvailable())
{

View File

@@ -395,7 +395,7 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
if(!odom.data().imageRaw().empty())
{
if(odom.info().type == (int)Odometry::kTypeF2M || odom.info().type == (int)Odometry::kTypeORBSLAM2)
if(odom.info().type == (int)Odometry::kTypeF2M || odom.info().type == (int)Odometry::kTypeORBSLAM)
{
imageView_->setFeatures(odom.info().words, odom.data().depthRaw(), Qt::yellow);
}
@@ -438,7 +438,7 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
}
if( odom.info().type == Odometry::kTypeF2M ||
odom.info().type == (int)Odometry::kTypeORBSLAM2 ||
odom.info().type == (int)Odometry::kTypeORBSLAM ||
odom.info().type == (int)Odometry::kTypeMSCKF)
{
if(imageView_->isFeaturesShown())

View File

@@ -171,8 +171,14 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
#ifndef RTABMAP_DVO
_ui->odom_strategy->setItemData(4, 0, Qt::UserRole - 1);
#endif
#ifndef RTABMAP_ORB_SLAM2
#ifndef RTABMAP_ORB_SLAM
_ui->odom_strategy->setItemData(5, 0, Qt::UserRole - 1);
#elif RTABMAP_ORB_SLAM == 3
_ui->odom_strategy->setItemText(5, "ORB SLAM 3");
_ui->groupBox_odomORBSLAM->setTitle("ORB SLAM 3");
#else
_ui->odom_strategy->setItemText(5, "ORB SLAM 2");
_ui->groupBox_odomORBSLAM->setTitle("ORB SLAM 2");
#endif
#ifndef RTABMAP_OKVIS
_ui->odom_strategy->setItemData(6, 0, Qt::UserRole - 1);
@@ -266,7 +272,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_ui->loopClosure_bundle->setItemData(1, 0, Qt::UserRole - 1);
_ui->groupBoxx_g2o->setEnabled(false);
}
#ifdef RTABMAP_ORB_SLAM2
#ifdef RTABMAP_ORB_SLAM
else
{
// only graph optimization is disabled, g2o (from ORB_SLAM2) is valid only for SBA
@@ -616,7 +622,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
//Source panel
connect(_ui->general_doubleSpinBox_imgRate, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->general_doubleSpinBox_imgRate, SIGNAL(valueChanged(double)), _ui->doubleSpinBox_OdomORBSLAM2Fps, SLOT(setValue(double)));
connect(_ui->general_doubleSpinBox_imgRate, SIGNAL(valueChanged(double)), _ui->doubleSpinBox_OdomORBSLAMFps, SLOT(setValue(double)));
connect(_ui->source_mirroring, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->toolButton_source_path_calibration, SIGNAL(clicked()), this, SLOT(selectCalibrationPath()));
connect(_ui->lineEdit_calibrationFile, SIGNAL(textChanged(const QString &)), this, SLOT(makeObsoleteSourcePanel()));
@@ -804,6 +810,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
connect(_ui->comboBox_imuFilter_strategy, SIGNAL(currentIndexChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->comboBox_imuFilter_strategy, SIGNAL(currentIndexChanged(int)), _ui->stackedWidget_imuFilter, SLOT(setCurrentIndex(int)));
_ui->stackedWidget_imuFilter->setCurrentIndex(_ui->comboBox_imuFilter_strategy->currentIndex());
connect(_ui->checkBox_imuFilter_baseFrameConversion, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->checkbox_publishInterIMU, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
connect(_ui->checkBox_source_scanFromDepth, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteSourcePanel()));
@@ -1312,14 +1319,14 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_ui->doubleSpinBox_OdomViso2BucketWidth->setObjectName(Parameters::kOdomViso2BucketWidth().c_str());
_ui->doubleSpinBox_OdomViso2BucketHeight->setObjectName(Parameters::kOdomViso2BucketHeight().c_str());
// Odometry ORBSLAM2
_ui->lineEdit_OdomORBSLAM2VocPath->setObjectName(Parameters::kOdomORBSLAM2VocPath().c_str());
connect(_ui->toolButton_OdomORBSLAM2VocPath, SIGNAL(clicked()), this, SLOT(changeOdometryORBSLAM2Vocabulary()));
_ui->doubleSpinBox_OdomORBSLAM2Bf->setObjectName(Parameters::kOdomORBSLAM2Bf().c_str());
_ui->doubleSpinBox_OdomORBSLAM2ThDepth->setObjectName(Parameters::kOdomORBSLAM2ThDepth().c_str());
_ui->doubleSpinBox_OdomORBSLAM2Fps->setObjectName(Parameters::kOdomORBSLAM2Fps().c_str());
_ui->spinBox_OdomORBSLAM2MaxFeatures->setObjectName(Parameters::kOdomORBSLAM2MaxFeatures().c_str());
_ui->spinBox_OdomORBSLAM2MapSize->setObjectName(Parameters::kOdomORBSLAM2MapSize().c_str());
// Odometry ORBSLAM
_ui->lineEdit_OdomORBSLAMVocPath->setObjectName(Parameters::kOdomORBSLAMVocPath().c_str());
connect(_ui->toolButton_OdomORBSLAMVocPath, SIGNAL(clicked()), this, SLOT(changeOdometryORBSLAMVocabulary()));
_ui->doubleSpinBox_OdomORBSLAMBf->setObjectName(Parameters::kOdomORBSLAMBf().c_str());
_ui->doubleSpinBox_OdomORBSLAMThDepth->setObjectName(Parameters::kOdomORBSLAMThDepth().c_str());
_ui->doubleSpinBox_OdomORBSLAMFps->setObjectName(Parameters::kOdomORBSLAMFps().c_str());
_ui->spinBox_OdomORBSLAMMaxFeatures->setObjectName(Parameters::kOdomORBSLAMMaxFeatures().c_str());
_ui->spinBox_OdomORBSLAMMapSize->setObjectName(Parameters::kOdomORBSLAMMapSize().c_str());
// Odometry Okvis
_ui->lineEdit_OdomOkvisPath->setObjectName(Parameters::kOdomOKVISConfigPath().c_str());
@@ -2008,13 +2015,14 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
_ui->lineEdit_cameraImages_imu_transform->setText("0 0 1 0 -1 0 1 0 0");
_ui->spinBox_cameraImages_max_imu_rate->setValue(0);
_ui->comboBox_imuFilter_strategy->setCurrentIndex(1);
_ui->comboBox_imuFilter_strategy->setCurrentIndex(2);
_ui->doubleSpinBox_imuFilterMadgwickGain->setValue(Parameters::defaultImuFilterMadgwickGain());
_ui->doubleSpinBox_imuFilterMadgwickZeta->setValue(Parameters::defaultImuFilterMadgwickZeta());
_ui->doubleSpinBox_imuFilterComplementaryGainAcc->setValue(Parameters::defaultImuFilterComplementaryGainAcc());
_ui->doubleSpinBox_imuFilterComplementaryBiasAlpha->setValue(Parameters::defaultImuFilterComplementaryBiasAlpha());
_ui->checkBox_imuFilterComplementaryDoAdaptiveGain->setChecked(Parameters::defaultImuFilterComplementaryDoAdpativeGain());
_ui->checkBox_imuFilterComplementaryDoBiasEstimation->setChecked(Parameters::defaultImuFilterComplementaryDoBiasEstimation());
_ui->checkBox_imuFilter_baseFrameConversion->setChecked(true);
_ui->checkbox_publishInterIMU->setChecked(false);
_ui->checkBox_source_scanFromDepth->setChecked(false);
@@ -2505,6 +2513,7 @@ void PreferencesDialog::readCameraSettings(const QString & filePath)
_ui->doubleSpinBox_imuFilterComplementaryBiasAlpha->setValue(settings.value("complementary_bias_alpha", _ui->doubleSpinBox_imuFilterComplementaryBiasAlpha->value()).toDouble());
_ui->checkBox_imuFilterComplementaryDoAdaptiveGain->setChecked(settings.value("complementary_adaptive_gain", _ui->checkBox_imuFilterComplementaryDoAdaptiveGain->isChecked()).toBool());
_ui->checkBox_imuFilterComplementaryDoBiasEstimation->setChecked(settings.value("complementary_biais_estimation", _ui->checkBox_imuFilterComplementaryDoBiasEstimation->isChecked()).toBool());
_ui->checkBox_imuFilter_baseFrameConversion->setChecked(settings.value("base_frame_conversion", _ui->checkBox_imuFilter_baseFrameConversion->isChecked()).toBool());
_ui->checkbox_publishInterIMU->setChecked(settings.value("publish_inter_imu", _ui->checkbox_publishInterIMU->isChecked()).toBool());
settings.endGroup();//IMU
@@ -2997,6 +3006,7 @@ void PreferencesDialog::writeCameraSettings(const QString & filePath) const
settings.setValue("complementary_bias_alpha", _ui->doubleSpinBox_imuFilterComplementaryBiasAlpha->value());
settings.setValue("complementary_adaptive_gain", _ui->checkBox_imuFilterComplementaryDoAdaptiveGain->isChecked());
settings.setValue("complementary_biais_estimation", _ui->checkBox_imuFilterComplementaryDoBiasEstimation->isChecked());
settings.setValue("base_frame_conversion", _ui->checkBox_imuFilter_baseFrameConversion->isChecked());
settings.setValue("publish_inter_imu", _ui->checkbox_publishInterIMU->isChecked());
settings.endGroup();//IMU
@@ -3150,7 +3160,7 @@ bool PreferencesDialog::validateForm()
"with TORO. GTSAM is set instead for graph optimization strategy."));
_ui->graphOptimization_type->setCurrentIndex(Optimizer::kTypeGTSAM);
}
#ifndef RTABMAP_ORB_SLAM2
#ifndef RTABMAP_ORB_SLAM
else if(Optimizer::isAvailable(Optimizer::kTypeG2O))
{
QMessageBox::warning(this, tr("Parameter warning"),
@@ -3160,7 +3170,7 @@ bool PreferencesDialog::validateForm()
}
#endif
}
#ifdef RTABMAP_ORB_SLAM2
#ifdef RTABMAP_ORB_SLAM
if(_ui->graphOptimization_type->currentIndex() == 1)
#else
if(_ui->graphOptimization_type->currentIndex() == 1 && !Optimizer::isAvailable(Optimizer::kTypeG2O))
@@ -3183,7 +3193,7 @@ bool PreferencesDialog::validateForm()
}
if(_ui->graphOptimization_type->currentIndex() == 2 && !Optimizer::isAvailable(Optimizer::kTypeGTSAM))
{
#ifndef RTABMAP_ORB_SLAM2
#ifndef RTABMAP_ORB_SLAM
if(Optimizer::isAvailable(Optimizer::kTypeG2O))
{
QMessageBox::warning(this, tr("Parameter warning"),
@@ -3768,7 +3778,10 @@ void PreferencesDialog::updateParameters(const ParametersMap & parameters, bool
void PreferencesDialog::selectSourceDriver(Src src, int variant)
{
_ui->comboBox_imuFilter_strategy->setCurrentIndex(1);
if(_ui->comboBox_imuFilter_strategy->currentIndex()==0)
{
_ui->comboBox_imuFilter_strategy->setCurrentIndex(2);
}
_3dRenderingRoiRatios[0]->setText("0.0 0.0 0.0 0.0");
_3dRenderingRoiRatios[1]->setText("0.0 0.0 0.0 0.0");
@@ -4309,7 +4322,7 @@ void PreferencesDialog::setParameter(const std::string & key, const std::string
}
#endif
#endif
#ifndef RTABMAP_ORB_SLAM2
#ifndef RTABMAP_ORB_SLAM
if(!Optimizer::isAvailable(Optimizer::kTypeG2O))
#endif
{
@@ -4861,20 +4874,20 @@ void PreferencesDialog::changeDictionaryPath()
}
}
void PreferencesDialog::changeOdometryORBSLAM2Vocabulary()
void PreferencesDialog::changeOdometryORBSLAMVocabulary()
{
QString path;
if(_ui->lineEdit_OdomORBSLAM2VocPath->text().isEmpty())
if(_ui->lineEdit_OdomORBSLAMVocPath->text().isEmpty())
{
path = QFileDialog::getOpenFileName(this, tr("ORBSLAM2 Vocabulary"), this->getWorkingDirectory(), tr("Vocabulary (*.txt)"));
path = QFileDialog::getOpenFileName(this, tr("ORBSLAM Vocabulary"), this->getWorkingDirectory(), tr("Vocabulary (*.txt)"));
}
else
{
path = QFileDialog::getOpenFileName(this, tr("ORBSLAM2 Vocabulary"), _ui->lineEdit_OdomORBSLAM2VocPath->text(), tr("Vocabulary (*.txt)"));
path = QFileDialog::getOpenFileName(this, tr("ORBSLAM Vocabulary"), _ui->lineEdit_OdomORBSLAMVocPath->text(), tr("Vocabulary (*.txt)"));
}
if(!path.isEmpty())
{
_ui->lineEdit_OdomORBSLAM2VocPath->setText(path);
_ui->lineEdit_OdomORBSLAMVocPath->setText(path);
}
}
@@ -5631,6 +5644,10 @@ int PreferencesDialog::getIMUFilteringStrategy() const
{
return _ui->comboBox_imuFilter_strategy->currentIndex();
}
bool PreferencesDialog::getIMUFilteringBaseFrameConversion() const
{
return _ui->checkBox_imuFilter_baseFrameConversion->isChecked();
}
bool PreferencesDialog::isDepthFilteringAvailable() const
{
return _ui->groupBox_depthImageFiltering->isEnabled();
@@ -6398,7 +6415,7 @@ void PreferencesDialog::testOdometry()
(float)_ui->doubleSpinBox_source_scanNormalsForceGroundUp->value());
if(_ui->comboBox_imuFilter_strategy->currentIndex()>0 && dynamic_cast<DBReader*>(camera) == 0)
{
cameraThread.enableIMUFiltering(_ui->comboBox_imuFilter_strategy->currentIndex()-1, this->getAllParameters());
cameraThread.enableIMUFiltering(_ui->comboBox_imuFilter_strategy->currentIndex()-1, this->getAllParameters(), _ui->checkBox_imuFilter_baseFrameConversion->isChecked());
}
if(isDepthFilteringAvailable())
{
@@ -6469,7 +6486,7 @@ void PreferencesDialog::testCamera()
(float)_ui->doubleSpinBox_source_scanNormalsForceGroundUp->value());
if(_ui->comboBox_imuFilter_strategy->currentIndex()>0 && dynamic_cast<DBReader*>(camera) == 0)
{
cameraThread.enableIMUFiltering(_ui->comboBox_imuFilter_strategy->currentIndex()-1, this->getAllParameters());
cameraThread.enableIMUFiltering(_ui->comboBox_imuFilter_strategy->currentIndex()-1, this->getAllParameters(), _ui->checkBox_imuFilter_baseFrameConversion->isChecked());
}
if(isDepthFilteringAvailable())
{

View File

@@ -162,9 +162,9 @@ p, li { white-space: pre-wrap; }
<property name="geometry">
<rect>
<x>0</x>
<y>-228</y>
<y>-567</y>
<width>596</width>
<height>929</height>
<height>912</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
@@ -430,7 +430,7 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item row="35" column="0">
<widget class="QLabel" name="label_28">
<widget class="QLabel" name="label_orbslam_title">
<property name="text">
<string>With ORB SLAM 2 :</string>
</property>
@@ -450,7 +450,7 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item row="35" column="1">
<widget class="QLabel" name="label_orbslam2">
<widget class="QLabel" name="label_orbslam">
<property name="text">
<string/>
</property>
@@ -944,7 +944,7 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item row="35" column="2">
<widget class="QLabel" name="label_orbslam2_license">
<widget class="QLabel" name="label_orbslam_license">
<property name="text">
<string>GPLv3</string>
</property>

View File

@@ -65,7 +65,7 @@
<x>0</x>
<y>-265</y>
<width>686</width>
<height>3357</height>
<height>3397</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_16">
@@ -7212,7 +7212,7 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property>
</widget>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QCheckBox" name="checkbox_publishInterIMU">
<property name="text">
<string/>
@@ -7222,16 +7222,36 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</property>
</widget>
</item>
<item row="1" column="1">
<item row="2" column="1">
<widget class="QLabel" name="label_563">
<property name="text">
<string>Publish inter IMU messages from the camera. IMU received between images will be published as separate topic.</string>
<string>Publish inter IMU messages from the camera. IMU received between images will be published as separate topic. IMU filtering strategy will be ignored.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_621">
<property name="text">
<string>Convert IMU in base frame before filtering. This can help to initialize correctly the yaw.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBox_imuFilter_baseFrameConversion">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
@@ -13572,7 +13592,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</item>
<item>
<property name="text">
<string>ORB SLAM 2</string>
<string>ORB SLAM</string>
</property>
</item>
<item>
@@ -13898,7 +13918,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
<item>
<widget class="QStackedWidget" name="stackedWidget_odometryType">
<property name="currentIndex">
<number>0</number>
<number>5</number>
</property>
<widget class="QWidget" name="page_52">
<layout class="QVBoxLayout" name="verticalLayout_77">
@@ -15778,15 +15798,15 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
<widget class="QWidget" name="page_70">
<layout class="QVBoxLayout" name="verticalLayout_125">
<item>
<widget class="QGroupBox" name="groupBox_odomORBSLAM2">
<widget class="QGroupBox" name="groupBox_odomORBSLAM">
<property name="title">
<string>ORB SLAM 2</string>
<string>ORB SLAM</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_124">
<item>
<widget class="QLabel" name="label_412">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ORB SLAM 2: &lt;a href=&quot;https://github.com/raulmur/ORB_SLAM2&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://github.com/raulmur/ORB_SLAM2&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Tracking and local mapping from ORB SLAM 2 is done but loop closure detection is disabled, using RTAB-Map loop closure detection instead. See ORB panel for ORB parameters (pyramid scale and number of pyramids). See FAST panel for FAST parameters (init and min thresholds). Vis/MaxFeatures (see Visual Registration panel) is used as the number of ORB features extracted.&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ORB SLAM2: &lt;a href=&quot;https://github.com/raulmur/ORB_SLAM2&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://github.com/UZ-SLAMLab/ORB_SLAM3&lt;/span&gt;&lt;/a&gt;&lt;br/&gt;ORB SLAM3: &lt;a href=&quot;https://github.com/UZ-SLAMLab/ORB_SLAM3&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;https://github.com/raulmur/ORB_SLAM2&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Tracking and local mapping from ORB SLAM is done but loop closure detection is disabled, using RTAB-Map loop closure detection instead. See ORB panel for ORB parameters (pyramid scale and number of pyramids). See FAST panel for FAST parameters (init and min thresholds). Vis/MaxFeatures (see Visual Registration panel) is used as the number of ORB features extracted.&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -15802,7 +15822,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
<item>
<layout class="QGridLayout" name="gridLayout_93" columnstretch="0,0,1">
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_OdomORBSLAM2Bf">
<widget class="QDoubleSpinBox" name="doubleSpinBox_OdomORBSLAMBf">
<property name="suffix">
<string> m</string>
</property>
@@ -15837,7 +15857,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_OdomORBSLAM2ThDepth">
<widget class="QDoubleSpinBox" name="doubleSpinBox_OdomORBSLAMThDepth">
<property name="suffix">
<string/>
</property>
@@ -15872,7 +15892,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineEdit_OdomORBSLAM2VocPath"/>
<widget class="QLineEdit" name="lineEdit_OdomORBSLAMVocPath"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_415">
@@ -15888,7 +15908,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</widget>
</item>
<item row="0" column="0">
<widget class="QToolButton" name="toolButton_OdomORBSLAM2VocPath">
<widget class="QToolButton" name="toolButton_OdomORBSLAMVocPath">
<property name="text">
<string>...</string>
</property>
@@ -15908,7 +15928,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_OdomORBSLAM2Fps">
<widget class="QDoubleSpinBox" name="doubleSpinBox_OdomORBSLAMFps">
<property name="enabled">
<bool>false</bool>
</property>
@@ -15946,7 +15966,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="spinBox_OdomORBSLAM2MaxFeatures">
<widget class="QSpinBox" name="spinBox_OdomORBSLAMMaxFeatures">
<property name="maximum">
<number>99999</number>
</property>
@@ -15969,7 +15989,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</widget>
</item>
<item row="5" column="1">
<widget class="QSpinBox" name="spinBox_OdomORBSLAM2MapSize">
<widget class="QSpinBox" name="spinBox_OdomORBSLAMMapSize">
<property name="maximum">
<number>999999</number>
</property>