Fixed problem with pixel_sigma (2-dimensional only)

Added switch to determine if normal GenericProjectionFactor or SmartProjectionFactor is used
release/4.3a0
Zsolt Kira 2013-08-09 14:52:26 +00:00
parent b0c96f9bf6
commit 8d9dcfbfc2
1 changed files with 33 additions and 9 deletions

View File

@ -38,6 +38,7 @@
// In GTSAM, measurement functions are represented as 'factors'. Several common factors // In GTSAM, measurement functions are represented as 'factors'. Several common factors
// have been provided with the library for solving robotics SLAM problems. // have been provided with the library for solving robotics SLAM problems.
#include <gtsam/slam/PriorFactor.h> #include <gtsam/slam/PriorFactor.h>
#include <gtsam/slam/ProjectionFactor.h>
#include <gtsam_unstable/slam/SmartProjectionFactor.h> #include <gtsam_unstable/slam/SmartProjectionFactor.h>
// Standard headers, added last, so we know headers above work on their own // Standard headers, added last, so we know headers above work on their own
@ -136,6 +137,11 @@ Cal3_S2::shared_ptr loadCalibration(const string& filename) {
int main(int argc, char** argv) { int main(int argc, char** argv) {
bool debug = false; bool debug = false;
// Set to true to use SmartProjectionFactor. Otherwise GenericProjectionFactor will be used
bool useSmartProjectionFactor = true;
// Minimum number of views of a landmark before it is added to the graph (SmartProjectionFactor case only)
unsigned int minimumNumViews = 1; unsigned int minimumNumViews = 1;
string HOME = getenv("HOME"); string HOME = getenv("HOME");
@ -143,7 +149,8 @@ int main(int argc, char** argv) {
string input_dir = HOME + "/data/KITTI_00_200/"; string input_dir = HOME + "/data/KITTI_00_200/";
typedef SmartProjectionFactor<Pose3, Point3, Cal3_S2> SmartFactor; typedef SmartProjectionFactor<Pose3, Point3, Cal3_S2> SmartFactor;
static SharedNoiseModel pixel_sigma(noiseModel::Unit::Create(3)); typedef GenericProjectionFactor<Pose3, Point3, Cal3_S2> ProjectionFactor;
static SharedNoiseModel pixel_sigma(noiseModel::Unit::Create(2));
static SharedNoiseModel prior_model(noiseModel::Diagonal::Sigmas(Vector_(6, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01))); static SharedNoiseModel prior_model(noiseModel::Diagonal::Sigmas(Vector_(6, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01)));
NonlinearFactorGraph graph; NonlinearFactorGraph graph;
@ -152,6 +159,11 @@ int main(int argc, char** argv) {
boost::shared_ptr<Cal3_S2> K = loadCalibration(input_dir+"calibration.txt"); boost::shared_ptr<Cal3_S2> K = loadCalibration(input_dir+"calibration.txt");
K->print("Calibration"); K->print("Calibration");
// Load values from VO camera poses output
gtsam::Values::shared_ptr loaded_values = loadPoseValues(input_dir+"camera_poses.txt");
graph.add(Pose3Prior(X(0),loaded_values->at<Pose3>(X(0)), prior_model));
//graph.print("thegraph");
// Read in kitti dataset // Read in kitti dataset
ifstream fin; ifstream fin;
fin.open((input_dir+"stereo_factors.txt").c_str()); fin.open((input_dir+"stereo_factors.txt").c_str());
@ -174,6 +186,17 @@ int main(int argc, char** argv) {
while (fin >> r >> l >> uL >> uR >> v >> x >> y >> z) { while (fin >> r >> l >> uL >> uR >> v >> x >> y >> z) {
if (debug) cout << "CurrentLandmark " << currentLandmark << " Landmark " << l << std::endl; if (debug) cout << "CurrentLandmark " << currentLandmark << " Landmark " << l << std::endl;
if (useSmartProjectionFactor == false) {
if (loaded_values->exists<Point3>(L(l)) == boost::none) {
Pose3 camera = loaded_values->at<Pose3>(X(r));
Point3 worldPoint = camera.transform_from(Point3(x, y, z));
loaded_values->insert(L(l), worldPoint); // add point;
}
ProjectionFactor::shared_ptr projectionFactor(new ProjectionFactor(Point2(uL,v), pixel_sigma, X(r), L(l), K));
graph.push_back(projectionFactor);
}
if (currentLandmark != l && views.size() < minimumNumViews) { if (currentLandmark != l && views.size() < minimumNumViews) {
// New landmark. Not enough views for previous landmark so move on. // New landmark. Not enough views for previous landmark so move on.
if (debug) cout << "New landmark " << l << " with not enough view for previous one" << std::endl; if (debug) cout << "New landmark " << l << " with not enough view for previous one" << std::endl;
@ -199,9 +222,12 @@ int main(int argc, char** argv) {
cout << endl; cout << endl;
} }
if (useSmartProjectionFactor) {
SmartFactor::shared_ptr smartFactor(new SmartFactor(measurements, pixel_sigma, views, K));
graph.push_back(smartFactor);
}
numLandmarks++; numLandmarks++;
SmartFactor::shared_ptr smartFactor(new SmartFactor(measurements, pixel_sigma, views, K));
graph.push_back(smartFactor);
currentLandmark = l; currentLandmark = l;
views.clear(); views.clear();
@ -223,10 +249,9 @@ int main(int argc, char** argv) {
} }
cout << "Graph size: " << graph.size() << endl; cout << "Graph size: " << graph.size() << endl;
// Load values from VO camera poses output /*
gtsam::Values::shared_ptr loaded_values = loadPoseValues(input_dir+"camera_poses.txt");
graph.add(Pose3Prior(X(0),loaded_values->at<Pose3>(X(0)), prior_model)); // If using only subset of graph, only read in values for keys that are used
//graph.print("thegraph");
// Get all view in the graph and populate poses from VO output // Get all view in the graph and populate poses from VO output
// TODO: Handle loop closures properly // TODO: Handle loop closures properly
@ -234,7 +259,6 @@ int main(int argc, char** argv) {
allViews.unique(); allViews.unique();
cout << "All Keys (" << allViews.size() << ")" << endl; cout << "All Keys (" << allViews.size() << ")" << endl;
/* If using only subset of graph, only read in values for keys that are used
values = *loadPoseValues(input_dir+"camera_poses.txt", allViews); values = *loadPoseValues(input_dir+"camera_poses.txt", allViews);
BOOST_FOREACH(const Key& k, allViews) { BOOST_FOREACH(const Key& k, allViews) {
if (debug) cout << k << " "; if (debug) cout << k << " ";
@ -267,7 +291,7 @@ int main(int argc, char** argv) {
tictoc_finishedIteration_(); tictoc_finishedIteration_();
cout << "===================================================" << endl; cout << "===================================================" << endl;
values.print("before optimization "); loaded_values->print("before optimization ");
result.print("results of kitti optimization "); result.print("results of kitti optimization ");
tictoc_print_(); tictoc_print_();
cout << "===================================================" << endl; cout << "===================================================" << endl;