testExpression.cpp
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  * -------------------------------1------------------------------------------- */
11 
21 #include <gtsam/geometry/Cal3_S2.h>
23 #include <gtsam/geometry/Point3.h>
24 #include <gtsam/base/Testable.h>
25 
27 
28 using namespace std;
29 using namespace gtsam;
30 
34 
35 /* ************************************************************************* */
36 template <class CAL>
39  return K.uncalibrate(p, Dcal, Dp);
40 }
41 
42 static const Rot3 someR = Rot3::RzRyRx(1, 2, 3);
43 
44 /* ************************************************************************* */
45 // Constant
46 TEST(Expression, Constant) {
47  Rot3_ R(someR);
48  Values values;
49  Rot3 actual = R.value(values);
50  EXPECT(assert_equal(someR, actual))
52 }
53 
54 /* ************************************************************************* */
55 // Leaf
57  const Key key = 100;
58  Rot3_ R(key);
59  Values values;
60  values.insert(key, someR);
61 
62  Rot3 actual2 = R.value(values);
63  EXPECT(assert_equal(someR, actual2))
64 }
65 
66 /* ************************************************************************* */
67 // Test the function `createUnknowns` to create many leaves at once.
68 TEST(Expression, Leaves) {
69  Values values;
70  const Point3 somePoint(1, 2, 3);
71  values.insert(Symbol('p', 10), somePoint);
72  std::vector<Point3_> pointExpressions = createUnknowns<Point3>(10, 'p', 1);
73  EXPECT(assert_equal(somePoint, pointExpressions.back().value(values)))
74 }
75 
76 /* ************************************************************************* */
77 // Unary(Leaf)
78 namespace unary {
80  return Point2(0,0);
81 }
82 double f2(const Point3& p, OptionalJacobian<1, 3> H) {
83  return 0.0;
84 }
86  return p;
87 }
89 const set<Key> expected{1};
90 } // namespace unary
91 
92 // Create a unary expression that takes another expression as a single argument.
93 TEST(Expression, Unary1) {
94  using namespace unary;
95  Expression<Point2> unaryExpression(f1, pointExpression);
96  EXPECT(expected == unaryExpression.keys())
97 }
98 
99 // Check that also works with a scalar return value.
100 TEST(Expression, Unary2) {
101  using namespace unary;
102  Double_ unaryExpression(f2, pointExpression);
103  EXPECT(expected == unaryExpression.keys())
104 }
105 
106 // Unary(Leaf), dynamic
107 TEST(Expression, Unary3) {
108  using namespace unary;
109  // TODO(yetongumich): dynamic output arguments do not work yet!
110  // Expression<Vector> unaryExpression(f3, pointExpression);
111  // EXPECT(expected == unaryExpression.keys())
112 }
113 
114 /* ************************************************************************* */
115 // Simple test class that implements the `VectorSpace` protocol.
116 class Class : public Point3 {
117  public:
118  enum {dimension = 3};
119  using Point3::Point3;
120  const Vector3& vector() const { return *this; }
121  inline static Class Identity() { return Class(0,0,0); }
122  double norm(OptionalJacobian<1,3> H = {}) const {
123  return norm3(*this, H);
124  }
125  bool equals(const Class &q, double tol) const {
126  return (std::abs(x() - q.x()) < tol && std::abs(y() - q.y()) < tol && std::abs(z() - q.z()) < tol);
127  }
128  void print(const string& s) const { cout << s << *this << endl;}
129 };
130 
131 namespace gtsam {
132 template<> struct traits<Class> : public internal::VectorSpace<Class> {};
133 }
134 
135 // Nullary Method
136 TEST(Expression, NullaryMethod) {
137  // Create expression
138  const Key key(67);
139  Expression<Class> classExpression(key);
140 
141  // Make expression from a class method, note how it differs from the function
142  // expressions by leading with the class expression in the constructor.
143  Expression<double> norm_(classExpression, &Class::norm);
144 
145  // Create Values
146  Values values;
147  values.insert(key, Class(3, 4, 5));
148 
149  // Check dims as map
150  std::map<Key, int> map;
151  norm_.dims(map); // TODO(yetongumich): Change to google style pointer convention.
152  LONGS_EQUAL(1, map.size())
153 
154  // Get value and Jacobians
155  std::vector<Matrix> H(1);
156  double actual = norm_.value(values, H);
157 
158  // Check all
159  const double norm = sqrt(3*3 + 4*4 + 5*5);
160  EXPECT(actual == norm)
161  Matrix expected(1, 3);
162  expected << 3.0 / norm, 4.0 / norm, 5.0 / norm;
163  EXPECT(assert_equal(expected, H[0]))
164 }
165 
166 /* ************************************************************************* */
167 // Binary(Leaf,Leaf)
168 namespace binary {
169 // Create leaves
170 double doubleF(const Pose3& pose, //
172  return 0.0;
173 }
174 Pose3_ x(1);
175 Point3_ p(2);
177 }
178 
179 /* ************************************************************************* */
180 // Check that creating an expression to double compiles.
181 TEST(Expression, BinaryToDouble) {
182  using namespace binary;
183  Double_ p_cam(doubleF, x, p);
184 }
185 
186 /* ************************************************************************* */
187 // Check keys of an expression created from class method.
188 TEST(Expression, BinaryKeys) {
189  const set<Key> expected{1, 2};
191 }
192 
193 /* ************************************************************************* */
194 // Check dimensions by calling `dims` method.
195 TEST(Expression, BinaryDimensions) {
196  map<Key, int> actual, expected{{1, 6}, {2, 3}};
197  binary::p_cam.dims(actual);
198  EXPECT(actual == expected)
199 }
200 
201 /* ************************************************************************* */
202 // Check dimensions of execution trace.
203 TEST(Expression, BinaryTraceSize) {
204  typedef internal::BinaryExpression<Point3, Pose3, Point3> Binary;
205  size_t expectedTraceSize = sizeof(Binary::Record);
206  internal::upAlign(expectedTraceSize);
207  EXPECT_LONGS_EQUAL(expectedTraceSize, binary::p_cam.traceSize())
208 }
209 
210 /* ************************************************************************* */
211 // Binary(Leaf,Unary(Binary(Leaf,Leaf)))
212 namespace tree {
213 using namespace binary;
214 // Create leaves
216 
217 // Create expression tree
220 Expression<Point2> uv_hat(uncalibrate<Cal3_S2>, K, projection);
221 }
222 
223 /* ************************************************************************* */
224 // keys
225 TEST(Expression, TreeKeys) {
226  const set<Key> expected{1, 2, 3};
228 }
229 
230 /* ************************************************************************* */
231 // dimensions
232 TEST(Expression, TreeDimensions) {
233  map<Key, int> actual, expected{{1, 6}, {2, 3}, {3, 5}};
234  tree::uv_hat.dims(actual);
235  EXPECT(actual == expected)
236 }
237 
238 /* ************************************************************************* */
239 // TraceSize
240 TEST(Expression, TreeTraceSize) {
241  typedef internal::BinaryExpression<Point3, Pose3, Point3> Binary1;
242  EXPECT_LONGS_EQUAL(internal::upAligned(sizeof(Binary1::Record)), tree::p_cam.traceSize())
243 
244  typedef internal::UnaryExpression<Point2, Point3> Unary;
245  EXPECT_LONGS_EQUAL(internal::upAligned(sizeof(Unary::Record)) + tree::p_cam.traceSize(),
246  tree::projection.traceSize())
247 
248  EXPECT_LONGS_EQUAL(0, tree::K.traceSize())
249 
250  typedef internal::BinaryExpression<Point2, Cal3_S2, Point2> Binary2;
251  EXPECT_LONGS_EQUAL(internal::upAligned(sizeof(Binary2::Record)) + tree::K.traceSize() +
252  tree::projection.traceSize(),
253  tree::uv_hat.traceSize())
254 }
255 
256 /* ************************************************************************* */
257 // Test compose operation with * operator.
258 TEST(Expression, compose1) {
259  // Create expression
260  Rot3_ R1(1), R2(2);
261  Rot3_ R3 = R1 * R2;
262 
263  // Check keys
264  const set<Key> expected{1, 2};
265  EXPECT(expected == R3.keys())
266 }
267 
268 /* ************************************************************************* */
269 // Test compose with arguments referring to the same rotation.
270 TEST(Expression, compose2) {
271  // Create expression
272  Rot3_ R1(1), R2(1);
273  Rot3_ R3 = R1 * R2;
274 
275  // Check keys
276  const set<Key> expected{1};
277  EXPECT(expected == R3.keys())
278 }
279 
280 /* ************************************************************************* */
281 // Test compose with one arguments referring to constant rotation.
282 TEST(Expression, compose3) {
283  // Create expression
284  Rot3_ R1(Rot3::Identity()), R2(3);
285  Rot3_ R3 = R1 * R2;
286 
287  // Check keys
288  const set<Key> expected{3};
289  EXPECT(expected == R3.keys())
290 }
291 
292 /* ************************************************************************* */
293 // Test compose with double type (should be multiplication).
294 TEST(Expression, compose4) {
295  // Create expression
296  gtsam::Key key = 1;
297  Double_ R1(key), R2(key);
298  Double_ R3 = R1 * R2;
299 
300  // Check keys
301  const set<Key> expected{1};
302  EXPECT(expected == R3.keys())
303 }
304 
305 /* ************************************************************************* */
306 // Test with ternary function.
309  // return dummy derivatives (not correct, but that's ok for testing here)
310  if (H1)
311  *H1 = I_3x3;
312  if (H2)
313  *H2 = I_3x3;
314  if (H3)
315  *H3 = I_3x3;
316  return R1 * (R2 * R3);
317 }
318 
319 TEST(Expression, ternary) {
320  // Create expression
321  Rot3_ A(1), B(2), C(3);
322  Rot3_ ABC(composeThree, A, B, C);
323 
324  // Check keys
325  const set<Key> expected {1, 2, 3};
326  EXPECT(expected == ABC.keys())
327 }
328 
329 /* ************************************************************************* */
330 // Test scalar multiplication with * operator.
331 TEST(Expression, ScalarMultiply) {
332  const Key key(67);
333  const Point3_ expr = 23 * Point3_(key);
334 
335  const set<Key> expected_keys{key};
336  EXPECT(expected_keys == expr.keys())
337 
338  map<Key, int> actual_dims, expected_dims {{key, 3}};
339  expr.dims(actual_dims);
340  EXPECT(actual_dims == expected_dims)
341 
342  // Check dims as map
343  std::map<Key, int> map;
344  expr.dims(map);
345  LONGS_EQUAL(1, map.size())
346 
347  Values values;
348  values.insert<Point3>(key, Point3(1, 0, 2));
349 
350  // Check value
351  const Point3 expected(23, 0, 46);
352  EXPECT(assert_equal(expected, expr.value(values)))
353 
354  // Check value + Jacobians
355  std::vector<Matrix> H(1);
356  EXPECT(assert_equal(expected, expr.value(values, H)))
357  EXPECT(assert_equal(23 * I_3x3, H[0]))
358 }
359 
360 /* ************************************************************************* */
361 // Test sum with + operator.
362 TEST(Expression, BinarySum) {
363  const Key key(67);
364  const Point3_ sum_ = Point3_(key) + Point3_(Point3(1, 1, 1));
365 
366  const set<Key> expected_keys{key};
367  EXPECT(expected_keys == sum_.keys())
368 
369  map<Key, int> actual_dims, expected_dims {{key, 3}};
370  sum_.dims(actual_dims);
371  EXPECT(actual_dims == expected_dims)
372 
373  // Check dims as map
374  std::map<Key, int> map;
375  sum_.dims(map);
376  LONGS_EQUAL(1, map.size())
377 
378  Values values;
379  values.insert<Point3>(key, Point3(2, 2, 2));
380 
381  // Check value
382  const Point3 expected(3, 3, 3);
383  EXPECT(assert_equal(expected, sum_.value(values)))
384 
385  // Check value + Jacobians
386  std::vector<Matrix> H(1);
387  EXPECT(assert_equal(expected, sum_.value(values, H)))
388  EXPECT(assert_equal(I_3x3, H[0]))
389 }
390 
391 /* ************************************************************************* */
392 // Test sum of 3 variables with + operator.
393 TEST(Expression, TripleSum) {
394  const Key key(67);
395  const Point3_ p1_(Point3(1, 1, 1)), p2_(key);
396  const Expression<Point3> sum_ = p1_ + p2_ + p1_;
397 
398  LONGS_EQUAL(1, sum_.keys().size())
399 
400  Values values;
401  values.insert<Point3>(key, Point3(2, 2, 2));
402 
403  // Check value
404  const Point3 expected(4, 4, 4);
405  EXPECT(assert_equal(expected, sum_.value(values)))
406 
407  // Check value + Jacobians
408  std::vector<Matrix> H(1);
409  EXPECT(assert_equal(expected, sum_.value(values, H)))
410  EXPECT(assert_equal(I_3x3, H[0]))
411 }
412 
413 /* ************************************************************************* */
414 // Test sum with += operator.
415 TEST(Expression, PlusEqual) {
416  const Key key(67);
417  const Point3_ p1_(Point3(1, 1, 1)), p2_(key);
418  Expression<Point3> sum_ = p1_;
419  sum_ += p2_;
420  sum_ += p1_;
421 
422  LONGS_EQUAL(1, sum_.keys().size())
423 
424  Values values;
425  values.insert<Point3>(key, Point3(2, 2, 2));
426 
427  // Check value
428  const Point3 expected(4, 4, 4);
429  EXPECT(assert_equal(expected, sum_.value(values)))
430 
431  // Check value + Jacobians
432  std::vector<Matrix> H(1);
433  EXPECT(assert_equal(expected, sum_.value(values, H)))
434  EXPECT(assert_equal(I_3x3, H[0]))
435 }
436 
437 /* ************************************************************************* */
438 TEST(Expression, SumOfUnaries) {
439  const Key key(67);
440  const Double_ norm_(&gtsam::norm3, Point3_(key));
441  const Double_ sum_ = norm_ + norm_;
442 
443  Values values;
444  values.insert<Point3>(key, Point3(6, 0, 0));
445 
446  // Check value
447  EXPECT_DOUBLES_EQUAL(12, sum_.value(values), 1e-9)
448 
449  // Check value + Jacobians
450  std::vector<Matrix> H(1);
451  EXPECT_DOUBLES_EQUAL(12, sum_.value(values, H), 1e-9)
452  EXPECT(assert_equal(Vector3(2, 0, 0).transpose(), H[0]))
453 }
454 
455 /* ************************************************************************* */
456 TEST(Expression, UnaryOfSum) {
457  const Key key1(42), key2(67);
458  const Point3_ sum_ = Point3_(key1) + Point3_(key2);
459  const Double_ norm_(&gtsam::norm3, sum_);
460 
461  map<Key, int> actual_dims, expected_dims = {{key1, 3}, {key2, 3}};
462  norm_.dims(actual_dims);
463  EXPECT(actual_dims == expected_dims)
464 
465  Values values;
466  values.insert<Point3>(key1, Point3(1, 0, 0));
467  values.insert<Point3>(key2, Point3(0, 1, 0));
468 
469  // Check value
470  EXPECT_DOUBLES_EQUAL(sqrt(2), norm_.value(values), 1e-9)
471 
472  // Check value + Jacobians
473  std::vector<Matrix> H(2);
474  EXPECT_DOUBLES_EQUAL(sqrt(2), norm_.value(values, H), 1e-9)
475  EXPECT(assert_equal(0.5 * sqrt(2) * Vector3(1, 1, 0).transpose(), H[0]))
476  EXPECT(assert_equal(0.5 * sqrt(2) * Vector3(1, 1, 0).transpose(), H[1]))
477 }
478 
479 /* ************************************************************************* */
480 TEST(Expression, WeightedSum) {
481  const Key key1(42), key2(67);
482  const Point3_ weighted_sum_ = 17 * Point3_(key1) + 23 * Point3_(key2);
483 
484  map<Key, int> actual_dims, expected_dims {{key1, 3}, {key2, 3}};
485  weighted_sum_.dims(actual_dims);
486  EXPECT(actual_dims == expected_dims)
487 
488  Values values;
489  const Point3 point1(1, 0, 0), point2(0, 1, 0);
490  values.insert<Point3>(key1, point1);
491  values.insert<Point3>(key2, point2);
492 
493  // Check value
494  const Point3 expected = 17 * point1 + 23 * point2;
495  EXPECT(assert_equal(expected, weighted_sum_.value(values)))
496 
497  // Check value + Jacobians
498  std::vector<Matrix> H(2);
499  EXPECT(assert_equal(expected, weighted_sum_.value(values, H)))
500  EXPECT(assert_equal(17 * I_3x3, H[0]))
501  EXPECT(assert_equal(23 * I_3x3, H[1]))
502 }
503 
504 /* ************************************************************************* */
505 TEST(Expression, Subtract) {
506  const Vector3 p = Vector3::Random(), q = Vector3::Random();
507  Values values;
508  values.insert(0, p);
509  values.insert(1, q);
510  const Vector3_ expression = Vector3_(0) - Vector3_(1);
511  set<Key> expected_keys = {0, 1};
512  EXPECT(expression.keys() == expected_keys)
513 
514  // Check value + Jacobians
515  std::vector<Matrix> H(2);
516  EXPECT(assert_equal<Vector3>(p - q, expression.value(values, H)))
517  EXPECT(assert_equal(I_3x3, H[0]))
518  EXPECT(assert_equal(-I_3x3, H[1]))
519 }
520 
521 /* ************************************************************************* */
522 TEST(Expression, LinearExpression) {
523  const Key key(67);
524  const std::function<Vector3(Point3)> f = [](const Point3& p) { return (Vector3)p; };
525  const Matrix3 kIdentity = I_3x3;
526  const Expression<Vector3> linear_ = linearExpression(f, Point3_(key), kIdentity);
527 
528  Values values;
529  values.insert<Point3>(key, Point3(1, 0, 2));
530 
531  // Check value
532  const Vector3 expected(1, 0, 2);
533  EXPECT(assert_equal(expected, linear_.value(values)))
534 
535  // Check value + Jacobians
536  std::vector<Matrix> H(1);
537  EXPECT(assert_equal(expected, linear_.value(values, H)))
538  EXPECT(assert_equal(I_3x3, H[0]))
539 }
540 
541 /* ************************************************************************* */
542 int main() {
543  TestResult tr;
544  return TestRegistry::runAllTests(tr);
545 }
546 /* ************************************************************************* */
Matrix< SCALARB, Dynamic, Dynamic, opt_B > B
Definition: bench_gemm.cpp:49
const gtsam::Symbol key('X', 0)
Expression< Point3 > Point3_
bool equals(const Class &q, double tol) const
Scalar * y
Concept check for values that can be used in unit tests.
static int runAllTests(TestResult &result)
Eigen::Vector3d Vector3
Definition: Vector.h:43
Expression< T > linearExpression(const std::function< T(A)> &f, const Expression< A > &expression, const Eigen::Matrix< double, traits< T >::dimension, traits< A >::dimension > &dTdA)
Definition: Expression.h:247
TEST(Expression, Constant)
VectorSpace provides both Testable and VectorSpaceTraits.
Definition: VectorSpace.h:207
Vector2 Point2
Definition: Point2.h:32
bool assert_equal(const Matrix &expected, const Matrix &actual, double tol)
Definition: Matrix.cpp:40
Eigen::MatrixXd Matrix
Definition: base/Matrix.h:39
Expression< Pose3 > Pose3_
int main()
Rot2 R(Rot2::fromAngle(0.1))
leaf::MyValues values
const set< Key > expected
Definition: BFloat16.h:88
double f2(const Vector2 &x)
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:48
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set set xzeroaxis lt lw set x2zeroaxis lt lw set yzeroaxis lt lw set y2zeroaxis lt lw set tics in set ticslevel set tics set mxtics default set mytics default set mx2tics default set my2tics default set xtics border mirror norotate autofreq set ytics border mirror norotate autofreq set ztics border nomirror norotate autofreq set nox2tics set noy2tics set timestamp bottom norotate set rrange [*:*] noreverse nowriteback set trange [*:*] noreverse nowriteback set urange [*:*] noreverse nowriteback set vrange [*:*] noreverse nowriteback set xlabel matrix size set x2label set timefmt d m y n H
Rot3 is a 3D rotation represented as a rotation matrix if the preprocessor symbol GTSAM_USE_QUATERNIO...
Definition: Rot3.h:58
#define EXPECT_DOUBLES_EQUAL(expected, actual, threshold)
Definition: Test.h:161
T upAligned(T value, unsigned requiredAlignment=TraceAlignment)
Expression< Rot3 > Rot3_
void print(const string &s) const
Base class for all pinhole cameras.
Rot3 composeThree(const Rot3 &R1, const Rot3 &R2, const Rot3 &R3, OptionalJacobian< 3, 3 > H1, OptionalJacobian< 3, 3 > H2, OptionalJacobian< 3, 3 > H3)
Eigen::VectorXd Vector
Definition: Vector.h:38
const Symbol key1('v', 1)
static Class Identity()
static const NavState kIdentity
#define EXPECT(condition)
Definition: Test.h:150
T & upAlign(T &value, unsigned requiredAlignment=TraceAlignment)
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
Array< double, 1, 3 > e(1./3., 0.5, 2.)
RealScalar s
EIGEN_DEVICE_FUNC const Scalar & q
static const Point3 point2(-0.08, 0.08, 0.0)
static const Rot3 someR
Point3_ p_cam(x, &Pose3::transformTo, p)
static sharedNode Leaf(Key key, const SymbolicFactorGraph &factors)
Expression< Point2 > uv_hat(uncalibrate< Cal3_S2 >, K, projection)
Expression< Cal3_S2 > K(3)
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:50
#define LONGS_EQUAL(expected, actual)
Definition: Test.h:134
traits
Definition: chartTesting.h:28
static Rot3 R3
static const Pose3 pose(Rot3(Vector3(1, -1, -1).asDiagonal()), Point3(0, 0, 0.5))
std::set< Key > keys() const
Return keys that play in this expression.
const Vector3 & vector() const
#define EXPECT_LONGS_EQUAL(expected, actual)
Definition: Test.h:154
Expression< Point2 > projection(f, p_cam)
double norm(OptionalJacobian< 1, 3 > H={}) const
Point2 f1(const Point3 &p, OptionalJacobian< 2, 3 > H)
T value(const Values &values, std::vector< Matrix > *H=nullptr) const
Return value and optional derivatives, reverse AD version Notes: this is not terribly efficient...
3D Point
float * p
Point2(* Project)(const Point3 &, OptionalJacobian< 2, 3 >)
double f3(double x1, double x2)
void insert(Key j, const Value &val)
Definition: Values.cpp:155
Line3 transformTo(const Pose3 &wTc, const Line3 &wL, OptionalJacobian< 4, 6 > Dpose, OptionalJacobian< 4, 4 > Dline)
Definition: Line3.cpp:94
double norm3(const Point3 &p, OptionalJacobian< 1, 3 > H)
Distance of the point from the origin, with Jacobian.
Definition: Point3.cpp:41
Jet< T, N > sqrt(const Jet< T, N > &f)
Definition: jet.h:418
Point3_ pointExpression(1)
const G double tol
Definition: Group.h:86
const Point3 point1(3.0, 4.0, 2.0)
Vector3 Point3
Definition: Point3.h:38
void dims(std::map< Key, int > &map) const
Return dimensions for each argument, as a map.
const KeyVector keys
#define abs(x)
Definition: datatypes.h:17
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
double doubleF(const Pose3 &pose, const Point3 &point, OptionalJacobian< 1, 6 > H1, OptionalJacobian< 1, 3 > H2)
The most common 5DOF 3D->2D calibration.
Point2 uncalibrate(const CAL &K, const Point2 &p, OptionalJacobian< 2, 5 > Dcal, OptionalJacobian< 2, 2 > Dp)
size_t traceSize() const
Return size needed for memory buffer in traceExecution.
const Symbol key2('v', 2)
Expression< Vector3 > Vector3_


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:38:06