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!