| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation,  | 
					
						
							|  |  |  |  * Atlanta, Georgia 30332-0415 | 
					
						
							|  |  |  |  * All Rights Reserved | 
					
						
							|  |  |  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * See LICENSE for the license information | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * -------------------------------1------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2015-05-26 11:51:50 +08:00
										 |  |  |  * @file testManifold.cpp | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  |  * @date September 18, 2014 | 
					
						
							|  |  |  |  * @author Frank Dellaert | 
					
						
							|  |  |  |  * @author Paul Furgale | 
					
						
							| 
									
										
										
										
											2015-05-26 11:51:50 +08:00
										 |  |  |  * @brief unit tests for Manifold type machinery | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-26 11:51:50 +08:00
										 |  |  | #include <gtsam/base/Manifold.h>
 | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | #include <gtsam/geometry/PinholeCamera.h>
 | 
					
						
							| 
									
										
										
										
											2015-02-21 19:39:50 +08:00
										 |  |  | #include <gtsam/geometry/Pose2.h>
 | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | #include <gtsam/geometry/Cal3_S2.h>
 | 
					
						
							|  |  |  | #include <gtsam/geometry/Cal3Bundler.h>
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | #include <gtsam/base/VectorSpace.h>
 | 
					
						
							|  |  |  | #include <gtsam/base/testLie.h>
 | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | #include <gtsam/base/Testable.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #undef CHECK
 | 
					
						
							|  |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <boost/assign/list_of.hpp>
 | 
					
						
							|  |  |  | using boost::assign::list_of; | 
					
						
							|  |  |  | using boost::assign::map_list_of; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // The DefaultChart of Camera below is laid out like Snavely's 9-dim vector
 | 
					
						
							|  |  |  | typedef PinholeCamera<Cal3Bundler> Camera; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | //******************************************************************************
 | 
					
						
							|  |  |  | TEST(Manifold, SomeManifoldsGTSAM) { | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |   //BOOST_CONCEPT_ASSERT((IsManifold<int>)); // integer is not a manifold
 | 
					
						
							| 
									
										
										
										
											2014-12-19 05:43:16 +08:00
										 |  |  |   BOOST_CONCEPT_ASSERT((IsManifold<Camera>)); | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  |   BOOST_CONCEPT_ASSERT((IsManifold<Cal3_S2>)); | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsManifold<Cal3Bundler>)); | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsManifold<Camera>)); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-12-19 05:43:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | //******************************************************************************
 | 
					
						
							|  |  |  | TEST(Manifold, SomeLieGroupsGTSAM) { | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsLieGroup<Rot2>)); | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsLieGroup<Pose2>)); | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsLieGroup<Rot3>)); | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsLieGroup<Pose3>)); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | //******************************************************************************
 | 
					
						
							|  |  |  | TEST(Manifold, SomeVectorSpacesGTSAM) { | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsVectorSpace<double>)); | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsVectorSpace<float>)); | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsVectorSpace<Point2>)); | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsVectorSpace<Matrix24>)); | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | //******************************************************************************
 | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | // dimension
 | 
					
						
							|  |  |  | TEST(Manifold, _dimension) { | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |   //using namespace traits;
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |   EXPECT_LONGS_EQUAL(2, traits<Point2>::dimension); | 
					
						
							|  |  |  |   EXPECT_LONGS_EQUAL(8, traits<Matrix24>::dimension); | 
					
						
							|  |  |  |   EXPECT_LONGS_EQUAL(1, traits<double>::dimension); | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | //******************************************************************************
 | 
					
						
							|  |  |  | TEST(Manifold, Identity) { | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |   EXPECT_DOUBLES_EQUAL(0.0, traits<double>::Identity(), 0.0); | 
					
						
							|  |  |  |   EXPECT(assert_equal(Matrix(Matrix24::Zero()), Matrix(traits<Matrix24>::Identity()))); | 
					
						
							|  |  |  |   EXPECT(assert_equal(Pose3(), traits<Pose3>::Identity())); | 
					
						
							| 
									
										
										
										
											2016-06-06 14:52:04 +08:00
										 |  |  |   EXPECT(assert_equal(Point2(0,0), traits<Point2>::Identity())); | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //******************************************************************************
 | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | // charts
 | 
					
						
							|  |  |  | TEST(Manifold, DefaultChart) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |   //DefaultChart<Point2> chart1;
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |   EXPECT(traits<Point2>::Local(Point2(0, 0), Point2(1, 0)) == Vector2(1, 0)); | 
					
						
							|  |  |  |   EXPECT(traits<Point2>::Retract(Point2(0, 0), Vector2(1, 0)) == Point2(1, 0)); | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-22 05:07:38 +08:00
										 |  |  |   Vector v2(2); | 
					
						
							|  |  |  |   v2 << 1, 0; | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |   //DefaultChart<Vector2> chart2;
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |   EXPECT(assert_equal(v2, traits<Vector2>::Local(Vector2(0, 0), Vector2(1, 0)))); | 
					
						
							|  |  |  |   EXPECT(traits<Vector2>::Retract(Vector2(0, 0), v2) == Vector2(1, 0)); | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 00:41:19 +08:00
										 |  |  |   { | 
					
						
							|  |  |  |     typedef Matrix2 ManifoldPoint; | 
					
						
							|  |  |  |     ManifoldPoint m; | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |     //DefaultChart<ManifoldPoint> chart;
 | 
					
						
							| 
									
										
										
										
											2014-11-10 00:41:19 +08:00
										 |  |  |     m << 1, 3, | 
					
						
							|  |  |  |          2, 4; | 
					
						
							|  |  |  |     // m as per default is in column-major storage mode. So this yields a linear representation of (1, 2, 3, 4)!
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |     EXPECT(assert_equal(Vector(Vector4(1, 2, 3, 4)), Vector(traits<ManifoldPoint>::Local(ManifoldPoint::Zero(), m)))); | 
					
						
							|  |  |  |     EXPECT(traits<ManifoldPoint>::Retract(m, Vector4(1, 2, 3, 4)) == 2 * m); | 
					
						
							| 
									
										
										
										
											2014-11-10 00:41:19 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     typedef Eigen::Matrix<double, 1, 2> ManifoldPoint; | 
					
						
							|  |  |  |     ManifoldPoint m; | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |     //DefaultChart<ManifoldPoint> chart;
 | 
					
						
							| 
									
										
										
										
											2014-11-10 00:41:19 +08:00
										 |  |  |     m << 1, 2; | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |     EXPECT(assert_equal(Vector(Vector2(1, 2)), Vector(traits<ManifoldPoint>::Local(ManifoldPoint::Zero(), m)))); | 
					
						
							|  |  |  |     EXPECT(traits<ManifoldPoint>::Retract(m, Vector2(1, 2)) == 2 * m); | 
					
						
							| 
									
										
										
										
											2014-11-10 00:41:19 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 23:35:23 +08:00
										 |  |  |   { | 
					
						
							|  |  |  |     typedef Eigen::Matrix<double, 1, 1> ManifoldPoint; | 
					
						
							|  |  |  |     ManifoldPoint m; | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |     //DefaultChart<ManifoldPoint> chart;
 | 
					
						
							| 
									
										
										
										
											2014-11-10 23:35:23 +08:00
										 |  |  |     m << 1; | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |     EXPECT(assert_equal(Vector(ManifoldPoint::Ones()), Vector(traits<ManifoldPoint>::Local(ManifoldPoint::Zero(), m)))); | 
					
						
							|  |  |  |     EXPECT(traits<ManifoldPoint>::Retract(m, ManifoldPoint::Ones()) == 2 * m); | 
					
						
							| 
									
										
										
										
											2014-11-10 23:35:23 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |   //DefaultChart<double> chart3;
 | 
					
						
							| 
									
										
										
										
											2014-10-22 05:07:38 +08:00
										 |  |  |   Vector v1(1); | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  |   v1 << 1; | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |   EXPECT(assert_equal(v1, traits<double>::Local(0, 1))); | 
					
						
							|  |  |  |   EXPECT_DOUBLES_EQUAL(traits<double>::Retract(0, v1), 1, 1e-9); | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Dynamic does not work yet !
 | 
					
						
							| 
									
										
										
										
											2016-04-16 04:54:46 +08:00
										 |  |  |   Vector z = Z_2x1, v(2); | 
					
						
							| 
									
										
										
										
											2014-10-22 05:07:38 +08:00
										 |  |  |   v << 1, 0; | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |   //DefaultChart<Vector> chart4;
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  | //  EXPECT(assert_equal(traits<Vector>::Local(z, v), v));
 | 
					
						
							|  |  |  | //  EXPECT(assert_equal(traits<Vector>::Retract(z, v), v));
 | 
					
						
							| 
									
										
										
										
											2014-10-22 05:07:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Vector v3(3); | 
					
						
							|  |  |  |   v3 << 1, 1, 1; | 
					
						
							|  |  |  |   Rot3 I = Rot3::identity(); | 
					
						
							| 
									
										
										
										
											2014-10-23 03:55:35 +08:00
										 |  |  |   Rot3 R = I.retract(v3); | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |   //DefaultChart<Rot3> chart5;
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:47:51 +08:00
										 |  |  |   EXPECT(assert_equal(v3, traits<Rot3>::Local(I, R))); | 
					
						
							|  |  |  |   EXPECT(assert_equal(traits<Rot3>::Retract(I, v3), R)); | 
					
						
							| 
									
										
										
										
											2014-10-22 05:07:38 +08:00
										 |  |  |   // Check zero vector
 | 
					
						
							| 
									
										
										
										
											2014-12-18 05:53:56 +08:00
										 |  |  |   //DefaultChart<Rot3> chart6;
 | 
					
						
							| 
									
										
										
										
											2016-04-16 04:54:46 +08:00
										 |  |  |   EXPECT(assert_equal((Vector) Z_3x1, traits<Rot3>::Local(R, R))); | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-28 02:54:14 +08:00
										 |  |  | #ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V4
 | 
					
						
							| 
									
										
										
										
											2015-05-26 09:30:53 +08:00
										 |  |  | //******************************************************************************
 | 
					
						
							| 
									
										
										
										
											2015-05-26 11:51:50 +08:00
										 |  |  | typedef ProductManifold<Point2,Point2> MyPoint2Pair; | 
					
						
							| 
									
										
										
										
											2015-05-26 09:30:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Define any direct product group to be a model of the multiplicative Group concept
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | template<> struct traits<MyPoint2Pair> : internal::ManifoldTraits<MyPoint2Pair> { | 
					
						
							|  |  |  |   static void Print(const MyPoint2Pair& m, const string& s = "") { | 
					
						
							|  |  |  |     cout << s << "(" << m.first << "," << m.second << ")" << endl; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   static bool Equals(const MyPoint2Pair& m1, const MyPoint2Pair& m2, double tol = 1e-8) { | 
					
						
							|  |  |  |     return m1 == m2; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST(Manifold, ProductManifold) { | 
					
						
							|  |  |  |   BOOST_CONCEPT_ASSERT((IsManifold<MyPoint2Pair>)); | 
					
						
							| 
									
										
										
										
											2016-06-06 15:37:49 +08:00
										 |  |  |   MyPoint2Pair pair1(Point2(0,0),Point2(0,0)); | 
					
						
							| 
									
										
										
										
											2015-05-26 09:30:53 +08:00
										 |  |  |   Vector4 d; | 
					
						
							|  |  |  |   d << 1,2,3,4; | 
					
						
							|  |  |  |   MyPoint2Pair expected(Point2(1,2),Point2(3,4)); | 
					
						
							|  |  |  |   MyPoint2Pair pair2 = pair1.retract(d); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expected,pair2,1e-9)); | 
					
						
							|  |  |  |   EXPECT(assert_equal(d, pair1.localCoordinates(pair2),1e-9)); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-11-28 02:54:14 +08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-05-26 09:30:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | //******************************************************************************
 | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | int main() { | 
					
						
							|  |  |  |   TestResult tr; | 
					
						
							|  |  |  |   return TestRegistry::runAllTests(tr); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-12-26 23:11:53 +08:00
										 |  |  | //******************************************************************************
 | 
					
						
							| 
									
										
										
										
											2014-10-21 18:54:28 +08:00
										 |  |  | 
 |