gtsam/tests/testManifold.cpp

155 lines
5.3 KiB
C++
Raw Permalink Normal View History

2014-10-21 18:54:28 +08:00
/* ----------------------------------------------------------------------------
2019-02-11 22:39:48 +08:00
* GTSAM Copyright 2010, Georgia Tech Research Corporation,
2014-10-21 18:54:28 +08:00
* 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>
#include <gtsam/geometry/Pose2.h>
2014-10-21 18:54:28 +08:00
#include <gtsam/geometry/Cal3_S2.h>
#include <gtsam/geometry/Cal3Bundler.h>
#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>
using namespace std;
using namespace gtsam;
// The DefaultChart of Camera below is laid out like Snavely's 9-dim vector
typedef PinholeCamera<Cal3Bundler> Camera;
//******************************************************************************
TEST(Manifold, SomeManifoldsGTSAM) {
//GTSAM_CONCEPT_ASSERT(IsManifold<int>); // integer is not a manifold
GTSAM_CONCEPT_ASSERT(IsManifold<Camera>);
GTSAM_CONCEPT_ASSERT(IsManifold<Cal3_S2>);
GTSAM_CONCEPT_ASSERT(IsManifold<Cal3Bundler>);
GTSAM_CONCEPT_ASSERT(IsManifold<Camera>);
}
2014-12-19 05:43:16 +08:00
//******************************************************************************
TEST(Manifold, SomeLieGroupsGTSAM) {
GTSAM_CONCEPT_ASSERT(IsLieGroup<Rot2>);
GTSAM_CONCEPT_ASSERT(IsLieGroup<Pose2>);
GTSAM_CONCEPT_ASSERT(IsLieGroup<Rot3>);
GTSAM_CONCEPT_ASSERT(IsLieGroup<Pose3>);
}
//******************************************************************************
TEST(Manifold, SomeVectorSpacesGTSAM) {
GTSAM_CONCEPT_ASSERT(IsVectorSpace<double>);
GTSAM_CONCEPT_ASSERT(IsVectorSpace<float>);
GTSAM_CONCEPT_ASSERT(IsVectorSpace<Point2>);
GTSAM_CONCEPT_ASSERT(IsVectorSpace<Matrix24>);
2014-10-21 18:54:28 +08:00
}
//******************************************************************************
2014-10-21 18:54:28 +08:00
// dimension
TEST(Manifold, _dimension) {
//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
}
//******************************************************************************
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()));
EXPECT(assert_equal(Point2(0,0), traits<Point2>::Identity()));
}
//******************************************************************************
2014-10-21 18:54:28 +08:00
// charts
TEST(Manifold, DefaultChart) {
//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;
//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
{
typedef Matrix2 ManifoldPoint;
ManifoldPoint m;
//DefaultChart<ManifoldPoint> 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)!
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);
}
{
typedef Eigen::Matrix<double, 1, 2> ManifoldPoint;
ManifoldPoint m;
//DefaultChart<ManifoldPoint> chart;
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);
}
{
typedef Eigen::Matrix<double, 1, 1> ManifoldPoint;
ManifoldPoint m;
//DefaultChart<ManifoldPoint> chart;
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);
}
//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 !
Vector z = Z_2x1, v(2);
2014-10-22 05:07:38 +08:00
v << 1, 0;
//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);
//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
//DefaultChart<Rot3> chart6;
EXPECT(assert_equal((Vector) Z_3x1, traits<Rot3>::Local(R, R)));
2014-10-21 18:54:28 +08:00
}
//******************************************************************************
2014-10-21 18:54:28 +08:00
int main() {
TestResult tr;
return TestRegistry::runAllTests(tr);
}
//******************************************************************************
2014-10-21 18:54:28 +08:00