| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file    NonlinearFactorGraph.h | 
					
						
							|  |  |  |  * @brief   Factor Graph Constsiting of non-linear factors | 
					
						
							|  |  |  |  * @author  Frank Dellaert | 
					
						
							|  |  |  |  * @author  Carlos Nieto | 
					
						
							|  |  |  |  * @author  Christian Potthast | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // \callgraph
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 08:40:17 +08:00
										 |  |  | #include <math.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | #include "NonlinearFactor.h"
 | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | #include "GaussianFactorGraph.h"
 | 
					
						
							| 
									
										
										
										
											2009-08-22 06:23:24 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 	 * A non-linear factor graph is templated on a configuration, but the factor type | 
					
						
							| 
									
										
										
										
											2009-11-13 00:47:12 +08:00
										 |  |  | 	 * is fixed as a NonlinearFactor. The configurations are typically (in SAM) more general | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 	 * than just vectors, e.g., Rot3 or Pose3, which are objects in non-linear manifolds. | 
					
						
							|  |  |  | 	 * Linearizing the non-linear factor graph creates a linear factor graph on the  | 
					
						
							|  |  |  | 	 * tangent vector space at the linearization point. Because the tangent space is a true | 
					
						
							| 
									
										
										
										
											2009-10-15 04:39:59 +08:00
										 |  |  | 	 * vector space, the config type will be an VectorConfig in that linearized | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 	template<class Config> | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 	class NonlinearFactorGraph: public FactorGraph<NonlinearFactor<Config> > { | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 		/** unnormalized error */ | 
					
						
							|  |  |  | 		double error(const Config& c) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-18 14:55:24 +08:00
										 |  |  | 		/** all individual errors */ | 
					
						
							|  |  |  | 		Vector error_vector(const Config& c) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 12:11:23 +08:00
										 |  |  | 		/** Unnormalized probability. O(n) */ | 
					
						
							|  |  |  | 		double probPrime(const Config& c) const { | 
					
						
							|  |  |  | 			return exp(-0.5 * error(c)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * linearize a nonlinear factor graph | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2009-11-13 00:16:32 +08:00
										 |  |  | 		GaussianFactorGraph linearize(const Config& config) const; | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-18 14:55:24 +08:00
										 |  |  | 		/**
 | 
					
						
							|  |  |  | 		 * shared pointer versions for MATLAB | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		boost::shared_ptr<GaussianFactorGraph> | 
					
						
							|  |  |  | 				linearize_(const Config& config) const; | 
					
						
							| 
									
										
										
										
											2009-12-12 05:34:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-07 02:25:04 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace
 |