Skip to content

Commit 64643a4

Browse files
authored
Merge pull request #2313 from dvorak0/yzf/add_smart_factor_python_export
add python exports for SmartStereoProjectionFactor
2 parents bf0eebe + 1c5ea5a commit 64643a4

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

gtsam_unstable/gtsam_unstable.i

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,15 @@ class gtsam::Point2Vector;
1010
class gtsam::Rot2;
1111
class gtsam::Pose2;
1212
class gtsam::Point3;
13+
class gtsam::StereoCamera;
1314
class gtsam::SO3;
1415
class gtsam::SO4;
1516
class gtsam::SOn;
1617
class gtsam::Rot3;
1718
class gtsam::Pose3;
19+
class gtsam::StereoCamera;
20+
class gtsam::SmartProjectionParams;
21+
class gtsam::SmartStereoProjectionFactor;
1822
virtual class gtsam::noiseModel::Base;
1923
virtual class gtsam::noiseModel::Gaussian;
2024
virtual class gtsam::noiseModel::Isotropic;
@@ -27,6 +31,7 @@ virtual class gtsam::HessianFactor;
2731
virtual class gtsam::JacobianFactor;
2832
class gtsam::Cal3_S2;
2933
class gtsam::Cal3DS2;
34+
class gtsam::Cal3_S2Stereo;
3035
class gtsam::GaussianFactorGraph;
3136
class gtsam::NonlinearFactorGraph;
3237
class gtsam::Ordering;
@@ -41,6 +46,7 @@ class gtsam::ISAM2Params;
4146
class gtsam::GaussianDensity;
4247
class gtsam::LevenbergMarquardtOptimizer;
4348
class gtsam::FixedLagSmoother;
49+
class gtsam::StereoPoint2;
4450

4551
namespace gtsam {
4652

@@ -731,6 +737,58 @@ typedef gtsam::ProjectionFactorPPPC<gtsam::Pose3, gtsam::Point3, gtsam::Cal3_S2>
731737
typedef gtsam::ProjectionFactorPPPC<gtsam::Pose3, gtsam::Point3, gtsam::Cal3DS2> ProjectionFactorPPPCCal3DS2;
732738
typedef gtsam::ProjectionFactorPPPC<gtsam::Pose3, gtsam::Point3, gtsam::Cal3Fisheye> ProjectionFactorPPPCCal3Fisheye;
733739

740+
#include <gtsam_unstable/slam/SmartStereoProjectionFactor.h>
741+
virtual class SmartStereoProjectionFactor : gtsam::NonlinearFactor {
742+
SmartStereoProjectionFactor(const gtsam::noiseModel::Base* sharedNoiseModel,
743+
const gtsam::SmartProjectionParams& params,
744+
const gtsam::Pose3& body_P_sensor);
745+
SmartStereoProjectionFactor(const gtsam::noiseModel::Base* sharedNoiseModel,
746+
const gtsam::SmartProjectionParams& params);
747+
SmartStereoProjectionFactor(const gtsam::noiseModel::Base* sharedNoiseModel);
748+
749+
void print(string s) const;
750+
bool equals(const gtsam::NonlinearFactor& p, double tol) const;
751+
double error(const gtsam::Values& values) const;
752+
753+
gtsam::TriangulationResult point() const;
754+
gtsam::TriangulationResult point(const gtsam::Values& values) const;
755+
756+
bool isValid() const;
757+
bool isDegenerate() const;
758+
bool isPointBehindCamera() const;
759+
bool isOutlier() const;
760+
bool isFarPoint() const;
761+
762+
gtsam::GaussianFactor linearizeDamped(const gtsam::CameraSet<gtsam::StereoCamera>& cameras,
763+
const double lambda) const;
764+
gtsam::GaussianFactor linearizeDamped(const gtsam::Values& values,
765+
const double lambda) const;
766+
};
767+
768+
#include <gtsam_unstable/slam/SmartStereoProjectionPoseFactor.h>
769+
virtual class SmartStereoProjectionPoseFactor : gtsam::SmartStereoProjectionFactor {
770+
SmartStereoProjectionPoseFactor(const gtsam::noiseModel::Base* sharedNoiseModel,
771+
const gtsam::SmartProjectionParams& params,
772+
const gtsam::Pose3& body_P_sensor);
773+
SmartStereoProjectionPoseFactor(const gtsam::noiseModel::Base* sharedNoiseModel,
774+
const gtsam::SmartProjectionParams& params);
775+
SmartStereoProjectionPoseFactor(const gtsam::noiseModel::Base* sharedNoiseModel);
776+
777+
void add(const gtsam::StereoPoint2& measured, gtsam::Key poseKey,
778+
const std::shared_ptr<gtsam::Cal3_S2Stereo>& K);
779+
void add(const std::vector<gtsam::StereoPoint2>& measurements,
780+
const gtsam::KeyVector& poseKeys,
781+
const std::vector<std::shared_ptr<gtsam::Cal3_S2Stereo>>& Ks);
782+
void add(const std::vector<gtsam::StereoPoint2>& measurements,
783+
const gtsam::KeyVector& poseKeys,
784+
const std::shared_ptr<gtsam::Cal3_S2Stereo>& K);
785+
786+
void print(string s) const;
787+
bool equals(const gtsam::NonlinearFactor& p, double tol) const;
788+
double error(const gtsam::Values& values) const;
789+
std::vector<std::shared_ptr<gtsam::Cal3_S2Stereo>> calibration() const;
790+
};
791+
734792
#include <gtsam_unstable/slam/ProjectionFactorRollingShutter.h>
735793
virtual class ProjectionFactorRollingShutter : gtsam::NoiseModelFactor {
736794
ProjectionFactorRollingShutter(const gtsam::Point2& measured, double alpha, const gtsam::noiseModel::Base* noiseModel,
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""
2+
Minimal smoke test for SmartStereoProjectionPoseFactor.
3+
4+
Constructs two stereo measurements of a single 3D landmark from two poses and
5+
verifies the factor evaluates to (near) zero error given consistent geometry.
6+
"""
7+
8+
import pathlib
9+
import sys
10+
11+
import gtsam # type: ignore
12+
13+
from gtsam_unstable import SmartStereoProjectionPoseFactor
14+
15+
16+
def main() -> None:
17+
# Simple stereo calibration
18+
K = gtsam.Cal3_S2Stereo(500, 500, 0.0, 320, 240, 0.2)
19+
20+
# Two camera poses observing the same landmark
21+
pose_a = gtsam.Pose3() # identity
22+
pose_b = gtsam.Pose3(gtsam.Rot3(), gtsam.Point3(0.2, 0.0, 0.0))
23+
landmark = gtsam.Point3(0.0, 0.1, 1.2)
24+
25+
# Generate synthetic stereo measurements
26+
cam_a = gtsam.StereoCamera(pose_a, K)
27+
cam_b = gtsam.StereoCamera(pose_b, K)
28+
z_a = cam_a.project(landmark)
29+
z_b = cam_b.project(landmark)
30+
31+
# Add a small pixel noise to the second measurement to verify non-zero error
32+
z_b = gtsam.StereoPoint2(z_b.uL() + 0.2, z_b.uR() + 0.2, z_b.v() + 0.1)
33+
print(f"z_a, uL: {z_a.uL():.2f}, uR: {z_a.uR():.2f}, v: {z_a.v():.2f}")
34+
print(f"z_b, uL: {z_b.uL():.2f}, uR: {z_b.uR():.2f}, v: {z_b.v():.2f}")
35+
36+
# Build factor with modest noise and default smart projection params
37+
noise = gtsam.noiseModel.Isotropic.Sigma(3, 1.0)
38+
params = gtsam.SmartProjectionParams()
39+
factor = SmartStereoProjectionPoseFactor(noise, params)
40+
41+
key_a = gtsam.symbol("x", 0)
42+
key_b = gtsam.symbol("x", 1)
43+
factor.add(z_a, key_a, K)
44+
factor.add(z_b, key_b, K)
45+
46+
values = gtsam.Values()
47+
values.insert(key_a, pose_a)
48+
values.insert(key_b, pose_b)
49+
50+
err = factor.error(values)
51+
print(f"SmartStereoProjectionPoseFactor error: {err:.6f}")
52+
53+
54+
if __name__ == "__main__":
55+
main()

0 commit comments

Comments
 (0)