26 #include <gtsam/inference/Symbol.h> 31 #include <gtsam_unstable/dllexport.h> 33 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 34 #include <boost/serialization/optional.hpp> 45 typedef SmartProjectionParams SmartStereoProjectionParams;
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),
96 result_(TriangulationResult::Degenerate()) {
109 DefaultKeyFormatter)
const override {
110 std::cout << s <<
"SmartStereoProjectionFactor\n";
112 std::cout <<
"triangulationParameters:\n" << params_.triangulation << std::endl;
113 std::cout <<
"result:\n" << result_ << std::endl;
131 size_t m = cameras.size();
133 bool retriangulate =
false;
136 if (cameraPosesTriangulation_.empty()
137 || cameras.size() != cameraPosesTriangulation_.size())
138 retriangulate =
true;
140 if (!retriangulate) {
141 for (
size_t i = 0; i < cameras.size(); i++) {
142 if (!cameras[i].pose().
equals(cameraPosesTriangulation_[i],
144 retriangulate =
true;
151 cameraPosesTriangulation_.clear();
152 cameraPosesTriangulation_.reserve(m);
153 for (
size_t i = 0; i < m; i++)
155 cameraPosesTriangulation_.push_back(cameras[i].pose());
158 return retriangulate;
169 size_t m = cameras.size();
173 MonoCameras monoCameras;
174 MonoMeasurements monoMeasured;
175 for(
size_t i = 0; i < m; i++) {
176 const Pose3 leftPose = cameras[i].pose();
177 const Cal3_S2 monoCal = cameras[i].calibration().calibration();
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);
199 return bool(result_);
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);
213 if (this->
measured_.size() != cameras.size())
214 throw std::runtime_error(
"SmartStereoProjectionHessianFactor: this->" 215 "measured_.size() inconsistent with input");
225 return std::make_shared<RegularHessianFactor<Base::Dim> >(this->
keys_,
242 return std::make_shared<RegularHessianFactor<Base::Dim> >(this->
keys_,
274 const Cameras&
cameras,
double lambda)
const {
278 return std::make_shared<JacobianFactorSVD<Base::Dim, ZDim> >(this->
keys_);
305 const double lambda = 0.0)
const {
317 throw std::runtime_error(
"SmartStereoFactorlinearize: unknown mode");
327 const double lambda = 0.0)
const {
335 const Values& values)
const override {
346 cameras.
project2(*result_,
nullptr, &E);
347 return nonDegenerate;
365 Matrix& E, Vector& b,
366 const Cameras&
cameras)
const {
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;
411 return Vector::Zero(cameras.size() *
Base::ZDim);
421 std::optional<Point3> externalPoint = {})
const {
432 throw(std::runtime_error(
"Backproject at infinity not implemented for SmartStereo."));
446 if (this->
active(values)) {
458 const Cameras& cameras, Vector& ue,
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;
486 Cameras cameras = this->
cameras(values);
491 bool isValid()
const {
return result_.valid(); }
507 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 508 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> {
virtual Cameras cameras(const Values &values) const
Collect all cameras: important that in key order.
Definition: SmartFactorBase.h:163
void computeJacobians(FBlocks &Fs, Matrix &E, Vector &b, const Cameras &cameras, const POINT &point) const
Definition: SmartFactorBase.h:315
bool equals(const NonlinearFactor &p, double tol=1e-9) const override
equals
Definition: SmartStereoProjectionFactor.h:118
bool triangulateForLinearize(const Cameras &cameras) const
triangulate
Definition: SmartStereoProjectionFactor.h:197
PinholeCamera< Cal3_S2 > MonoCamera
Vector of monocular cameras (stereo treated as 2 monocular)
Definition: SmartStereoProjectionFactor.h:83
bool equals(const CameraSet &p, double tol=1e-9) const
equals
Definition: CameraSet.h:91
double totalReprojectionError(const Cameras &cameras, const POINT &point) const
Definition: SmartFactorBase.h:297
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Definition: SmartStereoProjectionFactor.h:108
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:113
bool equals(const NonlinearFactor &p, double tol=1e-9) const override
equals
Definition: SmartFactorBase.h:188
bool triangulateAndComputeE(Matrix &E, const Cameras &cameras) const
Definition: SmartStereoProjectionFactor.h:343
DegeneracyMode degeneracyMode
How to linearize the factor.
Definition: SmartFactorParams.h:45
bool isFarPoint() const
Definition: SmartStereoProjectionFactor.h:503
std::vector< Pose3 > cameraPosesTriangulation_
current triangulation poses
Definition: SmartStereoProjectionFactor.h:71
Definition: Testable.h:152
Vector2 Point2
Definition: Point2.h:32
bool isDegenerate() const
Definition: SmartStereoProjectionFactor.h:494
Definition: NonlinearFactor.h:68
void computeJacobiansWithTriangulatedPoint(FBlocks &Fs, Matrix &E, Vector &b, const Cameras &cameras) const
Definition: SmartStereoProjectionFactor.h:363
KeyVector keys_
The keys involved in this factor.
Definition: Factor.h:87
double error(const Values &values) const override
Calculate total reprojection error.
Definition: SmartStereoProjectionFactor.h:445
std::shared_ptr< JacobianFactor > createJacobianSVDFactor(const Cameras &cameras, double lambda) const
different (faster) way to compute Jacobian factor
Definition: SmartStereoProjectionFactor.h:273
SmartStereoProjectionFactor(const SharedNoiseModel &sharedNoiseModel, const SmartStereoProjectionParams ¶ms=SmartStereoProjectionParams(), const std::optional< Pose3 > body_P_sensor={})
Definition: SmartStereoProjectionFactor.h:91
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Definition: SmartFactorBase.h:175
bool isValid() const
Is result valid?
Definition: SmartStereoProjectionFactor.h:491
A set of cameras, all with their own calibration.
Definition: CameraSet.h:36
bool triangulateAndComputeJacobiansSVD(FBlocks &Fs, Matrix &Enull, Vector &b, const Values &values) const
takes values
Definition: SmartStereoProjectionFactor.h:394
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:171
Rot3 is a 3D rotation represented as a rotation matrix if the preprocessor symbol GTSAM_USE_QUATERNIO...
Definition: Rot3.h:58
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
std::shared_ptr< SmartStereoProjectionFactor > shared_ptr
shorthand for a smart pointer to a factor
Definition: SmartStereoProjectionFactor.h:77
TriangulationResult point() const
Definition: SmartStereoProjectionFactor.h:480
Definition: SymmetricBlockMatrix.h:53
double totalReprojectionError(const Cameras &cameras, std::optional< Point3 > externalPoint={}) const
Definition: SmartStereoProjectionFactor.h:420
Base class to create smart factors on poses or cameras.
ZVector project2(const POINT &point, FBlocks *Fs=nullptr, Matrix *E=nullptr) const
Definition: CameraSet.h:108
bool throwCheirality
If true, re-throws Cheirality exceptions (default: false)
Definition: SmartFactorParams.h:55
bool verboseCheirality
If true, prints text for Cheirality exceptions (default: false)
Definition: SmartFactorParams.h:56
~SmartStereoProjectionFactor() override
Definition: SmartStereoProjectionFactor.h:100
Base class for smart factors. This base class has no internal point, but it has a measurement...
Definition: SmartFactorBase.h:51
ZVector measured_
Definition: SmartFactorBase.h:80
void computeJacobiansSVD(FBlocks &Fs, Matrix &Enull, Vector &b, const Cameras &cameras, const POINT &point) const
Definition: SmartFactorBase.h:330
CameraSet< StereoCamera > Cameras
Vector of cameras.
Definition: SmartStereoProjectionFactor.h:80
bool triangulateAndComputeE(Matrix &E, const Values &values) const
Definition: SmartStereoProjectionFactor.h:354
std::shared_ptr< GaussianFactor > linearizeDamped(const Cameras &cameras, const double lambda=0.0) const
Definition: SmartStereoProjectionFactor.h:304
Functions for triangulation.
double v() const
get v
Definition: StereoPoint2.h:114
bool isOutlier() const
Definition: SmartStereoProjectionFactor.h:500
bool isPointBehindCamera() const
Definition: SmartStereoProjectionFactor.h:497
LinearizationMode linearizationMode
How to linearize the factor.
Definition: SmartFactorParams.h:44
TriangulationResult point(const Values &values) const
Definition: SmartStereoProjectionFactor.h:485
The most common 5DOF 3D->2D calibration.
Definition: Cal3_S2.h:34
TriangulationResult triangulateSafe(const CameraSet< CAMERA > &cameras, const typename CAMERA::MeasurementVector &measured, const TriangulationParameters ¶ms)
triangulateSafe: extensive checking of the outcome
Definition: triangulation.h:687
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
A non-linear factor for stereo measurements.
std::shared_ptr< JacobianFactor > createJacobianSVDFactor(const Cameras &cameras, const Point3 &point, double lambda=0.0) const
Definition: SmartFactorBase.h:416
Definition: PinholeCamera.h:33
Definition: chartTesting.h:28
TriangulationResult triangulateSafe(const Cameras &cameras) const
triangulateSafe
Definition: SmartStereoProjectionFactor.h:167
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
Definition: Key.h:86
void correctForMissingMeasurements(const Cameras &cameras, Vector &ue, typename Cameras::FBlocks *Fs=nullptr, Matrix *E=nullptr) const override
Definition: SmartStereoProjectionFactor.h:457
Definition: StereoPoint2.h:34
A Rectified Stereo Camera.
virtual bool active(const Values &) const
Definition: NonlinearFactor.h:141
double uL() const
get uL
Definition: StereoPoint2.h:108
static const int Dim
Camera dimension.
Definition: SmartFactorBase.h:61
TriangulationResult result_
result from triangulateSafe
Definition: SmartStereoProjectionFactor.h:70
Definition: SmartStereoProjectionFactor.h:55
Vector3 Point3
Definition: Point3.h:38
Definition: triangulation.h:627
void whitenJacobians(FBlocks &F, Matrix &E, Vector &b) const
Whiten the Jacobians computed by computeJacobians using noiseModel_.
Definition: SmartFactorBase.h:377
double uR() const
get uR
Definition: StereoPoint2.h:111
utility functions for loading datasets
std::shared_ptr< GaussianFactor > linearize(const Values &values) const override
linearize
Definition: SmartStereoProjectionFactor.h:334
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
bool triangulateAndComputeJacobians(FBlocks &Fs, Matrix &E, Vector &b, const Values &values) const
Version that takes values, and creates the point.
Definition: SmartStereoProjectionFactor.h:383
static const int ZDim
Measurement dimension.
Definition: SmartFactorBase.h:62
Collect common parameters for SmartProjection and SmartStereoProjection factors.
noiseModel::Base::shared_ptr SharedNoiseModel
Definition: NoiseModel.h:741
Vector reprojectionErrorAfterTriangulation(const Values &values) const
Calculate vector of re-projection errors, before applying noise model.
Definition: SmartStereoProjectionFactor.h:405
Vector unwhitenedError(const Cameras &cameras, const POINT &point, typename Cameras::FBlocks *Fs=nullptr, Matrix *E=nullptr) const
Definition: SmartFactorBase.h:208
std::shared_ptr< GaussianFactor > linearizeDamped(const Values &values, const double lambda=0.0) const
Definition: SmartStereoProjectionFactor.h:326
double retriangulationThreshold
threshold to decide whether to re-triangulate
Definition: SmartFactorParams.h:50