| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file    testVSLAMGraph.cpp | 
					
						
							|  |  |  |  * @brief   Unit test for two cameras and four landmarks | 
					
						
							|  |  |  |  * single camera | 
					
						
							|  |  |  |  * @author  Chris Beall | 
					
						
							|  |  |  |  * @author  Frank Dellaert | 
					
						
							|  |  |  |  * @author  Viorela Ila | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "VSLAMGraph.h"
 | 
					
						
							|  |  |  | #include "NonlinearFactorGraph-inl.h"
 | 
					
						
							|  |  |  | #include "NonlinearOptimizer-inl.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | typedef NonlinearOptimizer<VSLAMGraph,VSLAMConfig> Optimizer; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  | Point3 landmark1(-1.0,-1.0, 0.0); | 
					
						
							|  |  |  | Point3 landmark2(-1.0, 1.0, 0.0); | 
					
						
							|  |  |  | Point3 landmark3( 1.0, 1.0, 0.0); | 
					
						
							|  |  |  | Point3 landmark4( 1.0,-1.0, 0.0); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  | Pose3 camera1(Matrix_(3,3, | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | 		       1., 0., 0., | 
					
						
							|  |  |  | 		       0.,-1., 0., | 
					
						
							|  |  |  | 		       0., 0.,-1. | 
					
						
							|  |  |  | 		       ), | 
					
						
							|  |  |  | 	      Point3(0,0,6.25)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  | Pose3 camera2(Matrix_(3,3, | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | 		       1., 0., 0., | 
					
						
							|  |  |  | 		       0.,-1., 0., | 
					
						
							|  |  |  | 		       0., 0.,-1. | 
					
						
							|  |  |  | 		       ), | 
					
						
							|  |  |  | 	      Point3(0,0,5.00)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | VSLAMGraph testGraph() { | 
					
						
							|  |  |  |   Point2 z11(-100, 100); | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  | 	Point2 z12(-100,-100); | 
					
						
							|  |  |  | 	Point2 z13( 100,-100); | 
					
						
							|  |  |  | 	Point2 z14( 100, 100); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | 	Point2 z21(-125, 125); | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  | 	Point2 z22(-125,-125); | 
					
						
							|  |  |  | 	Point2 z23( 125,-125); | 
					
						
							|  |  |  | 	Point2 z24( 125, 125); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   double sigma = 1; | 
					
						
							| 
									
										
										
										
											2009-11-17 09:02:55 +08:00
										 |  |  |   VSLAMFactor::shared_ptrK sK(new Cal3_S2(625, 625, 0, 0, 0)); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  |   VSLAMGraph g; | 
					
						
							| 
									
										
										
										
											2009-11-17 09:02:55 +08:00
										 |  |  |   g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z11, sigma, 1, 1, sK))); | 
					
						
							|  |  |  |   g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z12, sigma, 1, 2, sK))); | 
					
						
							|  |  |  |   g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z13, sigma, 1, 3, sK))); | 
					
						
							|  |  |  |   g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z14, sigma, 1, 4, sK))); | 
					
						
							|  |  |  |   g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z21, sigma, 2, 1, sK))); | 
					
						
							|  |  |  |   g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z22, sigma, 2, 2, sK))); | 
					
						
							|  |  |  |   g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z23, sigma, 2, 3, sK))); | 
					
						
							|  |  |  |   g.push_back(VSLAMFactor::shared_ptr(new VSLAMFactor(z24, sigma, 2, 4, sK))); | 
					
						
							| 
									
										
										
										
											2009-11-18 01:19:54 +08:00
										 |  |  |   return g; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-18 01:19:54 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( VSLAMGraph, optimizeLM) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   // build a graph
 | 
					
						
							|  |  |  |   VSLAMGraph graph = testGraph(); | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  | 	// add 3 landmark constraints
 | 
					
						
							| 
									
										
										
										
											2009-11-18 01:19:54 +08:00
										 |  |  |   graph.addLandmarkConstraint(1, landmark1); | 
					
						
							|  |  |  |   graph.addLandmarkConstraint(2, landmark2); | 
					
						
							|  |  |  |   graph.addLandmarkConstraint(3, landmark3); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-18 01:19:54 +08:00
										 |  |  |   // Create an initial configuration corresponding to the ground truth
 | 
					
						
							|  |  |  |   boost::shared_ptr<VSLAMConfig> initialEstimate(new VSLAMConfig); | 
					
						
							|  |  |  |   initialEstimate->addCameraPose(1, camera1); | 
					
						
							|  |  |  |   initialEstimate->addCameraPose(2, camera2); | 
					
						
							|  |  |  |   initialEstimate->addLandmarkPoint(1, landmark1); | 
					
						
							|  |  |  |   initialEstimate->addLandmarkPoint(2, landmark2); | 
					
						
							|  |  |  |   initialEstimate->addLandmarkPoint(3, landmark3); | 
					
						
							|  |  |  |   initialEstimate->addLandmarkPoint(4, landmark4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Create an ordering of the variables
 | 
					
						
							|  |  |  |   list<string> keys; | 
					
						
							|  |  |  |   keys.push_back("l1"); | 
					
						
							|  |  |  |   keys.push_back("l2"); | 
					
						
							|  |  |  |   keys.push_back("l3"); | 
					
						
							|  |  |  |   keys.push_back("l4"); | 
					
						
							|  |  |  |   keys.push_back("x1"); | 
					
						
							|  |  |  |   keys.push_back("x2"); | 
					
						
							|  |  |  |   Ordering ordering(keys); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Create an optimizer and check its error
 | 
					
						
							|  |  |  |   // We expect the initial to be zero because config is the ground truth
 | 
					
						
							|  |  |  |   Optimizer optimizer(graph, ordering, initialEstimate, 1e-5); | 
					
						
							|  |  |  |   DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Iterate once, and the config should not have changed because we started
 | 
					
						
							|  |  |  |   // with the ground truth
 | 
					
						
							|  |  |  |   Optimizer afterOneIteration = optimizer.iterate(); | 
					
						
							|  |  |  |   DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // check if correct
 | 
					
						
							|  |  |  |   CHECK(assert_equal(*initialEstimate,*(afterOneIteration.config()))); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-18 01:19:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-11-18 01:19:54 +08:00
										 |  |  | TEST( VSLAMGraph, optimizeLM2) | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | { | 
					
						
							|  |  |  |   // build a graph
 | 
					
						
							|  |  |  |   VSLAMGraph graph = testGraph(); | 
					
						
							| 
									
										
										
										
											2009-11-18 01:19:54 +08:00
										 |  |  | 	// add 2 camera constraints
 | 
					
						
							|  |  |  |   graph.addCameraConstraint(1, camera1); | 
					
						
							|  |  |  |   graph.addCameraConstraint(2, camera2); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  |   // Create an initial configuration corresponding to the ground truth
 | 
					
						
							|  |  |  |   boost::shared_ptr<VSLAMConfig> initialEstimate(new VSLAMConfig); | 
					
						
							|  |  |  |   initialEstimate->addCameraPose(1, camera1); | 
					
						
							|  |  |  |   initialEstimate->addCameraPose(2, camera2); | 
					
						
							|  |  |  |   initialEstimate->addLandmarkPoint(1, landmark1); | 
					
						
							|  |  |  |   initialEstimate->addLandmarkPoint(2, landmark2); | 
					
						
							|  |  |  |   initialEstimate->addLandmarkPoint(3, landmark3); | 
					
						
							|  |  |  |   initialEstimate->addLandmarkPoint(4, landmark4); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Create an ordering of the variables
 | 
					
						
							|  |  |  |   list<string> keys; | 
					
						
							| 
									
										
										
										
											2009-11-18 01:19:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  |   keys.push_back("l1"); | 
					
						
							|  |  |  |   keys.push_back("l2"); | 
					
						
							|  |  |  |   keys.push_back("l3"); | 
					
						
							|  |  |  |   keys.push_back("l4"); | 
					
						
							|  |  |  |   keys.push_back("x1"); | 
					
						
							|  |  |  |   keys.push_back("x2"); | 
					
						
							|  |  |  |   Ordering ordering(keys); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  |   // Create an optimizer and check its error
 | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  |   // We expect the initial to be zero because config is the ground truth
 | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  |   Optimizer optimizer(graph, ordering, initialEstimate, 1e-5); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  |   DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Iterate once, and the config should not have changed because we started
 | 
					
						
							|  |  |  |   // with the ground truth
 | 
					
						
							|  |  |  |   Optimizer afterOneIteration = optimizer.iterate(); | 
					
						
							|  |  |  |   DOUBLES_EQUAL(0.0, optimizer.error(), 1e-9); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // check if correct
 | 
					
						
							| 
									
										
										
										
											2009-11-13 14:19:08 +08:00
										 |  |  |   CHECK(assert_equal(*initialEstimate,*(afterOneIteration.config()))); | 
					
						
							| 
									
										
										
										
											2009-11-13 02:54:46 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { TestResult tr; TestRegistry::runAllTests(tr); return 0;} | 
					
						
							|  |  |  | /* ************************************************************************* */ |