ここでは、マニピュレータを数式化して解析するに辺り、座標系を設定し、各関節を動かすと手先はどう動くか、逆に手先の目標を設定したときに各関節をどうしたらいいかについて検討します。
座標変換で一通りやった座標変換の理論をばんばん使いますので、少しでも座標変換に行き詰まったらすぐに復習するようにしてください。
![]() |
![]() |
回転関節 | |
![]() |
![]() |
直動関節 | |
![]() |
![]() |
![]() | |
ボールジョイント |
さて、実際にロボットの機構を単純に書くために、各関節を記号化します。
3次元のロボットを2次元で書くため、いくつかの書き方があります。
それらを右の図に合わせて示しました。
回転関節については、一番上は紙面に垂直なもの、二番目と三番目は紙面上に軸がある場合です。二番目と三番目は同じ回転を表しますが、本によって違ったり、前者は構造的に腕の途中にある関節(ねじれる関節)、後者は屈曲する関節として書分けている場合もあるようです。
スライドについては、一番上をよく見掛けますが、二番目、三番目もあります。三番目は伸縮を表します。
ボールジョイントについては、そのまんまです。書くのが面倒だと、下の図のように二重丸にすることもあります。なお、この図では大きめに書いてありますが、ボールジョイントは駆動のない補助的な関節であることが多いため、回転などより小さめに書いた方が見やすくなります。
なお、これらの表記は平面で書く場合の表記法です。立体感を得やすいように鳥瞰図のように斜め方向から見た図などでは、これらの記号を使うこともありますし、円筒で回転関節を表すこともあります。 いずれにせよ、見せたい相手と、書いた本人が、ちゃんとわかるように統一して書きましょう。
![]() | ![]() |
このような図を書く場合に注意すべき点は、なるべく実態を表すようにすることです。
関節の数と順序があっているのは当然として、関節の軸間の関係がわかるようにすることが重要です。
たとえば、これらの図では、複数の回転関節の複合である股関節や足首関節などを記述するため、
各回転関節の軸が一点で交わることを明記しています。
ちなみに、このように回転軸をクロスさせると後述の座標変換や運動学の演算式が簡素化します。
ただし、実際にこのようなメカを設計製作することは容易ではありません。
ここで紹介する方法は「修正 Denavit-Hartenbergの記法」と呼ばれ、ロボット関係の教科書ではよく載っている方法です。 論文でもDHパラメータと表がのっているだけで終わることもあります。
まず、ロボットの各リンクごとに座標軸を設定します。リンクや座標軸の番号は以下のように定義します。
次に座標系を各リンクごとに設定します。リンク i には、座標系 i を固定します。
座標系は次のように設定します。
![]() |
リンク |
![]() |
座標系の設定 |
![]() |
![]() |
![]() |
リンクパラメータ |
Zi-1, Ziの座標軸は上の規定通り、回転軸に設定します(ぞれぞれ、左の黄色線とオレンジの線)。 次に、Xi-1軸ですが、上から三番目の図に赤で書いたように、2本の回転軸の両者に垂直な線を見つけて、そこに設定します。 2本の軸が平行な場合は、そういう線は無数にありますが、それ以外の場合は、必ず一本のそういう線が存在します(別の見方をすれば、2本の線を最短距離で結ぶ線です)。 あとは、Yi-1は自動的に決まります。 ちなみに、Xi, Yiについては次のリンクの形に依存するので、ここでは想像して適当にきめてあります。また、関節iは適当な角度にまがっています。
さて、この場合の、座標系i-1から座標系iまでの、同次変換行列を求めてみます。 座標系i-1から座標系iまでは、次の4つの変換を組み合わせることでたどれます。
最終的に、これらを順に掛け合わせて、座標系i-1から座標系iに至る同次変換行列を得ます。
この表記法は、リンクを、となりのリンクとの関係も含めて、四つのパラメータ a,α,d,θで表す方法です。
同次変換行列は12個の有効な要素がありますが、それを4パラメータで済ませることができます。
また、上式は一見するとややこしいのですが、実際にはそれぞれの値が単純になります。
また、これまでの内容に従って、
となります。
リンクiの座標系i上で規定された点、例えば腕上の特定の点を、基準座標系でどこに見えるかをこの同次変換で知ることができます。
![]() | ||
![]() | ||
座標系の設定 | ||
![]() | ||
![]() | ||
![]() | ||
各部のパラメータ | ||
![]() |
![]() |
![]() |
ロボット動作アニメ, 320x240 (2018/04/17, 605,561 bytes) ロボット動作アニメ, 640x480 (2018/04/17, 1,645,561 bytes) |
このロボットは2個の回転関節と直動関節からなるロボットです。 動作形態としては、根本側の回転関節1・2によって、手先の水平面内での位置を決め、直動関節3によって手先を上下させることで、手先でものを搬送できます。 ただし、3次元空間で位置、姿勢をすべて決定づけるには独立した6関節(6自由度)必要であるの対して3関節しかないため、手先の位置をきめることしかできません。 姿勢はそれに連動します(手先の鉛直軸まわりの姿勢は関節1・2で決まり、手先を鉛直から傾けることはできない)。
まず、座標軸を設定します。基本的には上で示した方針で、あとは分かりやすくなるように設定します。
ちなみに、教科書にも準拠していますが、Y軸の向きが一部異なります(教科書の図は右手系と左手系がごっちゃのため、右手に統一した)。
リンク番号は根本からつけますので、土台(紫)を0、上腕(橙)を1、下腕(緑)を2、手先(黄)を3とします。
Z軸は関節軸(回転軸or直動軸)にとり、X軸はZ軸の共通垂線にとります。
ここで、このロボットはすべてのZ軸が平行なので、Xはどこにとっても構いませんが、機構にあわせて、X1とX2は同一平面で土台と上腕の接合面におきました。
X3はX2と平行になるように、X0は関節角度が0(基準位置)となるときにX1と平行になるように設定しました。
なお、上述の設定では、座標系0は関節が基準位置のときに座標系1に一致するようにというガイドラインがありますが、ここではロボットの基準面に取ったほうがあとが楽そうなので、座標系0は1を土台の面まで平行移動したところにしました。
座標系が決まりましたので、DHのパラメータ出しを行います。 各リンクごとに
リンク | a | α | d | θ |
1 | 0 | 0 | d1 | θ1 |
2 | a2 | 0 | 0 | θ2 |
3 | a3 | π | d3 | 0 |
以上をもとに、同次変換行列を求めます。
よって、土台の座標系0からみた手先3の座標系の変換は
となります。
なお、この程度の機構の場合、わざわざこのDHの方法をしなくても、高校並の方法でも簡単に求まります。
それと比較してみるとよいでしょう。
ロボットを数式化する大きな目的のひとつは、ロボットを制御するに当たって、関節をどう動かしたらいいかを決定することです。 ロボットで、あるところにあるものをピックアップして、別のところに運ぶという仕事を行いたいとき(工場の製造ラインなどでありがち)、まずそれぞれの場所に手先を持っていくために各関節をどれだけ変位させればいいかを求める必要があります。一方で、現在の関節変位から手先の位置を知り、そのあとの軌道を計画したり、制御の情報にしたりすることも必要です。これらを運動学と言います。
一般的にみられる(上の図のような)直列リンク型の機構では順運動学が(めんどうながらも)単純に求められ、逆運動学は簡単には求められないか、数式として得られない場合があります。
一方、並列リンク型の機構では逆運動学は単純に得られるものの、順運動学が得られない場合があります。
以下では上のロボットを例に解いてみますが、その過程に注意してみてください。
2脚ロボットのような複雑な機構の場合にも、股関節のような複合関節で回転軸が一点で交わるようにすると解きやすくなることが、わかると思います。
前節で出てきたロボットを例に逆運動学を解いてみます。
関節変位は
で、手先についてはその位置だけに着目して、座標系3の原点とします。
順運動学はすでにもとまっていて、
です。
逆運動学はこれをθ1, θ2, d3について解きます。まず、あからさまに、
です。残りは幾何学的にみてみます。
ロボットを上方からみた図を右のように表します。ここで、手先が座標(r1,r2)に来るためには、(届くなら)関節2の位置が二通りになります。
手先の位置を別の見方で表すと、
となります。また、余弦定理より
が成り立ちます。よって、
と求められます。また、
よりθ1も求まります。
※教科書の式とかなりちがいますが、cos-1を使うかtan-1を使うかの違いです。数値計算で検算してみると、教科書のθ2の式は、ちょっと怪しげな気が。θ1=φ─θ2という時点で怪しい気が。
以上のように、このくらいの場合には解くことはできますが、複雑になってくると数式では解けなくなってきます。 そのような場合には、数値計算によって解を得ることができます。具体的には
ここでは、今後の応用も考えて、ヤコビ行列を求めてみます。
すでに順運動学が直接的な式で求まっている場合は、それを直接微分すればヤコビ行列が得られます。
まず、運動学の式は先ほどの通り
です。よって定義通りに計算すると、
となります。
上の方法では、 r をちゃんと計算しないとヤコビ行列は求まりません。 ここの例の3自由度程度であれば求めることはたいしたことはありませんが、ありがちな6自由度の場合は一般にはかなり悲惨な式になります。 そこで、発想を転換して、部分部分で求める方法が考案されています。
ヤコビ行列を分解した列ベクトル
は、ある関節を動かした影響が手先座標 r にどれだけ出るか、を示したものと解釈できます(偏微分=ある変数が式に与える影響)。
そのため、当然ながらロボットの状態の影響を受ける値を持ちますが、ロボットの現在の姿勢があれば、関節一個を動かしたときの影響は、簡単に求められそうです。
こまかなところは剛体の力学の勉強し直しが必要になりそうなので、概念だけ以下に示します。
すでに出ているヤコビ行列
は、微少な関節の変位と、手先の変位の関係として
が成り立ちます。
両辺をその変位にかかった時間δtで割って、それを0への極限をとると、微分形式の
となります。つまり、ヤコビ行列は、関節の速度を手先の速度に変換する行列としてもつかえます。これは速度の順運動学です。
もし、ロボットがある姿勢の時にヤコビ行列に逆行列があれば、
となり、「手先の速度から関節速度」がもとまります。つまり、手先の速度をきめてやれば、それを実現するための関節の速度が得られるわけです。これは速度の逆運動学です。
ちなみに、これは直列リンクなマニピュレータの場合で、位置の逆運動学がもとまるけど順運動学が求まらないようなパラレルリンクのマニピュレータの場合、立場が逆になります。
速度の逆運動学を得られる条件として、ヤコビ行列の逆行列があることがありました。 ある行列に逆行列があるためには、
では、行列式がゼロになるということはどういうことかと考えます。
すでに求めているロボットのヤコビ行列
より、行列式を求めると、
となります。
この式において、ロボットの構造上 a が0になることは想定されませんが、sin(θ2)=0は状況としてあり得ます。
sin(θ2)=0は2つ目の関節が真っ直ぐに伸びた状態か(θ2=0)、もしくは完全に折り畳まれた状態(θ2=π)です(後者はロボットの作りによっては無理)。
このとき、行列式が求められなくなり、速度の逆運動学が成り立たないことになります。
実際のロボットの上で、この行列式=0の意味を考えてみましょう。このロボットに限らず、人間の肘や膝を考えてもわかりますが、関節が真っ直ぐになった状態では、当然ながらそれ以上は手先を遠ざけることはできません。 手や足の場合、手首足首の関節で、位置だけならより遠くに持っていくことが出来る場合もありますが、姿勢が変わってしまいます。 それとは反対に、縮めようとすると関節を急速に曲げなければなりません(数学上はそれすら出来ないことになっている)。
このような状態を特異点、そのときのロボットの姿勢を特異姿勢といいます。機構の面からは死点ともいいます(自動車のエンジンなどでも使う)。
この特異点では、特定の方向への運動が出来なくなっています。また、特異姿勢のそばでは、ちょっとの動きをするために、関節を極端に高速に動かす必要があります。
(肘を伸ばした状態から、手首を1センチほど肩に近づけてみてください。肘関節の角度が急に大きくなることがわかります。一方、肘関節が大きく曲がった状態で手首を近づける場合はあまり動きません。)
そのため、マニピュレータに任意の作業をさせる場合は、マニピュレータの運動範囲を制限して特異姿勢に近づかないようにしなければなりません。
実際の例としては、最近みられる歩行ロボットがことごとく膝関節をある程度まげた状態で歩いているのも、一般には膝関節の特異点を避けるためです。膝関節を多少曲げておくと、膝関節を真っ直ぐに伸ばしたときに比べて関節にかかる力が大きくなります。
その観点からは伸ばしておいた方よく、人間が歩くときは膝を真っ直ぐして着地します。
しかし、歩行ロボットの制御分野ではそこまで進んでいないということになります。
世の2脚歩行ロボットは一般に脚には6自由度を持たせています。
これは足の位置と姿勢を制御するという観点でぴったりの数字です。
それに対して、一部の腕ロボットは7自由度をもっていて余分です。
これは人間の腕を単純化したときにでてくる形です。
(肩3自由度、肘1自由度、下腕のねじれ1自由度、手首2自由度)
これは手先の位置と姿勢を決めても1自由度余ることを意味し、作業する際に腕の位置をある程度選べることになります。
ところが、この1自由度余る分を何らかの形で決めなければなりません。
ほかの制約があるときは、それを組み込むことになりますが、そうでないときは逆運動学も求められずに、関節が一個余分なだけでやっかいなことになります。
そこで考案されたのが「疑似逆行列」です。
文字通り、「疑似」的に「逆行列」相当の働きをするようにしたものです。
疑似逆行列は
で与えられます。
ちなみに、加えられた1自由度分の制約は「全関節の動きをなるべく押さえる」という意味で、
が最小
という条件です。この時、
で速度の逆運動学が得られます。
多自由度のマニピュレータを設計するに当たっては、目的の動作ができるか(可動範囲など)に加えて、数式の上である程度単純になるようにしたほうがよいと言えます。 そうすることで、運動学、逆運動学が単純になるほか、設計時のミスや混乱を防ぎやすくなります。 運動学、逆運動学はいまどきのコンピュータの性能をもってすれば、いちいち解析的に(数式として)求めずとも数値計算で間に合わせることはできますが、単純なのに越したことはありません。 ある程度単純であれば、数式を無理やり解くのではなく、上の例のように幾何学的に処理することもできます。 そもそも、ロボットの動かし方を考え、設計して動作を決めるのは人間であり、頭の中でイメージがわかないようだといい設計はできないと思われます。
これまでたびたび、「多自由度関節は軸を直交させた方がいい」と述べてきたのは、この観点によるものです。
たとえば、6自由度の腕ロボットを設計するとき、手首に3自由度を配置し(ロボットアームの先端に近いところに回転軸を寄せる)の関節を一点で交わるように、さらに肩の関節を2自由度にして1点で軸が交わるように設計したとします。
(3軸は工夫が必要ですが2軸は案外簡単)
このとき、ロボットの逆運動学は6個もθが入った三角関数ごちゃごちゃの式を解くことになりますが、これを直接解かずに、以下のような手順で各関節の角度を決められます。
これまでの数学的な話では、複数の同次変換行列が求まったときに
などと記載していました。
ロボットの制御をしたり、シミュレーションを行う場合には数式をプログラム化する必要があります。
そのとき、"0T3"に相当する式を手で計算してしまってから入力しなければ、と思う人がいるかもしれませんが、そんなことはありません。
"0T1", "1T2", "2T3"を個別に求める式を入力してプログラム実行時に値を出し、プログラムの上で"0T3"を計算すればよいのです。
行列演算をする関数はC言語などには標準ではありませんが、ネット上で提供されているものもありますし、行列やベクトルの計算くらいならC言語の演習の感覚でつくってしまえばいいのです。
複雑な式を間違う(計算,入力)危険を犯してあらかじめ計算するよりは、明らかに効率がよくなります。
きちんと定義した上で、中間変数はじゃんじゃんつかいましょう。
もうひとつ、力業で求める方法が考えられます。本来の偏微分の定義より、
です。
微分という操作は極限という実現はできないことを考えたものなので、コンピュータのなかで微分値を使いたいときに差分という方法で代替することがあります。
どこが変わったかというと、Δqjを0にリミットしません。そのかわり、十分小さな値にします(極端に小さくすると演算精度が落ちるので注意)。
このことを使うと、