====== ロボットアームの運動学 ====== [[articles:robot_frame|ロボットのための座標系表現]]で述べたように ロボットの動作や作業環境を座標系を用いて記述することには様々な利点がある. そのためにはロボット自身を座標系を用いて記述する必要がある. それを扱うのがロボットアームの運動学である. ここでは特にシリアルリンクと呼ばれる構造のロボットアームに限って説明を行うが, 移動台車に搭載したアームや人間型ロボットの場合でも適切に座標系および 移動パラメタや関節パラメタとその座標系との関係を適切に設定すれば 同様な扱いが可能である. ここでは以下の3つのテーマを扱う. ; 順運動学 : ロボットの関節角度(関節パラメタ)が与えられたとき,手先の位置(および姿勢)を求める ; 逆運動学 : ロボットの手先の位置(および姿勢)が与えられたとき,それを実現する関節角度(関節パラメタ)を求める ; アームのヤコビ行列 : ロボットの関節の微小な動き(もしくは速度)とロボットの手先の位置(および姿勢)の微小な動き(もしくは速度)との局所的な線形関係の行列表現 ===== アーム構造の例 ===== まずは代表的なシリアルリンクアームの構造を示す. [{{ articles:kinematics_03.png?200 |図1 3自由度アーム}}] [{{ articles:kinematics_04.png?270 |図2 スカラ型アーム}}] [{{ articles:kinematics_05.png?320 |図3 6自由度アーム}}] [{{ articles:kinematics_06.png?330|図4 7自由度アーム}}] ;3自由度アーム : (可動範囲内で)手先を空間中の任意の位置に移動することができる. ; スカラ型アーム : 屏風型で平面上の位置を自由に移動することができる.上下の1軸,さらにはその周りのの回転軸を加えることが多く,工場内の部品のハンドリングに良く用いられる. ; 6自由度アーム : 三次元空間中で手先の位置・姿勢を自由に動かすことができる. 溶接ロボットなど先端軸周りの回転が不要な場合は省略されることも多い. ;7自由度アーム :手先の位置姿勢を固定してもひじ関節の位置を動かせる.人間の腕に近い自由度ではあるが手首の関節配置は人間とは異なる. [{{ articles:kinematics_07.png?400|図5 関節構造の記法の例}}] ロボットアームの構造を簡単に図示する際の記号の例を示す. 3つの回転関節の回転軸は左が紙面に垂直,真ん中が紙面上方向,右が紙面横方向となっている. ===== アームに座標系を設定する ===== [[articles:robot_frame#座標系がいっぱい!|ロボットのための座標系表現]]で述べたように 座標系で記述された世界の中でロボットアームを動かすためにはロボットアームの手先の座標系の 状態を知り,制御する必要がある. アームの運動学では,アームのベースから見た手先(手首やハンド)の位置・姿勢 (すなわちその座標系)とアームの関節パラメタとの関係を求めるのが主な目的となる. このとき各リンクに座標系を貼り付け,それら隣り合う座標系がそれを結び付けている 関節のパラメタにより逐次変換されることを利用することで運動学の問題を定式化することができる. [{{ articles:kinematics_08.png?200 | 図6 linkとjointの関係}}] [{{ articles:kinematics_09.png?280 | 図7 回転,並進関節の例}}] [{{ articles:kinematics_10.png?320 | 図8 シリアルリンクアームのlinkとjoint}}] 図6はアームのリンク(link)と関節(joint)の関係を示したものである. 一般的にロボットアームのリンクは剛体とみなすことができる((もちろん柔軟リンクの制御手法や研究も多数ある)). 空間の剛体の力学を考える場合には,重心を原点に,慣性主軸を座標の各軸にとると便利であることが多い. しかしロボットアームの運動学を考える場合は,前のリンクに置かれた自身を駆動する関節を考え,関節パラメタが$0$の ときに関節座標系(joint frame)と一致し,関節パラメタを変えることでリンク座標系(link frame)が変化するという モデルで考えることが多い. 図7は回転関節,並進関節を例に関節座標系に対してリンク座標系が動かされる様子を描いたものである. シリアルリンクアームは図8のようにそのような関節-リンクが直列につながったものとなる. 図7のような単一の回転もしくは並進の関節の場合,座標系の原点は駆動軸上のどこに置いても数式的には 同様に扱うことが出来る. また駆動軸は必ずしも座標系の軸のどれかに合わせる必要はないが,そうすることで座標変換行列は簡単になる. アームのリンクにこうした座標系を設定したイメージを図8に示す. 上記のような関節-リンクの関係を考えるとリンク$L_{i-1}$からリンク$L_i$への変換$^{i-1}T_i$は, リンク$L_{i-1}$から関節$J_i$の設置位置・姿勢への変換${^{i-1}T_{J_i}}$と,関節パラメタ$q_i$で動かされる部分の変換${^{J_i}T_i}(q_i)$に 分解されて以下のように書ける (( $q_i$は回転関節の場合は関節回転角度$\theta_i$,並進関節の場合は並進移動量$d_i$などである. )). $$ ^{i-1}T_i = {^{i-1}T_{J_i}}{^{J_i}T_i}(q_i) \tag{1} $$ 各リンクに張り付ける座標系の設定方法はいろいろなものがある. ここでは,直感的に理解しやすい一般的な方法と 数学的にきれいで無駄のないDH(Denavit-Hartenberg,デナビット・ハーテンバーグ)法と の二つを説明する. ==== 直感的に理解しやすい置き方 ==== この座標系の設定の仕方は厳密な規則があるわけではない. それぞれ開発者がそれぞれの方針に従って設定しているものを ざっくりと俯瞰すると以下のようになっていることが多い. * 関節軸を座標軸のどれかに一致させる. * 可能なら関節パラメタがゼロのとき座標系の姿勢がすべて同じになるようにする. * これは必須ではないが一般にはその方が分かりやすい * 逆に可動軸をz軸に限定すれば後述するDH法のように,すべての関節を同じ形で表現できるというメリットを享受することもできる.ただし分かりやすさは減る. * 関節軸が斜めについている場合は,この条件を達成することは不可能になる. 上記のように座標系を設定するとで式(1)を一つにまとめて簡略化した場合にも分かりやすい簡単な座標変換行列になる. この方法の利点は * 直感的に分かりやすいこと * 計算が簡略化できること * リンク座標系原点を分かりやすい好きな位置に配置できること である. 欠点は, * 関節パラメタで動かされる部分${^{J_i}T_i}$が関節軸ごとに変わるため計算に場合分けが必要となること * また,冗長な表現になっているため簡略化せずに計算すると無駄が多いこと * 無駄を省くための簡略化を行えばほぼDH記法と同じ程度の計算量になるが,簡略化はロボットアームごとに行う必要があること * さらに設定方法に任意性が多くどのような設定になっているかはその都度確認する必要が生じること である. 総合的には後述のDH法が優れているように見えるが,実際には直感的な分かりやすさは何物にも代えがたい.とりわけ途中のリンク座標系が意味のある場所に置けるということは,CGによる表示,動力学計算,シミュレーションなどにとっても使いやすい. 上記の理由で,実際の場面ではDH法よりも直感的に理解しやすい設定にすることが多い. この具体例は[[articles:forward_kinematics#3自由度アームの順運動学]]などの項で示す. ==== DH(Denavit-Hartenberg,デナビット・ハーテンバーグ)法 ==== DH法は,駆動軸をz軸に固定し,リンク間の変換を最小数のパラメタで表現することで座標系設定の恣意性を極力排除し 統一的な扱いを可能にするように工夫された方法である. DH法の図はいろいろなところで紹介されているのでここでは文章で表現する. 各リンクに対する座標系の取り方は以下のようになる. * それぞれのリンク$L_i$を動かす関節の回転軸もしくは並進軸を$z_i$軸にとる. * ベースから見て一つ前のリンク$L_{i-1}$の$z_{i-1}$軸とリンク$L_i$の回転軸もしくは並進軸$z_i$軸のとの距離(共通垂線の長さ)を$a_{i-1}$とする. * 共通垂線の方向を$x_{i-1}$軸とし,$z_{i-1}$軸上の垂線の足をリンク$L_{i-1}$の原点位置とする. * 2つのz軸が交差している場合は両方に垂直な方向がx軸となり$a_{i-1}=0$となる. * 2つのz軸が平行な場合は原点は$z_{i-1}$軸上の任意の位置にできる. * $z_{i-1}$と$z_i$との$x_{i-1}$軸まわりの回転角度を$\alpha_{i-1}$とする. * 共通垂線の$z_i$軸上の垂線の足からリンク$i$の原点(次のリンク$L_{i+1}$の$z_{i+1}$軸との垂線の足)との距離($z_i$の方向を考慮する)を$d_i$とする. * $x_{i-1}$と$x_i$との$z_i$軸まわりの回転角度を$\theta_i$とする. * $y_{i}$軸は$z_{i}$軸から$x_{i}$軸への右ねじの方向になる. * ベースリンク(おそらく$L_0$)にはそれを動かす関節がないので,座標系は任意に設定できる.((簡単にするなら次のリンクの関節パラメタが$0$のときに一致するように取る.そうすることでいくらか計算の省略ができるように見えるが,実際にはロボットを設置したときに据え付け位置とベースリンクとの座標変換を考える必要があることが多いので,据え付け原点に座標系を設定しても問題はない.)) 上記のように座標系を設定することでリンク$L_{i-1}$からリンク$L_i$への変換$^{i-1}T_i$は, * $x_{i-1}$方向へ$a_{i-1}$並進 * $x_{i-1}$軸周りに$\alpha_{i-1}$回転 * $z_i$軸方向へ$d_i$並進 * $z_i$軸まわりに$\theta_i$回転 の4パラメタで表現出来る. すなわち, $$ ^{i-1}T_i = \left( \begin{array}{cc} 1 & 0 & 0 & a_{i-1} \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array} \right) \left( \begin{array}{cc} 1 & 0 & 0 &0 \\ 0 & \mathrm{cos}\, \alpha_{i-1} & - \mathrm{sin}\, \alpha_{i-1} & 0\\ 0 & \mathrm{sin}\, \alpha_{i-1} & \mathrm{cos}\, \alpha_{i-1} & 0 \\ 0 & 0 & 0 & 1\end{array} \right) \left( \begin{array}{cc} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & d_i \\ 0 & 0 & 0 & 1 \end{array} \right) \left( \begin{array}{cc} \mathrm{cos}\, \theta_i & - \mathrm{sin}\, \theta_i & 0 & 0\\ \mathrm{sin}\, \theta_i & \mathrm{cos}\, \theta_i & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{array} \right) $$ $$ = \left( \begin{array}{cc} 1 & 0 & 0 &a_{i-1}\\ 0 & \mathrm{cos}\, \alpha_{i-1} & - \mathrm{sin}\, \alpha_{i-1} & 0 \\ 0 & \mathrm{sin}\, \alpha_{i-1} & \mathrm{cos}\, \alpha_{i-1} & 0 \\ 0 & 0 & 0 & 1\end{array} \right) \left( \begin{array}{cc} \mathrm{cos}\, \theta_i & - \mathrm{sin}\, \theta_i & 0 & 0 \\ \mathrm{sin}\, \theta_i & \mathrm{cos}\, \theta_i & 0 & 0 \\ 0 & 0 & 1 & d_i \\ 0 & 0 & 0 & 1 \end{array} \right) \tag{2} $$ 繰り返しに近いが各項の意味付けを説明すると, * 1項目と2項目は関節の設置に関する変換,前リンクのx軸に関する並進と回転で自身のz軸の設置位置姿勢を表し,ほぼ一意に決まる. * 3項目と4項目は自身のz軸に関する設置位置姿勢を表し,関節パラメタが$0$のときの位置姿勢(初期値)として調整可能である. * 並進関節の場合は3項目のz軸方向の並進位置$d_i$に関節パラメタが加えられる. * 回転関節の場合は4項目のz軸周りの回転角度$\theta_i$に関節パラメタが加えられる. 1項目と2項目,3項目と4項目はそれぞれ同じ軸の並進と回転なので順序は入れ替えても同じ結果になる. これをさらに計算すると, $$ ^{i-1}T_i = \left( \begin{array}{cc} \mathrm{c}(\theta_i) & -\mathrm{s}(\theta_i) & 0 &a_{i-1}\\ \mathrm{c}(\alpha_{i-1})\mathrm{s}(\theta_i) & \mathrm{c}(\alpha_{i-1})\mathrm{c}(\theta_i) & -\mathrm{s}(\alpha_{i-1}) & -\mathrm{s}(\alpha_{i-1}) d_i \\ \mathrm{s}(\alpha_{i-1})\mathrm{s}(\theta_i) & \mathrm{s}(\alpha_{i-1})\mathrm{c}(\theta_i) & \mathrm{c}(\alpha_{i-1}) & \mathrm{c}(\alpha_{i-1}) d_i \\ 0 & 0 & 0 & 1\end{array} \right) $$ となるが$\alpha_{i-1}$が$0$,$\pm{\pi/2}$,$\pi$の場合以外は簡略化につながらないのでこの形にするのは得策ではない. DH記法の利点は, * すべての関節を同じ形で表現できるということ\\ すなわち数式やプログラムで表現する際に場合分けが不要となりシンプルに表現することが可能となる. * また記述に無駄がなく計算のための簡略化がほぼ不要であること *さらに誰が設定してもほぼ同じ設定になるので紛らわしさがないこと(( $d_i$,$\theta_i$の駆動パラメタの初期値(オフセットになる)は恣意性が入る. このオフセットをゼロとすれば恣意性はなくなるがロボットの初期姿勢に無理が生じることが多い. )) である. 欠点は, * 座標系原点が必ずしも関節の物理的配置(駆動部)とは一致しないこと * さらにはそれがリンク上にあるとは限らないということ \\ そのため順運動学計算での途中で現れる各リンク座標系の位置がロボットアーム上にないなどあまり直感的でない状態が発生することがある. である.