23 #include <gtsam/slam/TriangulationFactor.h> 26 #include <gtsam/inference/Symbol.h> 34 std::runtime_error(
"Triangulation Underconstrained Exception.") {
43 "Triangulation Cheirality Exception: The resulting landmark is behind one or more cameras.") {
55 const std::vector<Matrix34>& projection_matrices,
56 const std::vector<Point2>& measurements,
double rank_tol = 1e-9);
66 const std::vector<Matrix34>& projection_matrices,
67 const std::vector<Point2>& measurements,
double rank_tol = 1e-9);
78 template<
class CALIBRATION>
80 const std::vector<Pose3>& poses, boost::shared_ptr<CALIBRATION> sharedCal,
81 const std::vector<Point2>& measurements,
Key landmarkKey,
82 const Point3& initialEstimate) {
84 values.
insert(landmarkKey, initialEstimate);
88 for (
size_t i = 0; i < measurements.size(); i++) {
89 const Pose3& pose_i = poses[i];
91 Camera camera_i(pose_i, sharedCal);
93 (camera_i, measurements[i], unit2, landmarkKey));
95 return std::make_pair(graph, values);
107 template<
class CAMERA>
109 const std::vector<CAMERA>& cameras,
110 const std::vector<typename CAMERA::Measurement>& measurements,
Key landmarkKey,
111 const Point3& initialEstimate) {
113 values.
insert(landmarkKey, initialEstimate);
117 for (
size_t i = 0; i < measurements.size(); i++) {
118 const CAMERA& camera_i = cameras[i];
120 (camera_i, measurements[i], unit, landmarkKey));
122 return std::make_pair(graph, values);
126 template<
class CALIBRATION>
129 const std::vector<Point2>& measurements,
Key landmarkKey,
130 const Point3& initialEstimate) {
131 return triangulationGraph<PinholeCamera<CALIBRATION> >
132 (cameras, measurements, landmarkKey, initialEstimate);
153 template<
class CALIBRATION>
155 boost::shared_ptr<CALIBRATION> sharedCal,
156 const std::vector<Point2>& measurements,
const Point3& initialEstimate) {
161 boost::tie(graph, values) = triangulationGraph<CALIBRATION>
162 (poses, sharedCal, measurements,
Symbol(
'p', 0), initialEstimate);
174 template<
class CAMERA>
176 const std::vector<CAMERA>& cameras,
177 const std::vector<typename CAMERA::Measurement>& measurements,
const Point3& initialEstimate) {
182 boost::tie(graph, values) = triangulationGraph<CAMERA>
183 (cameras, measurements,
Symbol(
'p', 0), initialEstimate);
189 template<
class CALIBRATION>
192 const std::vector<Point2>& measurements,
const Point3& initialEstimate) {
193 return triangulateNonlinear<PinholeCamera<CALIBRATION> >
194 (cameras, measurements, initialEstimate);
204 template<
class CALIBRATION>
207 K_(calibration.K()) {
209 Matrix34 operator()(
const Pose3& pose)
const {
228 template<
class CALIBRATION>
230 boost::shared_ptr<CALIBRATION> sharedCal,
231 const std::vector<Point2>& measurements,
double rank_tol = 1e-9,
232 bool optimize =
false) {
234 assert(poses.size() == measurements.size());
235 if (poses.size() < 2)
239 std::vector<Matrix34> projection_matrices;
241 for(
const Pose3& pose: poses)
242 projection_matrices.push_back(createP(pose));
249 point = triangulateNonlinear<CALIBRATION>
250 (poses, sharedCal, measurements, point);
252 #ifdef GTSAM_THROW_CHEIRALITY_EXCEPTION 254 for(
const Pose3& pose: poses) {
255 const Point3& p_local = pose.transform_to(point);
256 if (p_local.
z() <= 0)
276 template<
class CAMERA>
278 const std::vector<CAMERA>& cameras,
279 const std::vector<Point2>& measurements,
double rank_tol = 1e-9,
280 bool optimize =
false) {
282 size_t m = cameras.size();
283 assert(measurements.size() == m);
289 std::vector<Matrix34> projection_matrices;
290 for(
const CAMERA& camera: cameras)
291 projection_matrices.push_back(
298 point = triangulateNonlinear<CAMERA>(cameras, measurements, point);
300 #ifdef GTSAM_THROW_CHEIRALITY_EXCEPTION 302 for(
const CAMERA& camera: cameras) {
303 const Point3& p_local = camera.pose().transform_to(point);
304 if (p_local.
z() <= 0)
313 template<
class CALIBRATION>
316 const std::vector<Point2>& measurements,
double rank_tol = 1e-9,
317 bool optimize =
false) {
318 return triangulatePoint3<PinholeCamera<CALIBRATION> >
319 (cameras, measurements, rank_tol,
optimize);
349 const bool _enableEPI =
false,
double _landmarkDistanceThreshold = -1,
350 double _dynamicOutlierRejectionThreshold = -1) :
351 rankTolerance(_rankTolerance), enableEPI(_enableEPI),
352 landmarkDistanceThreshold(_landmarkDistanceThreshold),
353 dynamicOutlierRejectionThreshold(_dynamicOutlierRejectionThreshold) {
357 friend std::ostream &operator<<(std::ostream &os,
360 os <<
"enableEPI = " << p.
enableEPI << std::endl;
363 os <<
"dynamicOutlierRejectionThreshold = " 371 friend class boost::serialization::access;
372 template<
class ARCHIVE>
373 void serialize(ARCHIVE & ar,
const unsigned int version) {
374 ar & BOOST_SERIALIZATION_NVP(rankTolerance);
375 ar & BOOST_SERIALIZATION_NVP(enableEPI);
376 ar & BOOST_SERIALIZATION_NVP(landmarkDistanceThreshold);
377 ar & BOOST_SERIALIZATION_NVP(dynamicOutlierRejectionThreshold);
386 VALID, DEGENERATE, BEHIND_CAMERA
412 bool degenerate()
const {
413 return status_ == DEGENERATE;
415 bool behindCamera()
const {
416 return status_ == BEHIND_CAMERA;
419 friend std::ostream &operator<<(std::ostream &os,
422 os <<
"point = " << *result << std::endl;
424 os <<
"no point, status = " << result.status_ << std::endl;
431 friend class boost::serialization::access;
432 template<
class ARCHIVE>
433 void serialize(ARCHIVE & ar,
const unsigned int version) {
434 ar & BOOST_SERIALIZATION_NVP(status_);
439 template<
class CAMERA>
441 const std::vector<Point2>& measured,
444 size_t m = cameras.size();
448 return TriangulationResult::Degenerate();
452 Point3 point = triangulatePoint3<CAMERA>(cameras, measured,
457 double totalReprojError = 0.0;
458 for(
const CAMERA& camera: cameras) {
459 const Pose3& pose = camera.pose();
463 return TriangulationResult::Degenerate();
464 #ifdef GTSAM_THROW_CHEIRALITY_EXCEPTION 468 if (p_local.
z() <= 0)
469 return TriangulationResult::BehindCamera();
473 const Point2& zi = measured.at(i);
474 Point2 reprojectionError(camera.project(point) - zi);
475 totalReprojError += reprojectionError.
norm();
482 return TriangulationResult::Degenerate();
490 return TriangulationResult::Degenerate();
493 return TriangulationResult::BehindCamera();
Exception thrown by triangulateDLT when landmark is behind one or more of the cameras.
Definition: triangulation.h:39
Point3 triangulateDLT(const std::vector< Matrix34 > &projection_matrices, const std::vector< Point2 > &measurements, double rank_tol)
DLT triangulation: See Hartley and Zisserman, 2nd Ed., page 312.
Definition: triangulation.cpp:56
double dynamicOutlierRejectionThreshold
If this is nonnegative the we will check if the average reprojection error is smaller than this thres...
Definition: triangulation.h:338
TriangulationResult is an optional point, along with the reasons why it is invalid.
Definition: triangulation.h:384
void insert(Key j, const Value &val)
Add a variable with the given j, throws KeyAlreadyExists<J> if j is already present.
Definition: Values.cpp:133
std::pair< NonlinearFactorGraph, Values > triangulationGraph(const std::vector< Pose3 > &poses, boost::shared_ptr< CALIBRATION > sharedCal, const std::vector< Point2 > &measurements, Key landmarkKey, const Point3 &initialEstimate)
Create a factor graph with projection factors from poses and one calibration.
Definition: triangulation.h:79
Point3 transform_to(const Point3 &p, OptionalJacobian< 3, 6 > Dpose=boost::none, OptionalJacobian< 3, 3 > Dpoint=boost::none) const
takes point in world coordinates and transforms it to Pose coordinates
Definition: Pose3.cpp:319
double rankTolerance
threshold to decide whether triangulation is result.degenerate
Definition: triangulation.h:324
Character and index key used in VectorValues, GaussianFactorGraph, GaussianFactor, etc.
Definition: Symbol.h:34
Point3 triangulateNonlinear(const std::vector< Pose3 > &poses, boost::shared_ptr< CALIBRATION > sharedCal, const std::vector< Point2 > &measurements, const Point3 &initialEstimate)
Given an initial estimate , refine a point using measurements in several cameras. ...
Definition: triangulation.h:154
TriangulationResult(const Point3 &p)
Constructor.
Definition: triangulation.h:402
noiseModel::Base::shared_ptr SharedNoiseModel
Note, deliberately not in noiseModel namespace.
Definition: NoiseModel.h:1072
Vector4 triangulateHomogeneousDLT(const std::vector< Matrix34 > &projection_matrices, const std::vector< Point2 > &measurements, double rank_tol)
DLT triangulation: See Hartley and Zisserman, 2nd Ed., page 312.
Definition: triangulation.cpp:26
Pose3 inverse() const
inverse transformation with derivatives
Definition: Pose3.cpp:47
Definition: PinholePose.h:225
static shared_ptr Sigma(size_t dim, double sigma, bool smart=true)
An isotropic noise model created by specifying a standard devation sigma.
Definition: NoiseModel.cpp:561
A non-templated config holding any types of Manifold-group elements.
Definition: Values.h:70
bool enableEPI
if set to true, will refine triangulation using LM
Definition: triangulation.h:325
Definition: triangulation.h:322
Point3 triangulatePoint3(const std::vector< Pose3 > &poses, boost::shared_ptr< CALIBRATION > sharedCal, const std::vector< Point2 > &measurements, double rank_tol=1e-9, bool optimize=false)
Function to triangulate 3D landmark point from an arbitrary number of poses (at least 2) using the DL...
Definition: triangulation.h:229
TriangulationResult()
Default constructor, only for serialization.
Definition: triangulation.h:397
double landmarkDistanceThreshold
if the landmark is triangulated at distance larger than this, result is flagged as degenerate...
Definition: triangulation.h:331
TriangulationResult triangulateSafe(const std::vector< CAMERA > &cameras, const std::vector< Point2 > &measured, const TriangulationParameters ¶ms)
triangulateSafe: extensive checking of the outcome
Definition: triangulation.h:440
double distance3(const Point3 &p1, const Point3 &q, OptionalJacobian< 1, 3 > H1, OptionalJacobian< 1, 3 > H2)
distance between two points
Definition: Point3.cpp:83
Base class for all pinhole cameras.
TriangulationParameters(const double _rankTolerance=1.0, const bool _enableEPI=false, double _landmarkDistanceThreshold=-1, double _dynamicOutlierRejectionThreshold=-1)
Constructor.
Definition: triangulation.h:348
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition: concepts.h:30
Definition: PinholeCamera.h:33
Point3 optimize(const NonlinearFactorGraph &graph, const Values &values, Key landmarkKey)
Optimize for triangulation.
Definition: triangulation.cpp:73
double z() const
get z
Definition: Point3.h:114
Exception thrown by triangulateDLT when SVD returns rank < 3.
Definition: triangulation.h:31
A non-linear factor graph is a graph of non-Gaussian, i.e.
Definition: NonlinearFactorGraph.h:77
boost::enable_if< boost::is_base_of< FactorType, DERIVEDFACTOR > >::type push_back(boost::shared_ptr< DERIVEDFACTOR > factor)
Add a factor directly using a shared_ptr.
Definition: FactorGraph.h:155
Create a 3*4 camera projection matrix from calibration and pose.
Definition: triangulation.h:205
Factor Graph Constsiting of non-linear factors.
static shared_ptr Create(size_t dim)
Create a unit covariance noise model.
Definition: NoiseModel.h:601
Definition: TriangulationFactor.h:31
Matrix4 matrix() const
convert to 4*4 matrix
Definition: Pose3.cpp:280
const Point3 & translation(OptionalJacobian< 3, 6 > H=boost::none) const
get translation
Definition: Pose3.cpp:265
double norm(OptionalJacobian< 1, 2 > H=boost::none) const
norm of point, with derivative
Definition: Point2.cpp:65
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:57
Global functions in a separate testing namespace.
Definition: chartTesting.h:28