farm-ng-core
isometry3.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 #pragma once
10 
14 #include "sophus/lie/lie_group.h"
15 #include "sophus/lie/rotation3.h"
16 
17 namespace sophus {
18 
19 // definition: distance preserving mapping in R^3
20 // <==> shape and size preserving mapping in R^3
21 template <class TScalar>
22 class Isometry3
23  : public lie::Group<
24  Isometry3,
25  TScalar,
26  lie::WithDimAndSubgroup<3, lie::Rotation3Impl>::SemiDirectProduct> {
27  public:
28  using Scalar = TScalar;
29 
30  using Base = lie::Group<
31  Isometry3,
32  TScalar,
35 
36  using Tangent = typename Base::Tangent;
37  using Params = typename Base::Params;
38  using Point = typename Base::Point;
39 
40  Isometry3() = default;
41 
42  explicit Isometry3(UninitTag /*unused*/) : Base(UninitTag{}) {}
43 
45  Eigen::Vector<Scalar, 3> const& translation,
46  Rotation3<Scalar> const& group)
47  : Isometry3(UninitTag{}) {
48  this->params_.template head<4>() = group.params();
49  this->params_.template tail<3>() = translation;
50  }
51 
52  [[deprecated(
53  "Use Isometry3(t, R) instead. Rotation and translation do not "
54  "commute and constructor arguments are sorted in sophus2 based on order "
55  "of operation from right to left:"
56  "Isometry3(t, R) * point == t + R * point.")]] //
57  explicit Isometry3(
58  Rotation3<Scalar> const& group,
59  Eigen::Vector<Scalar, 3> const& translation)
60  : Isometry3(translation, group) {}
61 
62  Isometry3(Rotation3<Scalar> const& group) {
63  this->params_.template head<4>() = group.params();
64  }
65 
66  Isometry3(Eigen::Vector<Scalar, 3> const& translation) {
67  this->params_.template tail<3>() = translation;
68  }
69 
70  static auto fromRotationMatrix(Eigen::Matrix3<Scalar> const& mat_r)
71  -> Isometry3 {
73  }
74 
75  static auto fromUnitQuaternion(Quaternion<Scalar> const& q) -> Isometry3 {
77  }
78 
79  static auto fitFromQuaternion(Quaternion<Scalar> const& q) -> Isometry3 {
81  }
82 
83  /// Construct a translation only Isometry3 instance.
84  ///
85  template <class TT0, class TT1, class TT2>
86  static auto fromT(TT0 const& x, TT1 const& y, TT2 const& z) -> Isometry3 {
87  return Isometry3(Eigen::Vector3<Scalar>(x, y, z));
88  }
89 
90  /// Construct x-axis translation.
91  ///
92  static auto fromTx(Scalar const& x) -> Isometry3 {
93  return Isometry3::fromT(x, Scalar(0), Scalar(0));
94  }
95 
96  /// Construct y-axis translation.
97  ///
98  static auto fromTy(Scalar const& y) -> Isometry3 {
99  return Isometry3::fromT(Scalar(0), y, Scalar(0));
100  }
101 
102  /// Construct z-axis translation.
103  ///
104  static auto fromTz(Scalar const& z) -> Isometry3 {
105  return Isometry3::fromT(Scalar(0), Scalar(0), z);
106  }
107 
108  /// Construct x-axis rotation.
109  ///
110  static auto fromRx(Scalar const& x) -> Isometry3 {
112  }
113 
114  /// Construct y-axis rotation.
115  ///
116  static auto fromRy(Scalar const& y) -> Isometry3 {
118  }
119 
120  /// Construct z-axis rotation.
121  ///
122  static auto fromRz(Scalar const& z) -> Isometry3 {
124  }
125 
126  template <class TOtherScalar>
127  auto cast() const -> Isometry3<TOtherScalar> {
129  this->params_.template cast<TOtherScalar>());
130  }
131 
132  auto translation() -> Eigen::VectorBlock<Params, 3> {
133  return this->params_.template tail<3>();
134  }
135 
136  [[nodiscard]] auto translation() const
137  -> Eigen::VectorBlock<Params const, 3> {
138  return this->params_.template tail<3>();
139  }
140 
141  [[nodiscard]] auto rotation() const -> Rotation3<Scalar> const {
143  this->params_.template head<Rotation3<Scalar>::kNumParams>().eval());
144  }
145 
147  this->params_.template head<Rotation3<Scalar>::kNumParams>() =
148  rotation.params();
149  }
150 
151  [[nodiscard]] auto rotationMatrix() const -> Eigen::Matrix3<Scalar> {
152  return this->rotation().matrix();
153  }
154 
155  [[nodiscard]] auto unitQuaternion() const -> Quaternion<Scalar> {
156  return Quaternion<Scalar>::fromParams(this->params_.template head<4>());
157  }
158 
159  auto setUnitQuaternion(Quaternion<Scalar> const& z) const -> void {
161  }
162 
163  [[nodiscard]] auto so3() const -> Rotation3<Scalar> const {
164  return rotation();
165  }
166 };
167 
170 static_assert(concepts::Isometry3<Isometry3F64>);
171 
172 namespace details {
173 template <class TT>
174 class Cast<sophus::Isometry3<TT>> {
175  public:
176  template <class TTo>
177  static auto impl(sophus::Isometry3<TT> const& v) {
178  return v.template cast<typename TTo::Scalar>();
179  }
180  template <class TTo>
181  static auto implScalar(sophus::Isometry3<TT> const& v) {
182  return v.template cast<TTo>();
183  }
184 };
185 } // namespace details
186 
187 template <class TScalar>
188 using SE3 = Isometry3<TScalar>; // NOLINT
189 using SE3f = Isometry3<float>; // NOLINT
190 using SE3d = Isometry3<double>; // NOLINT
191 
192 } // namespace sophus
rotation3.h
sophus::Rotation3::fitFromQuaternion
static auto fitFromQuaternion(Quaternion< TScalar > const &q) -> Rotation3
Definition: rotation3.h:61
sophus::Isometry3::unitQuaternion
auto unitQuaternion() const -> Quaternion< Scalar >
Definition: isometry3.h:155
sophus::Isometry3::fromRy
static auto fromRy(Scalar const &y) -> Isometry3
Construct y-axis rotation.
Definition: isometry3.h:116
sophus::lie::Group< Isometry3, TScalar, lie::WithDimAndSubgroup< 3, lie::Rotation3Impl >::SemiDirectProduct >::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: lie_group.h:69
sophus::Rotation3::fromUnitQuaternion
static auto fromUnitQuaternion(Quaternion< TScalar > const &q) -> Rotation3
Definition: rotation3.h:57
Eigen
Definition: params.h:72
sophus::lie::Group< Isometry3, TScalar, lie::WithDimAndSubgroup< 3, lie::Rotation3Impl >::SemiDirectProduct >::Tangent
Eigen::Vector< Scalar, kDof > Tangent
Definition: lie_group.h:68
sophus::Isometry3< double >::Params
typename Base::Params Params
Definition: isometry3.h:37
sophus::Isometry3::Isometry3
Isometry3(UninitTag)
Definition: isometry3.h:42
sophus::lie::Group
Definition: lie_group.h:24
sophus::Rotation3
Definition: rotation3.h:20
sophus::Isometry3::fromRotationMatrix
static auto fromRotationMatrix(Eigen::Matrix3< Scalar > const &mat_r) -> Isometry3
Definition: isometry3.h:70
sophus::Isometry3< double >::Scalar
double Scalar
Definition: isometry3.h:28
sophus::Isometry3::setUnitQuaternion
auto setUnitQuaternion(Quaternion< Scalar > const &z) const -> void
Definition: isometry3.h:159
sophus::Isometry3::fromUnitQuaternion
static auto fromUnitQuaternion(Quaternion< Scalar > const &q) -> Isometry3
Definition: isometry3.h:75
sophus::lie::TranslationFactorGroupProduct
Semi direct product of a Lie group (factor group) and the vector space (translation).
Definition: translation_factor_group_product.h:27
sophus::Isometry3::translation
auto translation() const -> Eigen::VectorBlock< Params const, 3 >
Definition: isometry3.h:136
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::lie::Group< Isometry3, TScalar, lie::WithDimAndSubgroup< 3, lie::Rotation3Impl >::SemiDirectProduct >::Point
Eigen::Vector< Scalar, kPointDim > Point
Definition: lie_group.h:70
sophus::Quaternion::fromParams
static auto fromParams(Params const &params) -> Quaternion
Definition: quaternion.h:118
sophus::lie::Group< Rotation3, TScalar, lie::Rotation3Impl >::params
auto params() const -> Params const &
Definition: lie_group.h:235
sophus::lie::Group< Isometry3, TScalar, lie::WithDimAndSubgroup< 3, lie::Rotation3Impl >::SemiDirectProduct >::fromParams
static auto fromParams(Params const &params) -> Derived
Definition: lie_group.h:79
sophus::Isometry3::fromTy
static auto fromTy(Scalar const &y) -> Isometry3
Construct y-axis translation.
Definition: isometry3.h:98
sophus::Isometry3::fromTz
static auto fromTz(Scalar const &z) -> Isometry3
Construct z-axis translation.
Definition: isometry3.h:104
sophus::lie::Group< Isometry3, TScalar, lie::WithDimAndSubgroup< 3, lie::Rotation3Impl >::SemiDirectProduct >::params_
Params params_
Definition: lie_group.h:265
sophus::Isometry3::so3
auto so3() const -> Rotation3< Scalar > const
Definition: isometry3.h:163
sophus::Isometry3::cast
auto cast() const -> Isometry3< TOtherScalar >
Definition: isometry3.h:127
sophus::Rotation3::fromRotationMatrix
static auto fromRotationMatrix(Eigen::Matrix3< TScalar > const &mat_r) -> Rotation3
Definition: rotation3.h:65
sophus::Isometry3< double >::Point
typename Base::Point Point
Definition: isometry3.h:38
sophus::Isometry3::translation
auto translation() -> Eigen::VectorBlock< Params, 3 >
Definition: isometry3.h:132
sophus::Isometry3::fromRz
static auto fromRz(Scalar const &z) -> Isometry3
Construct z-axis rotation.
Definition: isometry3.h:122
sophus::Isometry3::fromT
static auto fromT(TT0 const &x, TT1 const &y, TT2 const &z) -> Isometry3
Construct a translation only Isometry3 instance.
Definition: isometry3.h:86
sophus::Isometry3::Isometry3
Isometry3(Eigen::Vector< Scalar, 3 > const &translation)
Definition: isometry3.h:66
sophus::Isometry3::rotationMatrix
auto rotationMatrix() const -> Eigen::Matrix3< Scalar >
Definition: isometry3.h:151
sophus::Isometry3::setRotation
auto setRotation(Rotation3< Scalar > const &rotation)
Definition: isometry3.h:146
sophus::Isometry3::fitFromQuaternion
static auto fitFromQuaternion(Quaternion< Scalar > const &q) -> Isometry3
Definition: isometry3.h:79
lie_group.h
sophus::Isometry3< double >::Tangent
typename Base::Tangent Tangent
Definition: isometry3.h:36
sophus::Isometry3::fromTx
static auto fromTx(Scalar const &x) -> Isometry3
Construct x-axis translation.
Definition: isometry3.h:92
group_accessors.h
translation_factor_group_product.h
rotation3.h
sophus::Isometry3
Definition: isometry3.h:22
sophus::Isometry3::fromRx
static auto fromRx(Scalar const &x) -> Isometry3
Construct x-axis rotation.
Definition: isometry3.h:110
sophus::Isometry3::Isometry3
Isometry3(Eigen::Vector< Scalar, 3 > const &translation, Rotation3< Scalar > const &group)
Definition: isometry3.h:44
sophus::Isometry3::Isometry3
Isometry3(Rotation3< Scalar > const &group, Eigen::Vector< Scalar, 3 > const &translation)
Definition: isometry3.h:57
sophus::Isometry3::Isometry3
Isometry3()=default
sophus::Isometry3::Isometry3
Isometry3(Rotation3< Scalar > const &group)
Definition: isometry3.h:62
sophus::UninitTag
Definition: common.h:70
sophus::Isometry3::rotation
auto rotation() const -> Rotation3< Scalar > const
Definition: isometry3.h:141
sophus::Quaternion
Definition: group_accessors.h:18