added example optimizing rotations only from g2o file
parent
f6adeb8fff
commit
16bb90387c
|
@ -60,7 +60,7 @@ int main(const int argc, const char *argv[]) {
|
||||||
initialization.print("initialization");
|
initialization.print("initialization");
|
||||||
} else {
|
} else {
|
||||||
const string outputFile = argv[2];
|
const string outputFile = argv[2];
|
||||||
std::cout << "Writing results to file: " << outputFile << argc << std::endl;
|
std::cout << "Writing results to file: " << outputFile << std::endl;
|
||||||
writeG2o(*graph, initialization, outputFile);
|
writeG2o(*graph, initialization, outputFile);
|
||||||
std::cout << "done! " << std::endl;
|
std::cout << "done! " << std::endl;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
/* ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
* 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 Pose3SLAMExample_initializePose3.cpp
|
||||||
|
* @brief A 3D Pose SLAM example that reads input from g2o, and initializes the Pose3 using InitializePose3
|
||||||
|
* Syntax for the script is ./Pose3SLAMExample_initializePose3 input.g2o output.g2o
|
||||||
|
* @date Aug 25, 2014
|
||||||
|
* @author Luca Carlone
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtsam/slam/InitializePose3.h>
|
||||||
|
#include <gtsam/slam/dataset.h>
|
||||||
|
#include <gtsam/slam/BetweenFactor.h>
|
||||||
|
#include <gtsam/slam/PriorFactor.h>
|
||||||
|
#include <gtsam/nonlinear/GaussNewtonOptimizer.h>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace gtsam;
|
||||||
|
|
||||||
|
int main(const int argc, const char *argv[]) {
|
||||||
|
|
||||||
|
// Read graph from file
|
||||||
|
string g2oFile;
|
||||||
|
if (argc < 2)
|
||||||
|
g2oFile = findExampleDataFile("pose3example.txt");
|
||||||
|
else
|
||||||
|
g2oFile = argv[1];
|
||||||
|
|
||||||
|
NonlinearFactorGraph::shared_ptr graph;
|
||||||
|
Values::shared_ptr initial;
|
||||||
|
bool is3D = true;
|
||||||
|
boost::tie(graph, initial) = readG2o(g2oFile, is3D);
|
||||||
|
|
||||||
|
Values initialRot;
|
||||||
|
BOOST_FOREACH(const Values::ConstKeyValuePair& key_value, *initial) {
|
||||||
|
Key key = key_value.key;
|
||||||
|
Pose3 pose = initial->at<Pose3>(key);
|
||||||
|
Rot3 R = pose.rotation();
|
||||||
|
initialRot.insert(key,R);
|
||||||
|
}
|
||||||
|
|
||||||
|
noiseModel::Unit::shared_ptr identityModel = noiseModel::Unit::Create(3);
|
||||||
|
NonlinearFactorGraph graphRot;
|
||||||
|
BOOST_FOREACH(const NonlinearFactor::shared_ptr& factor, *graph) {
|
||||||
|
boost::shared_ptr<BetweenFactor<Pose3> > pose3Between =
|
||||||
|
boost::dynamic_pointer_cast<BetweenFactor<Pose3> >(factor);
|
||||||
|
if(pose3Between){
|
||||||
|
Key key1 = pose3Between->key1();
|
||||||
|
Key key2 = pose3Between->key2();
|
||||||
|
Pose3 Pij = pose3Between->measured();
|
||||||
|
Rot3 Rij = Pij.rotation();
|
||||||
|
NonlinearFactor::shared_ptr factorRot(new BetweenFactor<Rot3>(key1, key2, Rij, identityModel));
|
||||||
|
graphRot.add(factorRot);
|
||||||
|
}else{
|
||||||
|
std::cout << "Found a factor that is not a Between<Pose3>: not admitted" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Add prior on the first key
|
||||||
|
graphRot.add(PriorFactor<Rot3>(0, Rot3(), identityModel));
|
||||||
|
|
||||||
|
std::cout << "Optimizing Rot3 via GN" << std::endl;
|
||||||
|
// GaussNewtonParams params;
|
||||||
|
GaussNewtonOptimizer optimizer(graphRot, initialRot);
|
||||||
|
Values GNrot = optimizer.optimize();
|
||||||
|
std::cout << "done!" << std::endl;
|
||||||
|
|
||||||
|
// Wrap estimate as poses to write in g2o format
|
||||||
|
Values GNposes;
|
||||||
|
BOOST_FOREACH(const Values::ConstKeyValuePair& key_value, GNrot) {
|
||||||
|
Key key = key_value.key;
|
||||||
|
Rot3 R = GNrot.at<Rot3>(key);
|
||||||
|
GNposes.insert(key,Pose3(R,Point3()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc < 3) {
|
||||||
|
GNrot.print("initialization");
|
||||||
|
} else {
|
||||||
|
const string outputFile = argv[2];
|
||||||
|
std::cout << "Writing results to file: " << outputFile << std::endl;
|
||||||
|
writeG2o(*graph, GNposes, outputFile);
|
||||||
|
std::cout << "done! " << std::endl;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue