89 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file imuSystem.h
							 | 
						||
| 
								 | 
							
								 * @brief A 3D Dynamic system domain as a demonstration of IMU factors
							 | 
						||
| 
								 | 
							
								 * @author Alex Cunningham
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/shared_ptr.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <gtsam/nonlinear/Values.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/nonlinear/Key.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/nonlinear/Symbol.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/slam/BetweenFactor.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/slam/PriorFactor.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/slam/RangeFactor.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/slam/PartialPriorFactor.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/nonlinear/NonlinearEquality.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/nonlinear/NonlinearFactorGraph.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <gtsam_unstable/dynamics/PoseRTV.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam_unstable/dynamics/IMUFactor.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam_unstable/dynamics/FullIMUFactor.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam_unstable/dynamics/VelocityConstraint.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam_unstable/dynamics/DynamicsPriors.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This domain focuses on a single class of variables: PoseRTV, which
							 | 
						||
| 
								 | 
							
								 * models a dynamic pose operating with IMU measurements and assorted priors.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * There are also partial priors that constraint certain components of the
							 | 
						||
| 
								 | 
							
								 * poses, as well as between and range factors to model other between-pose
							 | 
						||
| 
								 | 
							
								 * information.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								namespace imu {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using namespace gtsam;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Values: just poses
							 | 
						||
| 
								 | 
							
								inline Symbol PoseKey(Index j) { return Symbol('x', j); }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct Values : public gtsam::Values {
							 | 
						||
| 
								 | 
							
									typedef gtsam::Values Base;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Values() {}
							 | 
						||
| 
								 | 
							
									Values(const Values& values) : Base(values) {}
							 | 
						||
| 
								 | 
							
									Values(const Base& values) : Base(values) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void insertPose(Index key, const PoseRTV& pose) { insert(PoseKey(key), pose); }
							 | 
						||
| 
								 | 
							
									PoseRTV pose(Index key) const { return at<PoseRTV>(PoseKey(key)); }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// factors
							 | 
						||
| 
								 | 
							
								typedef IMUFactor<PoseRTV> IMUMeasurement; // IMU between measurements
							 | 
						||
| 
								 | 
							
								typedef FullIMUFactor<PoseRTV> FullIMUMeasurement; // Full-state IMU between measurements
							 | 
						||
| 
								 | 
							
								typedef BetweenFactor<PoseRTV> Between;   // full odometry (including velocity)
							 | 
						||
| 
								 | 
							
								typedef NonlinearEquality<PoseRTV> Constraint;
							 | 
						||
| 
								 | 
							
								typedef PriorFactor<PoseRTV> Prior;
							 | 
						||
| 
								 | 
							
								typedef RangeFactor<PoseRTV, PoseRTV> Range;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// graph components
							 | 
						||
| 
								 | 
							
								struct Graph : public NonlinearFactorGraph {
							 | 
						||
| 
								 | 
							
									typedef NonlinearFactorGraph Base;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									Graph() {}
							 | 
						||
| 
								 | 
							
									Graph(const Base& graph) : Base(graph) {}
							 | 
						||
| 
								 | 
							
									Graph(const Graph& graph) : Base(graph) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// prior factors
							 | 
						||
| 
								 | 
							
									void addPrior(size_t key, const PoseRTV& pose, const SharedNoiseModel& noiseModel);
							 | 
						||
| 
								 | 
							
									void addConstraint(size_t key, const PoseRTV& pose);
							 | 
						||
| 
								 | 
							
									void addHeightPrior(size_t key, double z, const SharedNoiseModel& noiseModel);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// inertial factors
							 | 
						||
| 
								 | 
							
									void addFullIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const SharedNoiseModel& noiseModel);
							 | 
						||
| 
								 | 
							
									void addIMUMeasurement(size_t key1, size_t key2, const Vector& accel, const Vector& gyro, double dt, const SharedNoiseModel& noiseModel);
							 | 
						||
| 
								 | 
							
									void addVelocityConstraint(size_t key1, size_t key2, double dt, const SharedNoiseModel& noiseModel);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// other measurements
							 | 
						||
| 
								 | 
							
									void addBetween(size_t key1, size_t key2, const PoseRTV& z, const SharedNoiseModel& noiseModel);
							 | 
						||
| 
								 | 
							
									void addRange(size_t key1, size_t key2, double z, const SharedNoiseModel& noiseModel);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// optimization
							 | 
						||
| 
								 | 
							
									Values optimize(const Values& init) const;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // \namespace imu
							 | 
						||
| 
								 | 
							
								
							 |