10月7日から10日の日程でJVRC(Japan Virtual Robotics Challenge)が開催され、MIDとして参戦してきました。
利用したロボットはCreative Commonsライセンスで公開されているJAXONを改変(派生)させたMIDJAXONというロボットで上半身はヒューマノイド型、下半身はクローラー型の形をしています。
成績はというと、全チーム中最高得点をとり総合優勝、更にチャレンジタスクへのチャレンジが認められJVRC賞も同時受賞、ということで最高の結果を残すことができました。
以下のサイトで競技終了後の技術交流会の様子を見ることができます。
http://www.ustream.tv/recorded/75191534
技術交流会でも言っているのですが、結果から見ると1位下半身クローラー型、2位クローラー型、3位ヒューマノイド型、でクローラー型が有利かと思われがちなのですが、公式の順位からは実はAIST-NEDO、NEDO-JSK、NEDO-HydraのDRC参加組が外されており、DRC参加組も含めた「裏順位」は、1位下半身クローラー型(MID)、2位ヒューマノイド型(AIST-NEDO)、3位ヒューマノイド型(NEDO-JSK)と初日に僅差でAIST-NEDOに勝っていたMIDがヒューマノイド勢の猛追を逃げ切ったという形になっており、まったくもってクローラー型が有利というわけではありません。制御しきることができればヒューマノイド型の勝ち、そこからクローラー型の安定性を活かした操縦で逃げ切った、というのが本当のところですので、今後のロボット設計の参考にしていただければと思います。
ともあれ、大会出場前に大会で使ったソースコードの公開を約束していたので、以下に公開します。
MIDJAXONのシミュレーションモデルはNEDO-JSKがJAXONを公開してくれているgithubレポジトリのフォークとして登録してあります。Creative CommonsライセンスのJAXONを派生させましたのでライセンスはやはりCreative Commonsです。
https://github.com/devrt/rtmros_choreonoid
MIDJAXONの制御プログラムは以下のレポジトリに登録しました。
https://github.com/devrt/midjaxon-controller
ソースコードの使い方ですが、まず、RTMでヒューマノイドの制御をしようとするとomniORBの通信を大量に使うので以下のコマンドを入力して通信の制約をゆるめます(各ターミナルで入力するのは面倒なので.bashrcなどに書いておくと良いです)。
$ export ORBgiopMaxMsgSize=2097152000
次にChoreonoid, OpenRTM-aist, hrpsys-baseなどRTMのパッケージをインストールします。
$ sudo add-apt-repository ppa:hrg/daily
$ sudo apt-get update
$ sudo apt-get install choreonoid choreonoid-jvrc-plugin openrtm-aist-dev openrtm-aist-python hrpsys-base openhrp
MIDJAXONでは操作インターフェースにROSのrvizを使っているのでROSもインストールします。
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116
$ sudo apt-get update
$ sudo apt-get install ros-indigo-desktop ros-indigo-rviz ros-indigo-rtmros-common ros-indigo-zbar-ros
rtmros-commonは東大JSKで開発されているRTMのデータ型をROSに変換するブリッジパッケージです。zbar-rosはJVRCで課題となるマーカの認識をしてくれるパッケージです。
更に以下のパッケージもインストールします。
$ sudo apt-get install python-wstool python-catkin-tools
wstoolとcatkinはgithubで公開された最新のROSパッケージを利用するためのユーティリティコマンドです。
パッケージのインストールが終わったらcatkin用のワークスペースを作成します。
$ source /opt/ros/indigo/setup.bash
$ mkdir -p catkin_ws/src
$ cd catkin_ws/src
$ wstool init
$ source ~/catkin_ws/devel/setup.bash
作成したワークスペースに各最新catkinパッケージをチェックアウトします。
$ cd catkin_ws/src
$ wstool set rtmros_common https://github.com/start-jsk/rtmros_common.git --git
$ wstool set rtmros_tutorials https://github.com/start-jsk/rtmros_tutorials.git --git
$ wstool set rtmros_choreonoid https://github.com/devrt/rtmros_choreonoid.git --git
$ wstool update
最後のrtmros_choreonoidだけ、start-jskではなくdevrtのものを使うことに注意してください。
catkinコマンドを使って最新のrtmrosブリッジをビルドします。
$ cd catkin_ws
$ catkin build hrpsys_ros_bridge
rvizを使うにはVRMLフォーマットで書かれたロボットモデルをROSのURDF形式に変換する必要があります。そのために、まずはモデル変換ツール「simtrans」をインストールします。
$ sudo apt-get install meshlab imagemagick
$ git clone https://github.com/fkanehiro/simtrans.git
$ cd simtrans
$ sudo pip install -r requirements.txt
$ suto python setup.py install
次にsimtransを使ってモデルを変換します。
$ roscd hrpsys_ros_bridge_jvrc/models
$ ./convert-midjaxon.sh
ROSの世界のセットアップ作業は以上ですので次にRTMで書かれた制御部分をセットアップします。
まずは、制御部分をチェックアウトします。
$ git clone https://github.com/devrt/midjaxon-controller.git
次に制御部分をコンパイルします。
$ cd midjaxon-controller
$ make
makeした結果、PDcontroller.soとMidJaxonController.soの2つのファイルができていることを確認してください。
/usr/lib/choreonoid-1.5/rtc以下に各ファイルをコピーします。
$ sudo make install
これでRTM側のセットアップも完了ですのでシステムを起動してみましょう。O1タスクを起動するには以下のコマンドを入力します。
$ cd midjaxon-controller
$ ./setup.py O1
起動が進むとroscoreへの接続待ちの状態になりますので、別のターミナルを開いて以下のコマンドを入力します。
$ cd midjaxon-controller
$ ./launchrviz.sh
無事に立ち上げが終わると以下のような操作画面が出てくるはずです。
操作にはアナログスティック2本を搭載したゲームパッドが必要で、MIDでは以下の製品を使っています。
http://www2.elecom.co.jp/peripheral/gamepad/jc-u2912f/
同型でなくても似た形の製品であれば同様に使えるはずです。Linuxで認識されるデバイス名はセットアップスクリプト(setup.py)にハードコードされていますので、MIDの環境と違う場合は当該箇所を書き換えてください。ゲームパッドを接続したらアナログモードにするのを忘れないでください(私はよく忘れます)。アナログスティック二本で左右のクローラーの前後、人差し指のボタン4個でフリッパーの上下が制御できます。
アームの操作などはsetup.py起動後に出るipythonのプロンプトでコマンド入力します。コマンドの一部を紹介すると、「leftcontrol()」は左のアームの逆運動学ベースの制御、「leftgrasp(0.3)」は左の手を閉じる、「headyaw(math.pi/2)」は真左を見る、「goactual()」は初期姿勢に戻る、「recover()」はコケた時のリカバリ、などとなっています。ipythonはこれ以外にも通常のPythonコマンドも入れることができるので、公開練習中などはこのプロンプトを使ってライブコーディングの形で機能を増やしていっていました。
物理シミュレーション、カメラ、レーザレンジファインダのシミュレーションなどが入っているため、PCの要求スペックは高めです。MIDではGPUはNvidiaのGeForce GTX750Ti、CPUはAMDの8-coreプロセッサを使っています。
長くなってしまったのでプログラム本体の説明についてはまた次回書こうと思っていますが、主に使っているのはhrpsys-baseの各種モジュール(コンポーネント)、rtmros-commonパッケージ、rvizで、それに以下の独自部分を書き足しています。
setup.py : Pythonで書かれたrtm.pyとrospyを使った上位レベルの制御インターフェース (BSD licenseで公開します)。各種コンポーネントの起動と接続もここでやっています。
MidJaxonController.[cpp,h] : C++で書かれた下位レベルのリアルタイム制御モジュール (BSD licenseで公開します)。setup.pyからchoreonoidに内蔵されたrtcdを経由してロードされます。
PDcontrollerMIDJAXON.[cpp,h] : hrpsys-baseからフォーク(クローラー用の等速制御を追加)したPD制御モジュール (hrpsys-base license)。choreonoidからBodyRTCアイテムを経由してロードされます。
最後に、JVRCは大変たのしく有意義な大会でした。運営に関わった方々の尽力に感謝すると共に、次回開催を心より願っております。