22 #include <gtsam/geometry/TriangulationFactor.h>
24 #include <gtsam/inference/Symbol.h>
35 std::runtime_error(
"Triangulation Underconstrained Exception.") {
44 "Triangulation Cheirality Exception: The resulting landmark is behind one or more cameras.") {
56 const std::vector<Matrix>& projection_matrices,
57 const std::vector<Point2>& measurements,
double rank_tol);
69 template<
class CALIBRATION>
71 const std::vector<Pose3>& poses, boost::shared_ptr<CALIBRATION> sharedCal,
72 const std::vector<Point2>& measurements,
Key landmarkKey,
73 const Point3& initialEstimate) {
75 values.
insert(landmarkKey, initialEstimate);
79 for (
size_t i = 0; i < measurements.size(); i++) {
80 const Pose3& pose_i = poses[i];
83 (camera_i, measurements[i], unit2, landmarkKey));
85 return std::make_pair(graph, values);
97 template<
class CALIBRATION>
100 const std::vector<Point2>& measurements,
Key landmarkKey,
101 const Point3& initialEstimate) {
103 values.
insert(landmarkKey, initialEstimate);
107 for (
size_t i = 0; i < measurements.size(); i++) {
110 (camera_i, measurements[i], unit2, landmarkKey));
112 return std::make_pair(graph, values);
123 GTSAM_EXPORT Point3
optimize(
const NonlinearFactorGraph& graph,
124 const Values& values,
Key landmarkKey);
134 template<
class CALIBRATION>
136 boost::shared_ptr<CALIBRATION> sharedCal,
137 const std::vector<Point2>& measurements,
const Point3& initialEstimate) {
143 Symbol(
'p', 0), initialEstimate);
155 template<
class CALIBRATION>
158 const std::vector<Point2>& measurements,
const Point3& initialEstimate) {
164 Symbol(
'p', 0), initialEstimate);
181 template<
class CALIBRATION>
183 boost::shared_ptr<CALIBRATION> sharedCal,
184 const std::vector<Point2>& measurements,
double rank_tol = 1e-9,
187 assert(poses.size() == measurements.size());
188 if (poses.size() < 2)
192 std::vector<Matrix> projection_matrices;
193 BOOST_FOREACH(
const Pose3& pose, poses) {
194 projection_matrices.push_back(
205 #ifdef GTSAM_THROW_CHEIRALITY_EXCEPTION
207 BOOST_FOREACH(
const Pose3& pose, poses) {
209 if (p_local.
z() <= 0)
229 template<
class CALIBRATION>
232 const std::vector<Point2>& measurements,
double rank_tol = 1e-9,
235 size_t m = cameras.size();
236 assert(measurements.size()==m);
243 std::vector<Matrix> projection_matrices;
244 BOOST_FOREACH(
const Camera& camera, cameras)
245 projection_matrices.push_back(
246 camera.calibration().K()
247 *
sub(camera.pose().inverse().matrix(), 0, 3, 0, 4));
255 #ifdef GTSAM_THROW_CHEIRALITY_EXCEPTION
257 BOOST_FOREACH(
const Camera& camera, cameras) {
258 const Point3& p_local = camera.pose().transform_to(point);
259 if (p_local.
z() <= 0)
Matrix4 matrix() const
convert to 4*4 matrix
Definition: Pose3.cpp:225
static shared_ptr Create(size_t dim)
Create a unit covariance noise model.
Definition: NoiseModel.h:585
Character and index key used in VectorValues, GaussianFactorGraph, GaussianFactor, etc.
Definition: Symbol.h:33
Pose3 inverse(boost::optional< Matrix & > H1=boost::none) const
inverse transformation with derivatives
Definition: Pose3.cpp:282
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:127
Point3 triangulateDLT(const std::vector< Matrix > &projection_matrices, const std::vector< Point2 > &measurements, double rank_tol)
DLT triangulation: See Hartley and Zisserman, 2nd Ed., page 312.
Definition: triangulation.cpp:33
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:182
Eigen::Block< const MATRIX > sub(const MATRIX &A, size_t i1, size_t i2, size_t j1, size_t j2)
extract submatrix, slice semantics, i.e.
Definition: Matrix.h:205
Exception thrown by triangulateDLT when SVD returns rank < 3.
Definition: triangulation.h:32
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
Factor Graph Constsiting of non-linear factors.
A non-templated config holding any types of Manifold-group elements.
Definition: Values.h:75
Definition: PinholeCamera.h:40
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:135
double z() const
get z
Definition: Point3.h:205
A non-linear factor graph is a graph of non-Gaussian, i.e.
Definition: NonlinearFactorGraph.h:69
size_t Key
Integer nonlinear key type.
Definition: types.h:59
Definition: TriangulationFactor.h:32
Point3 optimize(const NonlinearFactorGraph &graph, const Values &values, Key landmarkKey)
Optimize for triangulation.
Definition: triangulation.cpp:72
Point3 transform_to(const Point3 &p, boost::optional< Matrix & > Dpose=boost::none, boost::optional< Matrix & > Dpoint=boost::none) const
takes point in world coordinates and transforms it to Pose coordinates
Definition: Pose3.cpp:257
Exception thrown by triangulateDLT when landmark is behind one or more of the cameras.
Definition: triangulation.h:40
noiseModel::Base::shared_ptr SharedNoiseModel
Note, deliberately not in noiseModel namespace.
Definition: NoiseModel.h:884
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:70
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:491