| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file    testRot3.cpp | 
					
						
							|  |  |  |  * @brief   Unit tests for Rot3 class | 
					
						
							|  |  |  |  * @author  Alireza Fathi | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							| 
									
										
										
										
											2010-01-11 07:36:37 +08:00
										 |  |  | #include <boost/math/constants/constants.hpp>
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #include "numericalDerivative.h"
 | 
					
						
							| 
									
										
										
										
											2009-09-14 12:39:36 +08:00
										 |  |  | #include "Point3.h"
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #include "Rot3.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Rot3 R = rodriguez(0.1,0.4,0.2); | 
					
						
							|  |  |  | Point3 P(0.2,0.7,-2.0); | 
					
						
							|  |  |  | double error = 1e-9, epsilon=0.001; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, constructor) { | 
					
						
							|  |  |  |   Rot3 expected(eye(3,3)); | 
					
						
							|  |  |  |   Vector r1(3), r2(3), r3(3); | 
					
						
							|  |  |  |   r1(0)=1;r1(1)=0;r1(2)=0; | 
					
						
							|  |  |  |   r2(0)=0;r2(1)=1;r2(2)=0; | 
					
						
							|  |  |  |   r3(0)=0;r3(1)=0;r3(2)=1; | 
					
						
							|  |  |  |   Rot3 actual(r1,r2,r3); | 
					
						
							|  |  |  |   CHECK(assert_equal(actual,expected)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, constructor2) { | 
					
						
							|  |  |  |   Matrix R = Matrix_(3,3, | 
					
						
							|  |  |  | 		       11.,12.,13., | 
					
						
							|  |  |  | 		       21.,22.,23., | 
					
						
							|  |  |  | 		       31.,32.,33.); | 
					
						
							|  |  |  |   Rot3 actual(R); | 
					
						
							|  |  |  |   Rot3 expected(11,12,13, | 
					
						
							|  |  |  | 		21,22,23, | 
					
						
							|  |  |  | 		31,32,33); | 
					
						
							|  |  |  |   CHECK(assert_equal(actual,expected)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-14 12:39:36 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, constructor3) { | 
					
						
							|  |  |  |   Rot3 expected(1,2,3,4,5,6,7,8,9); | 
					
						
							|  |  |  |   Point3 r1(1,4,7), r2(2,5,8), r3(3,6,9); | 
					
						
							|  |  |  |   CHECK(assert_equal(Rot3(r1,r2,r3),expected)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, transpose) { | 
					
						
							|  |  |  |   Rot3 R(1,2,3,4,5,6,7,8,9); | 
					
						
							|  |  |  |   Point3 r1(1,2,3), r2(4,5,6), r3(7,8,9); | 
					
						
							| 
									
										
										
										
											2010-01-08 08:40:17 +08:00
										 |  |  |   CHECK(assert_equal(inverse(R),Rot3(r1,r2,r3))); | 
					
						
							| 
									
										
										
										
											2009-09-14 12:39:36 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, equals) { | 
					
						
							|  |  |  |   CHECK(R.equals(R)); | 
					
						
							|  |  |  |   Rot3 zero; | 
					
						
							|  |  |  |   CHECK(!R.equals(zero)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-02 22:28:18 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | Rot3 slow_but_correct_rodriguez(const Vector& w) { | 
					
						
							|  |  |  | 	double t = norm_2(w); | 
					
						
							|  |  |  | 	Matrix J = skewSymmetric(w/t); | 
					
						
							|  |  |  | 	if (t < 1e-5) return Rot3(); | 
					
						
							|  |  |  | 	Matrix R = eye(3, 3) + sin(t) * J + (1.0 - cos(t)) * (J * J); | 
					
						
							|  |  |  | 	return R; // matrix constructor will be tripped
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, rodriguez) { | 
					
						
							| 
									
										
										
										
											2010-01-02 22:28:18 +08:00
										 |  |  |   Rot3 R1 = rodriguez(epsilon, 0, 0); | 
					
						
							|  |  |  |   Vector w = Vector_(3,epsilon,0.,0.); | 
					
						
							|  |  |  |   Rot3 R2 = slow_but_correct_rodriguez(w); | 
					
						
							|  |  |  |   CHECK(assert_equal(R1,R2)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-04 01:43:02 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, rodriguez2) { | 
					
						
							|  |  |  |   Vector v(3); v(0) = 0; v(1) = 1; v(2) = 0; | 
					
						
							| 
									
										
										
										
											2010-01-02 22:28:18 +08:00
										 |  |  |   Rot3 R1 = rodriguez(v, 3.14/4.0); | 
					
						
							|  |  |  |   Rot3 R2(0.707388,0,0.706825, | 
					
						
							|  |  |  |   		0,1,0, | 
					
						
							|  |  |  |   		-0.706825,0,0.707388); | 
					
						
							|  |  |  |   CHECK(assert_equal(R1,R2,1e-5)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, rodriguez3) { | 
					
						
							|  |  |  |   Vector w = Vector_(3,0.1,0.2,0.3); | 
					
						
							|  |  |  |   Rot3 R1 = rodriguez(w/norm_2(w), norm_2(w)); | 
					
						
							|  |  |  |   Rot3 R2 = slow_but_correct_rodriguez(w); | 
					
						
							|  |  |  |   CHECK(assert_equal(R1,R2)); | 
					
						
							| 
									
										
										
										
											2009-09-04 01:43:02 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 23:52:43 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-08 08:40:17 +08:00
										 |  |  | TEST( Rot3, expmap) | 
					
						
							| 
									
										
										
										
											2010-01-07 03:29:41 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-08 08:40:17 +08:00
										 |  |  |   Vector v(3); | 
					
						
							|  |  |  |   fill(v.begin(), v.end(), 0); | 
					
						
							|  |  |  |   CHECK(assert_equal(expmap(R,v), R)); | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST(Rot3, log) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Vector w1 = Vector_(3, 0.1, 0.0, 0.0); | 
					
						
							|  |  |  | 	Rot3 R1 = rodriguez(w1); | 
					
						
							|  |  |  | 	CHECK(assert_equal(w1, logmap(R1))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector w2 = Vector_(3, 0.0, 0.1, 0.0); | 
					
						
							|  |  |  | 	Rot3 R2 = rodriguez(w2); | 
					
						
							|  |  |  | 	CHECK(assert_equal(w2, logmap(R2))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector w3 = Vector_(3, 0.0, 0.0, 0.1); | 
					
						
							|  |  |  | 	Rot3 R3 = rodriguez(w3); | 
					
						
							|  |  |  | 	CHECK(assert_equal(w3, logmap(R3))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Vector w = Vector_(3, 0.1, 0.4, 0.2); | 
					
						
							|  |  |  | 	Rot3 R = rodriguez(w); | 
					
						
							|  |  |  | 	CHECK(assert_equal(w, logmap(R))); | 
					
						
							| 
									
										
										
										
											2010-01-11 06:58:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Vector w5 = Vector_(3, 0.0, 0.0, 0.0); | 
					
						
							|  |  |  | 	Rot3 R5 = rodriguez(w5); | 
					
						
							|  |  |  | 	CHECK(assert_equal(w5, logmap(R5))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-11 07:36:37 +08:00
										 |  |  | 	Vector w6 = Vector_(3, boost::math::constants::pi<double>(), 0.0, 0.0); | 
					
						
							|  |  |  | 	Rot3 R6 = rodriguez(w6); | 
					
						
							|  |  |  | 	CHECK(assert_equal(w6, logmap(R6))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Vector w7 = Vector_(3, 0.0, boost::math::constants::pi<double>(), 0.0); | 
					
						
							|  |  |  |     Rot3 R7 = rodriguez(w7); | 
					
						
							|  |  |  |     CHECK(assert_equal(w7, logmap(R7))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Vector w8 = Vector_(3, 0.0, 0.0, boost::math::constants::pi<double>()); | 
					
						
							|  |  |  |     Rot3 R8 = rodriguez(w8); | 
					
						
							|  |  |  |     CHECK(assert_equal(w8, logmap(R8))); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | 	TEST(Rot3, manifold) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Rot3 t1 = rodriguez(0.1, 0.4, 0.2); | 
					
						
							|  |  |  | 	Rot3 t2 = rodriguez(0.3, 0.1, 0.7); | 
					
						
							|  |  |  | 	Rot3 origin; | 
					
						
							| 
									
										
										
										
											2010-01-10 20:25:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// log behaves correctly
 | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | 	Vector d12 = logmap(t1, t2); | 
					
						
							|  |  |  | 	CHECK(assert_equal(t2, expmap(t1,d12))); | 
					
						
							|  |  |  | 	CHECK(assert_equal(t2, expmap<Rot3>(d12)*t1)); | 
					
						
							|  |  |  | 	Vector d21 = logmap(t2, t1); | 
					
						
							|  |  |  | 	CHECK(assert_equal(t1, expmap(t2,d21))); | 
					
						
							|  |  |  | 	CHECK(assert_equal(t1, expmap<Rot3>(d21)*t2)); | 
					
						
							| 
									
										
										
										
											2010-01-10 20:25:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check that log(t1,t2)=-log(t2,t1)
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(d12,-d21)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// lines in canonical coordinates correspond to Abelian subgroups in SO(3)
 | 
					
						
							|  |  |  | 	Vector d = Vector_(3,0.1,0.2,0.3); | 
					
						
							|  |  |  | 	// exp(-d)=inverse(exp(d))
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(expmap<Rot3>(-d),inverse(expmap<Rot3>(d)))); | 
					
						
							|  |  |  | 	// exp(5d)=exp(2*d+3*d)=exp(2*d)exp(3*d)=exp(3*d)exp(2*d)
 | 
					
						
							|  |  |  | 	Rot3 R2 = expmap<Rot3>(2*d); | 
					
						
							|  |  |  | 	Rot3 R3 = expmap<Rot3>(3*d); | 
					
						
							|  |  |  | 	Rot3 R5 = expmap<Rot3>(5*d); | 
					
						
							|  |  |  | 	CHECK(assert_equal(R5,R2*R3)); | 
					
						
							|  |  |  | 	CHECK(assert_equal(R5,R3*R2)); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // rotate derivatives
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST( Rot3, Drotate1) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Matrix computed = Drotate1(R, P); | 
					
						
							|  |  |  |   Matrix numerical = numericalDerivative21(rotate,R,P); | 
					
						
							|  |  |  |   CHECK(assert_equal(numerical,computed,error)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 08:40:17 +08:00
										 |  |  | TEST( Rot3, Drotate1_) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   Matrix computed = Drotate1(inverse(R), P); | 
					
						
							|  |  |  |   Matrix numerical = numericalDerivative21(rotate,inverse(R),P); | 
					
						
							|  |  |  |   CHECK(assert_equal(numerical,computed,error)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | TEST( Rot3, Drotate2_DNrotate2) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Matrix computed = Drotate2(R); | 
					
						
							|  |  |  |   Matrix numerical = numericalDerivative22(rotate,R,P); | 
					
						
							|  |  |  |   CHECK(assert_equal(numerical,computed,error)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, unrotate) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Point3 w = R*P; | 
					
						
							|  |  |  |   CHECK(assert_equal(unrotate(R,w),P)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | // unrotate derivatives
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST( Rot3, Dunrotate1) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Matrix computed = Dunrotate1(R, P); | 
					
						
							|  |  |  |   Matrix numerical = numericalDerivative21(unrotate,R,P); | 
					
						
							|  |  |  |   CHECK(assert_equal(numerical,computed,error)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST( Rot3, Dunrotate2_DNunrotate2) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   Matrix computed = Dunrotate2(R); | 
					
						
							|  |  |  |   Matrix numerical = numericalDerivative22(unrotate,R,P); | 
					
						
							|  |  |  |   CHECK(assert_equal(numerical,computed,error)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 23:52:43 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2010-01-08 08:40:17 +08:00
										 |  |  | TEST( Rot3, compose ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Rot3 R1 = rodriguez(0.1, 0.2, 0.3); | 
					
						
							|  |  |  | 	Rot3 R2 = rodriguez(0.2, 0.3, 0.5); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Rot3 expected = R1*R2; | 
					
						
							|  |  |  | 	Rot3 actual = compose(R1, R2); | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected,actual)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Matrix numericalH1 = numericalDerivative21<Rot3,Rot3,Rot3>(compose, R1, R2, 1e-5); | 
					
						
							|  |  |  | 	Matrix actualH1 = Dcompose1(R1, R2); | 
					
						
							|  |  |  | 	CHECK(assert_equal(numericalH1,actualH1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Matrix actualH2 = Dcompose2(R1, R2); | 
					
						
							|  |  |  | 	Matrix numericalH2 = numericalDerivative22<Rot3,Rot3,Rot3>(compose, R1, R2, 1e-5); | 
					
						
							|  |  |  | 	CHECK(assert_equal(numericalH2,actualH2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, between ) | 
					
						
							| 
									
										
										
										
											2010-01-06 23:52:43 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | 	Rot3 R = rodriguez(0.1, 0.4, 0.2); | 
					
						
							|  |  |  | 	Rot3 origin; | 
					
						
							|  |  |  | 	CHECK(assert_equal(R, between(origin,R))); | 
					
						
							|  |  |  | 	CHECK(assert_equal(inverse(R), between(R,origin))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 08:40:17 +08:00
										 |  |  | 	Rot3 R1 = rodriguez(0.1, 0.2, 0.3); | 
					
						
							|  |  |  | 	Rot3 R2 = rodriguez(0.2, 0.3, 0.5); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Rot3 expected = R2*inverse(R1); | 
					
						
							|  |  |  | 	Rot3 actual = between(R1, R2); | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected,actual)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Matrix numericalH1 = numericalDerivative21(between<Rot3> , R1, R2, 1e-5); | 
					
						
							|  |  |  | 	Matrix actualH1 = Dbetween1(R1, R2); | 
					
						
							|  |  |  | 	CHECK(assert_equal(numericalH1,actualH1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Matrix actualH2 = Dbetween2(R1, R2); | 
					
						
							|  |  |  | 	Matrix numericalH2 = numericalDerivative22(between<Rot3> , R1, R2, 1e-5); | 
					
						
							|  |  |  | 	CHECK(assert_equal(numericalH2,actualH2)); | 
					
						
							| 
									
										
										
										
											2010-01-06 23:52:43 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, xyz ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double t = 0.1, st = sin(t), ct = cos(t); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-10 20:25:46 +08:00
										 |  |  | 	// Make sure all counterclockwise
 | 
					
						
							|  |  |  | 	// Diagrams below are all from from unchanging axis
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// z
 | 
					
						
							|  |  |  | 	// |   * Y=(ct,st)
 | 
					
						
							|  |  |  | 	// x----y
 | 
					
						
							|  |  |  | 	Rot3 expected1( | 
					
						
							|  |  |  | 			1,  0,  0, | 
					
						
							|  |  |  | 			0, ct,-st, | 
					
						
							|  |  |  | 			0, st, ct); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | 	CHECK(assert_equal(expected1,Rot3::Rx(t))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-10 20:25:46 +08:00
										 |  |  | 	// x
 | 
					
						
							|  |  |  | 	// |   * Z=(ct,st)
 | 
					
						
							|  |  |  | 	// y----z
 | 
					
						
							|  |  |  | 	Rot3 expected2( | 
					
						
							|  |  |  | 			 ct, 0, st, | 
					
						
							|  |  |  | 			  0, 1,  0, | 
					
						
							|  |  |  | 			-st, 0, ct); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | 	CHECK(assert_equal(expected2,Rot3::Ry(t))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-10 20:25:46 +08:00
										 |  |  | 	// y
 | 
					
						
							|  |  |  | 	// |   X=* (ct,st)
 | 
					
						
							|  |  |  | 	// z----x
 | 
					
						
							|  |  |  | 	Rot3 expected3( | 
					
						
							|  |  |  | 			ct, -st, 0, | 
					
						
							|  |  |  | 			st,  ct, 0, | 
					
						
							|  |  |  | 			 0,  0,  1); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | 	CHECK(assert_equal(expected3,Rot3::Rz(t))); | 
					
						
							| 
									
										
										
										
											2010-01-10 20:25:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check compound rotation
 | 
					
						
							|  |  |  | 	Rot3 expected = Rot3::Rz(0.3)*Rot3::Ry(0.2)*Rot3::Rx(0.1); | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected,Rot3::RzRyRx(0.1,0.2,0.3))); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, yaw_pitch_roll ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	double t = 0.1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// yaw is around z axis
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(Rot3::Rz(t),Rot3::yaw(t))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// pitch is around y axis
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(Rot3::Ry(t),Rot3::pitch(t))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// roll is around x axis
 | 
					
						
							|  |  |  | 	CHECK(assert_equal(Rot3::Rx(t),Rot3::roll(t))); | 
					
						
							| 
									
										
										
										
											2010-01-10 20:25:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Check compound rotation
 | 
					
						
							|  |  |  | 	Rot3 expected = Rot3::yaw(0.1)*Rot3::pitch(0.2)*Rot3::roll(0.3); | 
					
						
							|  |  |  | 	CHECK(assert_equal(expected,Rot3::ypr(0.1,0.2,0.3))); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | TEST( Rot3, RQ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// Try RQ on a pure rotation
 | 
					
						
							|  |  |  | 	Matrix actualK; Vector actual; | 
					
						
							|  |  |  |   boost::tie(actualK,actual) = RQ(R.matrix()); | 
					
						
							|  |  |  |   Vector expected = Vector_(3,0.14715, 0.385821, 0.231671); | 
					
						
							|  |  |  |   CHECK(assert_equal(eye(3),actualK)); | 
					
						
							|  |  |  |   CHECK(assert_equal(expected,actual,1e-6)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 10:27:49 +08:00
										 |  |  |   // Try using xyz call, asserting that Rot3::RzRyRx(x,y,z).xyz()==[x;y;z]
 | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  |   CHECK(assert_equal(expected,R.xyz(),1e-6)); | 
					
						
							| 
									
										
										
										
											2010-01-09 10:27:49 +08:00
										 |  |  |   CHECK(assert_equal(Vector_(3,0.1,0.2,0.3),Rot3::RzRyRx(0.1,0.2,0.3).xyz())); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-09 10:27:49 +08:00
										 |  |  |   // Try using ypr call, asserting that Rot3::ypr(y,p,r).ypr()==[y;p;r]
 | 
					
						
							|  |  |  |   CHECK(assert_equal(Vector_(3,0.1,0.2,0.3),Rot3::ypr(0.1,0.2,0.3).ypr())); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Try ypr for pure yaw-pitch-roll matrices
 | 
					
						
							| 
									
										
										
										
											2010-01-09 10:27:49 +08:00
										 |  |  |   CHECK(assert_equal(Vector_(3,0.1,0.0,0.0),Rot3::yaw  (0.1).ypr())); | 
					
						
							|  |  |  |   CHECK(assert_equal(Vector_(3,0.0,0.1,0.0),Rot3::pitch(0.1).ypr())); | 
					
						
							|  |  |  |   CHECK(assert_equal(Vector_(3,0.0,0.0,0.1),Rot3::roll (0.1).ypr())); | 
					
						
							| 
									
										
										
										
											2010-01-09 08:03:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Try RQ to recover calibration from 3*3 sub-block of projection matrix
 | 
					
						
							|  |  |  | 	Matrix K = Matrix_(3,3, | 
					
						
							|  |  |  | 			500.0,   0.0, 320.0, | 
					
						
							|  |  |  | 			  0.0, 500.0, 240.0, | 
					
						
							|  |  |  | 			  0.0,   0.0,   1.0 | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 	Matrix A = K*R.matrix(); | 
					
						
							|  |  |  |   boost::tie(actualK,actual) = RQ(A); | 
					
						
							|  |  |  |   CHECK(assert_equal(K,actualK)); | 
					
						
							|  |  |  |   CHECK(assert_equal(expected,actual,1e-6)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main(){ TestResult tr; return TestRegistry::runAllTests(tr); } | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | 
 |