farm-ng-core
quaternion.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 #include "sophus/common/common.h"
13 
14 namespace sophus {
15 
16 template <class TScalar>
18  public:
19  using Scalar = TScalar;
20  static int constexpr kNumParams = 4;
21  static bool constexpr kIsCommutative = false;
22 
23  using Params = Eigen::Vector<Scalar, kNumParams>;
24 
25  template <class TCompatibleScalar>
26  using ParamsReturn = Eigen::Vector<
27  typename Eigen::ScalarBinaryOpTraits<Scalar, TCompatibleScalar>::
28  ReturnType,
29  4>;
30 
31  // factories
32 
33  static auto zero() -> Eigen::Vector<Scalar, 4> {
34  return Eigen::Vector<Scalar, 4>::Zero();
35  }
36 
37  static auto one() -> Eigen::Vector<Scalar, 4> {
38  return Eigen::Vector<Scalar, 4>(0.0, 0.0, 0.0, 1.0);
39  }
40 
41  static auto areParamsValid(Params const& /*unused*/)
42  -> sophus::Expected<Success> {
43  return sophus::Expected<Success>{};
44  }
45 
46  static auto paramsExamples() -> std::vector<Params> {
47  return pointExamples<Scalar, 4>();
48  }
49 
50  static auto invalidParamsExamples() -> std::vector<Params> {
51  return std::vector<Params>({});
52  }
53 
54  template <class TCompatibleScalar>
55  static auto multiplication(
56  Eigen::Vector<Scalar, 4> const& lhs,
57  Eigen::Vector<TCompatibleScalar, 4> const& rhs)
59  Eigen::Vector3<Scalar> lhs_ivec = lhs.template head<3>();
60  Eigen::Vector3<TCompatibleScalar> rhs_ivec = rhs.template head<3>();
61 
63  out.w() = lhs.w() * rhs.w() - lhs_ivec.dot(rhs_ivec);
64  out.template head<3>() =
65  lhs.w() * rhs_ivec + rhs.w() * lhs_ivec + lhs_ivec.cross(rhs_ivec);
66  return out;
67  }
68 
69  template <class TCompatibleScalar>
70  static auto addition(
71  Eigen::Vector<Scalar, 4> const& a,
72  Eigen::Vector<TCompatibleScalar, 4> const& b)
74  return a + b;
75  }
76 
77  static auto conjugate(Eigen::Vector<Scalar, 4> const& a)
78  -> Eigen::Vector<Scalar, 4> {
79  return Eigen::Vector<Scalar, 4>(-a.x(), -a.y(), -a.z(), a.w());
80  }
81 
82  static auto inverse(Eigen::Vector<Scalar, 4> const& q)
83  -> Eigen::Vector<Scalar, 4> {
84  return conjugate(q) / squaredNorm(q);
85  }
86 
87  static auto norm(Eigen::Vector<Scalar, 4> const& q) -> Scalar {
88  return q.norm();
89  }
90 
91  static auto squaredNorm(Eigen::Vector<Scalar, 4> const& q) -> Scalar {
92  return q.squaredNorm();
93  }
94 };
95 
96 template <class TScalar>
97 class Quaternion {
98  public:
99  using Scalar = TScalar;
100  using Imag = Eigen::Vector<Scalar, 3>;
102  static int constexpr kNumParams = 4;
103 
104  using Params = Eigen::Vector<Scalar, kNumParams>;
105 
106  template <class TCompatibleScalar>
107  using QuaternionReturn = Quaternion<typename Eigen::ScalarBinaryOpTraits<
108  Scalar,
109  TCompatibleScalar>::ReturnType>;
110 
111  // constructors and factories
112 
113  Quaternion() : params_(Impl::zero()) {}
114 
115  Quaternion(Quaternion const&) = default;
116  auto operator=(Quaternion const&) -> Quaternion& = default;
117 
118  static auto fromParams(Params const& params) -> Quaternion {
119  Quaternion q(UninitTag{});
120  q.setParams(params);
121  return q;
122  }
123 
124  static auto zero() -> Quaternion {
126  }
127 
128  static auto one() -> Quaternion {
130  }
131 
132  [[nodiscard]] auto params() const -> Params const& { return params_; }
133 
134  void setParams(Params const& params) { params_ = params; }
135 
136  [[nodiscard]] auto real() const -> Scalar const& { return params_[3]; }
137  [[nodiscard]] auto real() -> Scalar& { return params_[3]; }
138 
139  [[nodiscard]] auto imag() const { return params_.template head<3>(); }
140  [[nodiscard]] auto imag() { return params_.template head<3>(); }
141 
142  template <class TCompatibleScalar>
143  [[nodiscard]] auto operator*(Quaternion<TCompatibleScalar> const& other) const
146  Impl::multiplication(this->params_, other.params()));
147  }
148 
149  template <class TCompatibleScalar>
150  [[nodiscard]] auto operator+(Quaternion<TCompatibleScalar> const& other) const
153  Impl::addition(this->params_, other.params()));
154  }
155 
156  [[nodiscard]] auto conjugate() const -> Quaternion {
157  return Quaternion::fromParams(Impl::conjugate(this->params_));
158  }
159 
160  [[nodiscard]] auto inverse() const -> Quaternion {
161  return Quaternion::fromParams(Impl::inverse(this->params_));
162  }
163 
164  [[nodiscard]] auto norm() const -> Scalar {
165  return Impl::norm(this->params_);
166  }
167 
168  [[nodiscard]] auto squaredNorm() const -> Scalar {
169  return Impl::squaredNorm(this->params_);
170  }
171 
172  private:
173  Quaternion(UninitTag /*unused*/) {}
174  Eigen::Vector4<Scalar> params_;
175 };
176 
178 
179 } // namespace sophus
sophus::QuaternionImpl::paramsExamples
static auto paramsExamples() -> std::vector< Params >
Definition: quaternion.h:46
sophus::QuaternionImpl::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: quaternion.h:23
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::Quaternion::zero
static auto zero() -> Quaternion
Definition: quaternion.h:124
sophus::QuaternionImpl::kIsCommutative
static constexpr bool kIsCommutative
Definition: quaternion.h:21
sophus::Quaternion::real
auto real() -> Scalar &
Definition: quaternion.h:137
sophus::Quaternion::kNumParams
static constexpr int kNumParams
Definition: quaternion.h:102
sophus::Quaternion::imag
auto imag()
Definition: quaternion.h:140
sophus::Quaternion::fromParams
static auto fromParams(Params const &params) -> Quaternion
Definition: quaternion.h:118
sophus::QuaternionImpl::conjugate
static auto conjugate(Eigen::Vector< Scalar, 4 > const &a) -> Eigen::Vector< Scalar, 4 >
Definition: quaternion.h:77
sophus::Quaternion::params
auto params() const -> Params const &
Definition: quaternion.h:132
sophus::QuaternionImpl::invalidParamsExamples
static auto invalidParamsExamples() -> std::vector< Params >
Definition: quaternion.h:50
sophus::QuaternionImpl::zero
static auto zero() -> Eigen::Vector< Scalar, 4 >
Definition: quaternion.h:33
sophus::QuaternionImpl::addition
static auto addition(Eigen::Vector< Scalar, 4 > const &a, Eigen::Vector< TCompatibleScalar, 4 > const &b) -> ParamsReturn< TCompatibleScalar >
Definition: quaternion.h:70
sophus::Quaternion::Quaternion
Quaternion()
Definition: quaternion.h:113
sophus::QuaternionImpl::norm
static auto norm(Eigen::Vector< Scalar, 4 > const &q) -> Scalar
Definition: quaternion.h:87
sophus::Quaternion::setParams
void setParams(Params const &params)
Definition: quaternion.h:134
sophus::QuaternionImpl::Scalar
TScalar Scalar
Definition: quaternion.h:19
sophus::Quaternion::real
auto real() const -> Scalar const &
Definition: quaternion.h:136
sophus::Quaternion::imag
auto imag() const
Definition: quaternion.h:139
sophus::Quaternion::norm
auto norm() const -> Scalar
Definition: quaternion.h:164
sophus::Quaternion::squaredNorm
auto squaredNorm() const -> Scalar
Definition: quaternion.h:168
sophus::Quaternion::Imag
Eigen::Vector< Scalar, 3 > Imag
Definition: quaternion.h:100
sophus::Quaternion::operator*
auto operator*(Quaternion< TCompatibleScalar > const &other) const -> QuaternionReturn< TCompatibleScalar >
Definition: quaternion.h:143
sophus::Quaternion::inverse
auto inverse() const -> Quaternion
Definition: quaternion.h:160
sophus::QuaternionImpl::ParamsReturn
Eigen::Vector< typename Eigen::ScalarBinaryOpTraits< Scalar, TCompatibleScalar >::ReturnType, 4 > ParamsReturn
Definition: quaternion.h:29
sophus::QuaternionImpl::inverse
static auto inverse(Eigen::Vector< Scalar, 4 > const &q) -> Eigen::Vector< Scalar, 4 >
Definition: quaternion.h:82
sophus::Quaternion::conjugate
auto conjugate() const -> Quaternion
Definition: quaternion.h:156
sophus::Quaternion::operator+
auto operator+(Quaternion< TCompatibleScalar > const &other) const -> QuaternionReturn< TCompatibleScalar >
Definition: quaternion.h:150
sophus::Quaternion::operator=
auto operator=(Quaternion const &) -> Quaternion &=default
sophus::QuaternionImpl::areParamsValid
static auto areParamsValid(Params const &) -> sophus::Expected< Success >
Definition: quaternion.h:41
common.h
sophus::Quaternion::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: quaternion.h:104
sophus::QuaternionImpl
Definition: quaternion.h:17
sophus::QuaternionImpl::one
static auto one() -> Eigen::Vector< Scalar, 4 >
Definition: quaternion.h:37
division_ring.h
sophus::QuaternionImpl::squaredNorm
static auto squaredNorm(Eigen::Vector< Scalar, 4 > const &q) -> Scalar
Definition: quaternion.h:91
sophus::QuaternionImpl::multiplication
static auto multiplication(Eigen::Vector< Scalar, 4 > const &lhs, Eigen::Vector< TCompatibleScalar, 4 > const &rhs) -> ParamsReturn< TCompatibleScalar >
Definition: quaternion.h:55
sophus::Quaternion::Scalar
TScalar Scalar
Definition: quaternion.h:99
sophus::Quaternion::one
static auto one() -> Quaternion
Definition: quaternion.h:128
vector_space.h
sophus::UninitTag
Definition: common.h:70
sophus::Quaternion
Definition: group_accessors.h:18
sophus::QuaternionImpl::kNumParams
static constexpr int kNumParams
Definition: quaternion.h:20