ここでは、双腕ロボットNextage OPENをOpenRTMベースで制御する一つの手法について説明します。graspPlugin for ChoreonoidのRobotInterfaceプラグインからコマンドを送ることができるため、graspPluginと共に説明します。
ソースは
https://github.com/kensuke-harada/hironx-interface
ならびに
graspPlugin/RobotInterface/Nextage/NextageInterface
以下にあります。ここでは、githubから~/HiroNXInterfaceにクローンした場合を想定します。
HiroNXProvider と HiroNXGUI
HIRO上で HiroNXProvider を動作させることで、Choreonoid からの把持計画の送信と、HiroNXGUI からの起動/終了ができます。
Choreonoid で作成した動作を HiroNXProvider に送信することで、Nextage が動作します。
Choreonoidをプロジェクトファイルと共に起動します。
% cd ~/src/Choreonoid % bin/choreonoid extplugin/graspPlugin/GripperManipulation/project/worldexpo.cnoid
% rtls localhost/dinobot.host_cxt/ HIROController0.rtc GripperManipulation0.rtc GraspConsumer0.rtc
HiroNXProvider は、Nextage のセットアップやキャリブレーション、サーボのON/OFFやシャットダウン、それに各関節の角度を直接操作するAPIを提供する RT コンポーネントです。
% cd graspPlugin/RobotInterface/NextageInterface/HiroNXProvider % ./HiroNXProvider.py
また、HiroNXProvider は Python で書かれたプロバイダ RTC ですが、実際に使われるインタプリタは hrpsyspy となります。
HiroNXGUI は、HiroNXProvider の提供するAPIを利用して、GUIでHIROを操作するツールです。
また、各関節の角度を直接指定してHIROを操作できます。
% cd ~/HiroNXInterface/HiroNXGUI % ./WxHiroNXGUI.py
HiroNXGUI は、python で動くコンシューマRTCです。
localhost/dinobot.host_cxt/ の下にある、HiroNXGUI0.rtc が利用できるようになります。
HIROController0.rtc, HiroNXProvider0.rtc, HiroNXGUI0.rtc には、二つのサービスポート、HiroNX ポートと HIRO ポートがあります。
HIROController0.rtc <-> HiroNXProvider0.rtc
HiroNXGUI0.rtc <-> HiroNXProvider0.rtc
この組み合わせで HiroNX ポート同士、 HIRO ポート同士をつないで、アクティベートします。
握った手と開いた手のボタンで、ハンドの開閉ができます。
関節操作タブでは、Nextage の左右の腕とハンド、胴体にあるひとつひとつのサーボモータの角度をテキストボックスで設定できます。
すべてのモータの角度の設定が完了したら、Goボタンを押すと Nextage の姿勢が変化します。
Reset ボタンを押すと、すべてのモータの角度が初期姿勢になります。
Ctrl+左クリックでパレットを指定して、=Planner=ツールバーのGraspを押すと把持計画が作成されます。
そこで、=PathPlan=ツールバーのStartを押すと、Nextageの姿勢遷移が作成されます。
アニメーションでNextageの姿勢に問題がないことを確認したら、いよいよデータをNextageに送信します。
=Interface=ツールバーのMoveボタンを押してください。
端末を開いて HiroNXGUI をインストールしたディレクトリに移り、
% ./WxHiroNXGUI.py
HiroNXGUI の持つ HiroNXポートとHIROポートを、EclipseのRTシステムエディタや rtcon コマンド等を使って HiroNXProvider と接続します。
RTシステムエディタで接続する場合
は、上のポート同士、下のポート同士を接続します。(上図では、左上が HiroNXGUI、右下が HiroNXProvider)
% rtcon localhost/vision.host_cxt/HiroNXGUI0.rtc:HIRO localhost/vision.host_cxt/HiroNXProvider0.rtc:HIRO % rtcon localhost/vision.host_cxt/HiroNXGUI0.rtc:HiroNX localhost/vision.host_cxt/HiroNXProvider0.rtc:HiroNX % rtact localhost/vision.host_cxt/HiroNXGUI0.rtc localhost/vision.host_cxt/HiroNXProvider0.rtc
(あらかじめ、パッケージから subversion を導入してください)
リポジトリからチェックアウトします。
% svn co -r 12 https://hironx-interface.googlecode.com/svn/HiroNXInterface/HiroNXGUI/
プログラム本体の WxHiroNXGUI.py は、python で書かれたプログラムです。
python ソースプログラムl/rで左右、open/closeで開閉を示す。
以下のファイルは、開発者が WxFormBuilder で GUI画面 を作成するためのファイル。HiroNXGUI に機能を追加する場合、ほとんどは HiroNX.idl に新しい命令を追加することになるはずです。
ここでは例として、newCommand メソッドを追加してみます。
HiroNXGUI ディレクトリにある HiroNX.idl を直接修正してもかまわないですが、対応するプロバイダRTC(今回は HiroNXProvider )ですでにIDLに命令を追加しているなら、それをコピーする方が早くて間違いがないでしょう。(参照:HiroNXProvider について)
更新したIDL を omniidl でコンパイルします。
% omniidl -bpython HiroNX.idl
wxFormBuilder を立ち上げて、HiroNXGUI.fbp を開きます。
左側のObject Tree ペインの、MyProject1 - MyFrame1- bSizer1 - m_notebook1 - m_system_tab - bSizer3 以下に、新しいボタンを追加します。
新しいボタンの位置ですが、おおむねHIROの起動時に使用するボタン(Set Up Robot, Calibrate Joints, Go Initial Servo ON/OFFなど)は上に、終了時に使用するボタン(Go Off Pose, Shutdown, Reboot など)は下に、配置しています。
今回は Protective Stop と Hand Open の間に配置することにします。
追加するコマンド名が newCommand なので、新しいボタンの name プロパティも「m_newCommand」とします。WxHiroNXGUI.py では、システムタブのボタンについては、ボタン名から m_ を取ったものをコマンドとみなしプロバイダRTCを呼び出す仕組みになっているので、新しいボタンには必ず正しい名前を設定しなくてはなりません。
labelプロパティには任意のラベルを設定できるので、ここでは「新しいコマンド」とします。
ボタンを追加したら、これをもとに HiroNXGUI.xrc を生成します。
File メニューから Generate Code を選んでください。
もちろん、wxFormBuilder を終了するときにセーブするのも忘れずに。
作業はこれで完了です。WxHiroNXGUI.py を起動して、「新しいボタン」をクリックしてみましょう。
% ./WxHiroNXGUI.py ./WxHiroNXGUI.py . comp_args: HiroNXGUI gen HiroNXGUI CommandEvent m_newCommand newCommand RTC not connected.
GitHubに格納されているHiroNXProvider は、双腕ロボット HIRO の制御 PC 上で動作して、HIRO の機能をRTミドルウェアから利用できるようにするRTコンポーネントです。ただし、HIROのソフトウェアは既にサポートされていませんので、NextageOPENを使う場合はgraspPlugin/RobotInterface/Nextage/NextageInterfaceを使います。
端末を開いて HiroNXProvider をインストールしたディレクトリに移り、
% ./HiroNXProvider.py
EclipseのRTシステムエディタや rtcon コマンド等を使って、HiroNXポートとHIROポートを別のRTコンポーネントと接続します。
OpenRTM-aist-Javaが必要です。さらに、HiroNXの場合はJython(2.2以上)が追加で必要になります。
プログラム本体の HiroNXProvider.py は Jython で動くように書かれていますが実機上で使われるインタプリタは /opt/grx/bin/hrpsyspy です。
しかし、開発用の一般のPCでテストを行うときのために、一般の Jython で起動することも可能となっています。
以下に実行例を示します。
% jython HiroNXProvider.py Import failure: rtm Import failure: hrp.simulator Not exists: /opt/grx/HIRONX/share/hrpsys/jar/ Import failure: OpenHRP mymodule init HiroNX_i.init hostname hostname: localhost
この場合、当然ロボット制御命令は実行できませんが、HiroNXProvider は中断せず、コンソールに例外が発生した旨のメッセージを出力して続行します。
localhost setupRobot hostname: localhost localhost can not connect to localhost
Subversion と Java SDK が必要です。
% cd HiroNXProvider
% javac *.java
HiroNXProvider を利用する前に、Hiro のホスト名を .rohothost に設定してください。
付属の .robothost は仮に hiro011 となっていますが、Hiro一台一台に異なるホスト名が割り当てられているので、このままでは HiroNXProvider は動作しません。
HiroNXProvider.py の実行中に、sample.py の createComps メソッドの
rh_svc = OpenHRP.RobotHardwareServiceHelper.narrow(rh.service("service0"))
AttributeError: 'NoneType' object has no attribute 'service'
これで HiroNXProvider.py を実行できるようになります。
HiroNXProvider に機能を追加する場合、ほとんどは HiroNX.idl か、HIROController.idl に新しい命令を追加することになるはずです。
ここでは例として、HiroNX.idl に newCommand メソッドを追加してみます。
Java SDK が必要です。
HiroNX.idl の内容は、以下のようになっています。
interface HiroNX { void setupRobot(); void restart(); void goInitial(); void goOffPose(); void servoOn(); void servoOff(); void calibrateJoint(); void servoOnHands(); void servoOffHands(); void EngageProtectiveStop(); void DisengageProtectiveStop(); void reboot(); void shutdown(); void rhandOpen(); void rhandClose(); void lhandOpen(); void lhandClose(); };
void lhandClose(); void newCommand(); };
% idlj -fall HiroNX.idl
% javac *.java 注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。 注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。
HiroNX_idl_example.py を編集して、 HiroNX_i クラスに newCommand メソッドを実装します。
HiroNX_idl_example.py の末尾付近に、
if __name__ == "__main__":
def lhandClose(self): try: print "lhandClose" gui.lhandClose() except: print sys.exc_info()[0] print sys.exc_info()[1] print traceback.print_tb(sys.exc_info()[2]) def newCommand(self): if __name__ == "__main__": import sys
def newCommand(self): try: print 'newCommand!' except: print sys.exc_info()[0] print sys.exc_info()[1] print traceback.print_tb(sys.exc_info()[2])
別に修正した HiroNXGUI を接続して、newCommand ボタンを押してみます。
GUIで「新しいコマンド」ボタンを押したとき、HiroNXProvider 側の端末で「newCommand!」と表示されれば成功です。
% jython HiroNXProvider.py Import failure: rtm Import failure: hrp.simulator Not exists: /opt/grx/HIRONX/share/hrpsys/jar/ Import failure: OpenHRP mymodule init HiroNX_i.init hostname hostname: localhost newCommand! newCommand!
ChoreonoidからHiroNXProviderを通してHiroNX/Nextageを操作する方法を説明します。
HiroNXProvideはgraspPluginに含まれておらずhrgPlugin内のRobotModels/HIRO/NextageInterface下にあります。
HandManipProvideはhrgPlugin内のRobotModels/HIRO/THK下にあります。
PortDuplicatoはhrgPlugin内のRobotModels/HIRO/ProtDuplicator下にあります。
$ svn co -r 12 https://hironx-interface.googlecode.com/svn/HiroNXInterface/HiroNXGUI/
ROSをインストールしていないときはhttp://wiki.ros.org/hydro/Installation/Ubuntuを参考にインストールを行ってください。
次にHironx/NEXTAGE OPEN APIを以下のコマンドでインストールします。(http://wiki.ros.org/rtmros_nextage/Tutorials/Install%20NEXTAGE%20OPEN%20software%20on%20your%20machine )
$ apt-get install ros-hydro-rtmros-nextage ros-hydro-moveit-ros-visualization ros-hydro-moveit-planners-ompl
# chorenoidのトップディレクトリに移動 $ cd choreonoid $ ccmake .
$ make
http://openrtm.org/openrtm/ja/node/30 を参考にOpenRTPをインストールしてください。
です。
.robotnameにはロボットのRTコンポート名を記述します。(例 RobotHardware0)
.robothostにはロボットのネームサーバのホスト名/IPアドレスとポート番号を指定します。(例 hiro011:15005)
HandManipProviderの設定ファイルを編集します。対象ファイルは”.port”です。
ハンドと接続しているUSBシリアルのデバイスファイル名を記述します。
通常は/dev/ttyUSB0です。
初めに、ロボットを起動します。ロボットのネームサーバの起動前にHiroNXProviderを起動するとロボットとHiroNXProviderが接続できなくなります。
次にHiroNXProvider, HiroNXGUI, HandManipProvider, PortDuplicator, Choreonoidを起動します。
コンポーネント名 | ポート名 | コンポーネント名 | ポート名 |
---|---|---|---|
HiroNXGUI0 | HiroNX | PortDuplicator0 | HiroNX |
HiroNXGUI0 | HIRO | PortDuplicator0 | HIRO |
ArmController0 | HiroNX | PortDuplicator0 | HiroNX |
ArmController0 | HIRO | PortDuplicator0 | HIRO |
PortDuplicator0 | HiroNX0 | HiroNXProvider0 | HiroNX |
PortDuplicator0 | HIRO0 | HiroNXProvider0 | HIRO |
PortDuplicator0 | HiroNX1 | HandManipProvider0 | HiroNX |
PortDuplicator0 | HIRO1 | HandManipProvider0 | HIRO |
AllActiveボタン(図中②)を押しRTコンポーネントをアクティブにします。
以下のコマンドを入力することにより、上記のGUIによる接続と同じRTコンポーネントの接続を実現することができます。
$ source `rospack find openrtm_tools`/scripts/rtshell-setup.sh $ rtcwd /localhost $ rtcon $host/HiroNXGUI0.rtc:HiroNX $host/PortDuplicator0.rtc:HiroNX $ rtcon $host/HiroNXGUI0.rtc:HIRO $host/PortDuplicator0.rtc:HIRO $ rtcon $host/ArmController0.rtc:HiroNX $host/PortDuplicator0.rtc:HiroNX $ rtcon $host/ArmController0.rtc:HIRO $host/PortDuplicator0.rtc:HIRO $ rtcon $host/PortDuplicator0.rtc:HiroNX0 $host/HiroNXPorvider0.rtc:HiroNX $ rtcon $host/PortDuplicator0.rtc:HIRO0 $host/HiroNXProvider0.rtc:HIRO $ rtcon $host/PortDuplicator0.rtc:HiroNX1 $host/HandManipProvider0.rtc:HiroNX $ rtcon $host/PortDuplicator0.rtc:HIRO1 $host/HandManipProvider0.rtc:HIRO $ rtact $host/HiroNXGUI0.rtc $host/HiroNXProvider0.rtc $host/ArmController0.rtc $host/PortDuplicator0.rtc $host/HandManipProvider0.rtc
HiroNXGUIの"Set up Robot"ボタンをクリックし、HiroNXProviderとロボットの接続を行います。
HiroNXGUIの"Calibrate Joints"ボタンをクリックし、キャリブレーションを行います。
HiroNXGUIの"Go Initial"ボタンをクリックし、ロボットを初期姿勢にします。
Choreonoidで動作を生成します。
ChoreonoidのInterfaceツールバーの"Move"ボタンをクリックすると生成した動作をロボットへ送信されロボットが動作します。
HiroNXProvider/HiroNXGUIの動作を実機に接続して試すのではなくシミュレー
ション上で試すには以下の手順を行ないます。
HiroNXProviderの.robothostファイルを以下の内容に書き替えます。
localhost:15005
HiroNX(Robot)0
$ source `rospack find openrtm_tools`/scripts/rtshell-setup.sh $ rtmlaunch hironx_ros_bridge hironx_startup.launch
choreonoidのRobotInterfaceプラグイン等で発行された動作命令をwindowsで処理するスクリプト
hrgPlugin内のRobotModels/HIRO/NextageInterfaceWindowsにあります。
動作にはOpenRTM(http://www.openrtm.org/openrtm/ja/content/openrtm-aist-official-website )が必要です。
・インストール方法
http://www.openrtm.org/openrtm/ja/node/5768 ページ中のパッケージ->WindowsインストーラからpythonとOpenRTMのパッケージをダウンロードします。
(既にpythonがインストールされている場合は、pythonのbitに合わせたOpenRTMをダウンロードします。)
Pythonをインストールし、OpenRTMをインストールします。
・使用方法
1.ネームサーバ起動 : NextagetIntefaceマシン(Windows)
[スタート]->[すべてのプログラム]->[OpenRTM1.1]->[Tools]->[Start Python Naming Service]をクリックしネームサーバが起動します。
2.HiroNXProvider起動 : NextagetIntefaceマシン(Windows)
エクスプローラを起動し、NextageInterfaceWindowsのフォルダへ移動します。HiroNXProvider.pyをダブルクリックし起動します。
3.choreonoid起動 : choreonoid操作マシン(Linux)
choreonoidがインストールされているディレクトリにrtc.confを編集します。(ない場合は作成してください)
corba.nameserversの行に、windowsマシンのIPアドレスを設定してください。
corba.nameservers: "windowsマシンのIPアドレス":2809
ターミナルを立ち上げ、choreonoidがインストールされているディレクトリへ移動し、bin/chorenoidとコマンドを入力choreonoidを起動します。
4.RTコンポーネント接続 : NextagetIntefaceマシン(Windows)
RTコンポーネントの接続はRT System Editor RCPを使用します。基本的な使用方法はhttp://openrtm.org/openrtm/ja/content/rtsystemeditor-110 を参照してください。
[スタート]->[すべてのプログラム]->[OpenRTM1.1]->[Tools]->[RTSystemEditorRCP]をクリックすると、RT System Editor RCPが起動します。
メニューからFile->Open New Sytem EditorをクリックするとSystem Dialogが表示されます。
左側にName Service Viewタブがあります。ネームサーバが正常に起動されていれば127.0.0.1もしくlocalhostのアイテムが表示されているので、その左側の三角形をクリックしツリーをすべて表示します。
HiroNXProverとChoreonoidが正常に起動されていれば、HiroNXProvider0|rtcとArmController0|rtcが表示されます。それぞれをSystem Dialogにドラッグします。
次に下記のポートのペアを接続します。
HiroNXProvider0|rtcのHiroNXポートとArmController0|rtcのHiroNXポート
HiroNXProvider0|rtcのHIROポートとArmController0|rtcのHIROポート
最後にAll Activateボタン(ツールバーの緑の三角形)をクリックしRTコンポーネントをアクティブにします。
5.動作
Choreonoidで動作生成を行い、Interfaceツールバーの"Move"ボタンをクリックすると生成した動作(関節角度等)がWindows上のHiroNXProviderのコマンドプロンプトに表示されます。
linux用(RobotModels/HIRO/NextageInterface)と異なるのはHiroNXManipulator.pyのみです。
HiroNXManipulator.pyにgoInitial等が呼ばれときに表示する処理が記述されていますので、これを所望の処理に変更して使用してください。