| 
									
										
										
										
											2010-10-14 12:54:38 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation,  | 
					
						
							|  |  |  |  * Atlanta, Georgia 30332-0415 | 
					
						
							|  |  |  |  * All Rights Reserved | 
					
						
							|  |  |  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * See LICENSE for the license information | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * -------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-08 03:09:14 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file    simulated2D.h | 
					
						
							|  |  |  |  * @brief   measurement functions and derivatives for simulated 2D robot | 
					
						
							|  |  |  |  * @author  Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // \callgraph
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/geometry/Pose2.h>
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:55 +08:00
										 |  |  | #include <gtsam/nonlinear/TupleValues.h>
 | 
					
						
							| 
									
										
										
										
											2010-08-20 01:23:19 +08:00
										 |  |  | #include <gtsam/nonlinear/NonlinearFactor.h>
 | 
					
						
							| 
									
										
										
										
											2010-04-08 03:09:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | // \namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	namespace simulated2DOriented { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// The types that take an oriented pose2 rather than point2
 | 
					
						
							|  |  |  | 		typedef TypedSymbol<Point2, 'l'> PointKey; | 
					
						
							|  |  |  | 		typedef TypedSymbol<Pose2,  'x'> PoseKey; | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		typedef LieValues<PoseKey> PoseValues; | 
					
						
							|  |  |  | 		typedef LieValues<PointKey> PointValues; | 
					
						
							|  |  |  | 		typedef TupleValues2<PoseValues, PointValues> Values; | 
					
						
							| 
									
										
										
										
											2010-04-08 03:09:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		//TODO:: point prior is not implemented right now
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Prior on a single pose, and optional derivative version | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		inline Pose2 prior(const Pose2& x) { | 
					
						
							|  |  |  | 			return x; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		Pose2 prior(const Pose2& x, boost::optional<Matrix&> H = boost::none); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-08 05:27:16 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * odometry between two poses, and optional derivative version | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		inline Pose2 odo(const Pose2& x1, const Pose2& x2) { | 
					
						
							| 
									
										
										
										
											2010-08-27 03:55:40 +08:00
										 |  |  | 			return x1.between(x2); | 
					
						
							| 
									
										
										
										
											2010-04-08 05:27:16 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		Pose2 odo(const Pose2& x1, const Pose2& x2, boost::optional<Matrix&> H1 = | 
					
						
							|  |  |  | 				boost::none, boost::optional<Matrix&> H2 = boost::none); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-08 03:09:14 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Unary factor encoding a soft prior on a vector | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2010-10-22 02:02:17 +08:00
										 |  |  | 		template<class CFG = Values, class Key = PoseKey> | 
					
						
							|  |  |  | 		struct GenericPosePrior: public NonlinearFactor1<CFG, Key> { | 
					
						
							| 
									
										
										
										
											2010-04-08 03:09:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			Pose2 z_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			GenericPosePrior(const Pose2& z, const SharedGaussian& model, const Key& key) : | 
					
						
							| 
									
										
										
										
											2010-10-22 02:02:17 +08:00
										 |  |  | 				NonlinearFactor1<CFG, Key> (model, key), z_(z) { | 
					
						
							| 
									
										
										
										
											2010-04-08 03:09:14 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Vector evaluateError(const Pose2& x, boost::optional<Matrix&> H = | 
					
						
							|  |  |  | 					boost::none) const { | 
					
						
							| 
									
										
										
										
											2010-08-27 03:55:40 +08:00
										 |  |  | 				return z_.logmap(prior(x, H)); | 
					
						
							| 
									
										
										
										
											2010-04-08 03:09:14 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-08 05:27:16 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * Binary factor simulating "odometry" between two Vectors | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2010-10-22 02:02:17 +08:00
										 |  |  | 		template<class CFG = Values, class KEY = PoseKey> | 
					
						
							|  |  |  | 		struct GenericOdometry: public NonlinearFactor2<CFG, KEY, KEY> { | 
					
						
							| 
									
										
										
										
											2010-04-08 05:27:16 +08:00
										 |  |  | 			Pose2 z_; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			GenericOdometry(const Pose2& z, const SharedGaussian& model, | 
					
						
							| 
									
										
										
										
											2010-10-22 02:02:17 +08:00
										 |  |  | 					const KEY& i1, const KEY& i2) : | 
					
						
							|  |  |  | 				NonlinearFactor2<CFG, KEY, KEY> (model, i1, i2), z_(z) { | 
					
						
							| 
									
										
										
										
											2010-04-08 05:27:16 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Vector evaluateError(const Pose2& x1, const Pose2& x2, boost::optional< | 
					
						
							|  |  |  | 					Matrix&> H1 = boost::none, boost::optional<Matrix&> H2 = boost::none) const { | 
					
						
							| 
									
										
										
										
											2010-08-27 03:55:40 +08:00
										 |  |  | 				return z_.logmap(odo(x1, x2, H1, H2)); | 
					
						
							| 
									
										
										
										
											2010-04-08 05:27:16 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-09 11:09:58 +08:00
										 |  |  | 		typedef GenericOdometry<Values, PoseKey> Odometry; | 
					
						
							| 
									
										
										
										
											2010-04-08 05:27:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-08 03:09:14 +08:00
										 |  |  | 	} // namespace simulated2DOriented
 | 
					
						
							|  |  |  | } // namespace gtsam
 |