76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
|  | /*
 | ||
|  |  * Pose2SLAMOptimizer.cpp | ||
|  |  * | ||
|  |  *  Created on: Jan 22, 2010 | ||
|  |  *      Author: dellaert | ||
|  |  */ | ||
|  | 
 | ||
|  | #include "Pose2SLAMOptimizer.h"
 | ||
|  | #include "pose2SLAM.h"
 | ||
|  | #include "dataset.h"
 | ||
|  | #include "SubgraphSolver-inl.h"
 | ||
|  | 
 | ||
|  | using namespace std; | ||
|  | namespace gtsam { | ||
|  | 
 | ||
|  | 	using namespace pose2SLAM; | ||
|  | 
 | ||
|  | 	/* ************************************************************************* */ | ||
|  | 	Pose2SLAMOptimizer::Pose2SLAMOptimizer(const string& dataset_name, | ||
|  | 			const string& path) { | ||
|  | 
 | ||
|  | 		static int maxID = 0; | ||
|  | 		static bool addNoise = false; | ||
|  | 
 | ||
|  | 		string filename; | ||
|  | 		boost::optional<SharedDiagonal> noiseModel; | ||
|  | 		boost::tie(filename, noiseModel) = dataset(dataset_name); | ||
|  | 
 | ||
|  | 		// read graph and initial estimate
 | ||
|  | 		boost::tie(graph_, theta_) = load2D(filename, noiseModel, maxID, addNoise); | ||
|  | 		graph_->addPrior(theta_->begin()->first, theta_->begin()->second, | ||
|  | 				noiseModel::Unit::Create(3)); | ||
|  | 
 | ||
|  | 		// initialize non-linear solver
 | ||
|  | 		solver_.initialize(*graph_, *theta_); | ||
|  | 
 | ||
|  | 		linearize(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* ************************************************************************* */ | ||
|  | 	void Pose2SLAMOptimizer::print(const string& str) const { | ||
|  | 		GTSAM_PRINT(*graph_); | ||
|  | 		GTSAM_PRINT(*theta_); | ||
|  | 		//TODO
 | ||
|  | 		//GTSAM_PRINT(solver_);
 | ||
|  | 		GTSAM_PRINT(*system_); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* ************************************************************************* */ | ||
|  | 	void Pose2SLAMOptimizer::update(const Vector& x) { | ||
|  | 		VectorConfig X = system_->assembleConfig(x, *solver_.ordering()); | ||
|  | 		*theta_ = expmap(*theta_, X); | ||
|  | 		linearize(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* ************************************************************************* */ | ||
|  | 	void Pose2SLAMOptimizer::updatePreconditioned(const Vector& y) { | ||
|  | 		Vector x; | ||
|  | 		update(x); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* ************************************************************************* */ | ||
|  | 	Vector Pose2SLAMOptimizer::optimize() const { | ||
|  | 		VectorConfig X = solver_.optimize(*system_); | ||
|  | 		std::list<Vector> vs; | ||
|  | 		BOOST_FOREACH(const Symbol& key, *solver_.ordering()) | ||
|  | 			vs.push_back(X[key]); | ||
|  | 		return concatVectors(vs); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* ************************************************************************* */ | ||
|  | 	double Pose2SLAMOptimizer::error() const { | ||
|  | 		return graph_->error(*theta_); | ||
|  | 	} | ||
|  | } |