/* ---------------------------------------------------------------------------- * 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------------------------------------------- */ /** * @file testManifold.cpp * @date September 18, 2014 * @author Frank Dellaert * @author Paul Furgale * @brief unit tests for Manifold type machinery */ #include #include #include #include #include #include #include #include #undef CHECK #include #include 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 Camera; //****************************************************************************** TEST(Manifold, SomeManifoldsGTSAM) { //BOOST_CONCEPT_ASSERT((IsManifold)); // integer is not a manifold BOOST_CONCEPT_ASSERT((IsManifold)); BOOST_CONCEPT_ASSERT((IsManifold)); BOOST_CONCEPT_ASSERT((IsManifold)); BOOST_CONCEPT_ASSERT((IsManifold)); } //****************************************************************************** TEST(Manifold, SomeLieGroupsGTSAM) { BOOST_CONCEPT_ASSERT((IsLieGroup)); BOOST_CONCEPT_ASSERT((IsLieGroup)); BOOST_CONCEPT_ASSERT((IsLieGroup)); BOOST_CONCEPT_ASSERT((IsLieGroup)); } //****************************************************************************** TEST(Manifold, SomeVectorSpacesGTSAM) { BOOST_CONCEPT_ASSERT((IsVectorSpace)); BOOST_CONCEPT_ASSERT((IsVectorSpace)); BOOST_CONCEPT_ASSERT((IsVectorSpace)); BOOST_CONCEPT_ASSERT((IsVectorSpace)); } //****************************************************************************** // dimension TEST(Manifold, _dimension) { //using namespace traits; EXPECT_LONGS_EQUAL(2, traits::dimension); EXPECT_LONGS_EQUAL(8, traits::dimension); EXPECT_LONGS_EQUAL(1, traits::dimension); } //****************************************************************************** TEST(Manifold, Identity) { EXPECT_DOUBLES_EQUAL(0.0, traits::Identity(), 0.0); EXPECT(assert_equal(Matrix(Matrix24::Zero()), Matrix(traits::Identity()))); EXPECT(assert_equal(Pose3(), traits::Identity())); EXPECT(assert_equal(Point2(), traits::Identity())); } //****************************************************************************** // charts TEST(Manifold, DefaultChart) { //DefaultChart chart1; EXPECT(traits::Local(Point2(0, 0), Point2(1, 0)) == Vector2(1, 0)); EXPECT(traits::Retract(Point2(0, 0), Vector2(1, 0)) == Point2(1, 0)); Vector v2(2); v2 << 1, 0; //DefaultChart chart2; EXPECT(assert_equal(v2, traits::Local(Vector2(0, 0), Vector2(1, 0)))); EXPECT(traits::Retract(Vector2(0, 0), v2) == Vector2(1, 0)); { typedef Matrix2 ManifoldPoint; ManifoldPoint m; //DefaultChart chart; 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)! EXPECT(assert_equal(Vector(Vector4(1, 2, 3, 4)), Vector(traits::Local(ManifoldPoint::Zero(), m)))); EXPECT(traits::Retract(m, Vector4(1, 2, 3, 4)) == 2 * m); } { typedef Eigen::Matrix ManifoldPoint; ManifoldPoint m; //DefaultChart chart; m << 1, 2; EXPECT(assert_equal(Vector(Vector2(1, 2)), Vector(traits::Local(ManifoldPoint::Zero(), m)))); EXPECT(traits::Retract(m, Vector2(1, 2)) == 2 * m); } { typedef Eigen::Matrix ManifoldPoint; ManifoldPoint m; //DefaultChart chart; m << 1; EXPECT(assert_equal(Vector(ManifoldPoint::Ones()), Vector(traits::Local(ManifoldPoint::Zero(), m)))); EXPECT(traits::Retract(m, ManifoldPoint::Ones()) == 2 * m); } //DefaultChart chart3; Vector v1(1); v1 << 1; EXPECT(assert_equal(v1, traits::Local(0, 1))); EXPECT_DOUBLES_EQUAL(traits::Retract(0, v1), 1, 1e-9); // Dynamic does not work yet ! Vector z = zero(2), v(2); v << 1, 0; //DefaultChart chart4; // EXPECT(assert_equal(traits::Local(z, v), v)); // EXPECT(assert_equal(traits::Retract(z, v), v)); Vector v3(3); v3 << 1, 1, 1; Rot3 I = Rot3::identity(); Rot3 R = I.retract(v3); //DefaultChart chart5; EXPECT(assert_equal(v3, traits::Local(I, R))); EXPECT(assert_equal(traits::Retract(I, v3), R)); // Check zero vector //DefaultChart chart6; EXPECT(assert_equal(zero(3), traits::Local(R, R))); } //****************************************************************************** typedef ProductManifold MyPoint2Pair; // Define any direct product group to be a model of the multiplicative Group concept namespace gtsam { template<> struct traits : internal::ManifoldTraits { 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 pair1; 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)); } //****************************************************************************** int main() { TestResult tr; return TestRegistry::runAllTests(tr); } //******************************************************************************