/** * @file testPose3.cpp * @brief Unit tests for Pose3 class */ #include #include "numericalDerivative.h" #include "Pose3.h" using namespace gtsam; Rot3 R = rodriguez(0.3,0,0); Point3 t(3.5,-8.2,4.2); Pose3 T(R,t); Point3 P(0.2,0.7,-2); Rot3 r1 = rodriguez(-90, 0, 0); Pose3 pose1(r1, Point3(1, 2, 3)); double error = 1e-9; #define PI 3.14159265358979323846 /* ************************************************************************* */ TEST( Pose3, equals) { Pose3 pose2 = pose1; CHECK(pose1.equals(pose2)); Pose3 origin; CHECK(!pose1.equals(origin)); } /* ************************************************************************* */ TEST( Pose3, exmap) { Pose3 id; Vector v(6); fill(v.begin(), v.end(), 0); v(0) = 0.3; CHECK(assert_equal(id.exmap(v), Pose3(R, Point3()))); v(3)=0.2;v(4)=0.7;v(5)=-2; CHECK(assert_equal(id.exmap(v), Pose3(R, P))); } /* ************************************************************************* */ TEST( Pose3, compose ) { Matrix actual = (T*T).matrix(); Matrix expected = T.matrix()*T.matrix(); CHECK(assert_equal(actual,expected,error)); } /* ************************************************************************* */ TEST( Pose3, inverse) { Matrix actual = T.inverse().matrix(); Matrix expected = inverse(T.matrix()); CHECK(assert_equal(actual,expected,error)); } /* ************************************************************************* */ TEST( Pose3, compose_inverse) { Matrix actual = (T*T.inverse()).matrix(); Matrix expected = eye(4,4); CHECK(assert_equal(actual,expected,error)); } /* ************************************************************************* */ // transform derivatives TEST( Pose3, Dtransform_from1) { Matrix computed = Dtransform_from1(T, P); Matrix numerical = numericalDerivative21(transform_from,T,P); CHECK(assert_equal(numerical,computed,error)); } TEST( Pose3, Dtransform_from2) { Matrix computed = Dtransform_from2(T); Matrix numerical = numericalDerivative22(transform_from,T,P); CHECK(assert_equal(numerical,computed,error)); } TEST( Pose3, Dtransform_to1) { Matrix computed = Dtransform_to1(T, P); Matrix numerical = numericalDerivative21(transform_to,T,P); CHECK(assert_equal(numerical,computed,error)); } TEST( Pose3, Dtransform_to2) { Matrix computed = Dtransform_to2(T); Matrix numerical = numericalDerivative22(transform_to,T,P); CHECK(assert_equal(numerical,computed,error)); } /* ************************************************************************* */ TEST( Pose3, transform_to_translate) { Point3 actual = transform_to(Pose3(Rot3(), Point3(1, 2, 3)), Point3(10.,20.,30.)); Point3 expected(9.,18.,27.); CHECK(assert_equal(expected, actual)); } TEST( Pose3, transform_to_rotate) { Pose3 transform(rodriguez(0,0,-1.570796), Point3()); Point3 actual = transform_to(transform, Point3(2,1,10)); Point3 expected(-1,2,10); CHECK(assert_equal(expected, actual, 0.001)); } TEST( Pose3, transform_to) { Pose3 transform(rodriguez(0,0,-1.570796), Point3(2,4, 0)); Point3 actual = transform_to(transform, Point3(3,2,10)); Point3 expected(2,1,10); CHECK(assert_equal(expected, actual, 0.001)); } /* ************************************************************************* */ TEST( Pose3, transform_from) { Point3 actual = transform_from(pose1, Point3()); Point3 expected = Point3(1.,2.,3.); CHECK(assert_equal(expected, actual)); } /* ************************************************************************* */ TEST( Pose3, transform_roundtrip) { Point3 actual = transform_from(pose1, transform_to(pose1, Point3(12., -0.11,7.0))); Point3 expected(12., -0.11,7.0); CHECK(assert_equal(expected, actual)); } /* ************************************************************************* */ TEST( Pose3, transformPose_to_origin) { // transform to origin Pose3 actual = pose1.transformPose_to(Pose3()); CHECK(assert_equal(pose1, actual, error)); } TEST( Pose3, transformPose_to_itself) { // transform to itself Pose3 actual = pose1.transformPose_to(pose1); CHECK(assert_equal(Pose3(), actual, error)); } TEST( Pose3, transformPose_to_translation) { // transform translation only Rot3 r = rodriguez(-1.570796,0,0); Pose3 pose2(r, Point3(21.,32.,13.)); Pose3 actual = pose2.transformPose_to(Pose3(Rot3(), Point3(1,2,3))); Pose3 expected(r, Point3(20.,30.,10.)); CHECK(assert_equal(expected, actual, error)); } TEST( Pose3, transformPose_to_simple_rotate) { // transform translation only Rot3 r = rodriguez(0,0,-1.570796); Pose3 pose2(r, Point3(21.,32.,13.)); Pose3 transform(r, Point3(1,2,3)); Pose3 actual = pose2.transformPose_to(transform); Pose3 expected(Rot3(), Point3(-30.,20.,10.)); CHECK(assert_equal(expected, actual, 0.001)); } TEST( Pose3, transformPose_to) { // transform to Rot3 r = rodriguez(0,0,-1.570796); //-90 degree yaw Rot3 r2 = rodriguez(0,0,0.698131701); //40 degree yaw Pose3 pose2(r2, Point3(21.,32.,13.)); Pose3 transform(r, Point3(1,2,3)); Pose3 actual = pose2.transformPose_to(transform); Pose3 expected(rodriguez(0,0,2.26892803), Point3(-30.,20.,10.)); CHECK(assert_equal(expected, actual, 0.001)); } /* ************************************************************************* */ TEST( Pose3, composeTransform ) { // known transform Rot3 r = rodriguez(0,0,-1.570796); Pose3 exp_transform(r, Point3(1,2,3)); // current Rot3 r2 = rodriguez(0,0,0.698131701); Pose3 current(r2, Point3(21.,32.,13.)); // target Pose3 target(rodriguez(0,0,2.26892803), Point3(-30.,20.,10.)); // calculate transform Pose3 actual = composeTransform(current, target); //verify CHECK(assert_equal(exp_transform, actual, 0.001)); } /* ************************************************************************* */ int main(){ TestResult tr; return TestRegistry::runAllTests(tr);} /* ************************************************************************* */