101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
| 
								 | 
							
								/* ----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
							 | 
						||
| 
								 | 
							
								 * Atlanta, Georgia 30332-0415
							 | 
						||
| 
								 | 
							
								 * All Rights Reserved
							 | 
						||
| 
								 | 
							
								 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 * See LICENSE for the license information
							 | 
						||
| 
								 | 
							
								 * -------------------------------------------------------------------------- */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file    timeiSAM2Chain.cpp
							 | 
						||
| 
								 | 
							
								 * @brief   Times each iteration of a long chain in iSAM2, to measure asymptotic performance
							 | 
						||
| 
								 | 
							
								 * @author  Richard Roberts
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <gtsam/base/timing.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/slam/dataset.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/geometry/Pose2.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/slam/PriorFactor.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/slam/BetweenFactor.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/inference/Symbol.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/nonlinear/ISAM2.h>
							 | 
						||
| 
								 | 
							
								#include <gtsam/nonlinear/Marginals.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <fstream>
							 | 
						||
| 
								 | 
							
								#include <boost/archive/binary_oarchive.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/archive/binary_iarchive.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/serialization/export.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/random/mersenne_twister.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/random/uniform_real.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/random/variate_generator.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using namespace std;
							 | 
						||
| 
								 | 
							
								using namespace gtsam;
							 | 
						||
| 
								 | 
							
								using namespace gtsam::symbol_shorthand;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef Pose2 Pose;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef NoiseModelFactor1<Pose> NM1;
							 | 
						||
| 
								 | 
							
								typedef NoiseModelFactor2<Pose,Pose> NM2;
							 | 
						||
| 
								 | 
							
								noiseModel::Unit::shared_ptr model = noiseModel::Unit::Create(Pose::Dim());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int main(int argc, char *argv[]) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const size_t steps = 50000;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cout << "Playing forward " << steps << " time steps..." << endl;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ISAM2 isam2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Times
							 | 
						||
| 
								 | 
							
								  vector<double> times(steps);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for(size_t step=0; step < steps; ++step) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Values newVariables;
							 | 
						||
| 
								 | 
							
								    NonlinearFactorGraph newFactors;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Collect measurements and new variables for the current step
							 | 
						||
| 
								 | 
							
								    gttic_(Create_measurements);
							 | 
						||
| 
								 | 
							
								    if(step == 0) {
							 | 
						||
| 
								 | 
							
								      // Add prior
							 | 
						||
| 
								 | 
							
								      newFactors.add(PriorFactor<Pose>(0, Pose(), noiseModel::Unit::Create(Pose::Dim())));
							 | 
						||
| 
								 | 
							
								      newVariables.insert(0, Pose());
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      Vector eta = Vector::Random(Pose::Dim()) * 0.1;
							 | 
						||
| 
								 | 
							
								      Pose2 between = Pose().retract(eta);
							 | 
						||
| 
								 | 
							
								      // Add between
							 | 
						||
| 
								 | 
							
								      newFactors.add(BetweenFactor<Pose>(step-1, step, between, model));
							 | 
						||
| 
								 | 
							
								      newVariables.insert(step, isam2.calculateEstimate<Pose>(step-1) * between);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    gttoc_(Create_measurements);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Update iSAM2
							 | 
						||
| 
								 | 
							
								    gttic_(Update_ISAM2);
							 | 
						||
| 
								 | 
							
								    isam2.update(newFactors, newVariables);
							 | 
						||
| 
								 | 
							
								    gttoc_(Update_ISAM2);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    tictoc_finishedIteration_();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    tictoc_getNode(node, Update_ISAM2);
							 | 
						||
| 
								 | 
							
								    times[step] = node->time();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(step % 1000 == 0) {
							 | 
						||
| 
								 | 
							
								      cout << "Step " << step << endl;
							 | 
						||
| 
								 | 
							
								      tictoc_print_();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  tictoc_print_();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Write times
							 | 
						||
| 
								 | 
							
								  ofstream timesFile("times.txt");
							 | 
						||
| 
								 | 
							
								  BOOST_FOREACH(double t, times) {
							 | 
						||
| 
								 | 
							
								    timesFile << t << "\n"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								}
							 |