gtsam  3.2.1
gtsam
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TriangulationFactor.h
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 
21 #include <boost/optional.hpp>
22 #include <boost/make_shared.hpp>
23 
24 namespace gtsam {
25 
31 template<class CALIBRATION = Cal3_S2>
32 class TriangulationFactor: public NoiseModelFactor1<Point3> {
33 
34 public:
35 
38 
39 protected:
40 
41  // Keep a copy of measurement and calibration for I/O
42  const Camera camera_;
43  const Point2 measured_;
44 
45  // verbosity handling for Cheirality Exceptions
46  const bool throwCheirality_;
47  const bool verboseCheirality_;
48 
49 public:
50 
53 
56 
58  typedef boost::shared_ptr<This> shared_ptr;
59 
62  throwCheirality_(false), verboseCheirality_(false) {
63  }
64 
74  TriangulationFactor(const Camera& camera, const Point2& measured,
75  const SharedNoiseModel& model, Key pointKey, bool throwCheirality = false,
76  bool verboseCheirality = false) :
77  Base(model, pointKey), camera_(camera), measured_(measured), throwCheirality_(
79  if (model && model->dim() != 2)
80  throw std::invalid_argument(
81  "TriangulationFactor must be created with 2-dimensional noise model.");
82  }
83 
86  }
87 
89  virtual gtsam::NonlinearFactor::shared_ptr clone() const {
90  return boost::static_pointer_cast<gtsam::NonlinearFactor>(
91  gtsam::NonlinearFactor::shared_ptr(new This(*this)));
92  }
93 
99  void print(const std::string& s = "", const KeyFormatter& keyFormatter =
100  DefaultKeyFormatter) const {
101  std::cout << s << "TriangulationFactor,";
102  camera_.print("camera");
103  measured_.print("z");
104  Base::print("", keyFormatter);
105  }
106 
108  virtual bool equals(const NonlinearFactor& p, double tol = 1e-9) const {
109  const This *e = dynamic_cast<const This*>(&p);
110  return e && Base::equals(p, tol) && this->camera_.equals(e->camera_, tol)
111  && this->measured_.equals(e->measured_, tol);
112  }
113 
115  Vector evaluateError(const Point3& point, boost::optional<Matrix&> H2 =
116  boost::none) const {
117  try {
118  Point2 error(camera_.project(point, boost::none, H2) - measured_);
119  return error.vector();
120  } catch (CheiralityException& e) {
121  if (H2)
122  *H2 = zeros(2, 3);
123  if (verboseCheirality_)
124  std::cout << e.what() << ": Landmark "
125  << DefaultKeyFormatter(this->key()) << " moved behind camera"
126  << std::endl;
127  if (throwCheirality_)
128  throw e;
129  return ones(2) * 2.0 * camera_.calibration().fx();
130  }
131  }
132 
135  mutable Matrix A;
136  mutable Vector b;
137 
143  boost::shared_ptr<GaussianFactor> linearize(const Values& x) const {
144  // Only linearize if the factor is active
145  if (!this->active(x))
146  return boost::shared_ptr<JacobianFactor>();
147 
148  // Allocate memory for Jacobian factor, do only once
149  if (Ab.rows() == 0) {
150  std::vector<size_t> dimensions(1, 3);
151  Ab = VerticalBlockMatrix(dimensions, 2, true);
152  A.resize(2,3);
153  b.resize(2);
154  }
155 
156  // Would be even better if we could pass blocks to project
157  const Point3& point = x.at<Point3>(key());
158  b = -(camera_.project(point, boost::none, A) - measured_).vector();
159  if (noiseModel_)
160  this->noiseModel_->WhitenSystem(A, b);
161 
162  Ab(0) = A;
163  Ab(1) = b;
164 
165  return boost::make_shared<JacobianFactor>(this->keys_, Ab);
166  }
167 
169  const Point2& measured() const {
170  return measured_;
171  }
172 
174  inline bool verboseCheirality() const {
175  return verboseCheirality_;
176  }
177 
179  inline bool throwCheirality() const {
180  return throwCheirality_;
181  }
182 
183 private:
184 
187  template<class ARCHIVE>
188  void serialize(ARCHIVE & ar, const unsigned int version) {
189  ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
190  ar & BOOST_SERIALIZATION_NVP(camera_);
191  ar & BOOST_SERIALIZATION_NVP(measured_);
192  ar & BOOST_SERIALIZATION_NVP(throwCheirality_);
193  ar & BOOST_SERIALIZATION_NVP(verboseCheirality_);
194  }
195 };
196 } // \ namespace gtsam
197 
Non-linear factor base classes.
virtual bool equals(const NonlinearFactor &f, double tol=1e-9) const
Check if two factors are equal.
Definition: NonlinearFactor.h:239
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const
print
Definition: TriangulationFactor.h:99
PinholeCamera< CALIBRATION > Camera
Camera type.
Definition: TriangulationFactor.h:37
bool throwCheirality() const
return flag for throwing cheirality exceptions
Definition: TriangulationFactor.h:179
void print(const std::string &s="") const
print with optional string
Definition: Point2.cpp:33
DenseIndex rows() const
Row size.
Definition: VerticalBlockMatrix.h:111
Calibration & calibration()
return calibration
Definition: PinholeCamera.h:159
friend class boost::serialization::access
Serialization function.
Definition: TriangulationFactor.h:186
virtual bool equals(const NonlinearFactor &p, double tol=1e-9) const
equals
Definition: TriangulationFactor.h:108
TriangulationFactor< CALIBRATION > This
shorthand for this class
Definition: TriangulationFactor.h:55
Definition: Point2.h:35
bool equals(const Point2 &q, double tol=1e-9) const
equals with an tolerance, prints out message if unequal
Definition: Point2.cpp:38
FastVector< Key > keys_
The keys involved in this factor.
Definition: Factor.h:69
virtual ~TriangulationFactor()
Virtual destructor.
Definition: TriangulationFactor.h:85
Point2 project(const Point3 &pw, boost::optional< Matrix & > Dpose=boost::none, boost::optional< Matrix & > Dpoint=boost::none, boost::optional< Matrix & > Dcal=boost::none) const
project a point from world coordinate to the image
Definition: PinholeCamera.h:299
Vector evaluateError(const Point3 &point, boost::optional< Matrix & > H2=boost::none) const
Evaluate error h(x)-z and optionally derivatives.
Definition: TriangulationFactor.h:115
Definition: VerticalBlockMatrix.h:41
VerticalBlockMatrix Ab
thread-safe (?) scratch memory for linearize
Definition: TriangulationFactor.h:134
const bool verboseCheirality_
If true, prints text for Cheirality exceptions (default: false)
Definition: TriangulationFactor.h:47
Some functions to compute numerical derivatives.
NoiseModelFactor1< Point3 > Base
shorthand for base class type
Definition: TriangulationFactor.h:52
TriangulationFactor()
Default constructor.
Definition: TriangulationFactor.h:61
const Point2 & measured() const
return the measurement
Definition: TriangulationFactor.h:169
A non-templated config holding any types of Manifold-group elements.
Definition: Values.h:75
Definition: PinholeCamera.h:40
bool verboseCheirality() const
return verbosity
Definition: TriangulationFactor.h:174
const ValueType & at(Key j) const
Retrieve a variable by key j.
Definition: Values-inl.h:219
Definition: CalibratedCamera.h:27
const Point2 measured_
2D measurement
Definition: TriangulationFactor.h:43
const bool throwCheirality_
If true, rethrows Cheirality exceptions (default: false)
Definition: TriangulationFactor.h:46
boost::shared_ptr< This > shared_ptr
shorthand for a smart pointer to a factor
Definition: TriangulationFactor.h:58
size_t Key
Integer nonlinear key type.
Definition: types.h:59
Definition: TriangulationFactor.h:32
Matrix ones(size_t m, size_t n)
Creates an ones matrix, with matlab-like syntax.
Definition: Matrix.cpp:45
A convenient base class for creating your own NoiseModelFactor with 1 variable.
Definition: NonlinearFactor.h:354
virtual gtsam::NonlinearFactor::shared_ptr clone() const
Definition: TriangulationFactor.h:89
bool equals(const PinholeCamera &camera, double tol=1e-9) const
assert equality up to a tolerance
Definition: PinholeCamera.h:130
virtual double error(const Values &c) const
Calculate the error of the factor.
Definition: NonlinearFactor.h:281
virtual bool active(const Values &c) const
Checks whether a factor should be used based on a set of values.
Definition: NonlinearFactor.h:125
void print(const std::string &s="PinholeCamera") const
print
Definition: PinholeCamera.h:136
A simple camera class with a Cal3_S2 calibration.
TriangulationFactor(const Camera &camera, const Point2 &measured, const SharedNoiseModel &model, Key pointKey, bool throwCheirality=false, bool verboseCheirality=false)
Constructor with exception-handling flags.
Definition: TriangulationFactor.h:74
const Camera camera_
Camera in which this landmark was seen.
Definition: TriangulationFactor.h:42
virtual void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const
Print.
Definition: NonlinearFactor.h:231
noiseModel::Base::shared_ptr SharedNoiseModel
Note, deliberately not in noiseModel namespace.
Definition: NoiseModel.h:884
Nonlinear factor base class.
Definition: NonlinearFactor.h:54
boost::shared_ptr< GaussianFactor > linearize(const Values &x) const
Linearize to a JacobianFactor, does not support constrained noise model ! Hence .
Definition: TriangulationFactor.h:143
Definition: Point3.h:39
Matrix zeros(size_t m, size_t n)
Creates an zeros matrix, with matlab-like syntax.
Definition: Matrix.cpp:40
boost::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: types.h:62