海洋ロボコンをやってた人です。
あるタイミングで行列計算をサッと計算したいとき理論式や手順を都度確認したいことがあり、要所事に調べるなら自身が良く使うであろうチップスはまとめておこうと思ったことが本記事の経緯です。
対象者は行列計算の計算式一覧をサッと確認したい方とし、必要に応じてノウハウを追加していきます。
修正点等あればご遠慮なくご指摘ください。
以下箇条書きになりますが、何卒宜しくお願い致します。
1. 回転行列 (Euler angle rotation matrix)
3次元空間における回転行列の計算方法を、特にオイラー角を用いて記載します。
回転行列は、個別の回転行列 Rz,ψ, Ry,θ, Rx,ϕ を掛け合わせることで求められます。
1.1. 回転行列の定義
回転行列 Rbn は、以下のように定義されます:
Rbn=Rz,ψ⋅Ry,θ⋅Rx,ϕ
ここで:
-
ψ: Z軸周りの回転角(ヨー角)
-
θ: Y軸周りの回転角(ピッチ角)
-
ϕ: X軸周りの回転角(ロール角)
Z軸周りの回転 (Rz,ψ)
Z軸を中心に角度 ψ だけ回転する場合、回転行列は次のように表されます:
Rz,ψ=cψsψ0−sψcψ0001
Y軸周りの回転 (Ry,θ)
Y軸を中心に角度 θ だけ回転する場合、回転行列は次のように表されます:
Ry,θ=cθ0−sθ010sθ0cθ
X軸周りの回転 (Rx,ϕ)
X軸を中心に角度 ϕ だけ回転する場合、回転行列は次のように表されます:
Rx,ϕ=1000cϕsϕ0−sϕcϕ
1.2. 回転行列計算
回転行列 Rbn は、以下の順番で行列積を計算することで求められます:
Rbn=Rz,ψ⋅Ry,θ⋅Rx,ϕ
まず、Ry,θ と Rx,ϕ の積を計算します:
Ry,θ⋅Rx,ϕ=cθ0−sθsθsϕcϕcθsϕsθcϕ−sϕcθcϕ
次に、この結果と Rz,ψ を掛けます:
Rz,ψ⋅(Ry,θ⋅Rx,ϕ)=cψsψ0−sψcψ0001⋅cθ0−sθsθsϕcϕcθsϕsθcϕ−sϕcθcϕ
これを解くと、最終的に次のような回転行列が得られます:
Rbn=cψcθsψcθ−sθcψsθsϕ−sψcϕsψsθsϕ+cψcϕcθsϕcψsθcϕ+sψsϕsψsθcϕ−cψsϕcθcϕ
2.1. 同時変換行列の定義
同次変換行列は、3次元空間における位置と姿勢を表現する4×4の行列:
T=[R3×301×3p3×11]
で表せる。 ここで:
R3×3=回転行列
p3×1=位置ベクトル
である。
2.2. 同時変換行列の計算
x′y′z′1=[R3×301×3p3×11]xyz1
とし、リンク1-リンク3をもつロボットアームを考えると
リンク1(地上からL1まで):
T1=Rz(θ1)01×300L11
リンク2(L1からL2まで):
T2=Ry(θ2)01×3L2001
リンク3(L2からL3まで):
T3=Ry(θ3)01×3L3001
ベース座標系からエンドエフェクタまでの変換:
Ttotal=T1T2T3
となるので、エンドエフェクタの位置ベクトル peは
pe=xeyeze1=Ttotal0001
と表せる。
SCARA, 6DOF Robot の同時変換行列は下記参照
「Kinematic Modeling of Serial Robotic Manipulators to Automate the Packaging Process of Tuna Cans」
3. 余因子行列 (Cofactor matrix)
3×3の正方行列 Aの逆行列を求めるために利用する。
3.1. 小行列と余因子の定義
3×3の正方行列
A=a11a21a31a12a22a32a13a23a33
に対して、行列 A の逆行列 A−1 は、余因子行列 A∼ を用いて次のように計算できます:
A−1=det(A)1A∼
det(A)はサラスの定理 (Sarrus's rule)により求められます (3×3行列の場合χの書き順に沿って対角行列を加減算して求める)。
ここで余因子行列 A∼ の各要素 aij∼ は次のように計算されます:
aij∼=(−1)i+j∣Mji∣ (i,j=1,2,3)
ここで、Mji は行列 A の要素 aji に対応する j 行 i 列の要素を除いた小行列を示す。
3.2. 余因子行列の計算
まず、行列 A の各要素に対応する小行列 Mji とその行列式 ∣Mji∣ を示し、それに基づいて余因子行列 A∼ を求めます。
余因子 a11∼ は:
a11∼=(−1)1+1∣M11∣=[a22a32a23a33]=a22a33−a23a32
余因子 a12∼ は:
a12∼=(−1)1+2∣M21∣=(−1)[a12a32a13a33]=−(a12a33−a13a32)
各要素に対応する余因子を求めた結果、余因子行列 A∼ は次のようになります:
A∼=a11∼a21∼a31∼a12∼a22∼a32∼a13∼a23∼a33∼=a22a33−a23a32−(a21a33−a23a31)a21a32−a22a31−(a12a33−a13a32)a11a33−a13a31−(a11a32−a12a31)a12a23−a13a22−(a11a23−a13a21)a11a22−a12a21
4. 歪対象行列 (Skew-symmetric matrix)
正方行列をAとすると歪対象行列(わいたいしょうぎょうれつ) は以下を満たす正方行列になる。
ここで、AT は行列 A の転置を表す。
4.1. det A = 0
証明
- 行列式の性質より、転置行列の行列式は元の行列と同じ:
det(AT)=det(A)
- 定義 AT=−A より、
det(AT)=det(−A)
- 行列のスカラー倍の行列式の性質:
det(−A)=(−1)ndet(A)
- 奇数次元 (n) の場合、(−1)n=−1 なので、
det(A)=−det(A)
これより、
det(A)=0
4.2. 外積表現
3次元ベクトル a に対応する歪対称行列[a×]:
[a×]=0a3−a2−a30a1a2−a10
がベクトル b に作用すると、次を満たす:
a×b=[a×]b
歪対象行列の主体各成分aii=0である。
ベクトル積を行列形式で計算する際に有用。
例えば回転行列Rを例にとると
R˙=[ω×]R
と表せる.
https://note.com/ss_sports_lab/n/na80cd8198d22
4.3. 定義2: 外積との関連
5. D-H法 (Denavit-Hartenberg conventional technique)
リンクパラメータを用いた座標表現にDH法がある。
5.1. DH法の定義
i−1Ti(θi,di,ai,αi)=Rz(θi)⋅Tz(di)⋅Tx(ai)⋅Rx(αi)i−1Ti=cθisθi00−sθicαicθicαisαi0sθisαi−cθisαicαi0aicθiaisθidi1
θi, di, ai, αi はそれぞれ関節角度、リンクオフセット、リンク長、リンクのねじれ角を示す。
Ra(⋅) と Ta(⋅) はそれぞれaベクトルへの回転行列と同時変換行列を示す。
DHパラメータの算出は定義式に従い順にリンク座標系を移動させ定める。
- Z軸周りの回転 Rz(θi)
- Z軸方向の並進 Tz(di)
- X軸方向の並進 Tx(ai)
- X軸周りの回転 Rx(αi)
5.2. DH法の計算
ここでは「Detection of a human ready for object transfer to facilitate human-robot interaction」を参考にOpenMANIPULATOR-X のDHパラメータを求めます。
T10=cosθ1sinθ1000010sinθ1−cosθ10000d11
T21=cosθ2sinθ200−sinθ2cosθ2000010a2cosθ2a2sinθ201
T32=cosθ3sinθ300−sinθ3cosθ3000010a3cosθ3a3sinθ301
T43=cosθ4sinθ400−sinθ4cosθ4000010a4cosθ4a4sinθ401
以上より、エンドエフェクタの変換行列は以下の式で求まる:
T40=T10⋅T21⋅T32⋅T43
このときDH Parameters of OpenMANIPULATOR-X は下記で表される。
Joint |
θi(deg) |
di(m) |
ai(m) |
αi(deg) |
1 |
θ1 |
0.077 |
0 |
90 |
2 |
θ2−θ0
|
0 |
0.130 |
0 |
3 |
θ3+θ0
|
0 |
0.124 |
0 |
4 |
θ4 |
0 |
0.1216 |
0 |
また、OpenMANIPULATOR-Xの位置ベクトルは
p_{3\times1} = \begin{bmatrix}
x \\ y \\ z
\end{bmatrix} = \begin{bmatrix}
f_1(\theta_1, \theta_2, \theta_3, \theta_4) \\
f_2(\theta_1, \theta_2, \theta_3, \theta_4) \\
f_3(\theta_1, \theta_2, \theta_3, \theta_4)
\end{bmatrix} = \begin{bmatrix}
(cos(θ_1)cos(θ_2))(a_4cos(θ_3)cos(θ_4)+a_3cos(θ_3)-a_4sin(θ_3)sin(θ_4)) + ... \\
(sin(θ_1)cos(θ_2))(a_4cos(θ_3)cos(θ_4)+a_3cos(θ_3)-a_4sin(θ_3)sin(θ_4)) + ... \\
sin(θ_2)(a_4cos(θ_3)cos(θ_4)+a_3cos(θ_3)-a_4sin(θ_3)sin(θ_4)) + ...
\end{bmatrix}
と定まる。(6. ヤコビ行列で利用のため記載)
6. ヤコビ行列 (Jacobian matrix)
エンドエフェクタに作用する力 F と関節トルク \tau の関係は、ヤコビ行列の転置を用いて以下のように表される:
\tau = J(\theta)^T \cdot F
ここで J(\theta): ヤコビ行列
この式を用いることで、エンドエフェクタに必要な力 F から関節に必要なトルク \tau を計算することができる。
6.1. ヤコビ行列の定義
多変数ベクトル値関数において任意の変数について偏微分可能なとき 5. のヤコビ行列
J(\theta_1, \theta_2, \theta_3, \theta_4)は以下で表せる。
J(\theta_1, \theta_2, \theta_3, \theta_4) = \begin{bmatrix}
\frac{\partial f_1}{\partial \theta_1} & \frac{\partial f_1}{\partial \theta_2} & \frac{\partial f_1}{\partial \theta_3} & \frac{\partial f_1}{\partial \theta_4} \\
\frac{\partial f_2}{\partial \theta_1} & \frac{\partial f_2}{\partial \theta_2} & \frac{\partial f_2}{\partial \theta_3} & \frac{\partial f_2}{\partial \theta_4} \\
\frac{\partial f_3}{\partial \theta_1} & \frac{\partial f_3}{\partial \theta_2} & \frac{\partial f_3}{\partial \theta_3} & \frac{\partial f_3}{\partial \theta_4}
\end{bmatrix}
6.2. ヤコビ行列の計算
実際に 5. で求めた位置ベクトルとヤコビ行列を用いてトルクを算出する。
\begin{bmatrix}
τ_1 \\ τ_2 \\ τ_3 \\ τ_4
\end{bmatrix} = J(\theta)^T \cdot F = \begin{bmatrix}
J_{11} & J_{21} & J_{31} \\
J_{12} & J_{22} & J_{32} \\
J_{13} & J_{23} & J_{33} \\
J_{14} & J_{24} & J_{34}
\end{bmatrix} \cdot \begin{bmatrix}
F_1 \\ F_2 \\ F_3
\end{bmatrix}
展開すると
\begin{aligned}
τ_1 &= J_{11}F_1 + J_{21}F_2 + J_{31}F_3 \\
τ_2 &= J_{12}F_1 + J_{22}F_2 + J_{32}F_3 \\
τ_3 &= J_{13}F_1 + J_{23}F_2 + J_{33}F_3 \\
τ_4 &= J_{14}F_1 + J_{24}F_2 + J_{34}F_3
\end{aligned}
ここで各ヤコビ行列の要素は
\begin{aligned}
J_{11} &= \frac{\partial f_1}{\partial \theta_1} = (-\sin(\theta_1)\cos(\theta_2))(a_4\cos(\theta_3)\cos(\theta_4) + a_3\cos(\theta_3) - a_4\sin(\theta_3)\sin(\theta_4)) + \dots \\
J_{12} &= \frac{\partial f_1}{\partial \theta_2} = (\cos(\theta_1)(-\sin(\theta_2)))(a_4\cos(\theta_3)\cos(\theta_4) + a_3\cos(\theta_3) - a_4\sin(\theta_3)\sin(\theta_4)) + \dots \\
J_{21} &= \frac{\partial f_2}{\partial \theta_1} = (\cos(\theta_1)\cos(\theta_2))(a_4\cos(\theta_3)\cos(\theta_4) + a_3\cos(\theta_3) - a_4\sin(\theta_3)\sin(\theta_4)) + \dots \\
J_{22} &= \frac{\partial f_2}{\partial \theta_2} = (\sin(\theta_1)(-\sin(\theta_2)))(a_4\cos(\theta_3)\cos(\theta_4) + a_3\cos(\theta_3) - a_4\sin(\theta_3)\sin(\theta_4)) + \dots \\
J_{31} &= \frac{\partial f_3}{\partial \theta_1} = \sin(\theta_2)(a_4\cos(\theta_3)\cos(\theta_4) + a_3\cos(\theta_3) - a_4\sin(\theta_3)\sin(\theta_4)) + \dots \\
J_{32} &= \frac{\partial f_3}{\partial \theta_2} = \cos(\theta_2)(a_4\cos(\theta_3)\cos(\theta_4) + a_3\cos(\theta_3) - a_4\sin(\theta_3)\sin(\theta_4)) + \dots
\end{aligned}
と求まるので、これをコンピュータで計算すればトルクが求まる。(残りは文献参照してください。)
Appendix
A. 外積 (Cross product)
2つの3次元ベクトル \mathbf{A} = \begin{bmatrix} a_x & a_y & a_z \end{bmatrix} と \mathbf{B} = \begin{bmatrix} b_x & b_y & b_z \end{bmatrix} の外積 \mathbf{A} \times \mathbf{B} は、3次の行列式の1行目(\hat{i}, \hat{j}, \hat{k})での余因子展開の式とみなすと,次のように行列式で表される:
\mathbf{A} \times \mathbf{B} =
\begin{vmatrix}
\hat{i} & \hat{j} & \hat{k} \\
a_x & a_y & a_z \\
b_x & b_y & b_z
\end{vmatrix}
ここで、\hat{i}, \hat{j}, \hat{k} はそれぞれ x軸、y軸、z軸方向の単位ベクトル。
行列式を展開すると、次のようになります:
\mathbf{A} \times \mathbf{B} =
\hat{i} \begin{vmatrix} a_y & a_z \\ b_y & b_z \end{vmatrix}
- \hat{j} \begin{vmatrix} a_x & a_z \\ b_x & b_z \end{vmatrix}
+ \hat{k} \begin{vmatrix} a_x & a_y \\ b_x & b_y \end{vmatrix}
各小行列の行列式を計算すると:
\begin{vmatrix} a_y & a_z \\ b_y & b_z \end{vmatrix} = a_y b_z - a_z b_y
\begin{vmatrix} a_x & a_z \\ b_x & b_z \end{vmatrix} = a_x b_z - a_z b_x
\begin{vmatrix} a_x & a_y \\ b_x & b_y \end{vmatrix} = a_x b_y - a_y b_x
これを代入すると:
\mathbf{A} \times \mathbf{B} =
\hat{i}(a_y b_z - a_z b_y)
- \hat{j}(a_x b_z - a_z b_x)
+ \hat{k}(a_x b_y - a_y b_x)
外積の各成分を整理すると:
\mathbf{A} \times \mathbf{B} = \begin{bmatrix}
a_y b_z - a_z b_y \\
a_z b_x - a_x b_z \\
a_x b_y - a_y b_x
\end{bmatrix}
B. 内積 (Dot Product)
ベクトル\mathbf{a}=[a_1,a_2,a_3]^Tと\mathbf{b}=[b_1,b_2,b_3]^Tが与えられたとき、内積d=\mathbf{a}\cdot\mathbf{b}は次のように計算される:
行列(A)と(B)を以下と表すと:
A = \begin{bmatrix}
a_{x1} & a_{y1} & a_{z1} \\
a_{x2} & a_{y2} & a_{z2} \\
a_{x3} & a_{y3} & a_{z3}
\end{bmatrix},
\quad
B = \begin{bmatrix}
b_{x1} & b_{y1} & b_{z1} \\
b_{x2} & b_{y2} & b_{z2} \\
b_{x3} & b_{y3} & b_{z3}
\end{bmatrix}
行列(A)と(B)の積(C = A \cdot B)は、次のように計算される。
C = \begin{bmatrix}
c_{11} & c_{12} & c_{13} \\
c_{21} & c_{22} & c_{23} \\
c_{31} & c_{32} & c_{33}
\end{bmatrix}
各要素(c_{ij})は以下:
\begin{aligned}
c_{11} &= a_{x1}b_{x1} + a_{y1}b_{x2} + a_{z1}b_{x3}, \\
c_{12} &= a_{x1}b_{y1} + a_{y1}b_{y2} + a_{z1}b_{y3}, \\
c_{13} &= a_{x1}b_{z1} + a_{y1}b_{z2} + a_{z1}b_{z3}, \\
c_{21} &= a_{x2}b_{x1} + a_{y2}b_{x2} + a_{z2}b_{x3}, \\
\vdots & \\
c_{33} &= a_{x3}b_{z1} + a_{y3}b_{z2} + a_{z3}b_{z3}.
\end{aligned}
以上、行列計算のチップスでした。
Likeいただけると大変励みになりますので、よろしくお願いいたします。
Discussion