/** * @file vSLAMexample.cpp * @brief An vSLAM example for synthesis sequence * single camera * @author Duy-Nguyen */ #include #include using namespace boost; #define GTSAM_MAGIC_KEY #include #include #include #include #include #include "landmarkUtils.h" #include "Feature2D.h" using namespace std; using namespace gtsam; using namespace gtsam::visualSLAM; using namespace boost; /* ************************************************************************* */ #define CALIB_FILE "Data/calib.txt" #define LANDMARKS_FILE "Data/landmarks.txt" #define POSEFN_PREFIX "Data/ttpy" #define POSEFN_SUFFIX ".pose" #define FEATFN_PREFIX "Data/ttpy" #define FEATFN_SUFFIX ".feat" #define NUM_IMAGES 10 const int ImageIds[NUM_IMAGES] = {10,20,30,40,50,60,70,80,90,100}; // Store groundtruth values map g_landmarks; vector g_poses; /* ************************************************************************* */ /** * Setup vSLAM graph * by adding and associating 2D features (measurements) detected in each image * with their corresponding landmarks. */ Graph setupGraph() { Graph g; shared_ptrK sK(new Cal3_S2(readCalibData(CALIB_FILE))); sK->print("Calibration: "); SharedGaussian sigma(noiseModel::Isotropic::Sigma(2,5.0f)); for (size_t i= 0; i features = readFeatures(FEATFN_PREFIX, FEATFN_SUFFIX, ImageIds[i]); for (size_t j = 0; j::iterator lmit = g_landmarks.begin(); lmit != g_landmarks.end(); lmit++) initValues.insert( lmit->first, lmit->second ); // Initialize camera poses. for (int i = 0; i graph(new Graph(setupGraph())); // Read groundtruth landmarks' positions and poses. These will also be used later as intial estimates. readLandMarks(LANDMARKS_FILE, g_landmarks); for (int i = 0; i initialValues(new Values(initializeValues())); // Add hard constraint on the first pose, used as fixed prior. graph->addPoseConstraint(0, g_poses[0]); // Create an ordering of the variables shared_ptr ordering(new Ordering); char name[4]; for (size_t i = 0; iprint("Initial estimates: "); // Optimize the graph. Optimizer::verbosityLevel verborsity = Optimizer::ERROR; Optimizer optimResult = optimizer.levenbergMarquardt(1e-5, 1e-5, verborsity); optimResult.config()->print("After optimization: "); } /* ************************************************************************* */