12 #include <mrpt/config.h> 34 q.rotationMatrixNoResize(
R);
52 tang2mat_jacob J = tang2mat_jacob::Zero();
53 J(1, 2) = J(5, 0) = J(6, 1) = +1.0;
54 J(2, 1) = J(3, 2) = J(7, 0) = -1.0;
74 const auto squared_n = q.
x() * q.
x() + q.
y() * q.
y() + q.
z() * q.
z();
75 const auto n = sqrt(squared_n);
78 double two_atan_nbyw_by_n;
91 ASSERTMSG_(std::abs(w) >= 1e-7,
"Quaternion should be normalized!");
92 two_atan_nbyw_by_n = 2.0 / w - 2.0 * (squared_n) / (w * w * w);
96 if (std::abs(w) < 1e-7)
99 two_atan_nbyw_by_n =
M_PI / n;
101 two_atan_nbyw_by_n = -
M_PI / n;
105 two_atan_nbyw_by_n = 2.0 * atan(n / w) / n;
110 ret[0] = two_atan_nbyw_by_n * q.
x();
111 ret[1] = two_atan_nbyw_by_n * q.
y();
112 ret[2] = two_atan_nbyw_by_n * q.
z();
118 const double yaw,
const double pitch,
const double roll)
122 ::sincos(yaw, &sy, &cy);
124 ::sincos(
pitch, &sp, &cp);
126 ::sincos(
roll, &sr, &cr);
128 const double cy = cos(yaw);
129 const double sy = sin(yaw);
130 const double cp = cos(
pitch);
131 const double sp = sin(
pitch);
132 const double cr = cos(
roll);
133 const double sr = sin(
roll);
137 alignas(MRPT_MAX_STATIC_ALIGN_BYTES)
const double rot_vals[] = {
138 cy * cp, cy * sp * sr - sy * cr, cy * sp * cr + sy * sr,
139 sy * cp, sy * sp * sr + cy * cr, sy * sp * cr - cy * sr,
140 -sp, cp * sr, cp * cr
144 R.loadFromArray(rot_vals);
148 template <
typename VEC3,
typename MAT3x3,
typename MAT3x9>
149 inline void M3x9(
const VEC3& a,
const MAT3x3& B, MAT3x9& RES)
152 alignas(MRPT_MAX_STATIC_ALIGN_BYTES)
const double vals[] = {
153 a[0], -B(0, 2), B(0, 1), B(0, 2), a[0], -B(0, 0), -B(0, 1), B(0, 0), a[0],
154 a[1], -B(1, 2), B(1, 1), B(1, 2), a[1], -B(1, 0), -B(1, 1), B(1, 0), a[1],
155 a[2], -B(2, 2), B(2, 1), B(2, 2), a[2], -B(2, 0), -B(2, 1), B(2, 0), a[2]
158 RES.loadFromArray(vals);
165 const double d = 0.5 * (
R(0, 0) +
R(1, 1) +
R(2, 2) - 1);
170 a[0] = a[1] = a[2] = 0;
175 const double theta = acos(d);
176 const double d2 =
square(d);
177 const double sq = std::sqrt(1 - d2);
179 a *= (d * theta - sq) / (4 * (sq * sq * sq));
190 v[0] =
R(2, 1) -
R(1, 2);
191 v[1] =
R(0, 2) -
R(2, 0);
192 v[2] =
R(1, 0) -
R(0, 1);
A compile-time fixed-size numeric matrix container.
T y() const
Return y coordinate of the quaternion.
void getAsQuaternion(mrpt::math::CQuaternionDouble &q, mrpt::optional_ref< mrpt::math::CMatrixDouble43 > out_dq_dr=std::nullopt) const
Returns the quaternion associated to the rotation of this object (NOTE: XYZ translation is ignored) ...
This base provides a set of functions for maths stuff.
T r() const
Return r (real part) coordinate of the quaternion.
#define ASSERTMSG_(f, __ERROR_MSG)
Defines an assertion mechanism.
T wrapToPi(T a)
Modifies the given angle to translate it into the ]-pi,pi] range.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
return_t square(const num_t x)
Inline function for the square of a number.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
T x() const
Return x coordinate of the quaternion.
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void M3x9(const VEC3 &a, const MAT3x3 &B, MAT3x9 &RES)
A quaternion, which can represent a 3D rotation as pair , with a real part "r" and a 3D vector ...
Traits for SO(n), rotations in R^n space.
T z() const
Return z coordinate of the quaternion.
void setDiagonal(const std::size_t N, const T value)
Resize to NxN, set all entries to zero, except the main diagonal which is set to value ...
void fromRodriguesVector(const ARRAYLIKE3 &v)
Set this quaternion to the rotation described by a 3D (Rodrigues) rotation vector : If ...