isce3 0.25.0
Loading...
Searching...
No Matches
Quaternion.h
1#pragma once
2#define EIGEN_MPL2_ONLY
3
4#include <cmath>
5
6#include <Eigen/Dense>
7#include <Eigen/Geometry>
8
9#include <isce3/except/Error.h>
10
11#include "DenseMatrix.h"
12#include "EulerAngles.h"
13#include "Vector.h"
14
15namespace isce3 { namespace core {
16
25class Quaternion : public Eigen::Quaterniond {
26
27private:
28 using super_t = Eigen::Quaterniond;
29 using AngleAxis_t = Eigen::AngleAxisd;
30
31public:
37 Quaternion() : super_t(1, 0, 0, 0) {}
38
46 Quaternion(double w, double x, double y, double z) : super_t(w, x, y, z)
47 {
48 normalize();
49 }
50
56 explicit Quaternion(const Eigen::Vector4d& qvec)
57 : Quaternion(qvec(0), qvec(1), qvec(2), qvec(3))
58 {}
59
65 explicit Quaternion(const Eigen::Vector3d& vec)
66 : Quaternion(0.0, vec(0), vec(1), vec(2))
67 {}
68
77 Quaternion(const Eigen::Matrix3d& rotmat) : super_t(rotmat)
78 {
79 if (!rotmat.isUnitary(1e-6))
80 throw isce3::except::InvalidArgument(
81 ISCE_SRCINFO(), "Requires unitary/rotation Matrix!");
82 }
83
88 Quaternion(const Eigen::AngleAxisd& aa)
89 : super_t(AngleAxis_t(aa.angle(), aa.axis().normalized()))
90 {}
91
97 Quaternion(double angle, const Eigen::Vector3d& axis)
98 : Quaternion(AngleAxis_t(angle, axis))
99 {}
100
107 Quaternion(double yaw, double pitch, double roll)
108 : super_t((AngleAxis_t(yaw, Vec3::UnitZ()) *
109 AngleAxis_t(pitch, Vec3::UnitY()) *
110 AngleAxis_t(roll, Vec3::UnitX()))
111 .toRotationMatrix())
112 {}
113
118 explicit Quaternion(const EulerAngles& ypr);
119
124 Quaternion(const Eigen::Quaternion<double>& other) : super_t(other)
125 {
126 normalize();
127 }
128
134 Eigen::Vector3d rotate(const Eigen::Vector3d& vec) const
135 {
136 // Note in case method "_tansformVector" of Eigen Base Quaternion
137 // becomes private or deprecated, one can replace it with the
138 // following code snippet :
139 // return ((*this)*(Quaternion(vec)*(this->conjugate()))).vec();
140 return this->_transformVector(vec);
141 }
142
149 Vec3 toYPR() const;
150
156
161 Eigen::AngleAxisd toAngleAxis() const
162 {
163 double angh {std::acos(this->w())};
164 return AngleAxis_t(2.0 * angh, (1.0 / std::sin(angh)) * (this->vec()));
165 }
166};
167
168}} // namespace isce3::core
Representation of 3-2-1 Euler angle sequence of rotations.
Definition EulerAngles.h:13
Quaternion(const Eigen::Vector4d &qvec)
Constructor from Eigen 4-element unit quaternion vector.
Definition Quaternion.h:56
Quaternion(const Eigen::AngleAxisd &aa)
Constructor from an Eigen AngleAxis object.
Definition Quaternion.h:88
Quaternion(double yaw, double pitch, double roll)
Constructor from Euler Angles yaw, pitch, roll.
Definition Quaternion.h:107
Eigen::Vector3d rotate(const Eigen::Vector3d &vec) const
Rotate a 3-D vector by self quaternion object.
Definition Quaternion.h:134
Quaternion(const Eigen::Vector3d &vec)
Constructor from Eigen 3D unit vector.
Definition Quaternion.h:65
Vec3 toYPR() const
Convert quaternion to an Eigen vector of Euler angles (yaw, pitch, roll) , all in radians.
Definition Quaternion.cpp:9
Quaternion(double w, double x, double y, double z)
Constructor from qw, qx, qy, qz.
Definition Quaternion.h:46
Eigen::AngleAxisd toAngleAxis() const
Convert from Eigen Quaternion to Eigen AngleAxis object.
Definition Quaternion.h:161
Quaternion(double angle, const Eigen::Vector3d &axis)
Constructor from an angle and 3-D vector axis.
Definition Quaternion.h:97
Quaternion()
Default constructor (qw,qx,qy,qz) = (1,0,0,0) , no rotation, equivalent to 3x3 identity rotation matr...
Definition Quaternion.h:37
EulerAngles toEulerAngles() const
Build isce3 EulerAngles Object from Quaternion object.
Definition Quaternion.cpp:21
Quaternion(const Eigen::Quaternion< double > &other)
Copy constructor from other Quaternion obj.
Definition Quaternion.h:124
Quaternion(const Eigen::Matrix3d &rotmat)
Constructor from an Eigen 3D Rotation matrix Throw exception for non-uniary matrix within 1e-6 precis...
Definition Quaternion.h:77
base interpolator is an abstract base class
Definition BinarySearchFunc.cpp:5

Generated for ISCE3.0 by doxygen 1.13.2.