Ubuntu 10.04 上に graspPlugin の環境を構築するには、下のソフトウェアのインストール手順を順に実行します。GraspPlugin の構築が完了したら、GraspConsumer プラグインによる把持動作計画チュートリアルでハンドロボット PA10 に缶をつかむ動作をさせることができます。なお、GraspConsumerプラグインを使わないのであれば、Choreonoid とgraspPlugin のインストールとビルドで十分です.
一括セットアップスクリプトを使って、OpenRTM を Ubuntu 12.04 にインストールする。
ここでは、インストール先を~/src/choreonoid-1.3.0 とする。
OpenRTM-aist-1.0.0-RELEASE から Ubuntu 用一括セットアップスクリプト pkg_install_ubuntu.sh をダウンロードする。
(注:ウェブサイト上では pkg_install_ubuntu.sh と表示されているが、実際にダウンロードするファイルは pkg_install_ubuntu100.sh となる。ただし、2013年9月現在このファイルは存在しないようです。結果的にOpenRTM1.1をインストールすることになると思いますが、問題なく動作することを確認しています。)
ブラウザを使わずに、wget でダウンロードする場合は以下の通り。(以降、囲み内で %で始まる行は端末に打ち込むコマンドを示す。最初の%は含まない)
% wget http://svn.openrtm.org/OpenRTM-aist/trunk/OpenRTM-aist/build/pkg_install_ubuntu.sh
% sudo sh pkg_install_ubuntu.sh
OpenRTM-aist のリポジトリが登録されていません。 Source.list に OpenRTM-aist のリポジトリ: deb http://www.openrtm.org/pub/Linux/ubuntu/ lucid main を追加します。よろしいですか?(y/n)
この操作後に追加で XXXkB のディスク容量が消費されます。 続行しますか [Y/n]?
警告: 以下のパッケージは認証されていません! (注:ここに表示されるパッケージ名は、その都度異なります) 検証なしにこれらのパッケージをインストールしますか [y/N]?
OpenRTM のサンプルのソースは /usr/share/OpenRTM-aist/examples にインストールされる。
% cp -pr /usr/share/OpenRTM-aist/examples ~/workspace
2012/2/20現在、apt-getでOpenRTM1.0系をインストールしようと思っても、1.1系がインストールされてしまいます。この場合、/etc/apt/preferencesを編集します。OpenRTMのサイトにも書いてありますが、preferencesに以下の記述を追加してください。
--<ここから>--
Package: openrtm-aist
Pin: version 1.0.*
Pin-Priority: 1001
Package: openrtm-aist-dev
Pin: version 1.0.*
Pin-Priority: 1001
Package: openrtm-aist-doc
Pin: version 1.0.*
Pin-Priority: 1001
Package: openrtm-aist-example
Pin: version 1.0.*
Pin-Priority: 1001
Package: openrtm-aist-python
Pin: version 1.0.*
Pin-Priority: 1001
Package: openrtm-aist-python-example
Pin: version 1.0.*
Pin-Priority: 1001
--<ここまで>--
ロボット動作振り付け統合ソフトウェア Choreonoid の導入手順を以下に記す。ここでは一度にgraspPluginの導入はせず、Choreonoidのみをビルドして実行する。なお、graspPluginはChoreonoidのバージョン1.0から1.3.1に対応しています。バージョン1.4への対応は少しお待ちください。
Choreonoid ホームページ のダウンロードページから、ソースパッケージ http://choreonoid.org/_downloads/choreonoid-1.3.1.zip をダウンロードして、展開する。
展開先に~/srcを指定することで、~/src/choreonoid-1.3.1ディレクトリが作られ、ビルドに必要なファイルが展開される。
端末を立ち上げ、この~/src/choreonoid-1.3.1ディレクトリをカレントディレクトリとする。
% cd choreonoid-1.3.1
% cd choreonoid/misc/script % sudo ./install-requisities-ubuntu-1*.**.sh (中略) 続行しますか [Y/n]?
% sudo apt-get update % sudo ./install-requisities-ubuntu-1*.**.sh
% sudo apt-get install libgstreamermm-0.10-dev libqt4-phonon-dev
% sudo apt-get install libeigen3-dev
% cd ../..
Makefile を生成するため、ccmake を起動する。
% ccmake .
% make
make が完了したら、 choreonoid を実行する。
% bin/choreonoid
glaspPlugin のインストール手順を以下に記す。
加えて、wx-common パッケージをインストールする。
% sudo apt-get install wx-common
これらがすでにインストール済みであれば、この項はスキップして graspPlugin インストール から作業を始めることができる。
graspPlugin は Choreonoid のプラグインとして提供される。
以下のサイトにブラウザからアクセスする。
https://code.google.com/p/grasp-plugin/downloads/list
graspPluginのソースを ~/src/choreonoid-1.3.1 の extplugin 以下に展開する。
% cd ~/src/choreonoid-1.3.1/extplugin % unzip graspPlugin-1.3.zip
% cd ~/src/choreonoid-1.3.1/extplugin/graspPlugin % unzip PRM-1.3.zip
% ./graspPlugin/Grasp/install-requisities-ubuntu.sh
graspPlugin をプラグインとして導入するため、ccmake で Choreonoid のビルド設定を変更する。
% cd ~/src/choreonoid-1.3.1 % ccmake .
2度cキーを押して configure すると、GRASP_PLUGINS と GRASP_ROBOT_MODEL_PLUGINS の二つの項目ができる。
となる。目的とするプラグインが依存しているプラグインについては、各プラグインの解説の中に依存プラグインとして記述している。
値を編集したら、「c」キーを押して configure を行う。
数秒後に configure が無事に終了すると、画面の下のキーメニューに新しく「Press [g] to generate and exit」の項目が出る。
「g」キーを押すと、makefileが生成され、ccmake が終了する。
% make
choreonoid を実行する。
% bin/choreonoid
graspPlugin を組み込んだことによって、ツールバーの種類が増えている。
また、Messageタブにもプラグインファイルを読み込み、起動した旨のメッセージが表示されている。
把持動作計画モジュール GraspPlannerComp のコンパイル方法について、以下に記す。
ここでは、graspPlugin のインストールとビルド まですでに完了しているとする。
GraspPlanner 本体のソースのあるディレクトリに移動し、make する。
% cd ~/workspace % cd Choreonoid/extplugin/graspPlugin/GraspConsumer/GraspPlan20100623/ % make
`rtm-config --idlc` `rtm-config --idlflags` -I`rtm-config --prefix`/include/rtm/idl GraspController.idl rtm-skelwrapper --include-dir="" --skel-suffix=Skel --stub-suffix=Stub --idl-file=GraspController.idl GraspControllerSkel.h was generated. GraspControllerSkel.cpp was generated. GraspControllerStub.h was generated. GraspControllerStub.cpp was generated. rm -f GraspPlanner.o g++ `rtm-config --cflags` -I. -c -o GraspPlanner.o GraspPlanner.cpp rm -f GraspPlanningImpl.o g++ `rtm-config --cflags` -I. -c -o GraspPlanningImpl.o GraspPlanningImpl.cpp rm -f GraspControllerSkel.o g++ `rtm-config --cflags` -I. -c -o GraspControllerSkel.o GraspControllerSkel.cpp rm -f GraspControllerSVC_impl.o g++ `rtm-config --cflags` -I. -c -o GraspControllerSVC_impl.o GraspControllerSVC_impl.cpp rm -f GraspPlanner.so g++ -shared -o GraspPlanner.so GraspPlanningImpl.o GraspPlanner.o GraspControllerSkel.o GraspControllerSVC_impl.o `rtm-config --libs` -L/usr/lib -L/usr/local/lib rm -f GraspPlannerComp.o g++ `rtm-config --cflags` -I. -c -o GraspPlannerComp.o GraspPlannerComp.cpp g++ -o GraspPlannerComp GraspPlanningImpl.o GraspPlanner.o GraspControllerSkel.o GraspControllerSVC_impl.o GraspPlannerComp.o `rtm-config --libs` -L/usr/lib -L/usr/local/lib
% ./GraspPlannerComp
Eclipse 全部入り(OpenRTM Eclipse tools)を動作させるには、Ubuntu 標準の Open JDK ではなく、Sun製の JDK が必要である。
Sun製の JDK sun-java6-jdk をインストールするには、まず apt のリポジトリを追加したうえで、パッケージリストを取得する。
% sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" % sudo apt-get update
% sudo apt-get install sun-java6-jdk アップグレード: 0 個、新規インストール: 8 個、削除: 0 個、保留: 0 個。 57.0MB のアーカイブを取得する必要があります。 この操作後に追加で 168MB のディスク容量が消費されます。
続いて、以下の画面が表示されたら「はい」を選択する。
インストールが終了したら、デフォルトのjavaをsun-java6に設定する。
% sudo update-alternatives --config java
There is only one alternative in link group java: /usr/lib/jvm/java-6-sun/jre/bin/java Nothing to configure.
There are 3 choices for the alternative java (providing /usr/bin/java). Selection Path 優 Status ------------------------------------------------------------ 0 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 auto mode * 1 /usr/bin/gij-4.4 1044 manual mode 2 /usr/lib/jvm/java-6-openjdk/jre/bin/java 1061 manual mode 3 /usr/lib/jvm/java-6-sun/jre/bin/java 63 manual mode Press enter to keep the current choice[*], or type selection number:
OpenRTM Eclipse tools 1.0-RELEASE から、 Linux用全部入りパッケージ をダウンロードして、(例として)ホームディレクトリのworkspace 以下に展開する。
% cd workspace % wget http://www.openrtm.org/pub/OpenRTM-aist/tools/1.0.0/eclipse342_rtmtools100release_linux_ja.tar.gz % tar xzf eclipse342_rtmtools100release_linux_ja.tar.gz % cd eclipse
そこで、以下のコマンドラインで起動する。
% ./eclipse -clean -vmargs -Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib/xulrunner-1.9.2.13/xulrunner
Eclipse のRT System Editor 上で、Name Server View が有効にならない場合があります。
これは、 /etc/hosts の IPv6 関係の項目(The following lines are以降の行)をコメントアウトすることで回避できます。
% sudo gedit /etc/host
として、/etc/hosts を編集してください。
/etc/hosts の例
127.0.0.1 localhost
127.0.1.1 yourservername # 注:この項はサーバ名(PC によって異なる)
# The following lines are desirable for IPv6 capable hosts
#::1 localhost ip6-localhost ip6-loopback
#fe00::0 ip6-localnet
#ff00::0 ip6-mcastprefix
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
#ff02::3 ip6-allhosts
Eclipse 上で作成した Choreonoid プロジェクトに対して、細かい設定を行う。
インクルードパスを設定すると、不明な型にカーソルを合わせてF3を押すだけで宣言部を参照できるようになる。
まずプロジェクトのプロパティを開く。プロジェクト名を右クリックしてコンテキストメニューを表示し、その一番下の「プロパティ」を選択すると、プロパティ画面が現れる。等がある。
Choreonoid では、ccmake で Makefile を生成しているので、Eclipse からもこれを呼び出せるようにしたい。
インクルードパスの場合と同様にプロジェクトのプロパティを開き、C/C++ Build を選択すると、以下のような画面が出る。
[inline:CppBuild.png]
ここで、「Generate Makefiles automatically」のチェックを外すと、Build directory のロックが外れるので、「${workspace_loc:/Choreonoid}」に修正する。
また、マルチコアCPUを積んだPCであれば、並列コンパイルでトータルビルド時間を短縮できる。
Behaviourタブを開いて、「Use parallel build」をチェック、「Use parallel jobs」にコア数に応じた適切な値を設定するだけでよい。
「適切な値」はPCによって異なる。CPUのコア数、デュアル版・クアッド版、ハイパースレッディング機能の有無、等々。
ひとまず コア数(一般に2~8程度)+1~2 として、パフォーマンスに余裕があるなら増やし、なければ減らすことになるだろう。
また、まれに並列コンパイルを行うと問題の発生するプロジェクトもある。
[inline:BuildBehaviour.png]
エラーが出たら即make を中断する「Stop on first build error」は並列コンパイルとは相性がよくないので、通常は外しておくが、上流のコンパイルエラーが下流に響いて大量のエラーが出るときなどはチェックした方がよい。
GripperManipulationプラグインはパラレルグリッパを持つロボットに対してピックアンドプレースの動作計画を行うプラグインです。把持計画手法についてはパラレルグリッパに特化した独自の手法を実装しています。この手法は非常に高速に計算できるの実時間で把持姿勢を求めることが出来ます。また、バウンディングボックスを用いないため複雑な形状の対象物にも比較的容易に適用できます。
本プラグインを導入すると、プランナバーのStartボタンを押すとGraspプラグインの把持計画が実行されるのではなく、GripperManipulationプラグインの把持計画が実行されるようになります。また、本プラグインを新たに導入するとINTENTIONバーが現れます。このバーは把持対象物の部位を指定するインテンションパラメータを指定するものです。
下記文献[1]には、把持計画アルゴリズムのうち、非実時間部と実時間部の両方が記述してありますが、本プラグインではその実時間部を実装しています。非実時間部はGeometryHandlerという公開バージョンには含まれていないプラグインを使います。(追記予定)
[1] K. Harada, T. Tsuji et al, "Grasp Planning for Parallel Grippers Considering Flexibility on its Grasping Surface", Proc. of IEEE Int. Conf. on Robotics and Biomimetics, 2011.
Choreonoid/extPlugin/graspPlugin/GripperManipulation というプラグインに、RTコンポーネントの「口」を取り付ける。
双腕ロボットの把持計画を行う graspPlugin プラグインであり、ファイル構成は以下のようになっている。
ここで、プログラムの構造がわかりやすいよう、GripperManipulationMain.cpp を、ManipPlugin.cpp にリネームする。
合わせて CMakeLists.txt も修正して、コンパイルできることを確認する。
下準備として、まず GripperManipulation の下に rtcディレクトリを作成し、ここに GraspController.idl を置く。
さらに、Eclipse を起動し、このrtc ディレクトリにダミーの新規 Eclipse プロジェクトを設定する。(*注) 本文では作業ディレクトリを /home/asahi/workspace として進めているので、読者はこの部分を自分の作業ディレクトリに置き換えて読むこと。
完了ボタンを押すと、C++ パースペクティブを開きますか? というダイアログが出るが、そのまま閉じればよい。
これで下準備は完了したので、Eclipse で RTC Builder パースペクティブを開く。
RTのアイコンをクリックすると、RtcBuilder ビューが開くので、タブごとに必要な情報を設定していく。
その他の項目はデフォルトのままでよい。
C++を選択する。
画面の指示にしたがって C++パースペクティブに切り替える。
このとき 一緒に保存されている RTC.xml に、一連の設定が保存されている。
RTコンポーネントの設定を変更する時は、RTC Builderの基本タブの中にある、プロファイルのインポート機能で、この設定を呼び戻すことができる。
端末を開いて GripperManipulation/rtc ディレクトリに移って、以下のコマンドを実行する。
% omniidl -bcxx GraspController.idl
% make -f Makefile.GripperManipulation
graspPlugin/GraspConsumer から、
GraspRtcController.h と GraspRtcController.cpp を GripperManipulation にコピーして、編集する。
ManipController.h(cpp) とまぎらわしいので、まずファイル名を ManipRtc.h(cpp) に変更する。
サンプルとして、一連のファイル編集を一度に行うパッチファイルを作成した。
% svn co -r131 http://subaru.ait.kyushu-u.ac.jp/svn/grasp-plugin/trunk/graspPlugin/GripperManipulation
% patch -p0 < GripperManipulation_patch.txt
以下は、パッチファイルの変更点の概要である。
クラス名を ManipRtc に変更する。(Eclipseのリファクタリング機能が便利だが、誤って元のGraspConsumer まで変更しないよう、注意!)
ManipPlugin::initialize メソッドに、RTコンポーネントをスタートさせるコードを追加する。
virtual bool initialize() { //Robotics::SceneBodyManager* manager = Robotics::SceneBodyManager::instance(); grasp::GraspController::instance(ManipController::instance()); ManipRtc::instance()->RtcStart(); //manage(manager->addSceneBodyFactory(create));
grasp::ManipRtc クラスを、GripperManipulation のフレンドクラスに設定する。
using namespace RTC; namespace grasp { class ManipRtc; } ... class GripperManipulation : public RTC::DataFlowComponentBase { public: friend class grasp::ManipRtc;
RTCBuilderはIDLデータ型の引数をCORBAとして出力するが、omniidlは同じものを::CORBAとして出力するため、型が異なるとコンパイラがエラーを出してしまう。
そこで、omniidlの出力に合わせて、CORBAネームスペースの型の引数の宣言を、::CORBA に書き換える。
また、GraspPlanResultSVC_impl クラスのメソッドの引数について、GraspPlanStart ネームスペースの型の引数宣言を GraspPlanResult に書き換える。(これはRTCBuilder のバグか)
初めの一回は、Choreonoid ディレクトリで ccmake を実行する。
% ccmake .
Choreonoid と RT System Editor を起動して、NameServer の127.0.0.1 の(ホスト名)|host_cxtの下に、GripperManipulation0|rtc があることを確認する。
これを System Diagram 上にドラッグ&ドロップできれば成功である。
(ただし、これを他のRTコンポーネントと結びつけても、まだ何も起こらない。GripperManipulation をRTコンポーネントに改造する・実装編につづく)
新しい対象物を掴ませたい場合、以下のステップを踏むことでできます。
1. vrmlモデルをgraspPlugin/Samples/Object以下に置いてください。
2.対象物固有のyamlファイルを編集します。開発者用レポジトリにはGeometryHandler プラグインがあり、これを使うことで自動的にyamlファイルが生成されるのですが、簡単な形状の対象物であれば比較的簡単に自力で生成することが出来ます。具体的にはgraspPlugin/Samples/Object/W0.wrl とgraspPlugin/GripperManipulation/project/W0.yamlを見比べることで分かるのではないかと思います。
3.最後に、Choreonoidを起動し、掴ませたい対象物のモデル(yamlファイル)を選択してPlannerバーのSetObjectを押すことで把持対象物と認識されます。
以上です。
次に、新しいロボットのモデルを導入したい場合は、まずロボットのVRMLモデルとyamlファイルをgraspPlugin/RobotModels以下に置いた後、graspPlugin/GripperManipulation/project/[ロボット名].prmという名前のファイルを編集します。例がPA10.prmやHIRO.prmとして同じディレクトリの中にあります。本把持計画の手法では、まず接触点の位置が与えられて、それに従って手首の位置・姿勢が決定されます。(なので、オフラインでForceClosureの計算を行うことが出来、オンラインでの計算を高速化できます。)先に手首の位置・姿勢を与えるタイプの把持計画(例えばGraspプラグインで実装した把持計画)とは異なりますので、本手法では接触点の位置とアプローチベクトルが与えられた時に手首の位置・姿勢を導出する関数を自力で作る必要があります。この関数はgraspPlugin/RobotModels/[RobotName]/Plugins/GrasplotPlugin.cppにあり、現時点でPA10とHIROに対応しています。
HiroNXには手首に力センサが装着されているモデルがあります。この力センサ分のオフセットを考慮する方法を以下に記します。
extplugin/graspPlugin/RobotModels/HIRO/Plugin/CMaleLists.txtを見てください。この中でfs_offset.diffのパッチを当てている部分がコメントアウトされていますので、このコメントを外すことでvrmlファイルでオフセットが含まれます。
次に、IKを解く部分でも、オフセットを考慮しなければいけません。これは、extplugin/graspPlugin/RobotModels/HIRO/Plugin/GrasplotPluginHIRO.cppの38-42行目辺りにあるコメントを外すことで可能になります。
Choreonoid 1.3から以下の点が変更されています。
干渉チェックColdetLinkPairUpdateCheckPtr -> cnoid::ColdetLinkPairPtr
#include <boost/make_shared.hpp> using namespace boost;
#ifdef CNOID_10_11_12_13 arm()->palmObjPair = new ColdetLinkPair(palm(),object() ); #else arm()->palmObjPair = make_shared< ColdetLinkPair >(body(), palm(), bodyItem->body(), object() ); #endif
ColdetLinkPairUpdateCheckPtr temp= new ColdetLinkPairUpdateCheck(bodyItemRobot()->body()->link(i),bodyItemRobot()->body()->link(j));
#ifdef CNOID_10_11_12_13 ColdetLinkPairPtr temp= new ColdetLinkPair(bodyItemRobot()->body()->link(i),bodyItemRobot()->body()->link(j)); #else ColdetLinkPairPtr temp = make_shared< ColdetLinkPair >(bodyItemRobot()->body(), bodyItemRobot()->body()->link(i), bodyItemRobot()->body(), bodyItemRobot()->body()->link(j) ); #endif
robotObjPairs.push_back(new ColdetLinkPairUpdateCheck(bodyItemRobot()->body()->link(j), object() ));
#ifdef CNOID_10_11_12_13 robotObjPairs.push_back(new ColdetLinkPair(bodyItemRobot()->body()->link(j), object() )); #else robotObjPairs.push_back(make_shared< ColdetLinkPair >(bodyItemRobot()->body(),bodyItemRobot()->body()->link(j),targetObject->bodyItemObject->body(),object())); #endif
#ifdef CNOID_10_11_12_13 if(j==nJoints-1) linkObjPair[j] = new ColdetLinkPair(tip, bo->body()->link(0)); else linkObjPair[j] = new ColdetLinkPair(fing_path->joint(j), bo->body()->link(0)); #else if(j==nJoints-1) linkObjPair[j] = make_shared< ColdetLinkPair >(body, tip, bo->body(), bo->body()->link(0)); else linkObjPair[j] = make_shared< ColdetLinkPair >(body, fing_path->joint(j), bo->body(), bo->body()->link(0)); #endif
#include <cnoid/JointPath>
#ifdef CNOID_10_11_12_13 fing_path = body->getJointPath(palm, tip); #else fing_path = make_shared< JointPath >(palm, tip); #endif
#ifndef CNOID_10_11_12_13 #include <cnoid/ItemList> #endif
#ifdef CNOID_10_11_12_13 BodyItem* item = prevSelected[i]; #else BodyItem* item = prevSelected.get(i); #endif