| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file   NonlinearConjugateGradientOptimizer.cpp | 
					
						
							|  |  |  |  * @brief  Test simple CG optimizer | 
					
						
							|  |  |  |  * @author Yong-Dian Jian | 
					
						
							|  |  |  |  * @date   June 11, 2012 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file   testGradientDescentOptimizer.cpp | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |  * @brief  Small test of NonlinearConjugateGradientOptimizer | 
					
						
							|  |  |  |  * @author Yong-Dian Jian | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  |  * @date   Jun 11, 2012 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:44:02 +08:00
										 |  |  | #include <gtsam/slam/BetweenFactor.h>
 | 
					
						
							| 
									
										
										
										
											2012-07-28 03:15:58 +08:00
										 |  |  | #include <gtsam/nonlinear/NonlinearConjugateGradientOptimizer.h>
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:44:02 +08:00
										 |  |  | #include <gtsam/nonlinear/NonlinearFactorGraph.h>
 | 
					
						
							|  |  |  | #include <gtsam/nonlinear/Values.h>
 | 
					
						
							|  |  |  | #include <gtsam/geometry/Pose2.h>
 | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-12 22:19:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | using namespace std; | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  | // Generate a small PoseSLAM problem
 | 
					
						
							| 
									
										
										
										
											2023-01-19 08:32:29 +08:00
										 |  |  | std::tuple<NonlinearFactorGraph, Values> generateProblem() { | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // 1. Create graph container and add factors to it
 | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |   NonlinearFactorGraph graph; | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // 2a. Add Gaussian prior
 | 
					
						
							|  |  |  |   Pose2 priorMean(0.0, 0.0, 0.0); // prior at origin
 | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |   SharedDiagonal priorNoise = noiseModel::Diagonal::Sigmas( | 
					
						
							|  |  |  |       Vector3(0.3, 0.3, 0.1)); | 
					
						
							| 
									
										
										
										
											2020-04-13 01:10:09 +08:00
										 |  |  |   graph.addPrior(1, priorMean, priorNoise); | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // 2b. Add odometry factors
 | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |   SharedDiagonal odometryNoise = noiseModel::Diagonal::Sigmas( | 
					
						
							|  |  |  |       Vector3(0.2, 0.2, 0.1)); | 
					
						
							| 
									
										
										
										
											2023-02-06 16:40:32 +08:00
										 |  |  |   graph.emplace_shared<BetweenFactor<Pose2>>(1, 2, Pose2(2.0, 0.0, 0.0), odometryNoise); | 
					
						
							|  |  |  |   graph.emplace_shared<BetweenFactor<Pose2>>(2, 3, Pose2(2.0, 0.0, M_PI_2), odometryNoise); | 
					
						
							|  |  |  |   graph.emplace_shared<BetweenFactor<Pose2>>(3, 4, Pose2(2.0, 0.0, M_PI_2), odometryNoise); | 
					
						
							|  |  |  |   graph.emplace_shared<BetweenFactor<Pose2>>(4, 5, Pose2(2.0, 0.0, M_PI_2), odometryNoise); | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // 2c. Add pose constraint
 | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |   SharedDiagonal constraintUncertainty = noiseModel::Diagonal::Sigmas( | 
					
						
							|  |  |  |       Vector3(0.2, 0.2, 0.1)); | 
					
						
							| 
									
										
										
										
											2023-02-06 16:40:32 +08:00
										 |  |  |   graph.emplace_shared<BetweenFactor<Pose2>>(5, 2, Pose2(2.0, 0.0, M_PI_2), | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |       constraintUncertainty); | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-06 06:31:22 +08:00
										 |  |  |   // 3. Create the data structure to hold the initialEstimate estimate to the solution
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:44:02 +08:00
										 |  |  |   Values initialEstimate; | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |   Pose2 x1(0.5, 0.0, 0.2); | 
					
						
							|  |  |  |   initialEstimate.insert(1, x1); | 
					
						
							|  |  |  |   Pose2 x2(2.3, 0.1, -0.2); | 
					
						
							|  |  |  |   initialEstimate.insert(2, x2); | 
					
						
							|  |  |  |   Pose2 x3(4.1, 0.1, M_PI_2); | 
					
						
							|  |  |  |   initialEstimate.insert(3, x3); | 
					
						
							|  |  |  |   Pose2 x4(4.0, 2.0, M_PI); | 
					
						
							|  |  |  |   initialEstimate.insert(4, x4); | 
					
						
							|  |  |  |   Pose2 x5(2.1, 2.1, -M_PI_2); | 
					
						
							|  |  |  |   initialEstimate.insert(5, x5); | 
					
						
							| 
									
										
										
										
											2012-06-12 22:19:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-05 01:42:39 +08:00
										 |  |  |   return {graph, initialEstimate}; | 
					
						
							| 
									
										
										
										
											2012-06-12 22:19:01 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  | TEST(NonlinearConjugateGradientOptimizer, Optimize) { | 
					
						
							| 
									
										
										
										
											2023-02-05 01:42:39 +08:00
										 |  |  | const auto [graph, initialEstimate] = generateProblem(); | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  | //  cout << "initial error = " << graph.error(initialEstimate) << endl;
 | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-13 09:21:10 +08:00
										 |  |  |   NonlinearOptimizerParams param; | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |   param.maxIterations = 500; /* requires a larger number of iterations to converge */ | 
					
						
							| 
									
										
										
										
											2012-06-13 09:21:10 +08:00
										 |  |  |   param.verbosity = NonlinearOptimizerParams::SILENT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-25 05:06:33 +08:00
										 |  |  |   NonlinearConjugateGradientOptimizer optimizer(graph, initialEstimate, param); | 
					
						
							| 
									
										
										
										
											2012-06-13 09:21:10 +08:00
										 |  |  |   Values result = optimizer.optimize(); | 
					
						
							|  |  |  | //  cout << "cg final error = " << graph.error(result) << endl;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  |   EXPECT_DOUBLES_EQUAL(0.0, graph.error(result), 1e-4); | 
					
						
							| 
									
										
										
										
											2012-06-13 09:21:10 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2015-02-22 13:14:19 +08:00
										 |  |  | int main() { | 
					
						
							|  |  |  |   TestResult tr; | 
					
						
							|  |  |  |   return TestRegistry::runAllTests(tr); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-06-12 06:10:23 +08:00
										 |  |  | /* ************************************************************************* */ |