古い情報

graspPlugin 環境構築

Ubuntu 10.04 上に graspPlugin の環境を構築するには、下のソフトウェアのインストール手順を順に実行します。GraspPlugin の構築が完了したら、GraspConsumer プラグインによる把持動作計画チュートリアルでハンドロボット PA10 に缶をつかむ動作をさせることができます。なお、GraspConsumerプラグインを使わないのであれば、Choreonoid とgraspPlugin のインストールとビルドで十分です.

OpenRTM のインストール

一括セットアップスクリプトを使って、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

実行中、以下のようにスクリプトから何度か問い合わせがあるが、すべての問い合わせに対して y と答えて続行する。

問い合わせ例 1

 OpenRTM-aist のリポジトリが登録されていません。
 Source.list に OpenRTM-aist のリポジトリ:
    deb http://www.openrtm.org/pub/Linux/ubuntu/ lucid main
 を追加します。よろしいですか?(y/n)

問い合わせ例 2

 この操作後に追加で XXXkB のディスク容量が消費されます。
 続行しますか [Y/n]?

問い合わせ例 3

 警告: 以下のパッケージは認証されていません!
  (注:ここに表示されるパッケージ名は、その都度異なります)
 検証なしにこれらのパッケージをインストールしますか [y/N]?

[Y/n]と問われているときは、Enter キーを押すだけでyを入力したとみなされインストールが行われるが、[y/N]と問われた場合は明示的にyキーのあとEnterを押さないと、nを入力したとみなされインストールがスキップされてしまう。
もし誤ってインストールをスキップした場合は、もう一度 pkg_install_ubuntu.sh を実行すればよい。

サンプルプログラムを取得

OpenRTM のサンプルのソースは /usr/share/OpenRTM-aist/examples にインストールされる。

 % cp -pr /usr/share/OpenRTM-aist/examples ~/workspace

などとして、ユーザーのワークスペースにサンプルをコピーできる。

OpenRTM 1.1系がインストールされてしまう場合

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 のインストールとビルド

ロボット動作振り付け統合ソフトウェア Choreonoid の導入手順を以下に記す。ここでは一度にgraspPluginの導入はせず、Choreonoidのみをビルドして実行する。なお、graspPluginはChoreonoidのバージョン1.0から1.3.1に対応しています。バージョン1.4への対応は少しお待ちください。

Choreonoid インストール

ソースの入手

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

必須パッケージのインストール

misc/script に、一括インストールスクリプトが用意されているので、実行する。
 % cd choreonoid/misc/script
 % sudo ./install-requisities-ubuntu-1*.**.sh
 (中略)
 続行しますか [Y/n]? 

「*」の部分は対応するバージョン名を入れる。相当量のパッケージをインストールするが、途中で失敗するなら update してから、再度スクリプトを実行する。
 % sudo apt-get update
 % sudo ./install-requisities-ubuntu-1*.**.sh

libgstreamermm-0.10-dev と libqt4-phonon-dev も必要な場合は、手動でインストールする(2013年9月現在必要なし)。
 % sudo apt-get install libgstreamermm-0.10-dev libqt4-phonon-dev 

Ubuntu10.04にChoreonoid1.3.1をインストールする場合は、eigenは自力でインストールする。
 % sudo apt-get install libeigen3-dev

完了したら、Choreonoid ディレクトリに戻る。
 % cd ../..

ccmake を使ったビルド

Makefile を生成するため、ccmake を起動する。

 % ccmake .

ccmake は、最初の起動では EMPTY CACHE とだけ表示される。
emptycache.png
ここで「c」キーを押して configure を行うと、数秒後にキーと値のメニューが表示される。
configure1.png
もう一度cを押すと、画面の下のキーメニューに新しく「Press [g] to generate and exit」の項目が出る。
configure2.png
そこで「g」キーを押すと、ccmake が終了する。これで Makefile が生成されているので、make を行う。
 % make

PCによっては時間がかかる。

Choreonoid の起動

make が完了したら、 choreonoid を実行する。

 % bin/choreonoid

以下のような Choreonoid 起動画面が出たら成功である。
Choreonoid_2.png

graspPlugin のインストールとビルド

glaspPlugin のインストール手順を以下に記す。

必須ソフトウェアのインストール

glaspPlugin のインストールに先立ち、OpenRTM と Choreonoid をインストールする必要がある。
  1. OpenRTM のインストール
  2. Choreonoid のインストールとビルド

加えて、wx-common パッケージをインストールする。

 % sudo apt-get install wx-common 

wx-commonパッケージがないと、ccmakeのconfigureにおいて、wxWidgets_wxrc_EXECUTABLE が NOT FOUND になって失敗する。

これらがすでにインストール済みであれば、この項はスキップして graspPlugin インストール から作業を始めることができる。

graspPlugin インストール

graspPlugin は Choreonoid のプラグインとして提供される。

graspPlugin ソースの展開

以下のサイトにブラウザからアクセスする。

 https://code.google.com/p/grasp-plugin/downloads/list

ここで、graspPlugin-1.3.zip ならびに、PRM-1.3.zipをダウンロードする。

graspPluginのソースを ~/src/choreonoid-1.3.1 の extplugin 以下に展開する。

 % cd ~/src/choreonoid-1.3.1/extplugin
 % unzip graspPlugin-1.3.zip

PRMプラグインのソースを~/src/choreonoid-1.3.1 の extplugin/graspPlugin 以下に展開する。
 % cd ~/src/choreonoid-1.3.1/extplugin/graspPlugin
 % unzip PRM-1.3.zip

なお、開発者は https://grasp-plugin.googlecode.com/svn/trunk/graspPlugin を利用できる。

必須パッケージをインストール

graspPlugin のインストールスクリプトを実行する。(ユーザーパスワードが必要)
 % ./graspPlugin/Grasp/install-requisities-ubuntu.sh

ccmake を使ったビルド

graspPlugin をプラグインとして導入するため、ccmake で Choreonoid のビルド設定を変更する。

 % cd ~/src/choreonoid-1.3.1
 % ccmake .

graspPlugin をビルドするには、ここでccmake で項目を編集する必要がある。
ccmake では、画面の左半分に白地で表示される項目がキーで、右半分に黒地で表示される項目がキーに対する値となる。
上下のカーソルキーを使って目当ての項目に移動したら、エンターキーを押すと値を編集することができる。
値を修正したら、もう一度エンターキーを押すと、再びカーソルキーを上下に動かせるようになる。

2度cキーを押して configure すると、GRASP_PLUGINS と GRASP_ROBOT_MODEL_PLUGINS の二つの項目ができる。
ccmake.png

それぞれに対して、以下の値を設定する。この設定は使うプラグインやロボットのモデルによって異なる。
例えば、双腕ロボットHIROによるピックアンドプレースの場合、
キー GRASP_PLUGINS
値 Grasp;PRM;GripperManipulation;VisionTrigger;RobotInterface
キー GRASP_ROBOT_MODEL_PLUGINS
値 HIRO/Plugin
と設定する。また、例えばPA10によってGraspプラグインの把持計画を使う場合
キー GRASP_PLUGINS
値 Grasp;PRM
キー GRASP_ROBOT_MODEL_PLUGINS
値 PA10/Plugin

となる。目的とするプラグインが依存しているプラグインについては、各プラグインの解説の中に依存プラグインとして記述している。

値を編集したら、「c」キーを押して configure を行う。
数秒後に configure が無事に終了すると、画面の下のキーメニューに新しく「Press [g] to generate and exit」の項目が出る。
pressg.png
「g」キーを押すと、makefileが生成され、ccmake が終了する。

ここで make を実行して、Choreonoid とプラグインをビルドする。
 % make

実行

choreonoid を実行する。

 % bin/choreonoid

以下のような画面が出たら成功。
Choreonoid.png

graspPlugin を組み込んだことによって、ツールバーの種類が増えている。
また、Messageタブにもプラグインファイルを読み込み、起動した旨のメッセージが表示されている。

GraspPlannerComp のビルド

把持動作計画モジュール 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 を実行できれば、成功。

 % ./GraspPlannerComp 

実行メッセージは特に出ない。

Eclipse 全部入りのインストール

Eclipse 全部入り(OpenRTM Eclipse tools)を動作させるには、Ubuntu 標準の Open JDK ではなく、Sun製の JDK が必要である。

sun-java6-jdk のインストール

Sun製の JDK sun-java6-jdk をインストールするには、まず apt のリポジトリを追加したうえで、パッケージリストを取得する。

 % sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
 % sudo apt-get update

ここで JDK パッケージのインストールが可能になる。
 % sudo apt-get install sun-java6-jdk
 
 アップグレード: 0 個、新規インストール: 8 個、削除: 0 個、保留: 0 個。
 57.0MB のアーカイブを取得する必要があります。
 この操作後に追加で 168MB のディスク容量が消費されます。

途中、このような画面が表示されるので、「了解」を選択して続行する。
java6.png

続いて、以下の画面が表示されたら「はい」を選択する。
java6-2.png

インストールが終了したら、デフォルトの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.

メッセージが下のようなものだった場合、Sun Java が呼ばれるよう設定する必要がある。
 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: 

こうした場合、Pathの欄が「/usr/lib/jvm/java-6-sun/jre/bin/java」 となっているものを探す。
ここでは 3 が Sun Java ということになるため、3を押してエンターすると、デフォルトのjava がSun のものに変更される。

eclipse 全部入り本体 のインストール

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 を起動するとスプラッシュスクリーンのあと空のウインドウが表示されるだけで、正常に起動しない。

そこで、以下のコマンドラインで起動する。

 % ./eclipse -clean -vmargs -Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib/xulrunner-1.9.2.13/xulrunner

一回~数回、このオプションをつけて起動できたら、単に ./eclipse だけでも起動できるようだ。
パネルにカスタム・アプリケーションのランチャを追加して、コマンドを /home/(ユーザ名)/workspace/eclipse/eclipse のように設定すると、端末を使わずに Eclipse を起動できる。

/etc/hosts の設定

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 のビルドとインクルードの設定

Eclipse 上で作成した Choreonoid プロジェクトに対して、細かい設定を行う。

インクルードパスの設定

インクルードパスを設定すると、不明な型にカーソルを合わせてF3を押すだけで宣言部を参照できるようになる。

まずプロジェクトのプロパティを開く。プロジェクト名を右クリックしてコンテキストメニューを表示し、その一番下の「プロパティ」を選択すると、プロパティ画面が現れる。
[inline:Project-Property.png]
[inline:EclipseProperty.png]
ここで、左ペインの「C/C++ General」を開き、「Paths and Symbols」を選ぶと、インクルードパスの設定画面となる。
[inline:PathsAndSymbols.png]
Assesmbly,GNU C,GNU C++の三項目が選べるが、ここではすべてに対して一括でインクルードパスを登録する。
右の「Add」ボタンをクリックすると、ダイアログが現れる。
[inline:AddDirectoryPath.png]
そうしたらまず「Add to all languages」 をチェックし、右側の4つのボタンから適切なものを選ぶ。
Variables
Eclipse の内蔵変数を利用する場合
Workspace
ワークスペース内のプロジェクトを参照する場合
File system
/usr/include など、システムのインクルードパスを参照する場合
キャンセル
ディレクトリパスの追加を中止する
登録する主なものとして、
ワークスペース
  • /choreonoid/include
  • /choreonoid/thirdparty/eigen3
  • /choreonoid
ファイルシステム
  • /usr/include/qt4
  • /usr/include/pcl-1.3

等がある。

ビルドの設定

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 プラグイン解説

GripperManipulationプラグインはパラレルグリッパを持つロボットに対してピックアンドプレースの動作計画を行うプラグインです。把持計画手法についてはパラレルグリッパに特化した独自の手法を実装しています。この手法は非常に高速に計算できるの実時間で把持姿勢を求めることが出来ます。また、バウンディングボックスを用いないため複雑な形状の対象物にも比較的容易に適用できます。

基本情報

  • プラグイン名: GripperManipulation
  • 依存プラグイン: Grasp
  • 対応しているロボット: PA10, HIRO

プランナバー

本プラグインを導入すると、プランナバーのStartボタンを押すとGraspプラグインの把持計画が実行されるのではなく、GripperManipulationプラグインの把持計画が実行されるようになります。また、本プラグインを新たに導入するとINTENTIONバーが現れます。このバーは把持対象物の部位を指定するインテンションパラメータを指定するものです。

インストール方法・使用方法

アルゴリズム

下記文献[1]には、把持計画アルゴリズムのうち、非実時間部と実時間部の両方が記述してありますが、本プラグインではその実時間部を実装しています。非実時間部はGeometryHandlerという公開バージョンには含まれていないプラグインを使います。(追記予定)

References

[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.

GripperManipulation プラグインを RT コンポーネントに改造する

Choreonoid/extPlugin/graspPlugin/GripperManipulation というプラグインに、RTコンポーネントの「口」を取り付ける。

オリジナルの GripperManipulation について

双腕ロボットの把持計画を行う graspPlugin プラグインであり、ファイル構成は以下のようになっている。

  • CMakeLists.txt cmake 定義ファイル
  • GripperManipulationMain.cpp Choreonoidプラグイン ManipPlugin クラスのソース
  • ManipBar.cpp Choreonoid ツールバー ManipBar クラスのソース
  • ManipBar.h Choreonoid ツールバー ManipBar クラスのヘッダ
  • ManipController.cpp 把持計画コントローラ ManipController クラスのソース
  • ManipController.h 把持計画コントローラ ManipController クラスのヘッダ
  • PRM 把持計画データファイルのディレクトリ

ここで、プログラムの構造がわかりやすいよう、GripperManipulationMain.cpp を、ManipPlugin.cpp にリネームする。
合わせて CMakeLists.txt も修正して、コンパイルできることを確認する。

RTC BuilderでRTコンポーネントのスケルトンを作成する

下準備として、まず GripperManipulation の下に rtcディレクトリを作成し、ここに GraspController.idl を置く。

さらに、Eclipse を起動し、このrtc ディレクトリにダミーの新規 Eclipse プロジェクトを設定する。
ウィザード選択では「C++ Project」を選び、各項目を以下のように設定する。
  • プロジェクト名 GraspControllerRTC
  • ロケーション /home/asahi/workspace(*注)/Choreonoid/extplugin/graspPlugin/GripperManipulation/rtc
  • Project type: Executable - Empty Project

(*注) 本文では作業ディレクトリを /home/asahi/workspace として進めているので、読者はこの部分を自分の作業ディレクトリに置き換えて読むこと。

NewCppProject.png
GripperManipulationRtcWizard.png

完了ボタンを押すと、C++ パースペクティブを開きますか? というダイアログが出るが、そのまま閉じればよい。

これで下準備は完了したので、Eclipse で RTC Builder パースペクティブを開く。
RTのアイコンをクリックすると、RtcBuilder ビューが開くので、タブごとに必要な情報を設定していく。
RTCBuilder_0.png

「基本」タブ

  • モジュール名 GripperManipulation
  • モジュール概要 Gripper Manipulation
  • ベンダ名 AIST
  • モジュールカテゴリ TestInterface
  • Output Project GripperManipulationRTC (先に作成したプロジェクトを選択する)

その他の項目はデフォルトのままでよい。
RTCBuilder-GripperManipulation.png

「言語・環境」タブ

C++を選択する。

「サービスポート」タブ

Add Port ボタンを押す。
sv_nameというポートができるので、マウスでクリックして右側にプロファイル設定画面を表示する。
ポート名をPlanStartPortに設定して、今度はAdd Interfaceボタンを押し、新しくできたインターフェースに以下の情報を設定する。
PlanStart.png
  • インターフェース名 PlanStart
  • 方向 Required
  • IDLファイル /home/asahi/workspace/Choreonoid/extplugin/graspPlugin/GripperManipulation/rtc/GraspController.idl
  • インターフェース型 GraspPlanStart(選択項目)
  • IDLパス /home/asahi/workspace/Choreonoid/extplugin/graspPlugin/GripperManipulation/rtc/
同じように、ポート ResultPort とインターフェース Result を作成する。
  • インターフェース名 Result
  • 方向 Provided
  • IDLファイル /home/asahi/workspace/Choreonoid/extplugin/graspPlugin/GripperManipulation/rtc/GraspController.idl
  • インターフェース型 GraspPlanResult
  • IDLパス /home/asahi/workspace/Choreonoid/extplugin/graspPlugin/GripperManipulation/rtc/

コード生成

以上で RTC Builder の設定は完了である。
再び基本タブを開き、コード生成ボタンを押すと、Choreonoid/extPlugin/graspPlugin/GripperManipulation/rtc に、以下のファイルが作られる。
  • GraspControllerSVC_impl.cpp
  • GraspControllerSVC_impl.h
  • GripperManipulation.conf
  • GripperManipulation.cpp
  • GripperManipulation.h
  • GripperManipulationComp.cpp
  • GripperManipulationComp_vc8.vcproj
  • GripperManipulationComp_vc9.vcproj
  • GripperManipulation_vc8.sln
  • GripperManipulation_vc8.vcproj
  • GripperManipulation_vc9.sln
  • GripperManipulation_vc9.vcproj
  • Makefile.GripperManipulation
  • RTC.xml
  • copyprops.bat
  • user_config.vsprops

画面の指示にしたがって C++パースペクティブに切り替える。

このとき 一緒に保存されている RTC.xml に、一連の設定が保存されている。
RTコンポーネントの設定を変更する時は、RTC Builderの基本タブの中にある、プロファイルのインポート機能で、この設定を呼び戻すことができる。

rtc をコンパイルする

端末を開いて GripperManipulation/rtc ディレクトリに移って、以下のコマンドを実行する。

 % omniidl -bcxx GraspController.idl

GraspController.hh と GraspControllerSK.cc が生成される。
続いて、make を実行する。Makefile を指定する必要がある。
 % make -f Makefile.GripperManipulation

これによって、GraspControllerSkel.cpp, GraspControllerStub.cpp, GraspControllerSkel.h, GraspControllerStub.h が生成される。
(コンパイルは通らないが、そのまま進める)

Choreonoid プラグインとRTコンポーネントの橋渡しクラスを作成する

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

として GripperManipulation のリビジョン131をチェックアウトしたあと、RTC Builderの設定を行い、ManipRtc.h(cpp) を作成したところで、パッチファイル GripperManipulation_patch.txt をダウンロードし、
 % patch -p0 < GripperManipulation_patch.txt

上のコマンドを実行すると、変更点が一度に適用されるので、ただちにビルドを行える。

以下は、パッチファイルの変更点の概要である。

ManipRtc.h(cpp)

クラス名を ManipRtc に変更する。(Eclipseのリファクタリング機能が便利だが、誤って元のGraspConsumer まで変更しないよう、注意!)

  • GraspConsumer.h をインクルードしている部分を、rtc下のGraspController.hh と GripperManipulation.hに変更する。
  • comp の型を、GraspConsumer *から、::GripperManipulation * に変更する。
  • graspPlanResult の引数で、 const GraspPlanResult となっている部分をすべて::GraspPlanResult に変更する。
  • ついでに、インクルードガードの識別子をヘッダ名と合わせて MANIPRTC_H とする。

ManipPlugin.cpp

ManipPlugin::initialize メソッドに、RTコンポーネントをスタートさせるコードを追加する。

    virtual bool initialize() {
      //Robotics::SceneBodyManager* manager = Robotics::SceneBodyManager::instance();
        grasp::GraspController::instance(ManipController::instance());
        ManipRtc::instance()->RtcStart();
        //manage(manager->addSceneBodyFactory(create));

rtc/GripperManipulation.h

grasp::ManipRtc クラスを、GripperManipulation のフレンドクラスに設定する。

 using namespace RTC;

 namespace  grasp {
    class ManipRtc;
 }
 
 ...
 
 class GripperManipulation
  : public RTC::DataFlowComponentBase
 {
 public:
  friend class grasp::ManipRtc;

rtc/GraspControlerSVC_impl.cpp/h

RTCBuilderはIDLデータ型の引数をCORBAとして出力するが、omniidlは同じものを::CORBAとして出力するため、型が異なるとコンパイラがエラーを出してしまう。
そこで、omniidlの出力に合わせて、CORBAネームスペースの型の引数の宣言を、::CORBA に書き換える。
また、GraspPlanResultSVC_impl クラスのメソッドの引数について、GraspPlanStart ネームスペースの型の引数宣言を GraspPlanResult に書き換える。(これはRTCBuilder のバグか)

CMakeLists.txt

  • set(rtc-dir ./rtc) を追加
  • include_directories(${rtc-dir}) を追加
  • sources に ManipRtc.cpp, ${rtc-dir}/GraspControllerSVC_impl.cpp, ${rtc-dir}/GripperManipulation.cpp, ${rtc-dir}/GraspControllerSkel.cpp を追加。
  • headers に ManipRtc.h, ${rtc-dir}/GraspController.hh, ${rtc-dir}/GraspControllerSVC_impl.h, ${rtc-dir}/GripperManipulation.h, ${rtc-dir}/GraspControllerSkel.h, ${rtc-dir}/GraspControllerStub.h を追加。
  • add_definitions に -fPIC -O2 -I/usr/include -I/usr/include/rtm/idl -I. を追加。
  • target_link_libraries に uuid dl pthread omniORB4 omnithread omniDynamic4 RTC coil を追加。
  • if(UNIX)と、対になるelseif(MSVC)~endif(UNIX)までの行を削除。

ビルドと動作確認

初めの一回は、Choreonoid ディレクトリで ccmake を実行する。

 % ccmake .

GRASP_PLUGINS に GripperManipulation を追加して、configure と generate を実行すると、Makefile が作成される。
make して、lib/choreonoid-0.9/libCnoidGripperManipulationPlugin.so が無事にビルドされたら、動作確認を行う。

Choreonoid と RT System Editor を起動して、NameServer の127.0.0.1 の(ホスト名)|host_cxtの下に、GripperManipulation0|rtc があることを確認する。
これを System Diagram 上にドラッグ&ドロップできれば成功である。
SystemDiagram_0.png
(ただし、これを他の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における手首の力センサを仮定する場合

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 から Choreonoid 1.4へのアップデートについて

Choreonoid 1.3から以下の点が変更されています。

干渉チェック
  • .h


 ColdetLinkPairUpdateCheckPtr   ->   cnoid::ColdetLinkPairPtr

  • .cpp


 #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



JointPath の設定


 #include <cnoid/JointPath>



 #ifdef  CNOID_10_11_12_13
    fing_path = body->getJointPath(palm, tip);
 #else
    fing_path = make_shared< JointPath >(palm, tip);
 #endif


ItemList関連


 #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


LinkやJointクラスのメンバ変数名


pがp()に変更
RがR()に変更
qがq()に変更