207 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			207 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
|  | /**
 | ||
|  |  * @file   testPose3.cpp | ||
|  |  * @brief  Unit tests for Pose3 class | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | #include <CppUnitLite/TestHarness.h>
 | ||
|  | #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);} | ||
|  | /* ************************************************************************* */ | ||
|  | 
 |