ロボットのGUIコントローラを作る(その1)
初稿: 2013/10/3, 最終更新: 2013/10/17 文責: Yoshihiro Sato
ロボットの制御と3次元CGは、力学の有無を除いてよく似ています。もしコンピュータの中でロボットの3Dモデルをうまく動かすことができたら、実際のロボットを動かすこともそう難しくありません。
このページでは、次の手順でロボットのGUIコントローラを作ります。
- ロボットの3Dモデルを3次元CGで動かす
- CGと実際のロボットを同期させる
例に使うロボットは、川田工業のHIROです。
このページの位置づけは、”ロボット制御の基礎を自分でプログラムを書いて勉強したいひと”向けです。C++はなんとなく大体わかる高専生ぐらいのレベルを想定しています。 本格的にロボット制御をしたい場合、よほどの理由がなければ動力学シミュレータと連携できるChoreonoidを推奨します。
最終的には、こんな画面とロボットが同期して動かせるようにがんばっていきます。
0.準備
0.1 ロボットのモデル
まず、ロボットのモデルを借りてきます。ロボットの動作計画ライブラリOpenRaveのWEBページにHIRONXのモデルと、逆運動学計算のためのC++のソースコードがあるので、これを使います。開発当時の様子はよく存知ませんが、おそらく知能化加速開発HRPプラットフォームユーザグループの成果として整備されたものなので、感謝しながらダウンロードします。
kawada-hironx-parallelfingers.zae
ページ中ごろにあるrawを押してください。
zaeという見慣れない拡張子は、3次元モデルの一般的なフォーマットの一つCOLLADA形式をzip圧縮したものです。拡張子を.zipに変更して圧縮ファイルを解凍して下さい。
kawada-hironx-parallelfingers.dae
というファイルができますのでこれを使います。openraveのページにあるkawada-hironx.zaeというファイルは、後で使うローダでうまく読み込めないので使いません。
0.2 openFrameworksのダウンロード
3次元モデルをCGで表示するライブラリを自分で作るのはとても大変です。そこで公開されている便利なライブラリの中から、openFrameworksを利用することにします。openFrameworksは、c++で書かれた3DCG、サウンド、ネットワーク通信、などの便利なライブラリの集合体で、メディアアートの作成によく使われています。ライセンスはMITライセンスですので、誰でも自由に使うことができます。
Windows,Mac,Linux,iOS,androidなどさまざまな環境で動きます。プログラミングを専門としない人にも簡単に扱えるように、オブジェクト指向をあまり意識しない比較的ゆるいルールの書式になっています。
リンク先から、自分の環境にあったバージョンをダウンロードして、適当な場所(このページの説明では、WindowsでVisual Studio2012の環境を使いますので、適当にc:\workspaceとします)に解凍します。また、C++がコンパイルできる開発環境が必要ですので、あらかじめ自分の環境でVisualStudio2012Expressなどを使えるようにしておいてください。
1.ロボットのモデルを読み込んで表示する
openFrameworksにはとても勉強になるexampleが多く収録されています。この中の一つを改造して、ロボットのモデルを表示させて見ます。まずは例を試してみましょう。
C:\workspace\of_v0.8.0_vs_release\examples\addons\assimpExample
にあるassimpExample.slnを開いてビルドし、プログラムを動かしてみてください。
Fig.1 assimpExample
いきなりとてもお洒落な人型モデルが表示されて、しかも動きますのでちょっとびっくりします。これは主にAssimpという3Dモデルローダのおかげで、さまざまなモデル形式を簡単に読み込んで管理できるようになっています。
このモデル読み込みの指定を書き換えて、ロボットのモデルを読ませてみましょう。
C:\workspace\of_v0.8.0_vs_release\examples\addons\assimpExample\bin\dataの中にkawada-hironx-parallelfingers.daeをコピーしてください。
1.1 読み込むモデルの変更
プロジェクト内にあるtestApp.cppというファイルを開いて、最初にある関数void testApp::setup()の中で、
model.loadModel("astroBoy_walk.dae", true);
と書いてある行を見つけてください。このモデルの指定をkawada-hironx-parallelfingers.daeに書き換えて、次のようにします。
model.loadModel("kawada-hironx-parallelfingers.dae", true);
再度ビルドしなおして、実行してみましょう。
Fig.2 ロボットモデルを表示
ロボットのモデルが読み込まれて表示されました!なんとなく、もう勝った気分になれますね。次回以降、このモデルをGUIやマウス操作などさまざまな方法で動かせるようにしていきます。