Skip to content

Commit 6aa188d

Browse files
committed
g2o: fixed iterative optimization (when epsilon>0) not converging as fast as like batch optimization (and not converging at all in some cases).
1 parent 3ab9a69 commit 6aa188d

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

corelib/src/optimizer/OptimizerG2O.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,12 @@ std::map<int, Transform> OptimizerG2O::optimize(
10371037
int it = 0;
10381038
UTimer timer;
10391039
double lastError = 0.0;
1040+
1041+
if (!optimizer.solver()->init()) {
1042+
UERROR("g2o: Error while initializing solver");
1043+
return optimizedPoses;
1044+
}
1045+
10401046
if(intermediateGraphes || this->epsilon() > 0.0)
10411047
{
10421048
for(int i=0; i<iterations(); ++i)
@@ -1150,7 +1156,8 @@ std::map<int, Transform> OptimizerG2O::optimize(
11501156
}
11511157
}
11521158

1153-
it += optimizer.optimize(1);
1159+
g2o::OptimizationAlgorithm::SolverResult result = optimizer.solver()->solve(i);
1160+
++it;
11541161

11551162
// early stop condition
11561163
optimizer.computeActiveErrors();
@@ -1163,6 +1170,12 @@ std::map<int, Transform> OptimizerG2O::optimize(
11631170
return optimizedPoses;
11641171
}
11651172

1173+
if(result == g2o::OptimizationAlgorithm::Fail)
1174+
{
1175+
UERROR("g2o: Solver failed, aborting optimization!");
1176+
return optimizedPoses;
1177+
}
1178+
11661179
double errorDelta = lastError - chi2;
11671180
if(i>0 && errorDelta < this->epsilon())
11681181
{

0 commit comments

Comments
 (0)