31#include <gtsam_unstable/dllexport.h>
33#if GTSAM_ENABLE_BOOST_SERIALIZATION
34#include <boost/serialization/optional.hpp>
65 const SmartStereoProjectionParams params_;
77 typedef std::shared_ptr<SmartStereoProjectionFactor>
shared_ptr;
85 typedef MonoCamera::MeasurementVector MonoMeasurements;
92 const SmartStereoProjectionParams& params = SmartStereoProjectionParams(),
93 const std::optional<Pose3> body_P_sensor = {}) :
94 Base(sharedNoiseModel, body_P_sensor),
110 std::cout << s <<
"SmartStereoProjectionFactor\n";
111 std::cout <<
"linearizationMode:\n" << params_.linearizationMode << std::endl;
112 std::cout <<
"triangulationParameters:\n" << params_.triangulation << std::endl;
113 std::cout <<
"result:\n" <<
result_ << std::endl;
133 bool retriangulate =
false;
138 retriangulate =
true;
140 if (!retriangulate) {
141 for (
size_t i = 0; i <
cameras.size(); i++) {
143 params_.retriangulationThreshold)) {
144 retriangulate =
true;
153 for (
size_t i = 0; i < m; i++)
158 return retriangulate;
173 MonoCameras monoCameras;
174 MonoMeasurements monoMeasured;
175 for(
size_t i = 0; i < m; i++) {
178 const MonoCamera leftCamera_i(leftPose,monoCal);
180 const Pose3 rightPose = leftPose.compose( left_Pose_right );
181 const MonoCamera rightCamera_i(rightPose,monoCal);
183 monoCameras.push_back(leftCamera_i);
184 monoMeasured.push_back(
Point2(zi.
uL(),zi.
v()));
185 if(!std::isnan(zi.
uR())){
186 monoCameras.push_back(rightCamera_i);
187 monoMeasured.push_back(
Point2(zi.
uR(),zi.
v()));
192 params_.triangulation);
204 const Cameras&
cameras,
const double lambda = 0.0,
bool diagonalDamping =
207 size_t numKeys = this->
keys_.size();
210 std::vector<Matrix> Gs(numKeys * (numKeys + 1) / 2);
211 std::vector<Vector> gs(numKeys);
214 throw std::runtime_error(
"SmartStereoProjectionHessianFactor: this->"
215 "measured_.size() inconsistent with input");
219 if (params_.degeneracyMode == ZERO_ON_DEGENERACY && !
result_) {
225 return std::make_shared<RegularHessianFactor<Base::Dim> >(this->
keys_,
242 return std::make_shared<RegularHessianFactor<Base::Dim> >(this->
keys_,
278 return std::make_shared<JacobianFactorSVD<Base::Dim, ZDim> >(this->
keys_);
305 const double _lambda = 0.0)
const {
307 switch (params_.linearizationMode) {
317 throw std::runtime_error(
"SmartStereoFactorlinearize: unknown mode");
327 const double _lambda = 0.0)
const {
335 const Values& values)
const override {
347 return nonDegenerate;
365 Matrix& E, Vector& b,
369 throw (
"computeJacobiansWithTriangulatedPoint");
384 FBlocks& Fs, Matrix& E, Vector& b,
385 const Values& values)
const {
390 return nonDegenerate;
395 FBlocks& Fs, Matrix& Enull, Vector& b,
396 const Values& values)
const {
401 return nonDegenerate;
421 std::optional<Point3> externalPoint = {})
const {
432 throw(std::runtime_error(
"Backproject at infinity not implemented for SmartStereo."));
446 if (this->
active(values)) {
459 typename Cameras::FBlocks* Fs =
nullptr,
460 Matrix* E =
nullptr)
const override {
462 for (
size_t i = 0; i <
cameras.size(); i++) {
464 if (std::isnan(z.
uR()))
467 MatrixZD& Fi = Fs->at(i);
468 for (
size_t ii = 0; ii <
Dim; ii++) Fi(1, ii) = 0.0;
471 E->row(
ZDim * i + 1) = Matrix::Zero(1, E->cols());
474 ue(
ZDim * i + 1) = 0.0;
507#if GTSAM_ENABLE_BOOST_SERIALIZATION
509 friend class boost::serialization::access;
510 template<
class ARCHIVE>
511 void serialize(ARCHIVE & ar,
const unsigned int ) {
512 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
522 SmartStereoProjectionFactor> {
3D Pose manifold SO(3) x R^3 and group SE(3)
Functions for triangulation.
A Stereo Camera based on two Simple Cameras.
A non-linear factor for stereo measurements.
utility functions for loading datasets
Base class to create smart factors on poses or cameras.
Collect common parameters for SmartProjection and SmartStereoProjection factors.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
KeyFormatter DefaultKeyFormatter
Assign default key formatter.
Definition Key.cpp:30
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition Key.h:91
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
TriangulationResult triangulateSafe(const CameraSet< CAMERA > &cameras, const typename CAMERA::MeasurementVector &measured, const TriangulationParameters ¶ms)
triangulateSafe: extensive checking of the outcome
Definition triangulation.h:706
noiseModel::Base::shared_ptr SharedNoiseModel
Aliases.
Definition NoiseModel.h:846
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
This class stores a dense matrix and allows it to be accessed as a collection of blocks.
Definition SymmetricBlockMatrix.h:80
A helper that implements the traits interface for GTSAM types.
Definition Testable.h:152
The most common 5DOF 3D->2D calibration.
Definition Cal3_S2.h:35
A set of cameras, all with their own calibration.
Definition CameraSet.h:37
static SymmetricBlockMatrix SchurComplement(const std::vector< Eigen::Matrix< double, ZDim, ND >, Eigen::aligned_allocator< Eigen::Matrix< double, ZDim, ND > > > &Fs, const Matrix &E, const Eigen::Matrix< double, N, N > &P, const Vector &b)
Definition CameraSet.h:175
A pinhole camera class that has a Pose3 and a Calibration.
Definition PinholeCamera.h:34
A 3D pose (R,t) : (Rot3,Point3).
Definition Pose3.h:42
Rot3 is a 3D rotation represented as a rotation matrix if the preprocessor symbol GTSAM_USE_QUATERNIO...
Definition Rot3.h:65
A 2D stereo point, v will be same for rectified images.
Definition StereoPoint2.h:34
double uR() const
get uR
Definition StereoPoint2.h:113
double uL() const
get uL
Definition StereoPoint2.h:110
double v() const
get v
Definition StereoPoint2.h:116
TriangulationResult is an optional point, along with the reasons why it is invalid.
Definition triangulation.h:646
KeyVector keys_
The keys involved in this factor.
Definition Factor.h:88
Nonlinear factor base class.
Definition NonlinearFactor.h:70
virtual bool active(const Values &c) const
Checks whether a factor should be used based on a set of values.
Definition NonlinearFactor.h:143
A non-templated config holding any types of Manifold-group elements.
Definition Values.h:65
void computeJacobians(FBlocks &Fs, Matrix &E, Vector &b, const Cameras &cameras, const POINT &point) const
Definition SmartFactorBase.h:318
std::shared_ptr< JacobianFactor > createJacobianSVDFactor(const Cameras &cameras, const Point3 &point, double lambda=0.0) const
Definition SmartFactorBase.h:419
static const int Dim
Definition SmartFactorBase.h:61
virtual Cameras cameras(const Values &values) const
Definition SmartFactorBase.h:165
Vector unwhitenedError(const Cameras &cameras, const POINT &point, typename Cameras::FBlocks *Fs=nullptr, Matrix *E=nullptr) const
Definition SmartFactorBase.h:211
double totalReprojectionError(const Cameras &cameras, const POINT &point) const
Definition SmartFactorBase.h:300
void computeJacobiansSVD(FBlocks &Fs, Matrix &Enull, Vector &b, const Cameras &cameras, const POINT &point) const
Definition SmartFactorBase.h:333
ZVector measured_
Definition SmartFactorBase.h:80
SmartFactorBase()
Definition SmartFactorBase.h:96
void whitenJacobians(FBlocks &F, Matrix &E, Vector &b) const
Definition SmartFactorBase.h:380
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Definition SmartFactorBase.h:178
static const int ZDim
Definition SmartFactorBase.h:62
bool equals(const NonlinearFactor &p, double tol=1e-9) const override
Definition SmartFactorBase.h:191
Definition SmartFactorParams.h:42
bool throwCheirality
If true, re-throws Cheirality exceptions (default: false).
Definition SmartFactorParams.h:55
LinearizationMode linearizationMode
How to linearize the factor.
Definition SmartFactorParams.h:44
DegeneracyMode degeneracyMode
How to linearize the factor.
Definition SmartFactorParams.h:45
bool verboseCheirality
If true, prints text for Cheirality exceptions (default: false).
Definition SmartFactorParams.h:56
SmartStereoProjectionFactor: triangulates point and keeps an estimate of it around.
Definition SmartStereoProjectionFactor.h:56
void computeJacobiansWithTriangulatedPoint(FBlocks &Fs, Matrix &E, Vector &b, const Cameras &cameras) const
Compute F, E only (called below in both vanilla and SVD versions) Assumes the point has been computed...
Definition SmartStereoProjectionFactor.h:363
bool decideIfTriangulate(const Cameras &cameras) const
Check if the new linearization point_ is the same as the one used for previous triangulation.
Definition SmartStereoProjectionFactor.h:126
~SmartStereoProjectionFactor() override
Virtual destructor.
Definition SmartStereoProjectionFactor.h:100
std::shared_ptr< RegularHessianFactor< Base::Dim > > createHessianFactor(const Cameras &cameras, const double lambda=0.0, bool diagonalDamping=false) const
linearize returns a Hessianfactor that is an approximation of error(p)
Definition SmartStereoProjectionFactor.h:203
TriangulationResult triangulateSafe(const Cameras &cameras) const
triangulateSafe
Definition SmartStereoProjectionFactor.h:167
Vector reprojectionErrorAfterTriangulation(const Values &values) const
Calculate vector of re-projection errors, before applying noise model.
Definition SmartStereoProjectionFactor.h:405
std::shared_ptr< GaussianFactor > linearize(const Values &values) const override
linearize
Definition SmartStereoProjectionFactor.h:334
std::vector< Pose3 > cameraPosesTriangulation_
current triangulation poses
Definition SmartStereoProjectionFactor.h:71
std::shared_ptr< GaussianFactor > linearizeDamped(const Cameras &cameras, const double _lambda=0.0) const
Linearize to Gaussian Factor.
Definition SmartStereoProjectionFactor.h:304
void correctForMissingMeasurements(const Cameras &cameras, Vector &ue, typename Cameras::FBlocks *Fs=nullptr, Matrix *E=nullptr) const override
This corrects the Jacobians and error vector for the case in which the right 2D measurement in the mo...
Definition SmartStereoProjectionFactor.h:457
std::shared_ptr< SmartStereoProjectionFactor > shared_ptr
shorthand for a smart pointer to a factor
Definition SmartStereoProjectionFactor.h:77
TriangulationResult result_
result from triangulateSafe
Definition SmartStereoProjectionFactor.h:70
double totalReprojectionError(const Cameras &cameras, std::optional< Point3 > externalPoint={}) const
Calculate the error of the factor.
Definition SmartStereoProjectionFactor.h:420
PinholeCamera< Cal3_S2 > MonoCamera
Vector of monocular cameras (stereo treated as 2 monocular).
Definition SmartStereoProjectionFactor.h:83
bool isOutlier() const
return the outlier state
Definition SmartStereoProjectionFactor.h:500
bool equals(const NonlinearFactor &p, double tol=1e-9) const override
equals
Definition SmartStereoProjectionFactor.h:118
SmartStereoProjectionFactor(const SharedNoiseModel &sharedNoiseModel, const SmartStereoProjectionParams ¶ms=SmartStereoProjectionParams(), const std::optional< Pose3 > body_P_sensor={})
Constructor.
Definition SmartStereoProjectionFactor.h:91
std::shared_ptr< GaussianFactor > linearizeDamped(const Values &values, const double _lambda=0.0) const
Linearize to Gaussian Factor.
Definition SmartStereoProjectionFactor.h:326
double error(const Values &values) const override
Calculate total reprojection error.
Definition SmartStereoProjectionFactor.h:445
bool triangulateAndComputeE(Matrix &E, const Values &values) const
Triangulate and compute derivative of error with respect to point.
Definition SmartStereoProjectionFactor.h:354
bool triangulateAndComputeJacobians(FBlocks &Fs, Matrix &E, Vector &b, const Values &values) const
Version that takes values, and creates the point.
Definition SmartStereoProjectionFactor.h:383
CameraSet< StereoCamera > Cameras
Vector of cameras.
Definition SmartStereoProjectionFactor.h:80
std::shared_ptr< JacobianFactor > createJacobianSVDFactor(const Cameras &cameras, double _lambda) const
different (faster) way to compute Jacobian factor
Definition SmartStereoProjectionFactor.h:273
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition SmartStereoProjectionFactor.h:108
bool isDegenerate() const
return the degenerate state
Definition SmartStereoProjectionFactor.h:494
TriangulationResult point() const
return the landmark
Definition SmartStereoProjectionFactor.h:480
bool triangulateAndComputeJacobiansSVD(FBlocks &Fs, Matrix &Enull, Vector &b, const Values &values) const
takes values
Definition SmartStereoProjectionFactor.h:394
bool isPointBehindCamera() const
return the cheirality status flag
Definition SmartStereoProjectionFactor.h:497
bool triangulateAndComputeE(Matrix &E, const Cameras &cameras) const
Triangulate and compute derivative of error with respect to point.
Definition SmartStereoProjectionFactor.h:343
bool triangulateForLinearize(const Cameras &cameras) const
triangulate
Definition SmartStereoProjectionFactor.h:197
bool isFarPoint() const
return the farPoint state
Definition SmartStereoProjectionFactor.h:503
bool isValid() const
Is result valid?
Definition SmartStereoProjectionFactor.h:491
TriangulationResult point(const Values &values) const
COMPUTE the landmark.
Definition SmartStereoProjectionFactor.h:485