gtsam
Loading...
Searching...
No Matches
expressions.h
Go to the documentation of this file.
1
7
8#pragma once
9
13#include <gtsam/geometry/OrientedPlane3.h>
17
18namespace gtsam {
19
20// 2D Geometry
21
22typedef Expression<Point2> Point2_;
23typedef Expression<Rot2> Rot2_;
24typedef Expression<Pose2> Pose2_;
25
26inline Point2_ transformTo(const Pose2_& x, const Point2_& p) {
27 return Point2_(x, &Pose2::transformTo, p);
28}
29
30inline Double_ range(const Point2_& p, const Point2_& q) {
31 return Double_(Range<Point2, Point2>(), p, q);
32}
33
34// 3D Geometry
35
36typedef Expression<Point3> Point3_;
37typedef Expression<Unit3> Unit3_;
38typedef Expression<Rot3> Rot3_;
39typedef Expression<Pose3> Pose3_;
40typedef Expression<Line3> Line3_;
41typedef Expression<OrientedPlane3> OrientedPlane3_;
42
43inline Point3_ transformTo(const Pose3_& x, const Point3_& p) {
44 return Point3_(x, &Pose3::transformTo, p);
45}
46
47inline Point3_ transformFrom(const Pose3_& x, const Point3_& p) {
48 return Point3_(x, &Pose3::transformFrom, p);
49}
50
51inline Line3_ transformTo(const Pose3_& wTc, const Line3_& wL) {
52 Line3 (*f)(const Pose3&, const Line3&, OptionalJacobian<4, 6>,
54 return Line3_(f, wTc, wL);
55}
56
57inline Pose3_ transformPoseTo(const Pose3_& p, const Pose3_& q) {
58 return Pose3_(p, &Pose3::transformPoseTo, q);
59}
60
61inline Pose3_ interpolateRt(const Pose3_& p, const Pose3_& q,
62 const Double_& t) {
63 return Pose3_(&Pose3::interpolateRt, p, q, t);
64}
65
66inline Point3_ normalize(const Point3_& a) {
67 Point3 (*f)(const Point3&, OptionalJacobian<3, 3>) = &normalize;
68 return Point3_(f, a);
69}
70
71inline Point3_ cross(const Point3_& a, const Point3_& b) {
72 Point3 (*f)(const Point3&, const Point3&, OptionalJacobian<3, 3>,
74 return Point3_(f, a, b);
75}
76
77inline Double_ dot(const Point3_& a, const Point3_& b) {
78 double (*f)(const Point3&, const Point3&, OptionalJacobian<1, 3>,
80 return Double_(f, a, b);
81}
82
83namespace internal {
84// define getter that returns value rather than reference
85inline Rot3 rotation(const Pose3& pose, OptionalJacobian<3, 6> H) {
86 return pose.rotation(H);
87}
88
89inline Point3 translation(const Pose3& pose, OptionalJacobian<3, 6> H) {
90 return pose.translation(H);
91}
92} // namespace internal
93
94inline Rot3_ rotation(const Pose3_& pose) {
95 return Rot3_(internal::rotation, pose);
96}
97
98inline Point3_ translation(const Pose3_& pose) {
99 return Point3_(internal::translation, pose);
100}
101
102inline Point3_ rotate(const Rot3_& x, const Point3_& p) {
103 return Point3_(x, &Rot3::rotate, p);
104}
105
106inline Point3_ point3(const Unit3_& v) { return Point3_(&Unit3::point3, v); }
107
108inline Unit3_ rotate(const Rot3_& x, const Unit3_& p) {
109 return Unit3_(x, &Rot3::rotate, p);
110}
111
112inline Point3_ unrotate(const Rot3_& x, const Point3_& p) {
113 return Point3_(x, &Rot3::unrotate, p);
114}
115
116inline Unit3_ unrotate(const Rot3_& x, const Unit3_& p) {
117 return Unit3_(x, &Rot3::unrotate, p);
118}
119
120inline Double_ distance(const OrientedPlane3_& p) {
121 return Double_(&OrientedPlane3::distance, p);
122}
123
124inline Unit3_ normal(const OrientedPlane3_& p) {
125 return Unit3_(&OrientedPlane3::normal, p);
126}
127
128// Projection
129
130typedef Expression<Cal3_S2> Cal3_S2_;
131typedef Expression<Cal3Bundler> Cal3Bundler_;
132
134inline Point2_ project(const Point3_& p_cam) {
136 return Point2_(f, p_cam);
137}
138
139inline Point2_ project(const Unit3_& p_cam) {
140 Point2 (*f)(const Unit3&, OptionalJacobian<2, 2>) = &PinholeBase::Project;
141 return Point2_(f, p_cam);
142}
143
144namespace internal {
145// Helper template for project2 expression below
146template <class CAMERA, class POINT>
147Point2 project4(const CAMERA& camera, const POINT& p,
148 OptionalJacobian<2, CAMERA::dimension> Dcam,
149 OptionalJacobian<2, FixedDimension<POINT>::value> Dpoint) {
150 return camera.project2(p, Dcam, Dpoint);
151}
152} // namespace internal
153
154template <class CAMERA, class POINT>
155Point2_ project2(const Expression<CAMERA>& camera_,
156 const Expression<POINT>& p_) {
157 return Point2_(internal::project4<CAMERA, POINT>, camera_, p_);
158}
159
160namespace internal {
161// Helper template for project3 expression below
162template <class CALIBRATION, class POINT>
163inline Point2 project6(const Pose3& x, const POINT& p, const CALIBRATION& K,
164 OptionalJacobian<2, 6> Dpose,
165 OptionalJacobian<2, 3> Dpoint,
166 OptionalJacobian<2, CALIBRATION::dimension> Dcal) {
167 return PinholeCamera<CALIBRATION>(x, K).project(p, Dpose, Dpoint, Dcal);
168}
169} // namespace internal
170
171template <class CALIBRATION, class POINT>
172inline Point2_ project3(const Pose3_& x, const Expression<POINT>& p,
173 const Expression<CALIBRATION>& K) {
174 return Point2_(internal::project6<CALIBRATION, POINT>, x, p, K);
175}
176
177template <class CALIBRATION>
178Point2_ uncalibrate(const Expression<CALIBRATION>& K, const Point2_& xy_hat) {
179 return Point2_(K, &CALIBRATION::uncalibrate, xy_hat);
180}
181
182template <class CALIBRATION>
183inline Pose3_ getPose(const Expression<PinholeCamera<CALIBRATION> >& cam) {
184 return Pose3_(&PinholeCamera<CALIBRATION>::getPose, cam);
185}
186
188// TODO(dellaert): Should work but fails because of a type deduction conflict.
189// template <typename T>
190// gtsam::Expression<typename gtsam::traits<T>::TangentVector> logmap(
191// const gtsam::Expression<T> &x1, const gtsam::Expression<T> &x2) {
192// return gtsam::Expression<typename gtsam::traits<T>::TangentVector>(
193// x1, &T::logmap, x2);
194// }
195
196template <typename T>
198 const gtsam::Expression<T>& x1, const gtsam::Expression<T>& x2) {
199 using Traits = gtsam::traits<T>;
200 using TangentVector = typename Traits::TangentVector;
201 auto logmap = [](const T& value, typename Traits::ChartJacobian H) {
202 return Traits::Logmap(value, H);
203 };
204 return Expression<TangentVector>(logmap, between(x1, x2));
205}
206template <typename T>
207inline Expression<T> interpolate(const Expression<T>& p, const Expression<T>& q,
208 const Expression<double>& t) {
209 T (*f)(const T&, const T&, double, typename MakeOptionalJacobian<T, T>::type,
210 typename MakeOptionalJacobian<T, T>::type,
211 typename MakeOptionalJacobian<T, double>::type) = &interpolate;
212 return Expression<T>(f, p, q, t);
213}
214
215} // namespace gtsam
The most common 5DOF 3D->2D calibration.
Base class for all pinhole cameras.
Calibration used by Bundler.
4 dimensional manifold of 3D lines
2D Pose
Global functions in a separate testing namespace.
Definition chartTesting.h:28
T interpolate(const T &X, const T &Y, double t, typename MakeOptionalJacobian< T, T >::type Hx={}, typename MakeOptionalJacobian< T, T >::type Hy={}, typename MakeOptionalJacobian< T, double >::type Ht={})
Linear interpolation between X and Y by coefficient t.
Definition Lie.h:415
gtsam::Expression< typename gtsam::traits< T >::TangentVector > logmap(const gtsam::Expression< T > &x1, const gtsam::Expression< T > &x2)
logmap
Definition expressions.h:197
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
Point3 cross(const Point3 &p, const Point3 &q, OptionalJacobian< 3, 3 > H1, OptionalJacobian< 3, 3 > H2)
cross product
Definition Point3.cpp:66
Line3 transformTo(const Pose3 &wTc, const Line3 &wL, OptionalJacobian< 4, 6 > Dpose, OptionalJacobian< 4, 4 > Dline)
Transform a line from world to camera frame.
Definition Line3.cpp:91
Point2_ project(const Point3_ &p_cam)
Expression version of PinholeBase::Project.
Definition expressions.h:134
double dot(const V1 &a, const V2 &b)
Dot product.
Definition Vector.h:191
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
OptionalJacobian is an Eigen::Ref like class that can take be constructed using either a fixed size o...
Definition OptionalJacobian.h:40
Definition BearingRange.h:42
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
A 3D line (R,a,b) : (Rot3,Scalar,Scalar).
Definition Line3.h:44
double distance(OptionalJacobian< 1, 3 > H={}) const
Return the perpendicular distance to the origin.
Definition OrientedPlane3.h:135
Unit3 normal(OptionalJacobian< 2, 3 > H={}) const
Return the normal.
Definition OrientedPlane3.h:129
A pinhole camera class that has a Pose3 and a Calibration.
Definition PinholeCamera.h:34
const Pose3 & getPose(OptionalJacobian< 6, dimension > H) const
return pose, with derivative
Definition PinholeCamera.h:174
Point2 transformTo(const Point2 &point, OptionalJacobian< 2, 3 > Dpose={}, OptionalJacobian< 2, 2 > Dpoint={}) const
Return point coordinates in pose coordinate frame.
Definition Pose2.cpp:238
A 3D pose (R,t) : (Rot3,Point3).
Definition Pose3.h:42
Pose3 transformPoseTo(const Pose3 &wTb, OptionalJacobian< 6, 6 > Hself={}, OptionalJacobian< 6, 6 > HwTb={}) const
Assuming self == wTa, takes a pose wTb in world coordinates and transforms it to local coordinates aT...
Definition Pose3.cpp:171
Pose3 interpolateRt(const Pose3 &T, double t, OptionalJacobian< 6, 6 > Hself={}, OptionalJacobian< 6, 6 > Harg={}, OptionalJacobian< 6, 1 > Ht={}) const
Interpolate between two poses via individual rotation and translation interpolation.
Definition Pose3.cpp:71
Point3 transformFrom(const Point3 &point, OptionalJacobian< 3, 6 > Hself={}, OptionalJacobian< 3, 3 > Hpoint={}) const
takes point in Pose coordinates and transforms it to world coordinates
Definition Pose3.cpp:180
Point3 transformTo(const Point3 &point, OptionalJacobian< 3, 6 > Hself={}, OptionalJacobian< 3, 3 > Hpoint={}) const
takes point in world coordinates and transforms it to Pose coordinates
Definition Pose3.cpp:204
Point3 rotate(const Point3 &p, OptionalJacobian< 3, 3 > H1={}, OptionalJacobian< 3, 3 > H2={}) const
rotate point from rotated coordinate frame to world
Definition Rot3M.cpp:165
Point3 unrotate(const Point3 &p, OptionalJacobian< 3, 3 > H1={}, OptionalJacobian< 3, 3 > H2={}) const
rotate point from world to rotated frame
Definition Rot3.cpp:143
Point3 point3(OptionalJacobian< 3, 2 > H={}) const
Return unit-norm Point3.
Definition Unit3.cpp:144
Expression class that supports automatic differentiation.
Definition Expression.h:49
Common expressions, both linear and non-linear.