84 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
| /**
 | |
|  * @file   Simulated3D.h
 | |
|  * @brief  measurement functions and derivatives for simulated 3D robot
 | |
|  * @author Alex Cunningham
 | |
|  **/
 | |
| 
 | |
| // \callgraph
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include "Matrix.h"
 | |
| #include "VectorConfig.h"
 | |
| #include "NonlinearFactor.h"
 | |
| #include "Key.h"
 | |
| 
 | |
| // \namespace
 | |
| 
 | |
| namespace gtsam {
 | |
| namespace simulated3D {
 | |
| 
 | |
| 	typedef VectorConfig VectorConfig;
 | |
| 
 | |
| 	typedef gtsam::Symbol PoseKey;
 | |
| 	typedef gtsam::Symbol PointKey;
 | |
| 
 | |
| 	/**
 | |
| 	 * Prior on a single pose
 | |
| 	 */
 | |
| 	Vector prior(const Vector& x);
 | |
| 	Matrix Dprior(const Vector& x);
 | |
| 
 | |
| 	/**
 | |
| 	 * odometry between two poses
 | |
| 	 */
 | |
| 	Vector odo(const Vector& x1, const Vector& x2);
 | |
| 	Matrix Dodo1(const Vector& x1, const Vector& x2);
 | |
| 	Matrix Dodo2(const Vector& x1, const Vector& x2);
 | |
| 
 | |
| 	/**
 | |
| 	 *  measurement between landmark and pose
 | |
| 	 */
 | |
| 	Vector mea(const Vector& x, const Vector& l);
 | |
| 	Matrix Dmea1(const Vector& x, const Vector& l);
 | |
| 	Matrix Dmea2(const Vector& x, const Vector& l);
 | |
| 
 | |
| 	struct Point2Prior3D: public NonlinearFactor1<VectorConfig, PoseKey,
 | |
| 			Vector> {
 | |
| 
 | |
| 		Vector z_;
 | |
| 
 | |
| 		Point2Prior3D(const Vector& z,
 | |
| 					const sharedGaussian& model, const PoseKey& j) :
 | |
| 				NonlinearFactor1<VectorConfig, PoseKey, Vector> (model, j), z_(z) {
 | |
| 			}
 | |
| 
 | |
| 		Vector evaluateError(const Vector& x, boost::optional<Matrix&> H =
 | |
| 				boost::none) {
 | |
| 			if (H) *H = Dprior(x);
 | |
| 			return prior(x) - z_;
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	struct Simulated3DMeasurement: public NonlinearFactor2<VectorConfig,
 | |
| 			PoseKey, Vector, PointKey, Vector> {
 | |
| 
 | |
| 		Vector z_;
 | |
| 
 | |
| 		Simulated3DMeasurement(const Vector& z,
 | |
| 					const sharedGaussian& model, PoseKey& j1, PointKey j2) :
 | |
| 				z_(z),
 | |
| 						NonlinearFactor2<VectorConfig, PoseKey, Vector, PointKey, Vector> (
 | |
| 								model, j1, j2) {
 | |
| 			}
 | |
| 
 | |
| 		Vector evaluateError(const Vector& x1, const Vector& x2, boost::optional<
 | |
| 				Matrix&> H1 = boost::none, boost::optional<Matrix&> H2 = boost::none) {
 | |
| 			if (H1) *H1 = Dmea1(x1, x2);
 | |
| 			if (H2) *H2 = Dmea2(x1, x2);
 | |
| 			return mea(x1, x2) - z_;
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| }} // namespace simulated3D
 |