Back to compile flags

release/4.3a0
dellaert 2014-12-26 00:15:57 +01:00
parent 11858da42b
commit 9955610ea4
8 changed files with 81 additions and 89 deletions

View File

@ -29,9 +29,8 @@ namespace gtsam {
// Do a comprehensive test of Lie Group derivatives // Do a comprehensive test of Lie Group derivatives
template<typename G> template<typename G>
void testLieGroupDerivatives(TestResult& result_, void testLieGroupDerivatives(TestResult& result_, const std::string& name_,
const std::string& name_, const G& t1, const G& t2, bool advanced) {
const G& t1, const G& t2) {
G id; G id;
Matrix H1, H2; Matrix H1, H2;
@ -76,6 +75,8 @@ void testLieGroupDerivatives(TestResult& result_,
EXPECT(assert_equal(numericalDerivative21(T::Between, id, t2), H1)); EXPECT(assert_equal(numericalDerivative21(T::Between, id, t2), H1));
EXPECT(assert_equal(numericalDerivative22(T::Between, id, t2), H2)); EXPECT(assert_equal(numericalDerivative22(T::Between, id, t2), H2));
if (!advanced) return;
// Retract // Retract
typename G::TangentVector z = T::Local(id, id); typename G::TangentVector z = T::Local(id, id);
@ -121,5 +122,5 @@ void testLieGroupDerivatives(TestResult& result_,
/// \brief Perform a concept check on the default chart for a type. /// \brief Perform a concept check on the default chart for a type.
/// \param value An instantiation of the type to be tested. /// \param value An instantiation of the type to be tested.
#define CHECK_LIE_GROUP_DERIVATIVES(t1,t2) \ #define CHECK_LIE_GROUP_DERIVATIVES(t1,t2,flag) \
{ gtsam::testLieGroupDerivatives(result_, name_, t1,t2); } { gtsam::testLieGroupDerivatives(result_, name_, t1, t2, flag); }

View File

@ -24,8 +24,6 @@
#include <gtsam/geometry/Rot2.h> #include <gtsam/geometry/Rot2.h>
#include <gtsam/base/Lie.h> #include <gtsam/base/Lie.h>
#define SLOW_BUT_CORRECT_EXPMAP
namespace gtsam { namespace gtsam {
/** /**

View File

@ -23,8 +23,6 @@
#include <iostream> #include <iostream>
#include <cmath> #include <cmath>
#define GTSAM_POSE3_EXPMAP
using namespace std; using namespace std;
namespace gtsam { namespace gtsam {
@ -160,8 +158,13 @@ Pose3 Pose3::ChartAtOrigin::Retract(const Vector6& xi, ChartJacobian H) {
#ifdef GTSAM_POSE3_EXPMAP #ifdef GTSAM_POSE3_EXPMAP
return Expmap(xi, H); return Expmap(xi, H);
#else #else
if (H) CONCEPT_NOT_IMPLEMENTED; Matrix3 DR;
return Pose3(Rot3::Retract(xi.head<3>()), Point3(xi.tail<3>())); Rot3 R = Rot3::Retract(xi.head<3>(), H ? &DR : 0);
if (H) {
*H = I_6x6;
H->topLeftCorner<3,3>() = DR;
}
return Pose3(R, Point3(xi.tail<3>()));
#endif #endif
} }
@ -170,9 +173,14 @@ Vector6 Pose3::ChartAtOrigin::Local(const Pose3& T, ChartJacobian H) {
#ifdef GTSAM_POSE3_EXPMAP #ifdef GTSAM_POSE3_EXPMAP
return Logmap(T, H); return Logmap(T, H);
#else #else
if (H) CONCEPT_NOT_IMPLEMENTED; Matrix3 DR;
Vector3 omega = Rot3::LocalCoordinates(T.rotation(), H ? &DR : 0);
if (H) {
*H = I_6x6;
H->topLeftCorner<3,3>() = DR;
}
Vector6 xi; Vector6 xi;
xi << Rot3::Logmap(T.rotation()), T.translation().vector(); xi << omega, T.translation().vector();
return xi; return xi;
#endif #endif
} }

View File

@ -247,10 +247,10 @@ namespace gtsam {
#ifndef GTSAM_USE_QUATERNIONS #ifndef GTSAM_USE_QUATERNIONS
// Cayley chart around origin, no derivatives // Cayley chart around origin
struct CayleyChart { struct CayleyChart {
static Rot3 Retract(const Vector3& v); static Rot3 Retract(const Vector3& v, OptionalJacobian<3, 3> H = boost::none);
static Vector3 Local(const Rot3& r); static Vector3 Local(const Rot3& r, OptionalJacobian<3, 3> H = boost::none);
}; };
/// Retraction from R^3 to Rot3 manifold using the Cayley transform /// Retraction from R^3 to Rot3 manifold using the Cayley transform

View File

@ -206,7 +206,8 @@ Vector3 Rot3::Logmap(const Rot3& R, OptionalJacobian<3,3> H) {
} }
/* ************************************************************************* */ /* ************************************************************************* */
Rot3 Rot3::CayleyChart::Retract(const Vector3& omega) { Rot3 Rot3::CayleyChart::Retract(const Vector3& omega, OptionalJacobian<3,3> H) {
if (H) throw std::runtime_error("Rot3::CayleyChart::Retract Derivative");
const double x = omega(0), y = omega(1), z = omega(2); const double x = omega(0), y = omega(1), z = omega(2);
const double x2 = x * x, y2 = y * y, z2 = z * z; const double x2 = x * x, y2 = y * y, z2 = z * z;
const double xy = x * y, xz = x * z, yz = y * z; const double xy = x * y, xz = x * z, yz = y * z;
@ -217,7 +218,8 @@ Rot3 Rot3::CayleyChart::Retract(const Vector3& omega) {
} }
/* ************************************************************************* */ /* ************************************************************************* */
Vector3 Rot3::CayleyChart::Local(const Rot3& R) { Vector3 Rot3::CayleyChart::Local(const Rot3& R, OptionalJacobian<3,3> H) {
if (H) throw std::runtime_error("Rot3::CayleyChart::Local Derivative");
// Create a fixed-size matrix // Create a fixed-size matrix
Matrix3 A = R.matrix(); Matrix3 A = R.matrix();
// Mathematica closed form optimization (procrastination?) gone wild: // Mathematica closed form optimization (procrastination?) gone wild:
@ -237,28 +239,16 @@ Vector3 Rot3::CayleyChart::Local(const Rot3& R) {
Rot3 Rot3::ChartAtOrigin::Retract(const Vector3& omega, ChartJacobian H) { Rot3 Rot3::ChartAtOrigin::Retract(const Vector3& omega, ChartJacobian H) {
static const CoordinatesMode mode = ROT3_DEFAULT_COORDINATES_MODE; static const CoordinatesMode mode = ROT3_DEFAULT_COORDINATES_MODE;
if (mode == Rot3::EXPMAP) return Expmap(omega, H); if (mode == Rot3::EXPMAP) return Expmap(omega, H);
if (mode == Rot3::CAYLEY) return CayleyChart::Retract(omega, H);
if (H) CONCEPT_NOT_IMPLEMENTED; else throw std::runtime_error("Rot3::Retract: unknown mode");
if(mode == Rot3::CAYLEY) {
return CayleyChart::Retract(omega);
} else {
assert(false);
exit(1);
}
} }
/* ************************************************************************* */ /* ************************************************************************* */
Vector3 Rot3::ChartAtOrigin::Local(const Rot3& R, ChartJacobian H) { Vector3 Rot3::ChartAtOrigin::Local(const Rot3& R, ChartJacobian H) {
static const CoordinatesMode mode = ROT3_DEFAULT_COORDINATES_MODE; static const CoordinatesMode mode = ROT3_DEFAULT_COORDINATES_MODE;
if (mode == Rot3::EXPMAP) return Logmap(R,H); if (mode == Rot3::EXPMAP) return Logmap(R, H);
if (mode == Rot3::CAYLEY) return CayleyChart::Local(R, H);
if (H) CONCEPT_NOT_IMPLEMENTED; else throw std::runtime_error("Rot3::Local: unknown mode");
if(mode == Rot3::CAYLEY) {
return CayleyChart::Local(R);
} else {
assert(false);
exit(1);
}
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -773,7 +773,7 @@ TEST(Pose2 , Traits) {
Pose2 t2(M_PI / 2.0, Point2(0.0, 2.0)); Pose2 t2(M_PI / 2.0, Point2(0.0, 2.0));
check_group_invariants(t1, t2); check_group_invariants(t1, t2);
check_manifold_invariants(t1, t2); check_manifold_invariants(t1, t2);
CHECK_LIE_GROUP_DERIVATIVES(t1,t2); CHECK_LIE_GROUP_DERIVATIVES(t1,t2,true);
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -28,8 +28,6 @@ using namespace boost::assign;
using namespace std; using namespace std;
using namespace gtsam; using namespace gtsam;
#define GTSAM_POSE3_EXPMAP
GTSAM_CONCEPT_TESTABLE_INST(Pose3) GTSAM_CONCEPT_TESTABLE_INST(Pose3)
GTSAM_CONCEPT_LIE_INST(Pose3) GTSAM_CONCEPT_LIE_INST(Pose3)
@ -463,16 +461,24 @@ TEST( Pose3, transformPose_to)
} }
/* ************************************************************************* */ /* ************************************************************************* */
#ifndef GTSAM_POSE3_EXPMAP TEST(Pose3, Retract_LocalCoordinates)
TEST(Pose3, localCoordinates_first_order)
{ {
Vector d12 = repeat(6,0.1); Vector6 d;
d << 1,2,3,4,5,6; d/=10;
R = Rot3::Retract(d.head<3>());
Pose3 t = Pose3::Retract(d);
EXPECT(assert_equal(d, Pose3::LocalCoordinates(t)));
}
/* ************************************************************************* */
TEST(Pose3, retract_localCoordinates)
{
Vector6 d12;
d12 << 1,2,3,4,5,6; d12/=10;
Pose3 t1 = T, t2 = t1.retract(d12); Pose3 t1 = T, t2 = t1.retract(d12);
EXPECT(assert_equal(d12, t1.localCoordinates(t2))); EXPECT(assert_equal(d12, t1.localCoordinates(t2)));
} }
#endif
/* ************************************************************************* */ /* ************************************************************************* */
TEST(Pose3, localCoordinates_expmap) TEST(Pose3, expmap_logmap)
{ {
Vector d12 = repeat(6,0.1); Vector d12 = repeat(6,0.1);
Pose3 t1 = T, t2 = t1.expmap(d12); Pose3 t1 = T, t2 = t1.expmap(d12);
@ -480,8 +486,7 @@ TEST(Pose3, localCoordinates_expmap)
} }
/* ************************************************************************* */ /* ************************************************************************* */
#ifndef GTSAM_POSE3_EXPMAP TEST(Pose3, retract_localCoordinates2)
TEST(Pose3, manifold_first_order)
{ {
Pose3 t1 = T; Pose3 t1 = T;
Pose3 t2 = T3; Pose3 t2 = T3;
@ -491,7 +496,6 @@ TEST(Pose3, manifold_first_order)
Vector d21 = t2.localCoordinates(t1); Vector d21 = t2.localCoordinates(t1);
EXPECT(assert_equal(t1, t2.retract(d21))); EXPECT(assert_equal(t1, t2.retract(d21)));
} }
#endif
/* ************************************************************************* */ /* ************************************************************************* */
TEST(Pose3, manifold_expmap) TEST(Pose3, manifold_expmap)
{ {
@ -678,9 +682,9 @@ TEST( Pose3, ExpmapDerivative1) {
Matrix6 actualH; Matrix6 actualH;
Vector6 w; w << 0.1, 0.2, 0.3, 4.0, 5.0, 6.0; Vector6 w; w << 0.1, 0.2, 0.3, 4.0, 5.0, 6.0;
Pose3::Expmap(w,actualH); Pose3::Expmap(w,actualH);
Matrix6 expectedH = numericalDerivative21<Pose3, Vector6, Matrix expectedH = numericalDerivative21<Pose3, Vector6,
OptionalJacobian<6, 6> >(&Pose3::Expmap, w, boost::none, 1e-2); OptionalJacobian<6, 6> >(&Pose3::Expmap, w, boost::none);
EXPECT(assert_equal(expectedH, actualH, 1e-5)); EXPECT(assert_equal(expectedH, actualH));
} }
/* ************************************************************************* */ /* ************************************************************************* */
@ -689,9 +693,9 @@ TEST( Pose3, LogmapDerivative1) {
Vector6 w; w << 0.1, 0.2, 0.3, 4.0, 5.0, 6.0; Vector6 w; w << 0.1, 0.2, 0.3, 4.0, 5.0, 6.0;
Pose3 p = Pose3::Expmap(w); Pose3 p = Pose3::Expmap(w);
EXPECT(assert_equal(w, Pose3::Logmap(p,actualH), 1e-5)); EXPECT(assert_equal(w, Pose3::Logmap(p,actualH), 1e-5));
Matrix6 expectedH = numericalDerivative21<Vector6, Pose3, Matrix expectedH = numericalDerivative21<Vector6, Pose3,
OptionalJacobian<6, 6> >(&Pose3::Logmap, p, boost::none, 1e-2); OptionalJacobian<6, 6> >(&Pose3::Logmap, p, boost::none);
EXPECT(assert_equal(expectedH, actualH, 1e-5)); EXPECT(assert_equal(expectedH, actualH));
} }
/* ************************************************************************* */ /* ************************************************************************* */
@ -745,7 +749,7 @@ TEST( Pose3, stream)
TEST(Pose3 , Traits) { TEST(Pose3 , Traits) {
check_group_invariants(T2,T3); check_group_invariants(T2,T3);
check_manifold_invariants(T2,T3); check_manifold_invariants(T2,T3);
CHECK_LIE_GROUP_DERIVATIVES(T2,T3); CHECK_LIE_GROUP_DERIVATIVES(T2,T3,false);
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -18,11 +18,10 @@
#include <gtsam/geometry/Point3.h> #include <gtsam/geometry/Point3.h>
#include <gtsam/geometry/Rot3.h> #include <gtsam/geometry/Rot3.h>
#include <gtsam/base/testLie.h>
#include <gtsam/base/Testable.h> #include <gtsam/base/Testable.h>
#include <gtsam/base/numericalDerivative.h> #include <gtsam/base/numericalDerivative.h>
#include <gtsam/base/lieProxies.h> #include <gtsam/base/lieProxies.h>
#include <gtsam/base/testLie.h>
//#include <gtsam/base/chartTesting.h>
#include <boost/math/constants/constants.hpp> #include <boost/math/constants/constants.hpp>
@ -220,6 +219,30 @@ TEST(Rot3, log)
CHECK_OMEGA_ZERO(x*2.*PI,y*2.*PI,z*2.*PI) CHECK_OMEGA_ZERO(x*2.*PI,y*2.*PI,z*2.*PI)
} }
/* ************************************************************************* */
TEST(Rot3, retract_localCoordinates)
{
Vector3 d12 = repeat(3,0.1);
Rot3 R2 = R.retract(d12);
EXPECT(assert_equal(d12, R.localCoordinates(R2)));
}
/* ************************************************************************* */
TEST(Rot3, expmap_logmap)
{
Vector3 d12 = repeat(3,0.1);
Rot3 R2 = R.expmap(d12);
EXPECT(assert_equal(d12, R.logmap(R2)));
}
/* ************************************************************************* */
TEST(Rot3, retract_localCoordinates2)
{
Rot3 t1 = R, t2 = R*R, origin;
Vector d12 = t1.localCoordinates(t2);
EXPECT(assert_equal(t2, t1.retract(d12)));
Vector d21 = t2.localCoordinates(t1);
EXPECT(assert_equal(t1, t2.retract(d21)));
}
/* ************************************************************************* */ /* ************************************************************************* */
Vector w = Vector3(0.1, 0.27, -0.2); Vector w = Vector3(0.1, 0.27, -0.2);
@ -634,39 +657,7 @@ TEST(Rot3 , Traits) {
Rot3 R2(Rot3::rodriguez(Vector3(0, 1, 0), 2)); Rot3 R2(Rot3::rodriguez(Vector3(0, 1, 0), 2));
check_group_invariants(R1, R2); check_group_invariants(R1, R2);
check_manifold_invariants(R1, R2); check_manifold_invariants(R1, R2);
CHECK_LIE_GROUP_DERIVATIVES(R1,R2,false);
Rot3 expected, actual;
Matrix actualH1, actualH2;
Matrix numericalH1, numericalH2;
expected = R1 * R2;
actual = traits_x<Rot3>::Compose(R1, R2, actualH1, actualH2);
EXPECT(assert_equal(expected,actual));
numericalH1 = numericalDerivative21(traits_x<Rot3>::Compose, R1, R2);
EXPECT(assert_equal(numericalH1,actualH1));
numericalH2 = numericalDerivative22(traits_x<Rot3>::Compose, R1, R2);
EXPECT(assert_equal(numericalH2,actualH2));
expected = R1.inverse() * R2;
actual = traits_x<Rot3>::Between(R1, R2, actualH1, actualH2);
EXPECT(assert_equal(expected,actual));
numericalH1 = numericalDerivative21(traits_x<Rot3>::Between, R1, R2);
EXPECT(assert_equal(numericalH1,actualH1));
numericalH2 = numericalDerivative22(traits_x<Rot3>::Between, R1, R2);
EXPECT(assert_equal(numericalH2,actualH2));
expected = R1.inverse();
actual = traits_x<Rot3>::Inverse(R1, actualH1);
EXPECT(assert_equal(expected,actual));
numericalH1 = numericalDerivative11(traits_x<Rot3>::Inverse, R1);
EXPECT(assert_equal(numericalH1,actualH1));
CHECK_LIE_GROUP_DERIVATIVES(R1,R2);
} }
/* ************************************************************************* */ /* ************************************************************************* */