[数学的知識] 3次元空間回転行列のオイラー角表現、四元数表現、両者間の変換、Matlabコード実装

シリアルナンバー コンテンツ
1 【数学的知識】自由度と自由度の計算方法
2 【数学的知識】剛体 剛体と剛体の運動
3 【数学的知識】剛体の基本運動、平行移動、回転
4 【数学的知識】ベクトル乗算、内積、外積、MATLABコード実装
5 [数学的知識] 最小二乗法、線形回帰から始まり、数値例を示し、最小二乗法を使用して回帰モデルを解く
6 【数学的知識】最小二乗法、一般線形状況、行列表現過程、最適パラメータ解公式過程
7 【数学的知識】共分散、確率変数の共分散、確率変数がそれぞれ単一の数値とベクトルの場合の共分散
8 【数学的知識】データの線形変換の観点から理解する特異値分解
9 [数学的知識] 回転行列の導出プロセスは、ユークリッド変換の非線形制限を解決しながら、ベクトルの回転に基づいています。
10 [数学的知識] 3次元空間回転行列のオイラー角表現、四元数表現、両者間の変換、Matlabコード実装
11 [数学的知識] 前後のモーメントにおける N>=3 点の座標が与えられたとき、剛体の並進行列と回転行列を求めます。これらの N>=3 点間の距離は常に変化せず、剛体を表します。

回転行列については以前に説明しました。繰り返しになりますが、回転の順序は重要であり、最終結果に影響します。最初にXXを回転させますX軸、 YY回転Y軸、最終回転ZZZ軸で得られる結果は、ZZ をZ軸、 YY回転Y軸、最後の回転XXX軸で得られる結果は異なります。この順序の違いにより、方向の違いや空間方向の変化が生じます。このため、実際のアプリケーションでは、正しく一貫した結果が得られるように、回転順序を明示的に指定する必要があります。

今回は、3次元空間をベースに、オイラー角表現とクォータニオン表現という回転行列の2つの表現方法と、両者の変換関係について説明します。

3 次元空間では、回転行列RRRの次元は3 × 3 3 \times 3です3×3 、行列式が1 1の直交行列です。1

1. オイラー角の表現

オイラー角は通常 3 つの角で構成されます

  • ロール角(ロール)、一般的な記号はϕ \phiϕ
  • ピッチ角 (ピッチ)、一般的な記号はθ \thetaです
  • ヨー角 (yaw)、一般的な記号はψ \psiですp

これら 3 つの角度は、それぞれX、Y、ZX、Y、Z周りの角度を表します。× やあZ軸の回転角度。

XXX軸回転ϕ \phiϕ角度の回転行列は次のとおりです。

R x ( ϕ ) = [ 1 0 0 0 cos ⁡ ( ϕ ) − sin ⁡ ( ϕ ) 0 sin ⁡ ( ϕ ) cos ⁡ ( ϕ ) ] R_x(\phi) = \left[\begin{matrix} 1 & 0 & 0 \\ 0 & \cos(\phi) & -\sin(\phi) \\ 0 & \sin(\phi) & \cos(\phi) \\ \end{行列}\right]R×( ϕ )= 1000cos ( ϕ )( ϕ )0( ϕ )cos ( ϕ )

YYY軸回転θ \theta角度θの回転行列は次のようになります。

R y ( θ ) = [ cos ⁡ ( θ ) 0 sin ⁡ ( θ ) 0 1 0 − sin ⁡ ( θ ) 0 cos ⁡ ( θ ) ] R_y(\theta) = \left[\begin{matrix} \cos (\theta) & 0 & \sin(\theta) \\ 0 & 1 & 0 \\ -\sin(\theta) & 0 & \cos(\theta) \\ end{行列}\right]Rはい()= cos ( θ )0sin ( θ )。010( θ )0cos ( θ )。

Z Z Z軸回転ψ \psiψ角度の回転行列は次のようになります。

R z ( ψ ) = [ cos ⁡ ( ψ ) − sin ⁡ ( ψ ) 0 sin ⁡ ( ψ ) cos ⁡ ( ψ ) 0 0 0 1 ] R_z(\psi) = \left[\begin{matrix} \cos (\psi) & -\sin(\psi) & 0 \\ \sin(\psi) & \cos(\psi) & 0 \\ 0 & 0 & 1 \\\end{行列}\right]Rz( p )= cos ( ψ )( ψ )0( ψ )cos ( ψ )0001

たとえば、固定軸XYZ XYZの場合X Y Zのオイラー角表現、その回転行列は次のとおりです。

R = R z ( ϕ ) R y ( θ ) R x ( ψ ) = [ cos ⁡ ( θ ) cos ⁡ ( ψ ) sin ⁡ ( ϕ ) sin ⁡ ( θ ) cos ⁡ ( ψ ) − cos ⁡ ( ϕ ) sin ⁡ ( ψ ) cos ⁡ ( ϕ ) sin ⁡ ( θ ) cos ⁡ ( ψ ) + sin ⁡ ( ϕ ) sin ⁡ ( ψ ) cos ⁡ ( θ ) sin ⁡ ( ψ ) sin ⁡ ( ϕ ) sin ⁡ ( θ ) sin ⁡ ( ψ ) + cos ⁡ ( ϕ ) cos ⁡ ( ψ ) cos ⁡ ( ϕ ) sin ⁡ ( θ ) sin ⁡ ( ψ ) − sin ⁡ ( ϕ ) cos ⁡ ( ψ ) − sin ⁡ ( θ ) sin ⁡ ( ϕ ) cos ⁡ ( θ ) cos ⁡ ( ϕ ) cos ⁡ ( θ ) ] \begin{aligned} R &= R_z(\phi) R_y(\theta) R_x(\psi) \\ &= \left[ \begin{行列} \cos(\theta)\cos(\psi) & \sin(\phi)\sin(\theta)\cos(\psi) - \cos(\phi)\sin(\psi) & \cos(\phi)\sin(\theta)\cos(\psi) + \sin(\phi)\sin(\psi) \\ \cos(\theta)\sin(\psi) & \sin(\ phi)\sin(\theta)\sin(\psi) + \cos(\phi)\cos(\psi) & \cos(\phi)\sin(\theta)\sin(\psi) - \sin( \phi)\cos(\psi) \\ -\sin(\theta) & \sin(\phi)\cos(\theta) & \cos(\phi)\cos(\theta)\\ \end{行列}\right] \end{整列}R=Rz( ϕ ) Rはい( i ) R×( p )= cos ( θ )cos ( ψ )cos ( θ )( ψ )sin ( θ )。( ϕ )( θ )cos ( ψ )cos ( ϕ )( ψ )( ϕ )( θ )( ψ )+cos ( ϕ )cos ( ψ )( ϕ )cos ( θ )。cos ( ϕ )( θ )cos ( ψ )+( ϕ )( ψ )cos ( ϕ )( θ )( ψ )( ϕ )cos ( ψ )cos ( ϕ )cos ( θ )。

この行列は、 XX付近の最初の時刻を表します。X軸回転ϕ \phiϕ角度、その後YY付近Y軸回転θ \theta角度θ 、その後ZZ付近Z軸回転ψ \psiψ角度の全体的な回転効果

オイラー角の導出と詳細については、次の記事を参照してください:第 3 章 - 数学的知識の基礎 ->ベクトルの回転に基づく座標変換と[数学的知識] 回転行列の導出プロセスユークリッド変換限界の非線形性

% 给定欧拉角 phi theta psi
phi   = deg2rad(10);  % 示例:10度,记得转换为弧度
theta = deg2rad(22);  % 示例:22度
psi   = deg2rad(35);  % 示例:35度

R_x = [ 1  0         0
        0  cos(phi) -sin(phi)
        0  sin(phi)  cos(phi)];

R_y = [ cos(theta)  0  sin(theta)
        0           1  0
       -sin(theta)  0  cos(theta)];

R_z = [ cos(psi) -sin(psi)  0
        sin(psi)  cos(psi)  0
        0         0         1];

R = R_z * R_y * R_x;

R = [cos(theta)*cos(psi)  sin(phi)*sin(theta)*cos(psi)-cos(phi)*sin(psi)  cos(phi)*sin(theta)*cos(psi)+sin(phi)*sin(psi)
     cos(theta)*sin(psi)  sin(phi)*sin(theta)*sin(psi)+cos(phi)*cos(psi)  cos(phi)*sin(theta)*sin(psi)-sin(phi)*cos(psi)
    -sin(theta)           sin(phi)*cos(theta)                             cos(phi)*cos(theta)];
R =
    0.7595   -0.5116    0.4018
    0.5318    0.8440    0.0694
   -0.3746    0.1610    0.9131

% 给定点坐标
point_1 = [ 10
            22
            35];
point_2 = R * point_1;

figure()
scatter3(point_1(1), point_1(2), point_1(3), 150, 'r'); hold on;
scatter3(point_2(1), point_2(2), point_2(3), 150, 'b');

画像の説明を追加してください


2. クォータニオン表現

クォータニオンは1 1で構成されます1実数プラス3 33 つの複素数で構成され、通常は次のように表現できます。

q = qw + qxi + qyj + qzkq = q_w + q_x \text{i} + q_y \text{j} + q_z \text{k}q=q+q×+qはいj+qzk

その中qw 、 qx 、 qy 、 qz q_w、 q_x、 q_y、 q_zqq×qはいqzこれらはすべて実数i、j、k \text{i, j, k}i、j、k はクォータニオンのプリミティブであり、以下に示す乗算関係を満たします。

  • i 2 = j 2 = k 2 = ijk = − 1 \text{i}^2 = \text{j}^2 = \text{k}^2 = \text{i}\text{j}\text{ k} = -12=j2=k2=私はjkです=1
  • i 0 = j 0 = k 0 = 1 \text{i}^0 = \text{j}^0 = \text{k}^0 = 10=j0=k0=1

クォータニオンは、スカラーとベクトルで構成されるとみなすこともできます。ここで、qw q_wqクォータニオンのスカラー部分qx 、 qy 、 qz q_x、 q_y、 q_zq×qはいqzクォータニオンのベクトル部分を構成します。


それぞれ 2 つの四元数があるとします。q 1 = ( qw 1 , [ qx 1 , qy 1 , qz 1 ] ) q_1 = (q_{w1}, [q_{x1}, q_{y1}, q_{z1} ])q1=( qw1 _[ q× 1qy1 _q1]) ,q 2 = ( qw 2 , [ qx 2 , qy 2 , qz 2 ] ) q_2 = (q_{w2}, [q_{x2}, q_{y2}, q_{z2}])q2=( qw2 _[ q× 2qy2_ _qz2 _])として、v 1 = [ qx 1 , qy 1 , qz 1 ] v_1 = [q_{x1}, q_{y1}, q_{z1}] とします。v1=[ q× 1qy1 _q1]v 2 = [ qx 2 , qy 2 , qz 2 ] v_2 = [q_{x2}, q_{y2}, q_{z2}]v2=[ q× 2qy2_ _qz2 _]の場合、次のアルゴリズムがあります

  • クォータニオンの合計: q 1 + qw 2 = ( qw 1 + qw 2 , ( v 1 + v 2 ) ) q_1 + q_2 = (q_{w1}+q_{w2}, (v_1 +v_2))q1+q2=( qw1 _+qw2 _( v1+v2))
  • 四元数乘法:q 1 q 2 = qw 1 qw 2 − v 1 ⋅ v 2 + qw 1 v 2 + qw 2 v 1 + v 1 × v 2 = ( qw 1 qw 2 − v 1 ⋅ v 2 , ( qw 1 v 2 + qw 2 v 1 + v 1 × v 2 ) ) q_1 q_2 = q_{w1} q_{w2} - v_1 \cdot v_2 + q_{w1} v_2 + q_{w2} v_1 + v_1 \times v_2 = (q_{w1} q_{w2} - v_1 \cdot v_2, (q_{w1} v_2 + q_{w2} v_1 + v_1 \times v_2))q1q2=qw1 _qw2 _v1v2+qw1 _v2+qw2 _v1+v1×v2=( qw1 _qw2 _v1v2( qw1 _v2+qw2 _v1+v1×v2))
  • クォータニオンのモジュール: ∥ q 1 ∥ = qw 1 2 + qx 1 2 + qy 1 2 + qz 1 2 \|q_1\| = \sqrt{q_{w1}^2 + q_{x1}^2 + q_ {y1 }^2 + q_{z1}^2}∥q _1=qw1 _2+q× 12+qy1 _2+q12
  • 単位四元数: ∥ q 1 ∥ = 1 \|q_1\| = 1∥q _1=1
  • クォータニオンの共役: q 1 ∗ = ( qw 1 , − v 1 ) q_1^* = (q_{w1}, -v_1)q1=( qw1 _−v _1)
  • クォータニオンの逆: q 1 − 1 = q 1 ∗ ∥ q 1 ∥ q_1^{-1} = \frac{q_1^*}{\|q_1\|}q1 1=∥q _1q1

クォータニオンは、3 次元空間での回転を表すために一般的に使用される拡張複素数系です。

単位四元数 (長さ1 11 ) 3D 空間での回転を表現できます。点を別の位置に回転するには、クォータニオンの乗算を使用します。

XXX軸回転ϕ \phi角度ϕの四元数は次のとおりです。

q ϕ = ( cos ⁡ ( ϕ 2 ) , sin ⁡ ( ϕ 2 ) , 0 , 0 ) q_\phi = (\cos(\frac{\phi}{2} ), \sin(\frac{\phi} {2})、0、0)qϕ=( cos (2ϕ2ϕ0 0 )

YYY軸回転θ \theta角度θの四元数は次のようになります。

q θ = (cos ⁡ (θ 2), 0, sin ⁡ (θ 2), 0, 0) q_\theta = (\cos(\frac{\theta}{2}), 0, \sin(\frac {\theta}{2})、0、0)q=( cos (20 20 0 )

Z Z Z軸回転ψ \psiψ角度の四元数は次

q ψ = ( cos ⁡ ( ψ 2 ) , 0 , 0 , sin ⁡ ( ψ 2 ) ) q_\psi = (\cos(\frac{\psi}{2}), 0, 0, \sin(\frac) {\psi}{2}))qp=( cos (2p0 0 2p))

回転された四元数の合計は、これら 3 つの四元数の積です。クォータニオン乗算は通常のスカラー乗算ではなく、特定の乗算ルールがあります。

クォータニオンqqが与えられると、q (モジュールの長さは 1 で、qw 2 + qx 2 + qy 2 + qz 2 = 1 \sqrt{q_w^2+q_x^2+q_y^2+q_z^2}=1 の関係があります)qw2+qバツ2+qy2+qz2 =1 ) 採用された回転順序がXYZ XYZX Y Z、それに対応する回転行列RRR は次のように表すことができます。

R = [ 1 − 2 ( qy 2 + qz 2 ) 2 ( qxqy − qwqz ) 2 ( qxqz + qwqy ) 2 ( qxqy + qwqz ) 1 − 2 ( qx 2 + qz 2 ) 2 ( qyqz − qwqx ) 2 ( qxqz − qwqy ) 2 ( qyqz + qwqx ) 1 − 2 ( qx 2 + qy 2 ) ] \begin{aligned} R &= \left[\begin{matrix} 1 - 2(q_y^2 + q_z^2) & 2 (q_x q_y - q_w q_z) & 2(q_x q_z + q_w q_y) \\ 2(q_x q_y + q_w q_z) & 1 - 2(q_x^2 + q_z^2) & 2(q_y q_z - q_w q_x) \\ 2(q_x q_z - q_w q_y) & 2(q_y q_z + q_w q_x) & 1 - 2(q_x^2 + q_y^2) \\ \end{行列}\right] \end{aligned}R= 12 ( qy2+qz2)2 ( q×qはい+qqz)2 ( q×qzqqはい)2 ( q×qはいqqz)12 ( qバツ2+qz2)2 ( qはいqz+qq×)2 ( q×qz+qqはい)2 ( qはいqzqq×)12 ( qバツ2+qy2)

単位四元数には、3D 回転を記述するときにいくつかの利点があり、オイラー角の「ジンバル ロック」問題の影響を受けません。

% 给定四元数
quaternion = [0.9376  0.0244  0.2070  0.2782];  

q_w = quaternion(1);
q_x = quaternion(2);
q_y = quaternion(3);
q_z = quaternion(4);

% 计算旋转矩阵 R
R(1,1) = 1 - 2*(q_y^2 + q_z^2);
R(1,2) = 2*(q_x*q_y - q_w*q_z);
R(1,3) = 2*(q_x*q_z + q_w*q_y);
R(2,1) = 2*(q_x*q_y + q_w*q_z);
R(2,2) = 1 - 2*(q_x^2 + q_z^2);
R(2,3) = 2*(q_y*q_z - q_w*q_x);
R(3,1) = 2*(q_x*q_z - q_w*q_y);
R(3,2) = 2*(q_y*q_z + q_w*q_x);
R(3,3) = 1 - 2*(q_x^2 + q_y^2);
R =
    0.7595   -0.5116    0.4017
    0.5318    0.8440    0.0694
   -0.3746    0.1609    0.9131

3. クォータニオンをオイラー角に変換する

特定の回転ではオイラー角の表現が複数あるため、クォータニオンからオイラー角への変換は一意ではありません。ただし、ほとんどの実際的なアプリケーションでは、特定のオイラー角のセットを特定の四元数から計算できます。

q = ( qw , qx , qy , qz ) q = ( q_w , q_x , q_y , q_z ) を構築します。q=( qq×qはいqz) 、 XYZ XYZに変換したい場合X Y Z( ϕ , θ , ψ ) (\phi, \theta, \psi)( ϕ ,ψ )クォータニオンからオイラー角に変換する方法は次のとおりです。

ϕ = atan2 ( 2 ( qwqx + qyqz ) , 1 − 2 ( qx 2 + qy 2 ) ) θ = arcsin ⁡ ( 2 ( qwqy − qxqz ) ) ψ = atan2 ( 2 ( qwqz + qxqy ) , 1 − 2 ( qy 2 + qz 2 ) ) \begin{aligned} \phi &= \text{atan2} (2(q_w q_x + q_y q_z), 1-2(q_x^2 + q_y^2)) \\ \theta &= \ text{} \arcsin (2(q_w q_y - q_x q_z)) \\ \psi&= \text{atan2} (2(q_w q_z + q_x q_y), 1-2(q_y^2 + q_z^2)) \end {整列}ϕp=atan2 ( 2 ( qq×+qはいqz12 ( qバツ2+qy2))=arcsin ( 2 ( qqはいq×qz))=atan2 ( 2 ( qqz+q×qはい12 ( qy2+qz2) )

ここで、atan2 ( ) \text{atan2}()atan2 ( ) はarctanではありません⁡ ( ) \arctan()アークタン( )

たとえば、arctan ⁡ ( y / x ) \arctan(y/x) を使用すると、arctan ( y / x )、その戻り値は[ − π / 2 , π / 2 ] [-\pi/2, \pi/2][ π /2 ,π /2 ] 、 xxを区別できないためxの正の値と負の値。そしてatan2 ( y , x ) \text{atan2}(y, x)atan2 ( y ,x )、その戻り値は[ − π , π ] [-\pi, \pi][ π ,π ] 、 xxを区別できますxの符号なので、特にオイラー角を計算する場合に、より実用的です。さらに重要なのは、atan2 ( y , x ) \text{atan2}(y, x) です。atan2 ( y ,x )はx = 0 x=0を処理できますバツ=0。角度またはオイラー角を計算する場合に便利です。

arcsin ⁡ ( ) \arcsin()を使用しているため、注意してください。arcsin(),当 θ \theta θは±90°に近い\pm 90\degree± 90°では、数値が不安定になる可能性があります。これは、このような極端なケースでは、ヘディングとロールが区別できなくなるためであり、これはジンバル ロック問題として知られています。

% 给定四元数
quaternion = [0.9376  0.0244  0.2070  0.2782];  

q_w = quaternion(1);
q_x = quaternion(2);
q_y = quaternion(3);
q_z = quaternion(4);

% 转换四元数到欧拉角
phi   = atan2(2*(q_w*q_x + q_y*q_z), 1 - 2*(q_x^2 + q_y^2));
theta = asin(2*(q_w*q_y - q_z*q_x));
psi   = atan2(2*(q_w*q_z + q_x*q_y), 1 - 2*(q_y^2 + q_z^2));

% 如果需要角度形式而不是弧度,可以转换为度
phi_deg   = rad2deg(phi);
theta_deg = rad2deg(theta);
psi_deg   = rad2deg(psi);
phi_deg =
    9.9953

theta_deg =
   21.9990

psi_deg =
   34.9983

4. オイラー角を四元数に変換する

3 つのオイラー角ϕ 、 θ 、 ψ \phi、 \theta、 \psi が与えられるとします。ϕ ψ、対応する四元数は次のとおりです。

qw = cos ⁡ ( ϕ 2 ) cos ⁡ ( θ 2 ) cos ⁡ ( ψ 2 ) + sin ⁡ ( ϕ 2 ) sin ⁡ ( θ 2 ) sin ⁡ ( ψ 2 ) qx = sin ⁡ ( ϕ 2 ) cos ⁡ ( θ 2 ) cos ⁡ ( ψ 2 ) − cos ⁡ ( ϕ 2 ) sin ⁡ ( θ 2 ) sin ⁡ ( ψ 2 ) qy = cos ⁡ ( ψ 2 ) sin ⁡ ( θ 2 ) cos ⁡ ( ψ 2 ) + sin ⁡ ( ϕ 2 ) cos ⁡ ( θ 2 ) sin ⁡ ( ψ 2 ) qz = cos ⁡ ( ϕ 2 ) cos ⁡ ( θ 2 ) sin ⁡ ( ψ 2 ) − sin ⁡ ( ϕ 2 ) sin ⁡ ( θ 2 ) cos ⁡ ( ψ 2 ) \begin{aligned} q_w &= \cos(\frac{\phi}{2}) \cos(\frac{\theta}{2}) \cos(\frac{\psi}{ 2}) + \sin(\frac{\phi}{2}) \sin(\frac{\theta}{2}) \sin(\frac{\psi}{2}) \\ q_x &= \sin (\frac{\phi}{2}) \cos(\frac{\theta}{2}) \cos(\frac{\psi}{2}) - \cos(\frac{\phi}{2} ) \sin(\frac{\theta}{2}) \sin(\frac{\psi}{2}) \\ q_y &= \cos(\frac{\phi}{2}) \sin(\frac {\theta}{2}) \cos(\frac{\psi}{2}) + \sin(\frac{\phi}{2}) \cos(\frac{\theta}{2}) \sin (\frac{\psi}{2}) \\ q_z &= \cos(\frac{\phi}{2})\cos(\frac{\theta}{2}) \sin(\frac{\psi}{2}) - \sin(\frac{\phi}{2}) \sin(\frac{\theta}{ 2}) \cos(\frac{\psi}{2}) \end{整列}qq×qはいqz=cos (2ϕ)cos (2)cos (2p)+2ϕ)2)2p)=2ϕ)cos (2)cos (2p)cos (2ϕ)2)2p)=cos (2ϕ)2)cos (2p)+2ϕ)cos (2)2p)=cos (2ϕ)cos (2)2p)2ϕ)2)cos (2p)

結果の四元数は( qw , qx , qy , qz ) (q_w, q_x, q_y, q_z) となります。( qq×qはいqz

phi   = deg2rad(10);  % 示例:10度,记得转换为弧度
theta = deg2rad(22);  % 示例:22度
psi   = deg2rad(35);  % 示例:35度

% 计算四元数
q_w = cos(phi/2) * cos(theta/2) * cos(psi/2) + sin(phi/2) * sin(theta/2) * sin(psi/2);
q_x = sin(phi/2) * cos(theta/2) * cos(psi/2) - cos(phi/2) * sin(theta/2) * sin(psi/2);
q_y = cos(phi/2) * sin(theta/2) * cos(psi/2) + sin(phi/2) * cos(theta/2) * sin(psi/2);
q_z = cos(phi/2) * cos(theta/2) * sin(psi/2) - sin(phi/2) * sin(theta/2) * cos(psi/2);

quaternion = [q_w, q_x, q_y, q_z];
quaternion =
    0.9376    0.0244    0.2070    0.2782

参照

  1. 回転行列 - ウィキペディア
  2. 役立つ情報のコレクション: オイラー角、回転行列、四元数

おすすめ

転載: blog.csdn.net/weixin_36815313/article/details/132286733