Choreonoid用OpenRTM連携プラグイン Python版
Choreonoid用OpenRTM連携プラグイン Python版
Post date:
Mon, 2017-10-30 15:42
概要・特徴
- ChoreonoidとOpenRTM-aistの連携プラグインPython版
- Pythonで作成したRTCによりシミュレータ上のロボットと連携
- Choreonoid標準で実装されているC++版プラグインと比較すると、開発環境の構築やコンパイルの手間が激減
- RTCの処理を実行中に変更するPythonエディタ
- RTCを再起動することなく、編集したソースコードの内容が反映される
- RTCのランチャー表示機能
- 起動可能なRTC一覧をChoreonoid上で表示
- ボタン1つでRTCを起動
- 73種類のサンプルコンポーネントを同梱
- Pythonで作成したRTCによりシミュレータ上のロボットと連携
仕様
- 言語: Python、C++
- OS: Windows 8.1、Windows 10、Ubuntu 14.04、Ubuntu 16.04
- RTミドルウェア:OpenRTM-aist-1.2.0(開発版)
ソースコードおよびマニュアル
概要スライド
ライセンス
- LGPL
問合先(メールアドレス):
n-miyamoto<at>aist.go.jp
Last modified:
Sun, 2017-12-03 18:59
Comments
Windows版のバイナリをダウンロードしましたが、私の環境では、そのままでは動作しませんでした。(起動まで行きますが、何も表示されずにプロセスが終了しています)PYTHONHOMEの設定またはChorenoidをQt5でビルドすると一部のWindowsでは動作しないことがありますので、そのあたりのバグだと思います。ここで使用しているPYTHONのバージョンは何でしょうか?
Pythonは2.7.13(64bit)、Qtは5.8です。
同じようにプロセスが終了する環境があったので、Pythonプラグインを起動時にロードせずに手動でロードしてみたところロードした瞬間に終了しました。 この環境ではPython 3.6をインストールしていたようなので、それが原因かもしれません。
ご回答ありがとうございます。そのような状況でしたら、環境変数のPYTHONHOMEを設定すれば問題ないと思います。これは、Py_Initialize関数の呼び出し時に、PYTHONのライブラリの場所が不明な場合に、FATAL ERRORになるのが原因です。本来は、PYTHONHOME等があるかどうかを確認して、プラグインをロードするかどうかを判断するルーチンがないためです。新しいバージョンでは、警告を表示し、プラグインがロードできないようになると思います。(私の修正が反映されればですが)
貴重な情報を教えていただいてありがとうございます。マニュアルに記載したいと思います。
ただPythonだけではなくOpenRTMプラグインのロードに失敗する環境もあるようです。 OpenRTMロード時に「必要なプラグインが見つからないため、OpenRTMプラグインの初期化ができません」と表示されます。Choreonoid起動時にOpenRTMプラグインを読み込んだ場合は何も表示されずにプロセスが終了します。 こちらの問題については調査したいと思います。
PYTHONHOMEをセットして実行したところ’ImportError: No module named RTC’がでて実行できていません。 パッケージにRTCのフォルダがないためだと思います。
また、OpenRTMの少し古いバージョン(1.1.1)の入っているPythonのHOMEを指定した場合にもPy_Initializeで失敗しいているようです。原因は、古いバージョンのインストーラではomniORBが4.2.0(VC10のDLLが入っています)であるためだと思います。
私の環境では最新版にしていないため(インストールすらしていません)、試すことができませんでした。パッケージ内にRTCを入れる必要があると思います。
RTCはOpenRTM_aist.RTM_IDL.RTCと同じでしょうか? それはあるのですが、Choreonoidでは失敗します。また、import onmiORBも失敗しています(import _omnipy のところで)ので、OpenRTM-aistのインストールが必要なのでしょうか?それだと少し利便性が半減しますが。
RTCのモジュールが見つからない問題ですが、RTCよりOpenRTM_aistを先にインポートすれば解決するようです。現在アップロードしているファイルでは修正済みです。
これはOpenRTM_aistフォルダの__init__.pyでsys.pathにRTM_IDLを追加しているためで、RTM_IDLの中にRTCがあります。
import omniORBの失敗の原因がわかりました。Pythonは64ビット版を使う必要があるのですね。私はうっかり32ビット版を指定していました。申し訳ございません。後程動作確認をさせていただきます。
Python2.7の64bit版のMSIインストーラーを展開したフォルダも同梱して、そこをPYTHONHOMEにすればPythonをインストールしなくても実行できそうに思うのですが、そのように変更したほうがいいですか?
Tankと4本足ロボットのチュートリアルで「新規」のメニューの画像が異なっています。Windows版のバイナリでは、4本足ロボットの方のメニューが出てきますが、どちらも正しいのでしょうか?PyRTCアイテムの表記が PyRTCItemかPyRTCかの違いですが。
四足ロボットに出ている画像が正しい画像です。 Tankのチュートリアルの画像は少し古いので修正します。 ご指摘ありがとうございます。
原因はよく分からないのですが、新規で表示されるアイテムの順番が変わることがあるようです。
4本足ロボットのチュートリアルを行ったのですが、Component Listが出ない場合がありました(しかも2回)。この2回は、ロボットのRTCの子アイテムとして表示されていましたが、3回目では、アイテムツリーのトップにあり、無事にRTCが動作しました。また、EditRTCのところも最初のみ’ImportError: No module named rtc_module’のエラーがでてエディット画面がでませんでした(しかしRTCは起動しています)。サイド行うとエディタが出てきましたので、動作が少し不安定な気がします。アイテムツリーの関係なのでしょうか…。
EditRTCについてはChoreonoidメーリングリストで聞いた方法で修正しました。 ComponentListはcnoid::Viewを継承したクラスで実装しているため、おそらく表示に問題は無いと思います。
rtc_moduleのインポートエラーについてですが、問題が再現できておらず、まだ原因は特定できていません。
画面が出ない現象ですが、そもそもChoreonoidでQWidgetのshow関数を使うのがまずいのかもしれません。 Choreonoidのメーリングリストで聞いてみようと思います。 ComponentListについてはcnoid::Viewを継承したクラスに変更したので正常に表示できるようになった可能性はあります。
rtc_moduleのインポートエラーが出る件ですが、RTCEditorではPythonファイルをTempフォルダに作成して、更新時にロードするようになっています。
もしかしたら上記のファイルパスに日本語が混ざっていた場合にロードできないのかもしれませんが、まだ確認ができていません。