23#include <gtsam/geometry/EssentialMatrix.h>
69 template <
class CALIBRATION>
72 std::shared_ptr<CALIBRATION> K)
82 gtsam::NonlinearFactor::shared_ptr
clone()
const override {
83 return std::static_pointer_cast<gtsam::NonlinearFactor>(
84 gtsam::NonlinearFactor::shared_ptr(
new This(*
this)));
89 const std::string& s =
"",
92 std::cout <<
" EssentialMatrixFactor with measurements\n ("
93 << vA_.transpose() <<
")' and (" << vB_.transpose() <<
")'"
101 error(0) = E.error(vA_, vB_, H);
134 : Base(model, key1, key2),
149 template <
class CALIBRATION>
152 std::shared_ptr<CALIBRATION> K)
153 : Base(model, key1, key2),
155 pn_(K->calibrate(pB)) {
156 f_ = 0.5 * (K->fx() + K->fy());
160 gtsam::NonlinearFactor::shared_ptr
clone()
const override {
161 return std::static_pointer_cast<gtsam::NonlinearFactor>(
162 gtsam::NonlinearFactor::shared_ptr(
new This(*
this)));
167 const std::string& s =
"",
170 std::cout <<
" EssentialMatrixFactor2 with measurements\n ("
171 << dP1_.transpose() <<
")' and (" << pn_.transpose() <<
")'"
195 Point3 _1T2 = E.direction().point3();
197 Point3 dP2 = E.rotation().unrotate(dP1_ - d1T2);
203 Matrix D_1T2_dir, DdP2_rot, DP2_point;
205 Point3 _1T2 = E.direction().point3(D_1T2_dir);
207 Point3 dP2 = E.rotation().unrotate(dP1_ - d1T2, DdP2_rot, DP2_point);
214 DdP2_E << DdP2_rot, -DP2_point * d * D_1T2_dir;
215 *DE = f_ * Dpn_dP2 * DdP2_E;
220 *Dd = -f_ * (Dpn_dP2 * (DP2_point * _1T2));
222 Point2 reprojectionError = pn - pn_;
223 return f_ * reprojectionError;
242 using Base::evaluateError;
266 template <
class CALIBRATION>
269 std::shared_ptr<CALIBRATION> K)
273 gtsam::NonlinearFactor::shared_ptr
clone()
const override {
274 return std::static_pointer_cast<gtsam::NonlinearFactor>(
275 gtsam::NonlinearFactor::shared_ptr(
new This(*
this)));
280 const std::string& s =
"",
283 std::cout <<
" EssentialMatrixFactor3 with rotation " << cRb_ << std::endl;
298 return Base::evaluateError(cameraE, d,
OptionalNone, Dd);
301 Matrix D_e_cameraE, D_cameraE_E;
302 EssentialMatrix cameraE = E.rotate(cRb_, D_cameraE_E);
306 Vector e = Base::evaluateError(cameraE, d, &D_e_cameraE, Dd);
307 *DE = D_e_cameraE * D_cameraE_E;
328template <
class CALIBRATION>
337 static constexpr int DimK = FixedDimension<CALIBRATION>::value;
338 typedef Eigen::Matrix<double, 2, DimK> JacobianCalibration;
355 : Base(
noiseModel::validOrDefault(0.0, model), keyE, keyK),
359 gtsam::NonlinearFactor::shared_ptr
clone()
const override {
360 return std::static_pointer_cast<gtsam::NonlinearFactor>(
361 gtsam::NonlinearFactor::shared_ptr(
new This(*
this)));
366 const std::string& s =
"",
369 std::cout <<
" EssentialMatrixFactor4 with measurements\n ("
370 << pA_.transpose() <<
")' and (" << pB_.transpose() <<
")'"
387 JacobianCalibration cA_H_K;
388 JacobianCalibration cB_H_K;
403 Matrix DynamicH_K = vB.transpose() * E.matrix().transpose().leftCols<2>() * cA_H_K +
404 vA.transpose() * E.matrix().leftCols<2>() * cB_H_K;
408 return Vector1(E.error(vA, vB, HE));
425template <
class CALIBRATION>
436 static constexpr int DimK = FixedDimension<CALIBRATION>::value;
437 typedef Eigen::Matrix<double, 2, DimK> JacobianCalibration;
456 : Base(
noiseModel::validOrDefault(0.0, model), keyE, keyKa, keyKb),
460 gtsam::NonlinearFactor::shared_ptr
clone()
const override {
461 return std::static_pointer_cast<gtsam::NonlinearFactor>(
462 gtsam::NonlinearFactor::shared_ptr(
new This(*
this)));
467 const std::string& s =
"",
470 std::cout <<
" EssentialMatrixFactor5 with measurements\n ("
471 << pA_.transpose() <<
")' and (" << pB_.transpose() <<
")'"
491 JacobianCalibration cA_H_Ka;
492 JacobianCalibration cB_H_Kb;
502 Matrix DynamicHka = vB.transpose() * E.matrix().transpose().leftCols<2>() * cA_H_Ka;
508 Matrix DynamicHkb = vA.transpose() * E.matrix().leftCols<2>() * cB_H_Kb;
512 return Vector1(E.error(vA, vB, HE));
Base class for all pinhole cameras.
Non-linear factor base classes.
#define OptionalNone
These typedefs and aliases will help with making the evaluateError interface independent of boost TOD...
Definition NonlinearFactor.h:51
Global functions in a separate testing namespace.
Definition chartTesting.h:28
KeyFormatter DefaultKeyFormatter
Assign default key formatter.
Definition Key.cpp:30
Matrix * OptionalMatrixType
This typedef will be used everywhere boost::optional<Matrix&> reference was used previously.
Definition NonlinearFactor.h:57
NoiseModelFactorT< Vector, ValueTypes... > NoiseModelFactorN
Noise model factor with N value types and dynamic-sized error vector.
Definition NoiseModelFactorN.h:561
Vector3 Point3
As of GTSAM 4, in order to make GTSAM more lean, it is now possible to just typedef Point3 to Vector3...
Definition Point3.h:38
Vector2 Point2
As of GTSAM 4, in order to make GTSAM more lean, it is now possible to just typedef Point2 to Vector2...
Definition Point2.h:32
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition Key.h:35
noiseModel::Base::shared_ptr SharedNoiseModel
Aliases.
Definition NoiseModel.h:846
std::uint64_t Key
Integer nonlinear key type.
Definition types.h:43
All noise models live in the noiseModel namespace.
Definition LossFunctions.cpp:33
static Point2 Project(const Point3 &pc, OptionalJacobian< 2, 3 > Dpoint={})
Project from 3D point in camera coordinates into image Does not throw a CheiralityException,...
Definition CalibratedCamera.cpp:89
An essential matrix is like a Pose3, except with translation up to scale It is named after the 3*3 ma...
Definition EssentialMatrix.h:26
static Vector3 Homogeneous(const Point2 &p)
Static function to convert Point2 to homogeneous coordinates.
Definition EssentialMatrix.h:34
Rot3 is a 3D rotation represented as a rotation matrix if the preprocessor symbol GTSAM_USE_QUATERNIO...
Definition Rot3.h:65
virtual void print(const std::string &s="Factor", const KeyFormatter &formatter=DefaultKeyFormatter) const
print
Definition Factor.cpp:29
NoiseModelFactorT()
Definition NoiseModelFactorN.h:257
virtual Vector evaluateError(const ValueTypes &... x, OptionalMatrixTypeT< ValueTypes >... H) const=0
Key key() const
Definition NoiseModelFactorN.h:307
double error(const Values &c) const override
Calculate the error of the factor.
Definition NonlinearFactor.cpp:146
EssentialMatrixFactor(Key key, const Point2 &pA, const Point2 &pB, const SharedNoiseModel &model, std::shared_ptr< CALIBRATION > K)
Constructor.
Definition EssentialMatrixFactor.h:70
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition EssentialMatrixFactor.h:82
EssentialMatrixFactor(Key key, const Point2 &pA, const Point2 &pB, const SharedNoiseModel &model)
Constructor.
Definition EssentialMatrixFactor.h:53
Vector evaluateError(const EssentialMatrix &E, OptionalMatrixType H) const override
vector of errors returns 1D vector
Definition EssentialMatrixFactor.h:98
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition EssentialMatrixFactor.h:88
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition EssentialMatrixFactor.h:160
EssentialMatrixFactor2(Key key1, Key key2, const Point2 &pA, const Point2 &pB, const SharedNoiseModel &model, std::shared_ptr< CALIBRATION > K)
Constructor.
Definition EssentialMatrixFactor.h:150
EssentialMatrixFactor2(Key key1, Key key2, const Point2 &pA, const Point2 &pB, const SharedNoiseModel &model)
Constructor.
Definition EssentialMatrixFactor.h:132
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition EssentialMatrixFactor.h:166
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition EssentialMatrixFactor.h:279
EssentialMatrixFactor3(Key key1, Key key2, const Point2 &pA, const Point2 &pB, const Rot3 &cRb, const SharedNoiseModel &model)
Constructor.
Definition EssentialMatrixFactor.h:253
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition EssentialMatrixFactor.h:273
EssentialMatrixFactor3(Key key1, Key key2, const Point2 &pA, const Point2 &pB, const Rot3 &cRb, const SharedNoiseModel &model, std::shared_ptr< CALIBRATION > K)
Constructor.
Definition EssentialMatrixFactor.h:267
EssentialMatrixFactor4(Key keyE, Key keyK, const Point2 &pA, const Point2 &pB, const SharedNoiseModel &model=nullptr)
Constructor.
Definition EssentialMatrixFactor.h:353
Vector1 evaluateError(const EssentialMatrix &E, const CALIBRATION &K, OptionalMatrixType HE, OptionalMatrixType HK) const override
Calculate the algebraic epipolar error pA' (K^-1)' E K pB.
Definition EssentialMatrixFactor.h:383
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition EssentialMatrixFactor.h:365
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition EssentialMatrixFactor.h:359
Vector1 evaluateError(const EssentialMatrix &E, const CALIBRATION &Ka, const CALIBRATION &Kb, OptionalMatrixType HE, OptionalMatrixType HKa, OptionalMatrixType HKb) const override
Calculate the algebraic epipolar error pA' (Ka^-1)' E Kb pB.
Definition EssentialMatrixFactor.h:486
EssentialMatrixFactor5(Key keyE, Key keyKa, Key keyKb, const Point2 &pA, const Point2 &pB, const SharedNoiseModel &model=nullptr)
Constructor.
Definition EssentialMatrixFactor.h:453
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition EssentialMatrixFactor.h:460
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition EssentialMatrixFactor.h:466