mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-03 16:27:46 +08:00
GTSAM: added optimizer approach option #172
This commit is contained in:
@@ -40,20 +40,18 @@ public:
|
|||||||
static bool available();
|
static bool available();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OptimizerGTSAM(
|
OptimizerGTSAM(const ParametersMap & parameters = ParametersMap()) :
|
||||||
int iterations = Parameters::defaultOptimizerIterations(),
|
Optimizer(parameters),
|
||||||
bool slam2d = Parameters::defaultRegForce3DoF(),
|
optimizer_(Parameters::defaultGTSAMOptimizer())
|
||||||
bool covarianceIgnored = Parameters::defaultOptimizerVarianceIgnored(),
|
{
|
||||||
double epsilon = Parameters::defaultOptimizerEpsilon(),
|
parseParameters(parameters);
|
||||||
bool robust = Parameters::defaultOptimizerRobust()) :
|
}
|
||||||
Optimizer(iterations, slam2d, covarianceIgnored, epsilon, robust) {}
|
|
||||||
|
|
||||||
OptimizerGTSAM(const ParametersMap & parameters) :
|
|
||||||
Optimizer(parameters) {}
|
|
||||||
virtual ~OptimizerGTSAM() {}
|
virtual ~OptimizerGTSAM() {}
|
||||||
|
|
||||||
virtual Type type() const {return kTypeGTSAM;}
|
virtual Type type() const {return kTypeGTSAM;}
|
||||||
|
|
||||||
|
virtual void parseParameters(const ParametersMap & parameters);
|
||||||
|
|
||||||
virtual std::map<int, Transform> optimize(
|
virtual std::map<int, Transform> optimize(
|
||||||
int rootId,
|
int rootId,
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
@@ -61,6 +59,9 @@ public:
|
|||||||
std::list<std::map<int, Transform> > * intermediateGraphes = 0,
|
std::list<std::map<int, Transform> > * intermediateGraphes = 0,
|
||||||
double * finalError = 0,
|
double * finalError = 0,
|
||||||
int * iterationsDone = 0);
|
int * iterationsDone = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int optimizer_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace rtabmap */
|
} /* namespace rtabmap */
|
||||||
|
|||||||
@@ -358,6 +358,8 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(g2o, RobustKernelDelta, double, 8, "Robust kernel delta used for bundle adjustment (0 means don't use robust kernel). Observations with chi2 over this threshold will be ignored in the second optimization pass.");
|
RTABMAP_PARAM(g2o, RobustKernelDelta, double, 8, "Robust kernel delta used for bundle adjustment (0 means don't use robust kernel). Observations with chi2 over this threshold will be ignored in the second optimization pass.");
|
||||||
RTABMAP_PARAM(g2o, Baseline, double, 0.075, "When doing bundle adjustment with RGB-D data, we can set a fake baseline (m) to do stereo bundle adjustment (if 0, mono bundle adjustment is done). For stereo data, the baseline in the calibration is used directly.");
|
RTABMAP_PARAM(g2o, Baseline, double, 0.075, "When doing bundle adjustment with RGB-D data, we can set a fake baseline (m) to do stereo bundle adjustment (if 0, mono bundle adjustment is done). For stereo data, the baseline in the calibration is used directly.");
|
||||||
|
|
||||||
|
RTABMAP_PARAM(GTSAM, Optimizer, int, 1, "0=Levenberg 1=GaussNewton 2=Dogleg");
|
||||||
|
|
||||||
// Odometry
|
// Odometry
|
||||||
RTABMAP_PARAM(Odom, Strategy, int, 0, "0=Frame-to-Map (F2M) 1=Frame-to-Frame (F2F)");
|
RTABMAP_PARAM(Odom, Strategy, int, 0, "0=Frame-to-Map (F2M) 1=Frame-to-Frame (F2F)");
|
||||||
RTABMAP_PARAM(Odom, ResetCountdown, int, 0, "Automatically reset odometry after X consecutive images on which odometry cannot be computed (value=0 disables auto-reset).");
|
RTABMAP_PARAM(Odom, ResetCountdown, int, 0, "Automatically reset odometry after X consecutive images on which odometry cannot be computed (value=0 disables auto-reset).");
|
||||||
|
|||||||
@@ -69,6 +69,12 @@ bool OptimizerGTSAM::available()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OptimizerGTSAM::parseParameters(const ParametersMap & parameters)
|
||||||
|
{
|
||||||
|
Optimizer::parseParameters(parameters);
|
||||||
|
Parameters::parse(parameters, Parameters::kGTSAMOptimizer(), optimizer_);
|
||||||
|
}
|
||||||
|
|
||||||
std::map<int, Transform> OptimizerGTSAM::optimize(
|
std::map<int, Transform> OptimizerGTSAM::optimize(
|
||||||
int rootId,
|
int rootId,
|
||||||
const std::map<int, Transform> & poses,
|
const std::map<int, Transform> & poses,
|
||||||
@@ -215,18 +221,29 @@ std::map<int, Transform> OptimizerGTSAM::optimize(
|
|||||||
}
|
}
|
||||||
|
|
||||||
UDEBUG("create optimizer");
|
UDEBUG("create optimizer");
|
||||||
|
gtsam::NonlinearOptimizer * optimizer;
|
||||||
|
|
||||||
|
if(optimizer_ == 2)
|
||||||
|
{
|
||||||
|
gtsam::DoglegParams parameters;
|
||||||
|
parameters.relativeErrorTol = epsilon();
|
||||||
|
parameters.maxIterations = iterations();
|
||||||
|
optimizer = new gtsam::DoglegOptimizer(graph, initialEstimate, parameters);
|
||||||
|
}
|
||||||
|
else if(optimizer_ == 1)
|
||||||
|
{
|
||||||
gtsam::GaussNewtonParams parameters;
|
gtsam::GaussNewtonParams parameters;
|
||||||
parameters.relativeErrorTol = epsilon();
|
parameters.relativeErrorTol = epsilon();
|
||||||
parameters.maxIterations = iterations();
|
parameters.maxIterations = iterations();
|
||||||
gtsam::GaussNewtonOptimizer optimizer(graph, initialEstimate, parameters);
|
optimizer = new gtsam::GaussNewtonOptimizer(graph, initialEstimate, parameters);
|
||||||
//gtsam::LevenbergMarquardtParams parametersLev;
|
}
|
||||||
//parametersLev.relativeErrorTol = epsilon();
|
else
|
||||||
//parametersLev.maxIterations = iterations();
|
{
|
||||||
//gtsam::LevenbergMarquardtOptimizer optimizer(graph, initialEstimate, parametersLev);
|
gtsam::LevenbergMarquardtParams parameters;
|
||||||
//gtsam::DoglegParams parametersDogleg;
|
parameters.relativeErrorTol = epsilon();
|
||||||
//parametersDogleg.relativeErrorTol = epsilon();
|
parameters.maxIterations = iterations();
|
||||||
//parametersDogleg.maxIterations = iterations();
|
optimizer = new gtsam::LevenbergMarquardtOptimizer(graph, initialEstimate, parameters);
|
||||||
//gtsam::DoglegOptimizer optimizer(graph, initialEstimate, parametersDogleg);
|
}
|
||||||
|
|
||||||
UINFO("GTSAM optimizing begin (max iterations=%d, robust=%d)", iterations(), isRobust()?1:0);
|
UINFO("GTSAM optimizing begin (max iterations=%d, robust=%d)", iterations(), isRobust()?1:0);
|
||||||
UTimer timer;
|
UTimer timer;
|
||||||
@@ -237,7 +254,7 @@ std::map<int, Transform> OptimizerGTSAM::optimize(
|
|||||||
if(intermediateGraphes && i > 0)
|
if(intermediateGraphes && i > 0)
|
||||||
{
|
{
|
||||||
std::map<int, Transform> tmpPoses;
|
std::map<int, Transform> tmpPoses;
|
||||||
for(gtsam::Values::const_iterator iter=optimizer.values().begin(); iter!=optimizer.values().end(); ++iter)
|
for(gtsam::Values::const_iterator iter=optimizer->values().begin(); iter!=optimizer->values().end(); ++iter)
|
||||||
{
|
{
|
||||||
if(iter->value.dim() > 1)
|
if(iter->value.dim() > 1)
|
||||||
{
|
{
|
||||||
@@ -257,17 +274,18 @@ std::map<int, Transform> OptimizerGTSAM::optimize(
|
|||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
optimizer.iterate();
|
optimizer->iterate();
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
catch(gtsam::IndeterminantLinearSystemException & e)
|
catch(gtsam::IndeterminantLinearSystemException & e)
|
||||||
{
|
{
|
||||||
UERROR("GTSAM exception caught: %s", e.what());
|
UERROR("GTSAM exception caught: %s", e.what());
|
||||||
|
delete optimizer;
|
||||||
return optimizedPoses;
|
return optimizedPoses;
|
||||||
}
|
}
|
||||||
|
|
||||||
// early stop condition
|
// early stop condition
|
||||||
double error = optimizer.error();
|
double error = optimizer->error();
|
||||||
UDEBUG("iteration %d error =%f", i+1, error);
|
UDEBUG("iteration %d error =%f", i+1, error);
|
||||||
double errorDelta = lastError - error;
|
double errorDelta = lastError - error;
|
||||||
if(i>0 && errorDelta < this->epsilon())
|
if(i>0 && errorDelta < this->epsilon())
|
||||||
@@ -297,9 +315,9 @@ std::map<int, Transform> OptimizerGTSAM::optimize(
|
|||||||
{
|
{
|
||||||
*iterationsDone = it;
|
*iterationsDone = it;
|
||||||
}
|
}
|
||||||
UINFO("GTSAM optimizing end (%d iterations done, error=%f (initial=%f final=%f), time=%f s)", optimizer.iterations(), optimizer.error(), graph.error(initialEstimate), graph.error(optimizer.values()), timer.ticks());
|
UINFO("GTSAM optimizing end (%d iterations done, error=%f (initial=%f final=%f), time=%f s)", optimizer->iterations(), optimizer->error(), graph.error(initialEstimate), graph.error(optimizer->values()), timer.ticks());
|
||||||
|
|
||||||
for(gtsam::Values::const_iterator iter=optimizer.values().begin(); iter!=optimizer.values().end(); ++iter)
|
for(gtsam::Values::const_iterator iter=optimizer->values().begin(); iter!=optimizer->values().end(); ++iter)
|
||||||
{
|
{
|
||||||
if(iter->value.dim() > 1)
|
if(iter->value.dim() > 1)
|
||||||
{
|
{
|
||||||
@@ -315,6 +333,7 @@ std::map<int, Transform> OptimizerGTSAM::optimize(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete optimizer;
|
||||||
}
|
}
|
||||||
else if(poses.size() == 1 || iterations() <= 0)
|
else if(poses.size() == 1 || iterations() <= 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -752,6 +752,8 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_ui->doubleSpinBox_g2o_robustKernelDelta->setObjectName(Parameters::kg2oRobustKernelDelta().c_str());
|
_ui->doubleSpinBox_g2o_robustKernelDelta->setObjectName(Parameters::kg2oRobustKernelDelta().c_str());
|
||||||
_ui->doubleSpinBox_g2o_baseline->setObjectName(Parameters::kg2oBaseline().c_str());
|
_ui->doubleSpinBox_g2o_baseline->setObjectName(Parameters::kg2oBaseline().c_str());
|
||||||
|
|
||||||
|
_ui->comboBox_gtsam_optimizer->setObjectName(Parameters::kGTSAMOptimizer().c_str());
|
||||||
|
|
||||||
_ui->graphPlan_goalReachedRadius->setObjectName(Parameters::kRGBDGoalReachedRadius().c_str());
|
_ui->graphPlan_goalReachedRadius->setObjectName(Parameters::kRGBDGoalReachedRadius().c_str());
|
||||||
_ui->graphPlan_goalsSavedInUserData->setObjectName(Parameters::kRGBDGoalsSavedInUserData().c_str());
|
_ui->graphPlan_goalsSavedInUserData->setObjectName(Parameters::kRGBDGoalsSavedInUserData().c_str());
|
||||||
_ui->graphPlan_stuckIterations->setObjectName(Parameters::kRGBDPlanStuckIterations().c_str());
|
_ui->graphPlan_stuckIterations->setObjectName(Parameters::kRGBDPlanStuckIterations().c_str());
|
||||||
|
|||||||
@@ -63,9 +63,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-483</y>
|
<y>0</y>
|
||||||
<width>673</width>
|
<width>673</width>
|
||||||
<height>2649</height>
|
<height>2718</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>15</number>
|
<number>21</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">
|
||||||
@@ -12245,6 +12245,44 @@ Lower the ratio -> higher the precision. 0 means disabled, matching the neare
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_19">
|
||||||
|
<property name="title">
|
||||||
|
<string>GTSAM</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_83" columnstretch="0,1">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QComboBox" name="comboBox_gtsam_optimizer">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Levenberg</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Gauss Newton</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Dogleg</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label_364">
|
||||||
|
<property name="text">
|
||||||
|
<string>Optimization algorithm.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user