farm-ng-core
spline.h
Go to the documentation of this file.
1 // Copyright (c) 2011, Hauke Strasdat
2 // Copyright (c) 2012, Steven Lovegrove
3 // Copyright (c) 2021, farm-ng, inc.
4 //
5 // Use of this source code is governed by an MIT-style
6 // license that can be found in the LICENSE file or at
7 // https://opensource.org/licenses/MIT.
8 
9 /// @file
10 // Basis spline implementation on Lie Group following:
11 // S. Lovegrove, A. Patron-Perez, G. Sibley, BMVC 2013
12 // http://www.bmva.org/bmvc/2013/Papers/paper0093/paper0093.pdf
13 
14 #pragma once
15 
16 #include "sophus/common/common.h"
18 #include "sophus/lie/lie_group.h"
19 
20 namespace sophus {
21 
22 template <class TScalar>
24  public:
25  static Eigen::Matrix<TScalar, 3, 4> c() {
26  Eigen::Matrix<TScalar, 3, 4> c;
27  TScalar const o(0);
28 
29  // clang-format off
30  c << TScalar(5./6), TScalar(3./6), -TScalar(3./6), TScalar(1./6),
31  TScalar(1./6), TScalar(3./6), TScalar(3./6), -TScalar(2./6),
32  o, o, o, TScalar(1./6);
33  // clang-format on
34  return c;
35  }
36 
37  static Eigen::Vector3<TScalar> b(TScalar const& u) {
38  // SOPHUS_ASSERT(u >= TScalar(0), "but %", u);
39  // SOPHUS_ASSERT(u < TScalar(1), "but %", u);
40  TScalar u_square(u * u);
41  return c() * Eigen::Vector4<TScalar>(TScalar(1), u, u_square, u * u_square);
42  }
43 
44  static Eigen::Vector3<TScalar> dtB(TScalar const& u, TScalar const& delta_t) {
45  // SOPHUS_ASSERT(u >= TScalar(0), "but %", u);
46  // SOPHUS_ASSERT(u < TScalar(1), "but %", u);
47  return (TScalar(1) / delta_t) * c() *
48  Eigen::Vector4<TScalar>(
49  TScalar(0), TScalar(1), TScalar(2) * u, TScalar(3) * u * u);
50  }
51 
52  static Eigen::Vector3<TScalar> dt2B(
53  TScalar const& u, TScalar const& delta_t) {
54  // SOPHUS_ASSERT(u >= TScalar(0), "but %", u);
55  // SOPHUS_ASSERT(u < TScalar(1), "but %", u);
56  return (TScalar(1) / (delta_t * delta_t)) * c() *
57  Eigen::Vector4<TScalar>(
58  TScalar(0), TScalar(0), TScalar(2), TScalar(6) * u);
59  }
60 };
61 
62 template <concepts::LieGroup TGroup>
64  public:
65  using LieGroup = TGroup;
66  using Scalar = typename LieGroup::Scalar;
67  using Transformation =
68  Eigen::Matrix<Scalar, TGroup::kAmbientDim, TGroup::kAmbientDim>;
69  using Tangent = typename LieGroup::Tangent;
70 
72  LieGroup const& parent_ts_control_point,
73  std::tuple<Tangent, Tangent, Tangent> const& control_tagent_vectors,
74  double u) {
75  auto aa = a(control_tagent_vectors, u);
76  return parent_ts_control_point * std::get<0>(aa) * std::get<1>(aa) *
77  std::get<2>(aa);
78  }
79 
81  LieGroup const& parent_ts_control_point,
82  std::tuple<Tangent, Tangent, Tangent> const& control_tagent_vectors,
83  double u,
84  double delta_t) {
85  auto aa = a(control_tagent_vectors, u);
86  auto dt_aa = dtA(aa, control_tagent_vectors, u, delta_t);
87  return parent_ts_control_point.matrix() *
88  ((std::get<0>(dt_aa) * std::get<1>(aa).matrix() *
89  std::get<2>(aa).matrix()) +
90  (std::get<0>(aa).matrix() * std::get<1>(dt_aa) *
91  std::get<2>(aa).matrix()) +
92  (std::get<0>(aa).matrix() * std::get<1>(aa).matrix() *
93  std::get<2>(dt_aa)));
94  }
95 
97  LieGroup const& parent_ts_control_point,
98  std::tuple<Tangent, Tangent, Tangent> const& control_tagent_vectors,
99  double u,
100  double delta_t) {
101  using TScalar = typename LieGroup::Scalar;
102  auto aa = a(control_tagent_vectors, u);
103  auto dt_aa = dtA(aa, control_tagent_vectors, u, delta_t);
104  auto dt2_aa = dt2A(aa, dt_aa, control_tagent_vectors, u, delta_t);
105 
106  return parent_ts_control_point.matrix() *
107  ((std::get<0>(dt2_aa) * std::get<1>(aa).matrix() *
108  std::get<2>(aa).matrix()) +
109  (std::get<0>(aa).matrix() * std::get<1>(dt2_aa) *
110  std::get<2>(aa).matrix()) +
111  (std::get<0>(aa).matrix() * std::get<1>(aa).matrix() *
112  std::get<2>(dt2_aa)) +
113  TScalar(2) * ((std::get<0>(dt_aa) * std::get<1>(dt_aa) *
114  std::get<2>(aa).matrix()) +
115  (std::get<0>(dt_aa) * std::get<1>(aa).matrix() *
116  std::get<2>(dt_aa)) +
117  (std::get<0>(aa).matrix() * std::get<1>(dt_aa) *
118  std::get<2>(dt_aa))));
119  }
120 
121  private:
122  static std::tuple<LieGroup, LieGroup, LieGroup> a(
123  std::tuple<Tangent, Tangent, Tangent> const& control_tagent_vectors,
124  double u) {
125  Eigen::Vector3d b = SplineBasisFunction<double>::b(u);
126  return std::make_tuple(
127  LieGroup::exp(b[0] * std::get<0>(control_tagent_vectors)),
128  LieGroup::exp(b[1] * std::get<1>(control_tagent_vectors)),
129  LieGroup::exp(b[2] * std::get<2>(control_tagent_vectors)));
130  }
131 
132  static std::tuple<Transformation, Transformation, Transformation> dtA(
133  std::tuple<LieGroup, LieGroup, LieGroup> const& aa,
134  std::tuple<Tangent, Tangent, Tangent> const& control_tagent_vectors,
135  double u,
136  double delta_t) {
137  Eigen::Vector3d dt_b = SplineBasisFunction<double>::dtB(u, delta_t);
138  return std::make_tuple(
139  dt_b[0] * std::get<0>(aa).matrix() *
140  LieGroup::hat(std::get<0>(control_tagent_vectors)),
141  dt_b[1] * std::get<1>(aa).matrix() *
142  LieGroup::hat(std::get<1>(control_tagent_vectors)),
143  dt_b[2] * std::get<2>(aa).matrix() *
144  LieGroup::hat(std::get<2>(control_tagent_vectors)));
145  }
146 
147  static std::tuple<Transformation, Transformation, Transformation> dt2A(
148  std::tuple<LieGroup, LieGroup, LieGroup> const& aa,
149  std::tuple<Transformation, Transformation, Transformation> const& dt_aa,
150  std::tuple<Tangent, Tangent, Tangent> const& control_tagent_vectors,
151  double u,
152  double delta_t) {
153  Eigen::Vector3d dt_b = SplineBasisFunction<double>::dtB(u, delta_t);
154  Eigen::Vector3d dt2_b = SplineBasisFunction<double>::dt2B(u, delta_t);
155 
156  return std::make_tuple(
157  (dt_b[0] * std::get<0>(dt_aa).matrix() +
158  dt2_b[0] * std::get<0>(aa).matrix()) *
159  LieGroup::hat(std::get<0>(control_tagent_vectors)),
160  (dt_b[1] * std::get<1>(dt_aa).matrix() +
161  dt2_b[1] * std::get<1>(aa).matrix()) *
162  LieGroup::hat(std::get<1>(control_tagent_vectors)),
163  (dt_b[2] * std::get<2>(dt_aa).matrix() +
164  dt2_b[2] * std::get<2>(aa).matrix()) *
165  LieGroup::hat(std::get<2>(control_tagent_vectors)));
166  }
167 };
168 
169 enum class SegmentCase { first, normal, last };
170 
171 template <concepts::LieGroup TGroup>
173  public:
174  using Scalar = typename TGroup::Scalar;
175  using T = Scalar;
176  using Transformation =
177  Eigen::Matrix<Scalar, TGroup::kAmbientDim, TGroup::kAmbientDim>;
178  using Params = typename TGroup::Params;
179 
181  SegmentCase segment_case,
182  Params const& params0,
183  Params const& params1,
184  Params const& params2,
185  Params const& params3)
186  : segment_case_(segment_case),
187  params0_(params0),
188  params1_(params1),
189  params2_(params2),
190  params3_(params3) {}
191 
192  BasisSplineSegment(BasisSplineSegment const&) = delete;
194 
195  auto operator=(BasisSplineSegment const&) -> BasisSplineSegment = delete;
196  auto operator=(BasisSplineSegment&&) -> BasisSplineSegment = delete;
197 
198  [[nodiscard]] TGroup worldFromFooPrev() const {
199  return TGroup::fromParams(params0_);
200  }
201  [[nodiscard]] TGroup worldFromFoo0() const {
202  return TGroup::fromParams(params1_);
203  }
204 
205  [[nodiscard]] TGroup worldFromFoo1() const {
206  return TGroup::fromParams(params2_);
207  }
208 
209  [[nodiscard]] TGroup worldFromFoo2() const {
210  return TGroup::fromParams(params3_);
211  }
212  TGroup parentFromSpline(double u) {
213  switch (segment_case_) {
214  case SegmentCase::first:
216  worldFromFoo0(),
217  std::make_tuple(
218  (worldFromFoo0().inverse() * worldFromFoo0()).log(),
219  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
220  (worldFromFoo1().inverse() * worldFromFoo2()).log()),
221  u);
222  case SegmentCase::normal:
225  std::make_tuple(
226  (worldFromFooPrev().inverse() * worldFromFoo0()).log(),
227  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
228  (worldFromFoo1().inverse() * worldFromFoo2()).log()),
229  u);
230  case SegmentCase::last:
233  std::make_tuple(
234  (worldFromFooPrev().inverse() * worldFromFoo0()).log(),
235  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
236  (worldFromFoo1().inverse() * worldFromFoo1()).log()),
237  u);
238  }
239  SOPHUS_PANIC("logic error");
240  }
241 
242  Transformation dtParentFromSpline(double u, double delta_t) {
243  switch (segment_case_) {
244  case SegmentCase::first:
246  worldFromFoo0(),
247  std::make_tuple(
248  (worldFromFoo0().inverse() * worldFromFoo0()).log(),
249  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
250  (worldFromFoo1().inverse() * worldFromFoo2()).log()),
251  u,
252  delta_t);
253  case SegmentCase::normal:
256  std::make_tuple(
257  (worldFromFooPrev().inverse() * worldFromFoo0()).log(),
258  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
259  (worldFromFoo1().inverse() * worldFromFoo2()).log()),
260  u,
261  delta_t);
262  case SegmentCase::last:
265  std::make_tuple(
266  (worldFromFooPrev().inverse() * worldFromFoo0()).log(),
267  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
268  (worldFromFoo1().inverse() * worldFromFoo1()).log()),
269  u,
270  delta_t);
271  }
272  SOPHUS_PANIC("logic error");
273  }
274 
275  Transformation dt2ParentFromSpline(double u, double delta_t) {
276  switch (segment_case_) {
277  case SegmentCase::first:
279  worldFromFoo0(),
280  std::make_tuple(
281  (worldFromFoo0().inverse() * worldFromFoo0()).log(),
282  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
283  (worldFromFoo1().inverse() * worldFromFoo2()).log()),
284  u,
285  delta_t);
286  case SegmentCase::normal:
289  std::make_tuple(
290  (worldFromFooPrev().inverse() * worldFromFoo0()).log(),
291  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
292  (worldFromFoo1().inverse() * worldFromFoo2()).log()),
293  u,
294  delta_t);
295  case SegmentCase::last:
298  std::make_tuple(
299  (worldFromFooPrev().inverse() * worldFromFoo0()).log(),
300  (worldFromFoo0().inverse() * worldFromFoo1()).log(),
301  (worldFromFoo1().inverse() * worldFromFoo1()).log()),
302  u,
303  delta_t);
304  }
305  SOPHUS_PANIC("logic error");
306  }
307 
308  private:
309  SegmentCase segment_case_;
310  Params const& params0_;
311  Params const& params1_;
312  Params const& params2_;
313  Params const& params3_;
314 };
315 
316 template <concepts::LieGroup TGroup>
318  public:
319  using LieGroup = TGroup;
320  using Scalar = typename LieGroup::Scalar;
321  using Transformation =
322  Eigen::Matrix<Scalar, TGroup::kAmbientDim, TGroup::kAmbientDim>;
323  using Tangent = typename LieGroup::Tangent;
324 
326  std::vector<LieGroup> const& parent_ts_control_point, double delta_t)
327  : parent_from_control_point_transforms_(parent_ts_control_point),
328  delta_transform_(delta_t) {
330  parent_from_control_point_transforms_.size() >= 2u,
331  ", but {}",
332  parent_from_control_point_transforms_.size());
333  }
334 
335  [[nodiscard]] LieGroup parentFromSpline(int i, double u) const {
336  SOPHUS_ASSERT(i >= 0, "i = {}", i);
338  i < this->getNumSegments(),
339  "i = {}; this->getNumSegments() = {}; "
340  "parent_from_control_point_transforms_.size() = {}",
341  i,
342  this->getNumSegments(),
343  parent_from_control_point_transforms_.size());
344 
345  SegmentCase segment_case =
346  i == 0 ? SegmentCase::first
347  : (i == this->getNumSegments() - 1 ? SegmentCase::last
349 
350  int idx_prev = std::max(0, i - 1);
351  int idx_0 = i;
352  int idx_1 = i + 1;
353  int idx_2 = std::min(
354  i + 2, int(this->parent_from_control_point_transforms_.size()) - 1);
355 
357  segment_case,
358  parent_from_control_point_transforms_[idx_prev].params(),
359  parent_from_control_point_transforms_[idx_0].params(),
360  parent_from_control_point_transforms_[idx_1].params(),
361  parent_from_control_point_transforms_[idx_2].params())
362  .parentFromSpline(u);
363  }
364 
365  [[nodiscard]] Transformation dtParentFromSpline(int i, double u) const {
366  SOPHUS_ASSERT(i >= 0, "i = {}", i);
368  i < this->getNumSegments(),
369  "i = {}; this->getNumSegments() = {}; "
370  "parent_from_control_point_transforms_.size() = {}",
371  i,
372  this->getNumSegments(),
373  parent_from_control_point_transforms_.size());
374 
375  SegmentCase segment_case =
376  i == 0 ? SegmentCase::first
377  : (i == this->getNumSegments() - 1 ? SegmentCase::last
379 
380  int idx_prev = std::max(0, i - 1);
381  int idx_0 = i;
382  int idx_1 = i + 1;
383  int idx_2 = std::min(
384  i + 2, int(this->parent_from_control_point_transforms_.size()) - 1);
385 
387  segment_case,
388  parent_from_control_point_transforms_[idx_prev].params(),
389  parent_from_control_point_transforms_[idx_0].params(),
390  parent_from_control_point_transforms_[idx_1].params(),
391  parent_from_control_point_transforms_[idx_2].params())
392  .dtParentFromSpline(u, delta_transform_);
393  }
394 
395  [[nodiscard]] Transformation dt2ParentFromSpline(int i, double u) const {
396  SOPHUS_ASSERT(i >= 0, "i = {}", i);
398  i < this->getNumSegments(),
399  "i = {}; this->getNumSegments() = {}; "
400  "parent_from_control_point_transforms_.size() = {}",
401  i,
402  this->getNumSegments(),
403  parent_from_control_point_transforms_.size());
404 
405  SegmentCase segment_case =
406  i == 0 ? SegmentCase::first
407  : (i == this->getNumSegments() - 1 ? SegmentCase::last
409 
410  int idx_prev = std::max(0, i - 1);
411  int idx_0 = i;
412  int idx_1 = i + 1;
413  int idx_2 = std::min(
414  i + 2, int(this->parent_from_control_point_transforms_.size()) - 1);
415 
417  segment_case,
418  parent_from_control_point_transforms_[idx_prev].params(),
419  parent_from_control_point_transforms_[idx_0].params(),
420  parent_from_control_point_transforms_[idx_1].params(),
421  parent_from_control_point_transforms_[idx_2].params())
422  .dt2ParentFromSpline(u, delta_transform_);
423  }
424 
425  [[nodiscard]] std::vector<LieGroup> const& parentFromsControlPoint() const {
426  return parent_from_control_point_transforms_;
427  }
428 
429  std::vector<LieGroup>& parentFromsControlPoint() {
430  return parent_from_control_point_transforms_;
431  }
432 
433  [[nodiscard]] int getNumSegments() const {
434  return int(parent_from_control_point_transforms_.size()) - 1;
435  }
436 
437  [[nodiscard]] double deltaT() const { return delta_transform_; }
438 
439  private:
440  std::vector<LieGroup> parent_from_control_point_transforms_;
441  double delta_transform_;
442 };
443 
444 struct IndexAndU {
445  int i;
446  double u;
447 };
448 
449 template <concepts::LieGroup TGroup>
450 class BasisSpline {
451  public:
452  using LieGroup = TGroup;
453  using Scalar = typename LieGroup::Scalar;
454  using Transformation =
455  Eigen::Matrix<Scalar, TGroup::kAmbientDim, TGroup::kAmbientDim>;
456  using Tangent = typename LieGroup::Tangent;
457 
459  std::vector<LieGroup> parent_ts_control_point, double t0, double delta_t)
460  : impl_(std::move(parent_ts_control_point), delta_t), t0_(t0) {}
461 
462  [[nodiscard]] LieGroup parentFromSpline(double t) const {
463  IndexAndU index_and_u = this->indexAndU(t);
464 
465  return impl_.parentFromSpline(index_and_u.i, index_and_u.u);
466  }
467 
468  [[nodiscard]] Transformation dtParentFromSpline(double t) const {
469  IndexAndU index_and_u = this->indexAndU(t);
470  return impl_.dtParentFromSpline(index_and_u.i, index_and_u.u);
471  }
472 
473  [[nodiscard]] Transformation dt2ParentFromSpline(double t) const {
474  IndexAndU index_and_u = this->indexAndU(t);
475  return impl_.dt2ParentFromSpline(index_and_u.i, index_and_u.u);
476  }
477 
478  [[nodiscard]] double t0() const { return t0_; }
479 
480  [[nodiscard]] double tmax() const {
481  return t0_ + impl_.deltaT() * getNumSegments();
482  }
483 
484  [[nodiscard]] std::vector<LieGroup> const& parentFromsControlPoint() const {
485  return impl_.parentFromsControlPoint();
486  }
487 
488  std::vector<LieGroup>& parentFromsControlPoint() {
489  return impl_.parentFromsControlPoint();
490  }
491 
492  [[nodiscard]] int getNumSegments() const { return impl_.getNumSegments(); }
493 
494  [[nodiscard]] double s(double t) const { return (t - t0_) / impl_.deltaT(); }
495 
496  [[nodiscard]] double deltaT() const { return impl_.deltaT(); }
497 
498  [[nodiscard]] IndexAndU indexAndU(double t) const {
499  SOPHUS_ASSERT(t >= t0_, "{} vs. {}", t, t0_);
500  SOPHUS_ASSERT(t <= this->tmax(), "{} vs. {}", t, this->tmax());
501 
502  double s = this->s(t);
503  double i = NAN;
504  IndexAndU index_and_u;
505  index_and_u.u = std::modf(s, &i);
506  index_and_u.i = int(i);
507  if (index_and_u.u > sophus::kEpsilonF64) {
508  return index_and_u;
509  }
510 
511  // u ~=~ 0.0
512  if (t < 0.5 * this->tmax()) {
513  // First half of spline, keep as is (i, 0.0).
514  return index_and_u;
515  }
516  // Second half of spline, use (i-1, 1.0) instead. This way we can represent
517  // t == tmax (and not just t<tmax).
518  index_and_u.u += 1.0;
519  --index_and_u.i;
520 
521  return index_and_u;
522  }
523 
524  private:
526 
527  double t0_;
528 };
529 
530 } // namespace sophus
sophus::BasisSplineSegment::Params
typename TGroup::Params Params
Definition: spline.h:178
SOPHUS_PANIC
#define SOPHUS_PANIC(...)
Definition: common.h:50
sophus::SegmentCase::first
@ first
sophus::BasisSpline::tmax
double tmax() const
Definition: spline.h:480
SOPHUS_ASSERT
#define SOPHUS_ASSERT(...)
Definition: common.h:40
sophus::BasisSpline::dtParentFromSpline
Transformation dtParentFromSpline(double t) const
Definition: spline.h:468
sophus::BasisSplineFn::dtParentFromSpline
static Transformation dtParentFromSpline(LieGroup const &parent_ts_control_point, std::tuple< Tangent, Tangent, Tangent > const &control_tagent_vectors, double u, double delta_t)
Definition: spline.h:80
sophus::BasisSplineImpl< LieGroup >::LieGroup
TGroup LieGroup
Definition: spline.h:319
sophus::BasisSplineFn::Transformation
Eigen::Matrix< Scalar, TGroup::kAmbientDim, TGroup::kAmbientDim > Transformation
Definition: spline.h:68
sophus::IndexAndU
Definition: spline.h:444
sophus::BasisSpline::t0
double t0() const
Definition: spline.h:478
sophus::BasisSpline::LieGroup
TGroup LieGroup
Definition: spline.h:452
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::BasisSplineSegment::worldFromFoo1
TGroup worldFromFoo1() const
Definition: spline.h:205
sophus::min
auto min(TPoint const &a, TPoint const &b) -> TPoint
Definition: vector_space.h:104
sophus::BasisSpline::parentFromsControlPoint
std::vector< LieGroup > & parentFromsControlPoint()
Definition: spline.h:488
sophus::BasisSplineSegment::worldFromFooPrev
TGroup worldFromFooPrev() const
Definition: spline.h:198
sophus::BasisSpline::Transformation
Eigen::Matrix< Scalar, TGroup::kAmbientDim, TGroup::kAmbientDim > Transformation
Definition: spline.h:455
sophus::SplineBasisFunction::dtB
static Eigen::Vector3< TScalar > dtB(TScalar const &u, TScalar const &delta_t)
Definition: spline.h:44
sophus::BasisSpline::Tangent
typename LieGroup::Tangent Tangent
Definition: spline.h:456
sophus::BasisSpline::parentFromsControlPoint
std::vector< LieGroup > const & parentFromsControlPoint() const
Definition: spline.h:484
sophus::SplineBasisFunction
Definition: spline.h:23
sophus::BasisSplineSegment::Scalar
typename TGroup::Scalar Scalar
Definition: spline.h:174
sophus::BasisSplineSegment::dtParentFromSpline
Transformation dtParentFromSpline(double u, double delta_t)
Definition: spline.h:242
sophus::BasisSplineImpl::dtParentFromSpline
Transformation dtParentFromSpline(int i, double u) const
Definition: spline.h:365
sophus::BasisSplineFn
Definition: spline.h:63
sophus::BasisSpline::Scalar
typename LieGroup::Scalar Scalar
Definition: spline.h:453
sophus::BasisSplineImpl::parentFromSpline
LieGroup parentFromSpline(int i, double u) const
Definition: spline.h:335
sophus::BasisSpline::dt2ParentFromSpline
Transformation dt2ParentFromSpline(double t) const
Definition: spline.h:473
sophus::BasisSplineSegment::BasisSplineSegment
BasisSplineSegment(SegmentCase segment_case, Params const &params0, Params const &params1, Params const &params2, Params const &params3)
Definition: spline.h:180
sophus::BasisSpline::getNumSegments
int getNumSegments() const
Definition: spline.h:492
sophus::IndexAndU::i
int i
Definition: spline.h:445
sophus::IndexAndU::u
double u
Definition: spline.h:446
sophus::BasisSpline::parentFromSpline
LieGroup parentFromSpline(double t) const
Definition: spline.h:462
sophus::BasisSplineSegment::worldFromFoo2
TGroup worldFromFoo2() const
Definition: spline.h:209
sophus::BasisSplineSegment::Transformation
Eigen::Matrix< Scalar, TGroup::kAmbientDim, TGroup::kAmbientDim > Transformation
Definition: spline.h:177
sophus::SegmentCase::normal
@ normal
sophus::BasisSplineImpl::deltaT
double deltaT() const
Definition: spline.h:437
sophus::BasisSplineImpl
Definition: spline.h:317
sophus::BasisSplineFn::dt2ParentFromSpline
static Transformation dt2ParentFromSpline(LieGroup const &parent_ts_control_point, std::tuple< Tangent, Tangent, Tangent > const &control_tagent_vectors, double u, double delta_t)
Definition: spline.h:96
sophus::BasisSplineSegment
Definition: spline.h:172
sophus::BasisSplineImpl::parentFromsControlPoint
std::vector< LieGroup > const & parentFromsControlPoint() const
Definition: spline.h:425
sophus::concepts::Tangent
concept Tangent
Definition: params.h:34
sophus::BasisSplineImpl::dt2ParentFromSpline
Transformation dt2ParentFromSpline(int i, double u) const
Definition: spline.h:395
sophus::SegmentCase::last
@ last
sophus::BasisSplineSegment::T
Scalar T
Definition: spline.h:175
lie_group.h
sophus::BasisSplineImpl< LieGroup >::Transformation
Eigen::Matrix< Scalar, TGroup::kAmbientDim, TGroup::kAmbientDim > Transformation
Definition: spline.h:322
sophus::BasisSplineSegment::operator=
auto operator=(BasisSplineSegment const &) -> BasisSplineSegment=delete
sophus::BasisSplineImpl::BasisSplineImpl
BasisSplineImpl(std::vector< LieGroup > const &parent_ts_control_point, double delta_t)
Definition: spline.h:325
sophus::BasisSpline::BasisSpline
BasisSpline(std::vector< LieGroup > parent_ts_control_point, double t0, double delta_t)
Definition: spline.h:458
common.h
sophus::BasisSpline::s
double s(double t) const
Definition: spline.h:494
sophus::BasisSplineFn::LieGroup
TGroup LieGroup
Definition: spline.h:65
sophus::BasisSplineFn::Tangent
typename LieGroup::Tangent Tangent
Definition: spline.h:69
sophus::BasisSplineSegment::worldFromFoo0
TGroup worldFromFoo0() const
Definition: spline.h:201
sophus::SplineBasisFunction::c
static Eigen::Matrix< TScalar, 3, 4 > c()
Definition: spline.h:25
sophus::BasisSplineImpl::parentFromsControlPoint
std::vector< LieGroup > & parentFromsControlPoint()
Definition: spline.h:429
sophus::BasisSplineImpl::getNumSegments
int getNumSegments() const
Definition: spline.h:433
sophus::max
auto max(TPoint const &a, TPoint const &b) -> TPoint
Definition: vector_space.h:114
sophus::BasisSplineFn::parentFromSpline
static LieGroup parentFromSpline(LieGroup const &parent_ts_control_point, std::tuple< Tangent, Tangent, Tangent > const &control_tagent_vectors, double u)
Definition: spline.h:71
sophus::SegmentCase
SegmentCase
Definition: spline.h:169
sophus::BasisSpline::deltaT
double deltaT() const
Definition: spline.h:496
sophus::BasisSpline::indexAndU
IndexAndU indexAndU(double t) const
Definition: spline.h:498
sophus::BasisSplineSegment::dt2ParentFromSpline
Transformation dt2ParentFromSpline(double u, double delta_t)
Definition: spline.h:275
interpolate.h
sophus::SplineBasisFunction::b
static Eigen::Vector3< TScalar > b(TScalar const &u)
Definition: spline.h:37
sophus::BasisSplineSegment::parentFromSpline
TGroup parentFromSpline(double u)
Definition: spline.h:212
sophus::BasisSpline
Definition: spline.h:450
sophus::SplineBasisFunction::dt2B
static Eigen::Vector3< TScalar > dt2B(TScalar const &u, TScalar const &delta_t)
Definition: spline.h:52
sophus::BasisSplineImpl< LieGroup >::Tangent
typename LieGroup::Tangent Tangent
Definition: spline.h:323
sophus::concepts::Params
concept Params
Definition: params.h:41
sophus::BasisSplineImpl< LieGroup >::Scalar
typename LieGroup::Scalar Scalar
Definition: spline.h:320
sophus::BasisSplineFn::Scalar
typename LieGroup::Scalar Scalar
Definition: spline.h:66