rtc_handleを使ったRTCの操作パネル例
eSEATの外部スクリプト読み込み機能とrtc_handleを活用して、RTCの操作を行うコンポーネントを作成してみます。
rtc_handleとは
rtc_handleは、国立大学法人 電気通信大学 大学院 情報システム学研究科の末廣尚士 教授によって開発されたOpenRTM-aistの操作ツールです。Pythonにより実装されており、NameingServiceの操作、既存のRTCの操作などをインタラクティブに操作することができます。これと似たようなツールとしてrtshellがありますが、rtc_handleの方が使える機能が限定されていますが、コンパクトでさまざまなツールに取り込んで利用できます。
この例では、rtc_handleを少し改造し、拡張しユーティリティを合わせて使うことで、RTCの操作を行うGUIパネルをeSEATで作成していきます。
目標とするGUIパネルと機能
この例で実現する機能は、簡単なRTCの操作(NomingServerから一覧の取得、RTCの有効化、無効化、RTC間の接続の生成と削除など)とします。また、eSEATで利用可能なGUIアイテムはボタンまたはテキスト入力に限られるので、操作対象のRTCは、テキスト入力で指定することを基本としておきます。
そこで、作成するGUIパネルは下図のようにします。
このように基本的に、コマンド入力のinput要素、情報出力のtext要素、簡易コマンド入力用のbutton要素で構成しましよう。
rtc_handleの拡張
現在、公開されているrtc_handleでは、上述の機能を実現するには、多少の不具合が存在していたので、修正と使い勝手の向上のためにいくつかの関数定義を追加します。
追加した関数定義等は、rtc_handle_tool.pyとしてeSEATスクリプトと同じディレクトリに置いておきます。
修正したrtc_handleと今回拡張を行ったPythonスクリプトは、このページの添付資料としています。
ひな形の作成とrtc_handleの読込
他の例と同じようにeSEATスクリプトのひな形の作成と今回利用するrtc_handleの読み込みの設定を行います。
rtc_handle等のライブラリとして利用するPythonスクリプトの場合には、general要素の中のscript要素で指定します。script要素は通常テキスト要素にPythonのコードを直接記述しますがライブラリ等の外部ファイルを指定したい場合には、execfile属性を用います。
<?xml version="1.0" encoding="UTF-8"?> <seatml> <general name="guicommand"> <adaptor name="str_out" type="rtcout" datatype="TimedString" /> <adaptor name="str_in" type="rtcin" datatype="TimedString" /> <script execfile="rtc_handle/rtc_handle.py" /> <script execfile="rtc_handle_tool.py" /> </general> </seatml>
GUIアイテムの追加
次に前述のGUIパネルの構成に従って、GUIアイテムを追加していきます。上述ように基本的に、作成するGUIパネルは、
- コマンド入力のinput要素
- 情報出力のtext要素
- 簡易コマンド入力用のbutton要素になります。
button要素に関しては、よく使うコマンド(RTCの一覧、RTC間のコネクション操作、RTCの状態操作)を追加していきたいと思います。
<label text="Input:" /> <input id="in1" width="50" colspan="3"></input> <brk /> <text id="in2" width="70" height="25" colspan="4" /> <brk /> <label text="This RTC:" /> <button label="portInfo" ></button> <button label="DisconnectAll" ></button> <brk /> <label text="RtcHandle:" /> <button label="getRtcList" ></button> <button label="showPort" ></button> <brk /> <label text="For connection:" /> <button label="connect" ></button> <button label="disconnect" ></button> <brk /> <label text="For component:" /> <button label="activate" ></button> <button label="deactivate" ></button> <button label="exit" ></button> <brk /> <label text="Misc:" /> <button label="println" ></button> <button label="clear" ></button>
ここまでのSEATMLでeSEATを起動するとGUIパネルは下図のようになります。
コマンド要素の追加
基本的なGUIパネルの作成の次に、各GUIアイテムの要素に対応するコマンド要素を追加していきます。今回のような、Pythonスクリプトの操作パネルを実現する場合には、そのほとんどがscript要素になります。button要素に対応するコマンドは、対象となるRTCまたはRTC群を実行時に指定するために、input要素を利用して実装していきたいと思います。
上記の場合、input要素には"in1"、text要素には、"in2"という識別子を持たせていますので、inputの要素の内容を参照するには、getTextメソッドを利用します。またtext要素への文字列出力には、appendTextメソッドを利用してください。
seatml内では、input, text, label, buttonの要素には、stateの識別子+":"を付加するように変更しました。(2014/07/24)
例えば、上記のGUIパネルのinput要素の中身をtext要素にコピーするには、
seat.appendText("main_mode:in2", seat.getText("main_mode:in1") + "\n")
となります。
rtc_handles_toolに定義された関数群
rtc_handleをより簡単に利用するためにrtc_handle_tool.pyには下記のような関数群を定義しています。
- get_handle_list()
- eSEATのORBを利用してRtmEnvを初期化し、localhostのNamingServiceからRTCの一覧を取得します。
- get_port_info(name)
- nameのRTCのポート名を取得します。
- connect_ports(path1, path2)
- path1, path2のポートを接続します。pathは、”RTC名:ポート名”の書式であることを仮定しています。
- disconnect_ports(path1, path2)
- path1, path2のポートの接続を削除します。
- activate_rtcs(pathes)
- pathesのRTCを有効化します。pathesの書式ですが、基本的にはRTC名を","で区切って並べた文字列です。ポートの接続時に使った書式でも有効にしています。
- deactivate(pathes)
- pathesのRTCを無効化します。
- exit_rtcs(pathes)
- pathesのRTCを終了させます。
SEATMLの最終確認と動作の検証
上述の関数群を使って、RTCを操作するGUIパネルを持つSEATMLスクリプトを作成します。作成したSEATMLスクリプトは、このページの添付資料としていますので、詳細は中身を確認してください。
コードを見ていただければわかると思いますが、GUIパネルはコマンド要素のほとんどがbutton要素の子要素となっていますので、eSEATを有効化していなくても対応するコマンドが実行されますので気を付けてください。
また、このGUIパネルを拡張することで、任意のRTCのconfigurationパラメータの変更もすることが可能になります。
このページの添付資料となっているSEATMLスクリプトをダウンロードして確認してみてください。
資料