76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
| /*
 | |
|  * Pose2SLAMOptimizer.cpp
 | |
|  *
 | |
|  *  Created on: Jan 22, 2010
 | |
|  *      Author: dellaert
 | |
|  */
 | |
| 
 | |
| #include "Pose2SLAMOptimizer.h"
 | |
| #include "pose2SLAM.h"
 | |
| #include "dataset.h"
 | |
| #include "SubgraphPreconditioner-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_);
 | |
| 	}
 | |
| }
 |