gtsam
Loading...
Searching...
No Matches
SphericalCamera.h
Go to the documentation of this file.
1/* ----------------------------------------------------------------------------
2
3 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4 * Atlanta, Georgia 30332-0415
5 * All Rights Reserved
6 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7
8 * See LICENSE for the license information
9
10 * -------------------------------------------------------------------------- */
11
18
19#pragma once
20
21#include <gtsam/base/Manifold.h>
23#include <gtsam/base/concepts.h>
24#include <gtsam/dllexport.h>
27#include <gtsam/geometry/Unit3.h>
28
29#if GTSAM_ENABLE_BOOST_SERIALIZATION
30#include <boost/serialization/nvp.hpp>
31#endif
32
33namespace gtsam {
34
42class GTSAM_EXPORT EmptyCal {
43 public:
44 inline constexpr static auto dimension = 0;
45 EmptyCal() {}
46 virtual ~EmptyCal() = default;
47 using shared_ptr = std::shared_ptr<EmptyCal>;
48
50 inline static size_t Dim() { return 0; }
51 size_t dim() const { return 0; }
52
53 void print(const std::string& s) const {
54 std::cout << "empty calibration: " << s << std::endl;
55 }
56
57 private:
58#if GTSAM_ENABLE_BOOST_SERIALIZATION
60 friend class boost::serialization::access;
61 template <class Archive>
62 void serialize(Archive& ar, const unsigned int /*version*/) {
63 ar& boost::serialization::make_nvp(
64 "EmptyCal", boost::serialization::base_object<EmptyCal>(*this));
65 }
66#endif
67};
68
75class GTSAM_EXPORT SphericalCamera {
76 public:
77 inline constexpr static auto dimension = 6;
78
79 using Measurement = Unit3;
80 using MeasurementVector = std::vector<Unit3>;
81 using CalibrationType = EmptyCal;
82
83 private:
84 Pose3 pose_;
85
86 protected:
87 EmptyCal::shared_ptr emptyCal_;
88
89 public:
92
95 : pose_(Pose3()), emptyCal_(std::make_shared<EmptyCal>()) {}
96
98 explicit SphericalCamera(const Pose3& pose)
99 : pose_(pose), emptyCal_(std::make_shared<EmptyCal>()) {}
100
102 explicit SphericalCamera(const Pose3& pose,
103 const EmptyCal::shared_ptr& cal)
104 : pose_(pose), emptyCal_(cal) {}
105
109 explicit SphericalCamera(const Vector& v) : pose_(Pose3::Expmap(v)) {}
110
112 virtual ~SphericalCamera() = default;
113
115 const EmptyCal::shared_ptr& sharedCalibration() const {
116 return emptyCal_;
117 }
118
120 const EmptyCal& calibration() const { return *emptyCal_; }
121
125
127 bool equals(const SphericalCamera& camera, double tol = 1e-9) const;
128
130 virtual void print(const std::string& s = "SphericalCamera") const;
131
135
137 const Pose3& pose() const { return pose_; }
138
140 const Rot3& rotation() const { return pose_.rotation(); }
141
143 const Point3& translation() const { return pose_.translation(); }
144
145 // /// return pose, with derivative
146 // const Pose3& getPose(OptionalJacobian<6, 6> H) const;
147
151
153 std::pair<Unit3, bool> projectSafe(const Point3& pw) const;
154
160 Unit3 project2(const Point3& pw, OptionalJacobian<2, 6> Dpose = {},
161 OptionalJacobian<2, 3> Dpoint = {}) const;
162
168 Unit3 project2(const Unit3& pwu, OptionalJacobian<2, 6> Dpose = {},
169 OptionalJacobian<2, 2> Dpoint = {}) const;
170
172 Point3 backproject(const Unit3& p, const double depth) const;
173
175 Unit3 backprojectPointAtInfinity(const Unit3& p) const;
176
182 Unit3 project(const Point3& point, OptionalJacobian<2, 6> Dpose = {},
183 OptionalJacobian<2, 3> Dpoint = {}) const;
184
189 Vector2 reprojectionError(const Point3& point, const Unit3& measured,
190 OptionalJacobian<2, 6> Dpose = {},
191 OptionalJacobian<2, 3> Dpoint = {}) const;
193
195 SphericalCamera retract(const Vector6& d) const {
196 return SphericalCamera(pose().retract(d));
197 }
198
200 Vector6 localCoordinates(const SphericalCamera& p) const {
201 return pose().localCoordinates(p.pose());
202 }
203
206 return SphericalCamera(
207 Pose3::Identity()); // assumes that the default constructor is valid
208 }
209
211 Matrix34 cameraProjectionMatrix() const {
212 return Matrix34(pose_.inverse().matrix().block(0, 0, 3, 4));
213 }
214
217 return Eigen::Matrix<double, traits<Point2>::dimension, 1>::Constant(0.0);
218 }
219
220 size_t dim() const { return 6; }
221
222 static size_t Dim() { return 6; }
223
224 private:
225#if GTSAM_ENABLE_BOOST_SERIALIZATION
227 friend class boost::serialization::access;
228 template <class Archive>
229 void serialize(Archive& ar, const unsigned int /*version*/) {
230 ar& BOOST_SERIALIZATION_NVP(pose_);
231 }
232#endif
233};
234// end of class SphericalCamera
235
236template <>
237struct traits<SphericalCamera> : public internal::Manifold<SphericalCamera> {};
238
239template <>
240struct traits<const SphericalCamera> : public internal::Manifold<SphericalCamera> {};
241
242} // namespace gtsam
Base exception type that uses tbb_allocator if GTSAM is compiled with TBB.
Base class and basic functions for Manifold types.
3D Pose manifold SO(3) x R^3 and group SE(3)
Bearing-Range product.
STL namespace.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
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
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition Matrix.cpp:143
Point2_ project(const Point3_ &p_cam)
Expression version of PinholeBase::Project.
Definition expressions.h:134
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
Both ManifoldTraits and Testable.
Definition Manifold.h:156
OptionalJacobian is an Eigen::Ref like class that can take be constructed using either a fixed size o...
Definition OptionalJacobian.h:40
Template to create a binary predicate.
Definition Testable.h:112
static This Identity()
Definition ExtendedPose3.h:229
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
Empty calibration.
Definition SphericalCamera.h:42
static size_t Dim()
return DOF, dimensionality of tangent space
Definition SphericalCamera.h:50
A spherical camera class that has a Pose3 and measures bearing vectors.
Definition SphericalCamera.h:75
const EmptyCal::shared_ptr & sharedCalibration() const
return shared pointer to calibration
Definition SphericalCamera.h:115
SphericalCamera(const Pose3 &pose)
Constructor with pose.
Definition SphericalCamera.h:98
virtual ~SphericalCamera()=default
Default destructor.
Matrix34 cameraProjectionMatrix() const
for Linear Triangulation
Definition SphericalCamera.h:211
Vector6 localCoordinates(const SphericalCamera &p) const
return canonical coordinate
Definition SphericalCamera.h:200
const Rot3 & rotation() const
get rotation
Definition SphericalCamera.h:140
const Pose3 & pose() const
return pose, constant version
Definition SphericalCamera.h:137
const Point3 & translation() const
get translation
Definition SphericalCamera.h:143
SphericalCamera retract(const Vector6 &d) const
move a cameras according to d
Definition SphericalCamera.h:195
const EmptyCal & calibration() const
return calibration
Definition SphericalCamera.h:120
static SphericalCamera Identity()
for Canonical
Definition SphericalCamera.h:205
SphericalCamera()
Default constructor.
Definition SphericalCamera.h:94
Vector defaultErrorWhenTriangulatingBehindCamera() const
for Nonlinear Triangulation
Definition SphericalCamera.h:216
SphericalCamera(const Pose3 &pose, const EmptyCal::shared_ptr &cal)
Constructor with empty intrinsics (needed for smart factors).
Definition SphericalCamera.h:102
Represents a 3D point on a unit sphere.
Definition Unit3.h:44