Content deleted Content added
m v2.05b - Bot T20 CW#61 - Fix errors for CW project (Reference before punctuation) |
Link suggestions feature: 3 links added. |
||
(19 intermediate revisions by 9 users not shown) | |||
Line 1:
{{Short description|Mathematical strategy}}
{{cleanup rewrite|date=January 2024}}
[[Rotation formalisms in three dimensions|Spatial rotations in three dimensions]] can be [[Coordinate system|parametrized]] using both [[Euler angles]] and [[Quaternions and spatial rotation|unit quaternions]]. This article explains how to convert between the two representations. Actually this simple use of "quaternions" was first presented by [[Leonhard Euler|Euler]] some seventy years earlier than [[William Rowan Hamilton|Hamilton]] to solve the problem of [[magic square]]s. For this reason the dynamics community commonly refers to quaternions in this application as "Euler parameters".
==Definition==
There are [[Quaternions_and_spatial_rotation#Alternative_conventions|two representations]] of quaternions. This article uses the more popular Hamilton.
A quaternion has 4 real values: {{mvar|q<sub>w</sub>}} (the real part or the scalar part) and {{mvar|q<sub>x</sub> q<sub>y</sub> q<sub>z</sub>}} (the imaginary part).
:<math>|\mathbf{q}|^2 = q_0^2 + q_1^2 + q_2^2 + q_3^2 = q_w^2 + q_x^2 + q_y^2 + q_z^2 = 1</math>▼
Defining the [[Quaternion#Conjugation,_the_norm,_and_reciprocal|norm of the quaternion]] as follows:
▲
A ''unit quaternion'' satisfies:
<math display=block>\lVert q \rVert = 1</math>
We can associate a [[quaternion]] with a rotation around an axis by the following expression
:<math>
:<math>
:<math>
:<math>
where α is a simple rotation angle (the value in radians of the [[angle of rotation]]) and cos(β<sub>''x''</sub>), cos(β<sub>''y''</sub>) and cos(β<sub>''z''</sub>) are the "[[direction cosine]]s" of the angles between the three coordinate axes and the axis of rotation. ([[Euler's rotation theorem|Euler's Rotation Theorem]]).
==Intuition==
To better understand how "[[direction cosine]]s" work with quaternions:
:<math>\begin{array}{lcr}
If the [[axis of rotation]] is the ''x''-axis:
:<math>\begin{array}{lcr}
If the [[axis of rotation]] is the ''y''-axis:
:<math>\begin{array}{lcr}
If the [[axis of rotation]] is the ''z''-axis:
:<math>\begin{array}{lcr}
If the [[axis of rotation]] is a [[Vector_(mathematics_and_physics)|vector]] located 45° ({{sfrac|{{pi}}|4}} radians) between the ''x'' and ''y'' axes:
:<math>\begin{array}{lcr}
Therefore, the ''x'' and ''y'' axes "share" influence over the new [[axis of rotation]].
Line 63 ⟶ 70:
== Rotation matrices ==
The [[orthogonal matrix]] (post-multiplying a [[Row and column vectors|column vector]]) corresponding to a clockwise/[[Right-hand rule|left-handed]] (looking along positive axis to origin) rotation by the unit [[quaternion]] <math>q=
:<math>R = \begin{bmatrix}
1- 2(
2(
2(
\end{bmatrix}</math>
Line 74 ⟶ 81:
:<math>R = \begin{bmatrix}
2(
2(
\end{bmatrix}</math>
If <math>
The direction cosine matrix (from the rotated Body XYZ coordinates to the original Lab xyz coordinates for a clockwise/lefthand rotation) corresponding to a post-multiply '''Body 3-2-1''' sequence with [[Euler angles]] (ψ, θ, φ) is given by:<ref name=nasa-rotation>{{cite web|last=NASA Mission Planning and Analysis Division|title=Euler Angles, Quaternions, and Transformation Matrices|date=July 1977 |url=https://ntrs.nasa.gov/citations/19770024290|publisher=[[NASA]]|accessdate=24 May 2021}}</ref>
Line 166 ⟶ 173:
};
// This is not in game format, it is in mathematical format.
Quaternion ToQuaternion(double roll, double pitch, double yaw) // roll (x), pitch (
{
// Abbreviations for the various angular functions
Line 196 ⟶ 204:
\end{bmatrix} =
\begin{bmatrix}
\mbox{
- \pi/2 + 2 \, \mbox{
\mbox{
\end{bmatrix} </math>
:<math> \theta = \mbox{arcsin} (2(
=== Source code ===
Line 261 ⟶ 260:
== Vector rotation ==
Let us define scalar <math>
Note that the canonical way to rotate a three-dimensional vector <math>\vec{v}</math> by a quaternion <math>q</math> defining an [[#Conversion|Euler rotation]] is via the formula
:<math>\mathbf{
where <math>\mathbf{
:<math>\vec{t} = 2\vec{q} \times \vec{v}</math>
:<math>\vec{v}^{\,\prime} = \vec{v} +
where <math>\times</math> indicates a three-dimensional vector [[cross product]]. This involves fewer multiplications and is therefore computationally faster. Numerical tests indicate this latter approach may be up to 30% <ref>{{cite journal |pmc=4435132|year=2015|last1=Janota|first1=A|title=Improving the Precision and Speed of Euler Angles Computation from Low-Cost Rotation Sensor Data|journal=Sensors|volume=15|issue=3|pages=7016–7039|last2=Šimák|first2=V|last3=Nemec|first3=D|last4=Hrbček|first4=J|doi=10.3390/s150307016|pmid=25806874|bibcode=2015Senso..15.7016J |doi-access=free}}</ref> faster than the original for vector rotation.
=== Proof ===
Line 274 ⟶ 273:
:<math>
\begin{align}
\mathbf{
& = (
\vec{
\end{align}
</math>
Using this relation one finds for <math>\mathbf{
:<math>
\begin{align}
\mathbf{
& = (\vec{v} \cdot \vec{q},
\end{align}
</math>
Line 289 ⟶ 288:
:<math>
\begin{align}
\mathbf{q
& = (0,
\vec{q}\times(\vec{q}\times\vec{v} )) \\
\end{align}
</math>
where anti-commutivity of cross product and <math>\vec{q}\cdot \vec{v} \times \vec{q} = 0</math> has been applied. By next exploiting the property that <math>\mathbf{q}</math> is a [[#Definition|unit quaternion]] so that <math>
:<math>
\vec{q}\times(\vec{q}\times\vec{v}) = (\vec{q}\cdot\vec{v})\vec{q} - (\vec{q}\cdot\vec{q})\vec{v}
Line 301 ⟶ 300:
:<math>
\begin{align}
\mathbf{
2\vec{q}\times (\vec{q}\times\vec{v} )) \\
\end{align}
Line 307 ⟶ 306:
which upon defining <math>\vec{t} = 2\vec{q} \times \vec{v}</math> can be written in terms of scalar and vector parts as
:<math>
(0, \vec{v}^{\,\prime}) = (0, \vec{v} +
</math>
|