60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file    NonlinearFactorGraph.h
 | |
|  * @brief   Factor Graph Constsiting of non-linear factors
 | |
|  * @author  Frank Dellaert
 | |
|  * @author  Carlos Nieto
 | |
|  * @author  Christian Potthast
 | |
|  */
 | |
| 
 | |
| // \callgraph
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <math.h>
 | |
| 
 | |
| #include "NonlinearFactor.h"
 | |
| #include "GaussianFactorGraph.h"
 | |
| 
 | |
| namespace gtsam {
 | |
| 
 | |
| 	/**
 | |
| 	 * A non-linear factor graph is templated on a configuration, but the factor type
 | |
| 	 * is fixed as a NonlinearFactor. The configurations are typically (in SAM) more general
 | |
| 	 * 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
 | |
| 	 * vector space, the config type will be an VectorConfig in that linearized
 | |
| 	 */
 | |
| 	template<class Config>
 | |
| 	class NonlinearFactorGraph: public FactorGraph<NonlinearFactor<Config> > {
 | |
| 
 | |
| 	public:
 | |
| 
 | |
| 		typedef typename boost::shared_ptr<NonlinearFactor<Config> > sharedFactor;
 | |
| 
 | |
| 		/** unnormalized error */
 | |
| 		double error(const Config& c) const;
 | |
| 
 | |
| 		/** all individual errors */
 | |
| 		Vector unwhitenedError(const Config& c) const;
 | |
| 
 | |
| 		/** Unnormalized probability. O(n) */
 | |
| 		double probPrime(const Config& c) const {
 | |
| 			return exp(-0.5 * error(c));
 | |
| 		}
 | |
| 
 | |
| 		template<class F>
 | |
| 		void add(const F& factor) {
 | |
| 			push_back(boost::shared_ptr<F>(new F(factor)));
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 * linearize a nonlinear factor graph
 | |
| 		 */
 | |
| 		boost::shared_ptr<GaussianFactorGraph>
 | |
| 				linearize(const Config& config) const;
 | |
| 
 | |
| 	};
 | |
| 
 | |
| } // namespace
 |