SFMExample_bal_COLAMD_METIS.cpp
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
19 // For an explanation of headers, see SFMExample.cpp
21 #include <gtsam/sfm/SfmData.h> // for loading BAL datasets !
22 #include <gtsam/slam/dataset.h>
25 #include <gtsam/inference/Symbol.h>
27 #include <gtsam/base/timing.h>
28 
29 #include <vector>
30 
31 using namespace std;
32 using namespace gtsam;
35 
36 // We will be using a projection factor that ties a SFM_Camera to a 3D point.
37 // An SFM_Camera is defined in datase.h as a camera with unknown Cal3Bundler
38 // calibration and has a total of 9 free parameters
40 
41 
42 int main(int argc, char* argv[]) {
43  // Find default file, but if an argument is given, try loading a file
44  string filename = findExampleDataFile("dubrovnik-3-7-pre");
45  if (argc > 1) filename = string(argv[1]);
46 
47  // Load the SfM data from file
48  SfmData mydata = SfmData::FromBalFile(filename);
49  cout << "read " << mydata.numberTracks() << " tracks on " << mydata.numberCameras() << " cameras" << endl;
50 
51  // Create a factor graph
53 
54  // We share *one* noiseModel between all projection factors
55  auto noise = noiseModel::Isotropic::Sigma(2, 1.0); // one pixel in u and v
56 
57  // Add measurements to the factor graph
58  size_t j = 0;
59  for (const SfmTrack& track : mydata.tracks) {
60  for (const auto& [i, uv] : track.measurements) {
61  graph.emplace_shared<MyFactor>(
62  uv, noise, C(i), P(j)); // note use of shorthand symbols C and P
63  }
64  j += 1;
65  }
66 
67  // Add a prior on pose x1. This indirectly specifies where the origin is.
68  // and a prior on the position of the first landmark to fix the scale
69  graph.addPrior(C(0), mydata.cameras[0], noiseModel::Isotropic::Sigma(9, 0.1));
70  graph.addPrior(P(0), mydata.tracks[0].p,
71  noiseModel::Isotropic::Sigma(3, 0.1));
72 
73  // Create initial estimate
75  size_t i = 0;
76  j = 0;
77  for (const SfmCamera& camera : mydata.cameras) initial.insert(C(i++), camera);
78  for (const SfmTrack& track : mydata.tracks) initial.insert(P(j++), track.p);
79 
83  LevenbergMarquardtParams params_using_COLAMD, params_using_METIS;
84  try {
85  params_using_METIS.setVerbosity("ERROR");
86  gttic_(METIS_ORDERING);
87  params_using_METIS.ordering = Ordering::Create(Ordering::METIS, graph);
88  gttoc_(METIS_ORDERING);
89 
90  params_using_COLAMD.setVerbosity("ERROR");
91  gttic_(COLAMD_ORDERING);
92  params_using_COLAMD.ordering = Ordering::Create(Ordering::COLAMD, graph);
93  gttoc_(COLAMD_ORDERING);
94  } catch (exception& e) {
95  cout << e.what();
96  }
97 
98  // expect they have different ordering results
99  if (params_using_COLAMD.ordering == params_using_METIS.ordering) {
100  cout << "COLAMD and METIS produce the same ordering. "
101  << "Problem here!!!" << endl;
102  }
103 
104  /* Optimize the graph with METIS and COLAMD and time the results */
105 
106  Values result_METIS, result_COLAMD;
107  try {
108  gttic_(OPTIMIZE_WITH_METIS);
109  LevenbergMarquardtOptimizer lm_METIS(graph, initial, params_using_METIS);
110  result_METIS = lm_METIS.optimize();
111  gttoc_(OPTIMIZE_WITH_METIS);
112 
113  gttic_(OPTIMIZE_WITH_COLAMD);
114  LevenbergMarquardtOptimizer lm_COLAMD(graph, initial, params_using_COLAMD);
115  result_COLAMD = lm_COLAMD.optimize();
116  gttoc_(OPTIMIZE_WITH_COLAMD);
117  } catch (exception& e) {
118  cout << e.what();
119  }
120 
121  { // printing the result
122 
123  cout << "COLAMD final error: " << graph.error(result_COLAMD) << endl;
124  cout << "METIS final error: " << graph.error(result_METIS) << endl;
125 
126  cout << endl << endl;
127 
128  cout << "Time comparison by solving " << filename << " results:" << endl;
129 
130  cout << mydata.numberTracks() << " point tracks and " << mydata.numberCameras()
131  << " cameras" << endl;
132 
133  tictoc_print_();
134  }
135 
136  return 0;
137 }
138 
virtual const Values & optimize()
#define gttic_(label)
Definition: timing.h:245
SfmData stores a bunch of SfmTracks.
Definition: SfmData.h:39
IsDerived< DERIVEDFACTOR > emplace_shared(Args &&... args)
Emplace a shared pointer to factor of given type.
Definition: FactorGraph.h:196
Factor Graph consisting of non-linear factors.
int main(int argc, char *argv[])
Values initial
Definition: BFloat16.h:88
NonlinearFactorGraph graph
std::vector< SfmTrack > tracks
Sparse set of points.
Definition: SfmData.h:42
void addPrior(Key key, const T &prior, const SharedNoiseModel &model=nullptr)
void setVerbosity(const std::string &src)
Data structure for dealing with Structure from Motion data.
std::vector< SfmMeasurement > measurements
The 2D image projections (id,(u,v))
Definition: SfmTrack.h:44
A nonlinear optimizer that uses the Levenberg-Marquardt trust-region scheme.
size_t numberCameras() const
The number of cameras.
Definition: SfmData.h:77
void tictoc_print_()
Definition: timing.h:268
Array< double, 1, 3 > e(1./3., 0.5, 2.)
double error(const Values &values) const
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:50
traits
Definition: chartTesting.h:28
GTSAM_EXPORT std::string findExampleDataFile(const std::string &name)
Definition: dataset.cpp:70
std::vector< SfmCamera > cameras
Set of cameras.
Definition: SfmData.h:40
Point3 p
3D position of the point
Definition: SfmTrack.h:126
void insert(Key j, const Value &val)
Definition: Values.cpp:155
size_t numberTracks() const
The number of reconstructed 3D points.
Definition: SfmData.h:74
std::optional< Ordering > ordering
The optional variable elimination ordering, or empty to use COLAMD (default: empty) ...
static const CalibratedCamera camera(kDefaultPose)
a general SFM factor with an unknown calibration
#define gttoc_(label)
Definition: timing.h:250
utility functions for loading datasets
std::ptrdiff_t j
Timing utilities.
GeneralSFMFactor< SfmCamera, Point3 > MyFactor


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:35:42