| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  |  * @file    testBiasedGPSFactor.cpp | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  |  * @brief   | 
					
						
							|  |  |  |  * @author Luca Carlone | 
					
						
							|  |  |  |  * @date   July 30, 2014 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <gtsam/base/numericalDerivative.h>
 | 
					
						
							|  |  |  | #include <gtsam/geometry/Pose3.h>
 | 
					
						
							|  |  |  | #include <gtsam/inference/Symbol.h>
 | 
					
						
							| 
									
										
										
										
											2014-10-07 01:11:27 +08:00
										 |  |  | #include <gtsam_unstable/slam/BiasedGPSFactor.h>
 | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  | #include <CppUnitLite/TestHarness.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace gtsam; | 
					
						
							|  |  |  | using namespace gtsam::symbol_shorthand; | 
					
						
							|  |  |  | using namespace gtsam::noiseModel; | 
					
						
							|  |  |  | // Convenience for named keys
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using symbol_shorthand::X; | 
					
						
							|  |  |  | using symbol_shorthand::B; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  | TEST(BiasedGPSFactor, errorNoiseless) { | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Rot3 R = Rot3::rodriguez(0.1, 0.2, 0.3); | 
					
						
							|  |  |  |   Point3 t(1.0, 0.5, 0.2); | 
					
						
							|  |  |  |   Pose3 pose(R,t); | 
					
						
							|  |  |  |   Point3 bias(0.0,0.0,0.0); | 
					
						
							|  |  |  |   Point3 noise(0.0,0.0,0.0); | 
					
						
							|  |  |  |   Point3 measured = t + noise; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  |   BiasedGPSFactor factor(X(1), B(1), measured, Isotropic::Sigma(3, 0.05)); | 
					
						
							| 
									
										
										
										
											2014-11-24 02:22:25 +08:00
										 |  |  |   Vector expectedError = Vector3(0.0, 0.0, 0.0 ); | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  |   Vector actualError = factor.evaluateError(pose,bias); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expectedError,actualError, 1E-5)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  | TEST(BiasedGPSFactor, errorNoisy) { | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Rot3 R = Rot3::rodriguez(0.1, 0.2, 0.3); | 
					
						
							|  |  |  |   Point3 t(1.0, 0.5, 0.2); | 
					
						
							|  |  |  |   Pose3 pose(R,t); | 
					
						
							|  |  |  |   Point3 bias(0.0,0.0,0.0); | 
					
						
							|  |  |  |   Point3 noise(1.0,2.0,3.0); | 
					
						
							|  |  |  |   Point3 measured = t - noise; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  |   BiasedGPSFactor factor(X(1), B(1), measured, Isotropic::Sigma(3, 0.05)); | 
					
						
							| 
									
										
										
										
											2014-11-24 02:22:25 +08:00
										 |  |  |   Vector expectedError = Vector3(1.0, 2.0, 3.0 ); | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  |   Vector actualError = factor.evaluateError(pose,bias); | 
					
						
							|  |  |  |   EXPECT(assert_equal(expectedError,actualError, 1E-5)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  | TEST(BiasedGPSFactor, jacobian) { | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Rot3 R = Rot3::rodriguez(0.1, 0.2, 0.3); | 
					
						
							|  |  |  |   Point3 t(1.0, 0.5, 0.2); | 
					
						
							|  |  |  |   Pose3 pose(R,t); | 
					
						
							|  |  |  |   Point3 bias(0.0,0.0,0.0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Point3 noise(0.0,0.0,0.0); | 
					
						
							|  |  |  |   Point3 measured = t + noise; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  |   BiasedGPSFactor factor(X(1), B(1), measured, Isotropic::Sigma(3, 0.05)); | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Matrix actualH1, actualH2; | 
					
						
							|  |  |  |   factor.evaluateError(pose,bias, actualH1, actualH2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Matrix numericalH1 = numericalDerivative21( | 
					
						
							|  |  |  |       boost::function<Vector(const Pose3&, const Point3&)>(boost::bind( | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  |           &BiasedGPSFactor::evaluateError, factor, _1, _2, boost::none, | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  |           boost::none)), pose, bias, 1e-5); | 
					
						
							|  |  |  |   EXPECT(assert_equal(numericalH1,actualH1, 1E-5)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Matrix numericalH2 = numericalDerivative22( | 
					
						
							|  |  |  |       boost::function<Vector(const Pose3&, const Point3&)>(boost::bind( | 
					
						
							| 
									
										
										
										
											2014-09-11 03:30:06 +08:00
										 |  |  |           &BiasedGPSFactor::evaluateError, factor, _1, _2, boost::none, | 
					
						
							| 
									
										
										
										
											2014-07-31 02:43:24 +08:00
										 |  |  |           boost::none)), pose, bias, 1e-5); | 
					
						
							|  |  |  |   EXPECT(assert_equal(numericalH2,actualH2, 1E-5)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | int main() { | 
					
						
							|  |  |  |   TestResult tr; | 
					
						
							|  |  |  |   return TestRegistry::runAllTests(tr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | /* ************************************************************************* */ |