Updated Fixed-Lag smoother example
							parent
							
								
									6b47aaeba3
								
							
						
					
					
						commit
						13d3f1cb6e
					
				|  | @ -65,7 +65,10 @@ int main(int argc, char** argv) { | ||||||
|   // The Batch version uses Levenberg-Marquardt to perform the nonlinear optimization
 |   // The Batch version uses Levenberg-Marquardt to perform the nonlinear optimization
 | ||||||
|   BatchFixedLagSmoother smootherBatch(lag); |   BatchFixedLagSmoother smootherBatch(lag); | ||||||
|   // The Incremental version uses iSAM2 to perform the nonlinear optimization
 |   // The Incremental version uses iSAM2 to perform the nonlinear optimization
 | ||||||
|   IncrementalFixedLagSmoother smootherISAM2(lag); |   ISAM2Params parameters; | ||||||
|  |   parameters.relinearizeThreshold = 0.0; // Set the relin threshold to zero such that the batch estimate is recovered
 | ||||||
|  |   parameters.relinearizeSkip = 1; // Relinearize every time
 | ||||||
|  |   IncrementalFixedLagSmoother smootherISAM2(lag, parameters); | ||||||
| 
 | 
 | ||||||
|   // Create containers to store the factors and linearization points that
 |   // Create containers to store the factors and linearization points that
 | ||||||
|   // will be sent to the smoothers
 |   // will be sent to the smoothers
 | ||||||
|  | @ -111,6 +114,9 @@ int main(int argc, char** argv) { | ||||||
|     // Update the smoothers with the new factors
 |     // Update the smoothers with the new factors
 | ||||||
|     smootherBatch.update(newFactors, newValues, newTimestamps); |     smootherBatch.update(newFactors, newValues, newTimestamps); | ||||||
|     smootherISAM2.update(newFactors, newValues, newTimestamps); |     smootherISAM2.update(newFactors, newValues, newTimestamps); | ||||||
|  |     for(size_t i = 1; i < 2; ++i) { // Optionally perform multiple iSAM2 iterations
 | ||||||
|  |       smootherISAM2.update(); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     // Print the optimized current pose
 |     // Print the optimized current pose
 | ||||||
|     cout << setprecision(5) << "Timestamp = " << time << endl; |     cout << setprecision(5) << "Timestamp = " << time << endl; | ||||||
|  |  | ||||||
|  | @ -233,7 +233,7 @@ FixedLagSmoother::Result BatchFixedLagSmoother::optimize() { | ||||||
|   // Create a Values that holds the current evaluation point
 |   // Create a Values that holds the current evaluation point
 | ||||||
|   Values evalpoint = theta_.retract(delta_, ordering_); |   Values evalpoint = theta_.retract(delta_, ordering_); | ||||||
|   result.error = factors_.error(evalpoint); |   result.error = factors_.error(evalpoint); | ||||||
| std::cout << "Initial Error = " << result.error << std::endl; | 
 | ||||||
|   // Use a custom optimization loop so the linearization points can be controlled
 |   // Use a custom optimization loop so the linearization points can be controlled
 | ||||||
|   double previousError; |   double previousError; | ||||||
|   VectorValues newDelta; |   VectorValues newDelta; | ||||||
|  | @ -266,22 +266,20 @@ std::cout << "Initial Error = " << result.error << std::endl; | ||||||
|         } |         } | ||||||
|         gttoc(damp); |         gttoc(damp); | ||||||
|         result.intermediateSteps++; |         result.intermediateSteps++; | ||||||
| std::cout << "Trying Lambda = " << lambda << std::endl; | 
 | ||||||
|         gttic(solve); |         gttic(solve); | ||||||
|         // Solve Damped Gaussian Factor Graph
 |         // Solve Damped Gaussian Factor Graph
 | ||||||
|         newDelta = GaussianJunctionTree(dampedFactorGraph).optimize(parameters_.getEliminationFunction()); |         newDelta = GaussianJunctionTree(dampedFactorGraph).optimize(parameters_.getEliminationFunction()); | ||||||
|         // update the evalpoint with the new delta
 |         // update the evalpoint with the new delta
 | ||||||
|         evalpoint = theta_.retract(newDelta, ordering_); |         evalpoint = theta_.retract(newDelta, ordering_); | ||||||
|         gttoc(solve); |         gttoc(solve); | ||||||
| std::cout << "  Max Delta = " << newDelta.asVector().maxCoeff() << std::endl; | 
 | ||||||
|         // Evaluate the new error
 |         // Evaluate the new error
 | ||||||
|         gttic(compute_error); |         gttic(compute_error); | ||||||
|         double error = factors_.error(evalpoint); |         double error = factors_.error(evalpoint); | ||||||
|         gttoc(compute_error); |         gttoc(compute_error); | ||||||
| std::cout << "  New Error = " << error << std::endl; | 
 | ||||||
| std::cout << "  Change = " << result.error - error << std::endl; |  | ||||||
|         if(error < result.error) { |         if(error < result.error) { | ||||||
| std::cout << "  Keeping Change" << std::endl; |  | ||||||
|           // Keep this change
 |           // Keep this change
 | ||||||
|           // Update the error value
 |           // Update the error value
 | ||||||
|           result.error = error; |           result.error = error; | ||||||
|  | @ -305,7 +303,6 @@ std::cout << "  Keeping Change" << std::endl; | ||||||
|           // End this lambda search iteration
 |           // End this lambda search iteration
 | ||||||
|           break; |           break; | ||||||
|         } else { |         } else { | ||||||
| std::cout << "  Rejecting Change" << std::endl; |  | ||||||
|           // Reject this change
 |           // Reject this change
 | ||||||
|           // Increase lambda and continue searching
 |           // Increase lambda and continue searching
 | ||||||
|           lambda *= lambdaFactor; |           lambda *= lambdaFactor; | ||||||
|  | @ -322,7 +319,7 @@ std::cout << "  Rejecting Change" << std::endl; | ||||||
|     result.iterations++; |     result.iterations++; | ||||||
|   } while(result.iterations < maxIterations && |   } while(result.iterations < maxIterations && | ||||||
|       !checkConvergence(relativeErrorTol, absoluteErrorTol, errorTol, previousError, result.error, NonlinearOptimizerParams::SILENT)); |       !checkConvergence(relativeErrorTol, absoluteErrorTol, errorTol, previousError, result.error, NonlinearOptimizerParams::SILENT)); | ||||||
| std::cout << "Final Error = " << result.error << std::endl; | 
 | ||||||
|   return result; |   return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue