Eigen-Contrib  5.0.1
 
Loading...
Searching...
No Matches
EulerAngles.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2015 Tal Hadad <tal_hd@hotmail.com>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9// SPDX-License-Identifier: MPL-2.0
10
11#ifndef EIGEN_EULERANGLESCLASS_H // TODO: Fix previous "EIGEN_EULERANGLES_H" definition?
12#define EIGEN_EULERANGLESCLASS_H
13
14// IWYU pragma: private
15#include "./InternalHeaderCheck.h"
16
17namespace Eigen {
103template <typename Scalar_, class _System>
104class EulerAngles : public RotationBase<EulerAngles<Scalar_, _System>, 3> {
105 public:
107
109 typedef Scalar_ Scalar;
110 typedef typename NumTraits<Scalar>::Real RealScalar;
111
113 typedef _System System;
114
119
122 const Vector3& u = Vector3::Unit(System::AlphaAxisAbs - 1);
123 return System::IsAlphaOpposite ? -u : u;
124 }
125
128 const Vector3& u = Vector3::Unit(System::BetaAxisAbs - 1);
129 return System::IsBetaOpposite ? -u : u;
130 }
131
134 const Vector3& u = Vector3::Unit(System::GammaAxisAbs - 1);
135 return System::IsGammaOpposite ? -u : u;
136 }
137
138 private:
139 Vector3 m_angles;
140
141 public:
145 EulerAngles(const Scalar& alpha, const Scalar& beta, const Scalar& gamma) : m_angles(alpha, beta, gamma) {}
146
147 // TODO: Test this constructor
149 explicit EulerAngles(const Scalar* data) : m_angles(data) {}
150
163 template <typename Derived>
164 explicit EulerAngles(const MatrixBase<Derived>& other) {
165 *this = other;
166 }
167
179 template <typename Derived>
181 System::CalcEulerAngles(*this, rot.toRotationMatrix());
182 }
183
184 /*EulerAngles(const QuaternionType& q)
185 {
186 // TODO: Implement it in a faster way for quaternions
187 // According to http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/
188 // we can compute only the needed matrix cells and then convert to euler angles. (see ZYX example below)
189 // Currently we compute all matrix cells from quaternion.
190
191 // Special case only for ZYX
192 //Scalar y2 = q.y() * q.y();
193 //m_angles[0] = std::atan2(2*(q.w()*q.z() + q.x()*q.y()), (1 - 2*(y2 + q.z()*q.z())));
194 //m_angles[1] = std::asin( 2*(q.w()*q.y() - q.z()*q.x()));
195 //m_angles[2] = std::atan2(2*(q.w()*q.x() + q.y()*q.z()), (1 - 2*(q.x()*q.x() + y2)));
196 }*/
197
199 const Vector3& angles() const { return m_angles; }
201 Vector3& angles() { return m_angles; }
202
204 Scalar alpha() const { return m_angles[0]; }
206 Scalar& alpha() { return m_angles[0]; }
207
209 Scalar beta() const { return m_angles[1]; }
211 Scalar& beta() { return m_angles[1]; }
212
214 Scalar gamma() const { return m_angles[2]; }
216 Scalar& gamma() { return m_angles[2]; }
217
227 EulerAngles res;
228 res.m_angles = -m_angles;
229 return res;
230 }
231
237 EulerAngles operator-() const { return inverse(); }
238
246 template <class Derived>
248 EIGEN_STATIC_ASSERT(
249 (std::is_same<Scalar, typename Derived::Scalar>::value),
250 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
251
252 internal::eulerangles_assign_impl<System, Derived>::run(*this, other.derived());
253 return *this;
254 }
255
256 // TODO: Assign and construct from another EulerAngles (with different system)
257
263 template <typename Derived>
265 System::CalcEulerAngles(*this, rot.toRotationMatrix());
266 return *this;
267 }
268
273 bool isApprox(const EulerAngles& other, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const {
274 return angles().isApprox(other.angles(), prec);
275 }
276
279 // TODO: Calc it faster
280 return static_cast<QuaternionType>(*this).toRotationMatrix();
281 }
282
288
289 friend std::ostream& operator<<(std::ostream& s, const EulerAngles<Scalar, System>& eulerAngles) {
290 s << eulerAngles.angles().transpose();
291 return s;
292 }
293
295 template <typename NewScalarType>
301};
302
303#define EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(AXES, SCALAR_TYPE, SCALAR_POSTFIX) \
304 \
305 typedef EulerAngles<SCALAR_TYPE, EulerSystem##AXES> EulerAngles##AXES##SCALAR_POSTFIX;
306
307#define EIGEN_EULER_ANGLES_TYPEDEFS(SCALAR_TYPE, SCALAR_POSTFIX) \
308 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(XYZ, SCALAR_TYPE, SCALAR_POSTFIX) \
309 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(XYX, SCALAR_TYPE, SCALAR_POSTFIX) \
310 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(XZY, SCALAR_TYPE, SCALAR_POSTFIX) \
311 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(XZX, SCALAR_TYPE, SCALAR_POSTFIX) \
312 \
313 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(YZX, SCALAR_TYPE, SCALAR_POSTFIX) \
314 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(YZY, SCALAR_TYPE, SCALAR_POSTFIX) \
315 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(YXZ, SCALAR_TYPE, SCALAR_POSTFIX) \
316 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(YXY, SCALAR_TYPE, SCALAR_POSTFIX) \
317 \
318 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(ZXY, SCALAR_TYPE, SCALAR_POSTFIX) \
319 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(ZXZ, SCALAR_TYPE, SCALAR_POSTFIX) \
320 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(ZYX, SCALAR_TYPE, SCALAR_POSTFIX) \
321 EIGEN_EULER_ANGLES_SINGLE_TYPEDEF(ZYZ, SCALAR_TYPE, SCALAR_POSTFIX)
322
323EIGEN_EULER_ANGLES_TYPEDEFS(float, f)
324EIGEN_EULER_ANGLES_TYPEDEFS(double, d)
325
326#undef EIGEN_EULER_ANGLES_TYPEDEFS
327#undef EIGEN_EULER_ANGLES_SINGLE_TYPEDEF
328
329// Specifically-referenced instantiations.
338
339namespace internal {
340template <typename Scalar_, class _System>
341struct traits<EulerAngles<Scalar_, _System> > {
342 typedef Scalar_ Scalar;
343};
344
345// set from a rotation matrix
346template <class System, class Other>
347struct eulerangles_assign_impl<System, Other, 3, 3> {
348 typedef typename Other::Scalar Scalar;
349 static void run(EulerAngles<Scalar, System>& e, const Other& m) { System::CalcEulerAngles(e, m); }
350};
351
352// set from a vector of Euler angles
353template <class System, class Other>
354struct eulerangles_assign_impl<System, Other, 3, 1> {
355 typedef typename Other::Scalar Scalar;
356 static void run(EulerAngles<Scalar, System>& e, const Other& vec) { e.angles() = vec; }
357};
358} // namespace internal
359} // namespace Eigen
360
361#endif // EIGEN_EULERANGLESCLASS_H
Represents a rotation in a 3 dimensional space as three Euler angles.
Definition EulerAngles.h:104
Scalar & gamma()
Definition EulerAngles.h:216
_System System
Definition EulerAngles.h:113
Scalar & alpha()
Definition EulerAngles.h:206
static Vector3 GammaAxisVector()
Definition EulerAngles.h:133
Scalar alpha() const
Definition EulerAngles.h:204
static Vector3 AlphaAxisVector()
Definition EulerAngles.h:121
Vector3 & angles()
Definition EulerAngles.h:201
Quaternion< Scalar > QuaternionType
Definition EulerAngles.h:117
const Vector3 & angles() const
Definition EulerAngles.h:199
EulerAngles(const Scalar &alpha, const Scalar &beta, const Scalar &gamma)
Definition EulerAngles.h:145
EulerAngles(const Scalar *data)
Definition EulerAngles.h:149
EulerAngles< NewScalarType, System > cast() const
Definition EulerAngles.h:296
AngleAxis< Scalar > AngleAxisType
Definition EulerAngles.h:118
Matrix3 toRotationMatrix() const
Definition EulerAngles.h:278
EulerAngles & operator=(const MatrixBase< Derived > &other)
Definition EulerAngles.h:247
Scalar gamma() const
Definition EulerAngles.h:214
Scalar_ Scalar
Definition EulerAngles.h:109
Scalar & beta()
Definition EulerAngles.h:211
static Vector3 BetaAxisVector()
Definition EulerAngles.h:127
Scalar beta() const
Definition EulerAngles.h:209
EulerAngles inverse() const
Definition EulerAngles.h:226
EulerAngles(const MatrixBase< Derived > &other)
Definition EulerAngles.h:164
EulerAngles operator-() const
Definition EulerAngles.h:237
Matrix< Scalar, 3, 3 > Matrix3
Definition EulerAngles.h:115
EulerAngles(const RotationBase< Derived, 3 > &rot)
Definition EulerAngles.h:180
EulerAngles & operator=(const RotationBase< Derived, 3 > &rot)
Definition EulerAngles.h:264
bool isApprox(const EulerAngles &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition EulerAngles.h:273
EulerAngles()
Definition EulerAngles.h:143
Matrix< Scalar, 3, 1 > Vector3
Definition EulerAngles.h:116
@ GammaAxisAbs
Definition EulerSystem.h:132
@ IsGammaOpposite
Definition EulerSystem.h:136
@ IsAlphaOpposite
Definition EulerSystem.h:134
@ AlphaAxisAbs
Definition EulerSystem.h:130
@ BetaAxisAbs
Definition EulerSystem.h:131
@ IsBetaOpposite
Definition EulerSystem.h:135
RotationMatrixType toRotationMatrix() const
Matrix< Scalar, 3, 1 > eulerAngles(Index a0, Index a1, Index a2) const
Matrix< Type, 3, 1 > Vector3
Namespace containing all symbols from the Eigen library.