回転行列については以前に説明しました。繰り返しになりますが、回転の順序は重要であり、最終結果に影響します。最初に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軸の回転角度。
XX頃X軸回転ϕ \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 ( θ )0−sin ( θ )。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=qw+q×私+qはいj+qzk
その中qw 、 qx 、 qy 、 qz q_w、 q_x、 q_y、 q_zqw、q×、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} = -1私2=j2=k2=私はjkです=− 1
- i 0 = j 0 = k 0 = 1 \text{i}^0 = \text{j}^0 = \text{k}^0 = 1私0=j0=k0=1
クォータニオンは、スカラーとベクトルで構成されるとみなすこともできます。ここで、qw q_wqwクォータニオンのスカラー部分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× 1、qy1 _、q1で]) ,q 2 = ( qw 2 , [ qx 2 , qy 2 , qz 2 ] ) q_2 = (q_{w2}, [q_{x2}, q_{y2}, q_{z2}])q2=( qw2 _、[ q× 2、qy2_ _、qz2 _])として、v 1 = [ qx 1 , qy 1 , qz 1 ] v_1 = [q_{x1}, q_{y1}, q_{z1}] とします。v1=[ q× 1、qy1 _、q1で],v 2 = [ qx 2 , qy 2 , qz 2 ] v_2 = [q_{x2}, q_{y2}, q_{z2}]v2=[ q× 2、qy2_ _、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 _−v1⋅v2+qw1 _v2+qw2 _v1+v1×v2=( qw1 _qw2 _−v1⋅v2、( 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+q1で2
- 単位四元数: ∥ 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 _1∥q1∗
クォータニオンは、3 次元空間での回転を表すために一般的に使用される拡張複素数系です。
単位四元数 (長さ1 11 ) 3D 空間での回転を表現できます。点を別の位置に回転するには、クォータニオンの乗算を使用します。
XX頃X軸回転ϕ \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 (2私)、0 、罪(2私)、0 、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 (2p)、0 、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= 1−2 ( qy2+qz2)2 ( q×qはい+qwqz)2 ( q×qz−qwqはい)2 ( q×qはい−qwqz)1−2 ( qバツ2+qz2)2 ( qはいqz+qwq×)2 ( q×qz+qwqはい)2 ( qはいqz−qwq×)1−2 ( 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=( qw、q×、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 ( qwq×+qはいqz)、1−2 ( qバツ2+qy2))=arcsin ( 2 ( qwqはい−q×qz))=atan2 ( 2 ( qwqz+q×qはい)、1−2 ( 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{整列}qwq×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) となります。( qw、q×、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