====== ロボットのための座標系表現 ====== ロボットが作業を行うためには対象となるものの位置や姿勢,ロボットの動作を記述する必要がある. 三次元空間での位置・姿勢の表現として[[articles:frame|三次元直交座標系]]が一般性があり 非常に優れたものとなっている. しかし,このロボットの動作や作業環境を「座標系」で表現するということが ロボットの初学者にはなかなか浸透しない. 一回きりや単純な繰り返し動作なら座標系なしでも良いが, いろいろ条件を変えて実験したり,カメラからの情報で動作させたり, コンピュータで表示したりシミュレーションしたり, 論文できちんと記述しようとしたり,などなど, 座標系を使い慣れていないとなかなか不便なことになる. またロボットアームの順運動学,逆運動学の計算,ハンドアイキャリブレーション, RGB-Dカメラを用いた物体の位置計測にも座標系は重要な役割を果たしている. ===== ロボットの動作の表現 ===== ロボットの動作をその関節パラメタ(関節角度,角速度など)で表現する方法は簡便であり 古くから,また現代においてもよく用いられている. この方法は,同じロボットが同じ環境で同じ作業を繰り返し行う場合には有効であるが, そうでない場合には思うような作業が実現できなくなってしまう. また最近では深層学習などの手法を用いて動作や環境の記述を陽に行わずに, 視覚情報から直接ロボットの動作を生成することも多数試みられている. これは対象をモデル化して陽に記述することが困難な場合には有用ではあるが, 現状はほぼ同じ視野の中の単純なほぼ同じ動作が実現できているだけである. 視点やロボットを変更した場合には学習をやり直す必要があるし, 複数の連続する動作による作業全体を通して学習することはまだできていない. table上のplace_aにあるboxをplace_bに動かすという単純な作業を例に考えてみる(図1). [{{ articles:robot_frame_01.png?300|図1 ロボットの作業の例}}] ロボットでこの作業を実現する単純な方法は前節で述べたように 要所の関節角を覚えておいてそれを再生するというものである. しかし,この方法では以下のような場合すぐに困ってしまう. * ロボットの設置位置が少しずれたら?((移動するロボットなら確実に問題になる)) * 違うロボットだったら? * カメラのデータで動かすには? そもそも「boxがplace_aにある」とはどういうことなのかすら良く分からない ((たとえば具体的にはコンピュータ上でどう表現されることなのかということ)). ===== 座標系の導入 ===== 一般的に空間中の位置を表現するには座標値を用いることが多い. しかし,ロボットが行う作業においては位置だけでなくその姿勢も問題になる. [{{ articles:robot_frame_02.png?300|図2 座標系の導入}}] 物体の位置だけでなく姿勢も表現するには,物体に固定された座標系を考え その座標系の位置と姿勢で表現するのが一般的なやり方となる(図2). ロボットの動作記述に座標系の概念を導入したのは スタンフォード大学人工知能研究所で開発されたALというロボット用言語 ((S. Mujitaba, R. Goldman:"AL USER'S MANUAL", Stanford AI Lab. Memo, AIM-323,(1979) )) であった.ALではこのような座標系を"FRAME"と呼んでいて (( 私は,このframeという呼び方はロボット特有のものかと思っていたがそうではないようだ. \\ [[https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E5%A4%A9%E6%96%87%E5%9F%BA%E6%BA%96%E5%BA%A7%E6%A8%99%E7%B3%BB |ウィキペディアの「国際天文基準座標系」]]の記述では, 英語においては、座標系を規定する概念や考え方を"Reference System"、 それを実現した座標系の実体を"Reference Frame"と呼び、概念と実体を区別している[1] とある. \\ また[[https://kotobank.jp/word/%E5%9F%BA%E6%BA%96%E7%B3%BB-5047|ブリタニカ国際大百科事典]]にも 「基準系(frame of reference)」という項目がある. \\ frameの用語は古くから使われていたようである. )) ロボットの動作だけでなく,その環境やロボットの操作による環境の変化を統一的に管理できるようになっている. このようなロボットの動作記述における座標系の導入はその後のロボットの作業プログラミングに大きな影響を与えた. たとえばboxの底面中心に座標系を設定/固定してtable上のしかるべき位置・姿勢に place_aを設定すれば「boxがplace_aにある」というのは,この二つの座標系が 一致した状態であるということになる. ロボットがboxを掴んで移動させる場合には,関節角度ではなく handに設定した座標系がbox座標系に対してしかるべき位置・姿勢関係に なるようにして把持し,box座方形がplace_bに一致するように 動かすという形で記述する. またALでは座標系の親子関係を管理しているので,boxがhandで掴まれたという 情報を与えてやると,handではなくboxの位置・姿勢を直接ロボットへの 指令として与えることができるようになっていた. このように座標系を用いて記述することによって,ロボットのベース位置や ロボットの種類が変化しても,ロボットの動作を計算により簡単に変更できるし, カメラなどのセンサ情報を基に動作させることも容易になる. ===== 座標系がいっぱい! ===== 図2の座標系の関係やそのおよその決まり方を図3に示す.$T$は座標系の関係を[[articles:frame#同次変換行列|同次変換行列]]で 表したものである. [{{ articles:robot_frame_03.png?500|図3 座標系の関係と決まり方}}] このようにロボットの働く環境やロボットの動作を座標系および座標系の連鎖を用いて表すのは 何のためかといえば, * ロボットが働く環境を統一的に表現する * カメラや他のセンサと連携させる * ロボットが行う作業をロボットの構造によらずに記述する * 局所的な表現と全体的な表現を統一的につなげる(座標系の連鎖) ということになる. このとき問題になるのが, * 座標系をどう表現するか * 座標系間の関係をどう表現するか * 位置・姿勢データは,どの座標系で表現されたものか * ある座標系での表現を他の座標系での表現に変換するにはどうするか であり,これらについていろいろと説明をしていく. 最終的には,ロボットの動作・作業に座標系をどのように使うかということの理解の助けになればと考えている.