基礎ヤコビ行列

本稿では，ロボット運動学の基礎ヤコビ行列について解説していきます．

なお，本稿では最初から６自由度以上のロボットを想定し，手先の位置と姿勢を共に考慮します．手先の位置のみを考慮した運動学については他の記事をご覧ください．

基礎ヤコビ行列について理解するためには，まずヤコビ行列を正しく理解することが重要です．したがって，ヤコビ行列の定義から確認していきます．

# ヤコビ行列の定義

ベクトル$\boldsymbol{q}$と多変数ベクトル関数$\boldsymbol{f}(\boldsymbol{q})$を以下のように定める．

```math
\boldsymbol{q} = 
    \begin{bmatrix}
        q_1 \\
        q_2 \\
        \vdots \\
        q_n \\
    \end{bmatrix}
    \in \mathbb{R}^{n}
```
```math
\boldsymbol{f}(\boldsymbol{q}) = 
    \begin{bmatrix}
        f_1(q_1, q_2, \cdots, q_n) \\
        f_2(q_1, q_2, \cdots, q_n) \\
        \vdots \\
        f_m(q_1, q_2, \cdots, q_n) \\
    \end{bmatrix}
    \in \mathbb{R}^{m}
```
上記の多変数ベクトル関数$\boldsymbol{f}(\boldsymbol{q})$に対するヤコビ行列は，以下のように定義されている．
```math
\boldsymbol{J}(\boldsymbol{q}) 
    = \dfrac{\partial \boldsymbol{f}(\boldsymbol{q})}{\partial \boldsymbol{q}}
    =
    \begin{bmatrix}
        \dfrac{\partial f_1(\boldsymbol{q})}{\partial q_1} & \cdots & \dfrac{\partial f_1(\boldsymbol{q})}{\partial q_n} \\
        \vdots & \ddots & \vdots \\
        \dfrac{\partial f_m(\boldsymbol{q})}{\partial q_1} & \cdots &  \dfrac{\partial f_m(\boldsymbol{q})}{\partial q_n}
    \end{bmatrix}
    \in \mathbb{R}^{m \times n}
```
当然のことではあるが，上記の定義を満たすものがヤコビ行列であり，そうでないものはヤコビ行列ではない．

# ロボット運動学におけるヤコビ行列

多関節ロボットの各関節変位を$\boldsymbol{q}$とし，手先の位置を$\boldsymbol{p}(\boldsymbol{q})$，手先の姿勢を$\boldsymbol{\varphi}(\boldsymbol{q})$とすると，手先の位置・姿勢を表す多変数ベクトル関数は以下のように表される．
```math
\boldsymbol{f}(\boldsymbol{q}) = 
    \begin{bmatrix}
        \boldsymbol{p}(\boldsymbol{q}) \\
        \boldsymbol{\varphi}(\boldsymbol{q}) 
    \end{bmatrix}
    \in \mathbb{R}^{6}
```
上記の$\boldsymbol{f}(\boldsymbol{q})$をヤコビ行列の定義式に代入することで，ヤコビ行列は以下のように表される．
```math
\boldsymbol{J}(\boldsymbol{q}) 
    = \dfrac{\partial \boldsymbol{f}(\boldsymbol{q})}{\partial \boldsymbol{q}}
    \in \mathbb{R}^{6 \times n}
```
また，微分の連鎖律（チェーンルール）より，$\boldsymbol{f}(\boldsymbol{q})$の時間微分は以下のように表される．
```math
    \dfrac{{\rm d} \boldsymbol{f}(\boldsymbol{q})}{{\rm d} t} = 
    \begin{bmatrix}
        \dot{\boldsymbol{p}}(\boldsymbol{q}) \\
        \dot{\boldsymbol{\varphi}}(\boldsymbol{q}) \\
    \end{bmatrix}
    =
    \dfrac{\partial \boldsymbol{f}(\boldsymbol{q})}{\partial \boldsymbol{q}}
    \cdot
    \dfrac{\partial \boldsymbol{q}}{\partial t}
    =
    \boldsymbol{J}(\boldsymbol{q}) \, \dot{\boldsymbol{q}}
```
ここで，「手先の姿勢を$\boldsymbol{\varphi}(\boldsymbol{q})$とする」と前述したが，この$\boldsymbol{\varphi}(\boldsymbol{q})$がヤコビ行列に与える影響について正確に把握することが重要となる．$\boldsymbol{\varphi}(\boldsymbol{q})$の表現方法は複数考えられるが，それらの中で最も一般的なものはオイラー角である．しかし，オイラー角には回転軸の選び方と回転の順番に選択の余地があり，１２通りの表し方がある．そして，オイラー角の選び方が異なれば，その偏微分で得られるヤコビ行列も異なるものとなる．よって，この時点で既に１２種類のヤコビ行列が存在することになる．また，オイラー角を時間微分した値と角速度は等価ではなく，時間微分して角速度になるような（3次元の）ベクトルも存在しないことが知られている（証明は下記のサイトなどを参照されたい）．

https://physics-htfi.github.io/classical_mechanics/010.html

すなわち，どのような方法で$\boldsymbol{\varphi}(\boldsymbol{q})$を表現したとしても，$\dot{\boldsymbol{\varphi}}(\boldsymbol{q})$が角速度になることはない．さらに，偏微分で導出したヤコビ行列を用いても，静力学（ヤコビ行列の転置を用いて，手先の力とモーメントを関節のトルクに変換する計算）は成り立たない．また，$\boldsymbol{\varphi}(\boldsymbol{q})$は複雑な非線形関数であるため，$\boldsymbol{q}$で偏微分した結果を実装することは現実的には不可能なことがほとんどである（MATLABなどを用いて計算結果が得られたとしても，計算量の観点から望ましくない）．

以上より，実際のロボット制御で（本来の）ヤコビ行列が使われることは，ほとんど無いと言える．すなわち，昔から多くの人が使っているヤコビ行列という名前の行列は，ヤコビ行列ではない何かなのである．この点を考慮した一部の文献では，基礎ヤコビ行列（または幾何ヤコビ行列）という名称が用いられている．

# 基礎ヤコビ行列

手先の角速度を$\boldsymbol{\omega}(\boldsymbol{q})$としたとき，次式を満たすような行列$\boldsymbol{J}_v(\boldsymbol{q})$が基礎ヤコビ行列である．
```math
    \begin{bmatrix}
        \dot{\boldsymbol{p}}(\boldsymbol{q}) \\
        \boldsymbol{\omega}(\boldsymbol{q}) 
    \end{bmatrix}
    =
    \boldsymbol{J}_v(\boldsymbol{q}) \, \dot{\boldsymbol{q}}
```
ここで，上記の$\boldsymbol{J}_v(\boldsymbol{q})$と偏微分で求めた本来のヤコビ行列$\boldsymbol{J}(\boldsymbol{q})$は別物であることに注意しなければならない．すなわち，どのような方法で$\boldsymbol{\varphi}(\boldsymbol{q})$を表現しても，$\boldsymbol{J}_v(\boldsymbol{q})=\boldsymbol{J}(\boldsymbol{q})$が成り立つことはなく，基礎ヤコビ行列がヤコビ行列の定義を満たすこともない．オイラー角の微分値と角速度の変換をする行列$\boldsymbol{H}(\boldsymbol{q})$を用いることで
```math
    \boldsymbol{J}_v(\boldsymbol{q})=\boldsymbol{H}(\boldsymbol{q}) \, \boldsymbol{J}(\boldsymbol{q})
```
とすることは可能であるが，「基礎ヤコビ行列は，ヤコビ行列の定義を満たさない」という事実は変わらない．すなわち，基礎ヤコビ行列は単に手先と関節の速度比を表す行列であり，それ以上のことを一般性をもって言うことはできない．

# よくある誤解

以降では，基礎ヤコビ行列に対する典型的な誤解について解説する．

【誤】 基礎ヤコビ行列を用いると，ヤコビ行列の計算に必要な偏微分を省略できる．
理由：ヤコビ行列の偏微分を省略しているのではなく，そもそも求めている行列自体が異なる． 

【誤】 基礎ヤコビ行列は，複数存在するヤコビ行列のうち，手先の角速度を考慮したもの（最も基礎的なもの）であるため，基礎ヤコビ行列と言う．
理由：基礎ヤコビ行列は，ヤコビ行列の一種ではない（ヤコビ行列の定義を満たさない）．

【誤】 基礎ヤコビ行列は，近年発見された新しいヤコビ行列の計算方法である．
理由： 昔から多くの人が「ヤコビ行列」と言いながら使っていた行列は，実はヤコビ行列ではなく，最初から基礎ヤコビ行列だったのである．例えば，1987年に出版された書籍「広瀬茂男：ロボット工学-機械システムのベクトル解析-」に記載されているヤコビ行列は，基礎ヤコビ行列である（本の中ではヤコビ行列という名前で紹介されている）．

【誤】 ロボット工学では，$\boldsymbol{J}_v(\boldsymbol{q})$をヤコビ行列としてもよい．
理由：ヤコビ行列の定義を無視したトンデモ論である．定義を無視してヤコビ行列を定式化できるのであれば，回転行列や同次変換行列なども全てヤコビ行列にできることになる．

# まとめ

### ヤコビ行列のまとめ

手先の位置・姿勢を表す多変数ベクトル関数をヤコビ行列の定義に従って偏微分をすれば，理論上はヤコビ行列を求められる．しかし，以下の理由により，本来のヤコビ行列が実際のロボット制御で用いられることは稀である．
- 手先姿勢$\boldsymbol{\varphi}(\boldsymbol{q})$の表現方法がヤコビ行列の計算結果にも影響するため，少なくとも12種類のヤコビ行列が定義できてしまうこと．
- $\boldsymbol{J}(\boldsymbol{q})$の転置を用いても，静力学を計算できないこと．
- $\boldsymbol{\varphi}(\boldsymbol{q})$は複雑な非線形関数となるため，これを$\boldsymbol{q}$で偏微分することは現実的には不可能となることが多いこと．

### 基礎ヤコビ行列のまとめ

- 基礎ヤコビ行列とヤコビ行列は別物である．
- 基礎ヤコビ行列は，ヤコビ行列の定義を満たさない．すなわち，基礎ヤコビ行列はヤコビ行列の一種ではない．
- 基礎ヤコビ行列は，単に手先と関節の速度比を表す行列である．
- 実際のロボット制御で昔から使われてきたヤコビ行列（という名前の行列）は，実は最初から基礎ヤコビ行列であった．

# おわりに

本稿を作成するにあたり，手元にあったロボット工学の教科書１２冊を調査しました．そのうち９冊は手先の位置のみを考慮したヤコビ行列の解説をしており，本稿で述べた問題点には言及していませんでした．残りの３冊では，手先の位置と姿勢を考慮したヤコビ行列の導出がなされていましたが，そのうちの２冊には内容に誤りが見られました．１冊は「オイラー角の微分値を角速度と等価」とする誤りであり，もう１冊は「オイラー角の偏微分でヤコビ行列を導出した後，そのヤコビ行列を用いて静力学を計算できる」とする誤りでした．最後の１冊は内容に誤りは見られないものの，「ヤコビ行列はオイラー角の偏微分で導出することが一般的であり，基礎ヤコビ行列は補助的に使うもの」であるかのような説明になっていました．

ロボット運動学は，既に完成された学問分野であるかのように思われがちですが，今こそ「常識を疑う」姿勢が必要なのではないでしょうか．

（移動ロボットの運動学についても色々と言いたいことはありますが，本題から逸れるので筆を置きます）

# 参考文献

https://www.jstage.jst.go.jp/article/jrsj/41/2/41_41_175/_article/-char/ja/