121 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file    testRot2.cpp
 | |
|  * @brief   Unit tests for Rot2 class
 | |
|  * @author  Frank Dellaert
 | |
|  */
 | |
| 
 | |
| #include <CppUnitLite/TestHarness.h>
 | |
| #include "numericalDerivative.h"
 | |
| #include "Rot2.h"
 | |
| 
 | |
| using namespace gtsam;
 | |
| 
 | |
| Rot2 R(Rot2::fromAngle(0.1));
 | |
| Point2 P(0.2, 0.7);
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( Rot2, constructors_and_angle)
 | |
| {
 | |
| 	double c=cos(0.1), s=sin(0.1);
 | |
| 	DOUBLES_EQUAL(0.1,R.theta(),1e-9);
 | |
| 	CHECK(assert_equal(R,Rot2::fromCosSin(c,s)));
 | |
| 	CHECK(assert_equal(R,Rot2::atan2(s*5,c*5)));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( Rot2, transpose)
 | |
| {
 | |
| 	CHECK(assert_equal(inverse(R).matrix(),R.transpose()));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( Rot2, compose)
 | |
| {
 | |
| 	CHECK(assert_equal(Rot2::fromAngle(0.45), Rot2::fromAngle(0.2)*Rot2::fromAngle(0.25)));
 | |
| 	CHECK(assert_equal(Rot2::fromAngle(0.45), Rot2::fromAngle(0.25)*Rot2::fromAngle(0.2)));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( Rot2, equals)
 | |
| {
 | |
| 	CHECK(R.equals(R));
 | |
| 	Rot2 zero;
 | |
| 	CHECK(!R.equals(zero));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( Rot2, expmap)
 | |
| {
 | |
| 	Vector v = zero(1);
 | |
| 	CHECK(assert_equal(expmap(R,v), R));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST(Rot2, logmap)
 | |
| {
 | |
| 	Rot2 rot0(Rot2::fromAngle(M_PI_2));
 | |
| 	Rot2 rot(Rot2::fromAngle(M_PI));
 | |
| 	Vector expected = Vector_(1, M_PI_2);
 | |
| 	Vector actual = logmap(rot0, rot);
 | |
| 	CHECK(assert_equal(expected, actual));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| // rotate and derivatives
 | |
| inline Point2 rotate_(const Rot2 & R, const Point2& p) {return R.rotate(p);}
 | |
| TEST( Rot2, rotate)
 | |
| {
 | |
| 	Matrix H1, H2;
 | |
| 	Point2 actual = rotate(R, P, H1, H2);
 | |
| 	CHECK(assert_equal(actual,R*P));
 | |
| 	Matrix numerical1 = numericalDerivative21(rotate_, R, P);
 | |
| 	CHECK(assert_equal(numerical1,H1));
 | |
| 	Matrix numerical2 = numericalDerivative22(rotate_, R, P);
 | |
| 	CHECK(assert_equal(numerical2,H2));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| // unrotate and derivatives
 | |
| inline Point2 unrotate_(const Rot2 & R, const Point2& p) {return R.unrotate(p);}
 | |
| TEST( Rot2, unrotate)
 | |
| {
 | |
| 	Matrix H1, H2;
 | |
| 	Point2 w = R * P, actual = unrotate(R, w, H1, H2);
 | |
| 	CHECK(assert_equal(actual,P));
 | |
| 	Matrix numerical1 = numericalDerivative21(unrotate_, R, w);
 | |
| 	CHECK(assert_equal(numerical1,H1));
 | |
| 	Matrix numerical2 = numericalDerivative22(unrotate_, R, w);
 | |
| 	CHECK(assert_equal(numerical2,H2));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| TEST( Rot2, relativeBearing )
 | |
| {
 | |
| 	Point2 l1(1, 0), l2(1, 1);
 | |
| 	Matrix expectedH, actualH;
 | |
| 
 | |
| 	// establish relativeBearing is indeed zero
 | |
| 	Rot2 actual1 = relativeBearing(l1, actualH);
 | |
| 	CHECK(assert_equal(Rot2(),actual1));
 | |
| 
 | |
| 	// Check numerical derivative
 | |
| 	expectedH = numericalDerivative11(relativeBearing, l1, 1e-5);
 | |
| 	CHECK(assert_equal(expectedH,actualH));
 | |
| 
 | |
| 	// establish relativeBearing is indeed 45 degrees
 | |
| 	Rot2 actual2 = relativeBearing(l2, actualH);
 | |
| 	CHECK(assert_equal(Rot2::fromAngle(M_PI_4),actual2));
 | |
| 
 | |
| 	// Check numerical derivative
 | |
| 	expectedH = numericalDerivative11(relativeBearing, l2, 1e-5);
 | |
| 	CHECK(assert_equal(expectedH,actualH));
 | |
| }
 | |
| 
 | |
| /* ************************************************************************* */
 | |
| int main() {
 | |
| 	TestResult tr;
 | |
| 	return TestRegistry::runAllTests(tr);
 | |
| }
 | |
| /* ************************************************************************* */
 | |
| 
 |