gtsam
Loading...
Searching...
No Matches
TranslationRecovery.h
Go to the documentation of this file.
1/* ----------------------------------------------------------------------------
2
3 * GTSAM Copyright 2010-2020, 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
18
20
21#include <map>
22#include <set>
23#include <utility>
24#include <vector>
25
26namespace gtsam {
27
28// Set up an optimization problem for the unknown translations Ti in the world
29// coordinate frame, given the known camera attitudes wRi with respect to the
30// world frame, and a set of (noisy) translation directions of type Unit3,
31// w_aZb. The measurement equation is
32// w_aZb = Unit3(Tb - Ta) (1)
33// i.e., w_aZb is the translation direction from frame A to B, in world
34// coordinates. Although Unit3 instances live on a manifold, following
35// Wilson14eccv_1DSfM.pdf error we compute the *chordal distance* in the
36// ambient world coordinate frame.
37//
38// It is clear that we cannot recover the scale, nor the absolute position,
39// so the gauge freedom in this case is 3 + 1 = 4. We fix these by taking fixing
40// the translations Ta and Tb associated with the first measurement w_aZb,
41// clamping them to their initial values as given to this method. If no initial
42// values are given, we use the origin for Tb and set Tb to make (1) come
43// through, i.e.,
44// Tb = s * wRa * Point3(w_aZb) (2)
45// where s is an arbitrary scale that can be supplied, default 1.0. Hence, two
46// versions are supplied below corresponding to whether we have initial values
47// or not.
48class GTSAM_EXPORT TranslationRecovery : public LocationRecovery {
49 public:
50 using KeyPair = std::pair<Key, Key>;
51 using TranslationEdges = std::vector<BinaryMeasurement<Unit3>>;
52
53 private:
54 // Translation directions between camera pairs.
55 TranslationEdges relativeTranslations_;
56
57 const bool use_bilinear_translation_factor_ = false;
58
59 public:
66 bool use_bilinear_translation_factor = false)
67 : LocationRecovery(lmParams),
68 use_bilinear_translation_factor_(use_bilinear_translation_factor) {}
69
74
83 const std::vector<BinaryMeasurement<Unit3>> &relativeTranslations) const;
84
100 void addPrior(
101 const std::vector<BinaryMeasurement<Unit3>> &relativeTranslations,
102 const double scale,
103 const std::vector<BinaryMeasurement<Point3>> &betweenTranslations,
105 const SharedNoiseModel &priorNoiseModel =
106 noiseModel::Isotropic::Sigma(3, 0.01)) const;
107
120 const std::vector<BinaryMeasurement<Unit3>> &relativeTranslations,
121 const std::vector<BinaryMeasurement<Point3>> &betweenTranslations,
122 std::mt19937 *rng, const Values &initialValues = Values()) const;
123
135 const std::vector<BinaryMeasurement<Unit3>> &relativeTranslations,
136 const std::vector<BinaryMeasurement<Point3>> &betweenTranslations,
137 const Values &initialValues = Values()) const;
138
157 Values run(
158 const TranslationEdges &relativeTranslations, const double scale = 1.0,
159 const std::vector<BinaryMeasurement<Point3>> &betweenTranslations = {},
160 const Values &initialValues = Values()) const;
161
171 static TranslationEdges SimulateMeasurements(
172 const Values &poses, const std::vector<KeyPair> &edges);
173};
174} // namespace gtsam
Recover absolute Point3 locations from pairwise Unit3 direction measurements, using either chordal or...
Global functions in a separate testing namespace.
Definition chartTesting.h:28
noiseModel::Base::shared_ptr SharedNoiseModel
Aliases.
Definition NoiseModel.h:846
static shared_ptr Sigma(size_t dim, double sigma, bool smart=true)
An isotropic noise model created by specifying a standard deviation sigma.
Definition NoiseModel.cpp:706
Parameters for Levenberg-Marquardt optimization.
Definition LevenbergMarquardtParams.h:36
Definition NonlinearFactorGraph.h:57
A non-templated config holding any types of Manifold-group elements.
Definition Values.h:65
Definition BinaryMeasurement.h:37
LocationRecovery(const LevenbergMarquardtParams &lmParams)
Construct with LM parameters.
Definition LocationRecovery.h:58
NonlinearFactorGraph buildGraph(const std::vector< BinaryMeasurement< Unit3 > > &relativeTranslations) const
Build the factor graph to do the optimization.
Definition TranslationRecovery.cpp:97
TranslationRecovery()=default
Default constructor.
Values run(const TranslationEdges &relativeTranslations, const double scale=1.0, const std::vector< BinaryMeasurement< Point3 > > &betweenTranslations={}, const Values &initialValues=Values()) const
Build and optimize factor graph.
Definition TranslationRecovery.cpp:156
void addPrior(const std::vector< BinaryMeasurement< Unit3 > > &relativeTranslations, const double scale, const std::vector< BinaryMeasurement< Point3 > > &betweenTranslations, NonlinearFactorGraph *graph, const SharedNoiseModel &priorNoiseModel=noiseModel::Isotropic::Sigma(3, 0.01)) const
Add 3 factors to the graph:
Definition TranslationRecovery.cpp:103
TranslationRecovery(const LevenbergMarquardtParams &lmParams, bool use_bilinear_translation_factor=false)
Construct a new Translation Recovery object.
Definition TranslationRecovery.h:65
Values initializeRandomly(const std::vector< BinaryMeasurement< Unit3 > > &relativeTranslations, const std::vector< BinaryMeasurement< Point3 > > &betweenTranslations, std::mt19937 *rng, const Values &initialValues=Values()) const
Create random initial translations.
Definition TranslationRecovery.cpp:128