eSEAT2
Simple Wiki Based Contents Management System
ソフトウェア関連 >> RTコンポーネント関連 >> eSEAT2

eSEAT ver.2

eSEAT ver.2 は、OpenHRIで公開していた簡易対話制御コンポーネントと2013年に公開したSUITを融合させたコンポーネントです。
2013年のSI2013で発表したものと異なりますのでご注意下さい。なお、このコンポーネントはOpenHRIに含める予定です。
なお、下記の内容は、trunkブランチの内容になっています。
masterを更新し、下記の内容と同じになりました。これでtrunkブランチの方が古くなっています。
公開してずいぶん経過し、機能も増えましたので、新しいページに移行します。

eSEAT Ver.1からの拡張ポイント

今回開発したeSEATは、基本的に以前のseatmlで記述したスクリプトファイルも読み込むことが出来るようしていますが、スキーマのタグ名と実現している機能とのギャップが大きくなって来ましたので書き直しをしています。
その他に、データポートで使えるデータ型の拡張、scriptタグで記入していたpythonのコードを外部ファイルで指定可能にしたり、SUITコンポーネントのように簡易な入力パネルの生成機能の統合を行っています。
以前のバージョンでは、ruleタグのkeyに対したボタンの自動生成機能を実装していたのですが、この機能はマルチスレッド対応のmtTkinterという外部ライブラリに依していましたので、安定性、ライセンス等の理由でこの機能を削除しました。今後の改修で復活するかもしれませんが、どうしても利用されたい場合はお問い合わせください。
以下に、今回の改変ポイントを列挙します。
  • 入出力データポートのデータ型の拡張(OpenRTM-aistで標準にサポートしている全ての型への対応。独自データ型については未確認ですが可能だと思います。)
  • scriptタグのpythonコードを外部ファイルで指定可能。(この機能はeSEATの内部ではexefile関数コールで実装しています。そのため、対応するスクリプトがコールされる時に毎回評価されることになりますのでコンポーネントの動作中にファイルを書き換えるとコンポーネントの振る舞いも変更されますのでご注意下さい。)スクリプト内部では、データポートから来たデータは、rtc_in_dataという大域変数に自動的に格納されます。また、スクリプトで処理したデータを出力データポートから送信したい場合は、rtc_resultに代入することでスクリプト実行終了後に送信されます。
  • SUITコンポーネントで実装していた簡易GUI作成機能の統合のため'button,label,brk,spaceの追加と新たに一行入力のためのinputタグと文字列の出力用のtextタグを追加しています。下のようなGUIパネルを生成することができます。

  • スキーマの変更。SEATMLを最初に作成した時と現在の実装がかけ離れて来ました。そのため、SEATMLのスキーマを変更することにしました。今の実装では、以前のスキーマも読み込めるようにはしていますが将来的にはなくすつもりです。 現在のリポジトリ(trunk)では、agent, commandのタグは使用できなくなりました。
    • 変更されるタグ
      • agentadaptor
      • commandmessage
  • Webアダプターを追加しました(2015-08-10)。この機能は、RTM-REST-APIと似たような機能を提供します。すなわち、これは、eSEATに簡単なCOMET機能をもつWebサーバーを実装したものであり、デフォルトでは、eSEATの起動ディレクトリの下の'html'というディレクトリをドキュメントルートとして動作しています。また、Webアダプタでは、簡単なCOMETインターフェースを実装していますので、PUSH配信可能になっています。Javascriptのコードを独自に実装することで、Webブラウザへコンポーネントの情報の出力、Webブラウザから情報の入力などが可能です。
    詳細は、Webアダプターについてを参照してください。
  • 周期実行のタスク記述ができるように変更しました。(2015-08-19)これによってeSEATのonEecuteで実行するスクリプト定義をseatmlで行うことができますので、ロボットコントローラの実装をしやすくしています。
  • データポートからの入力またはGUIのイベントが一定時間発生していない場合に、実行するスクリプトをseatmlで定義できるようになりました。(2017-11-22)この機能を用いると一定時間何も入力がない場合に、状態遷移を起こしたり、データポートやサービスポート経由で外部コンポーネントにイベントや情報を送信することができます。このタイムアウトは、サービスポートの呼出し時には、リセットされませんが、実装クラスのメソッド内に self.seat.resetTimer() と追記することでタイマーのリセットを行うことができます。
  • ROSノードとして動作するようになりました。PublisherとSubscriberを定義することができます。この機能によりRTMとROSノードとのブリッジも簡単に実現可能です。また、ROSノードのデータ変換としても動作させることができます。(2018-10-11追加) 2018-10-12 ROS Serviceへの対応を行いました。
  • GUI部品として、Combobox, Checkbutton, Radiobutton, Listbox, Scaleの追加し、OpenRTM-aistなしでも動作するように、core.Managerを実装。
  • GUI部品に、FrameとLabelFrameを追加しました。いくつかのバグフィックスを行い、core.Managerの動作が安定しました。

開発言語

eSEATは、Python2.7.13上で開発しています。現在(2017-11)は、OpenRTM-aist-1.1.2-RELASEを用いています。
また、下記のパッケージを使用していますので、ソースコードを用いて実行させる場合には、各サイトからダウンロードし、インストール後、実行してください。
必要なパッケージ
  • OpenRTM-aist-1.1.2-RLEASE(インストーラからインストールすることができます)
  • lxmlおよびBeautifulSoup:
    • 現在は、pipコマンドで簡単にインストールすることができます。
$ pip install beautifulsoup4
$ pip install lxml
また、eSEATをWindowsの実行ファイルに変換したい場合には、下記のパッケージもインストールする必要があります。

使用方法

eSEATの起動オプションは、ほぼSEATと同じです。
 python.exe eSEAT.py <seatml file>
とすれば、指定したスクリプトファイルを読み込みコンポーネントが起動します。また、eSEATコンポーネントのネームサーバーへの登録名を変更したい場合には、"-n"オプションを使うと便利です。
 python.exe eSEAT.py -n eSEAT1 sample.seatml
上記のように起動させると、sample.seatml の定義をお読み込んだコンポーネントが、eSEAT1という名前で起動します。このオプションを使うことで、複数のeSEATコンポーネントを同じシステムで利用することができます。

ライセンス

OpenHRIに含まれているSEATは、EPL-1.0で配布しておりましたが、eSEATは、MITライセンスでの配布に変更しております。

eSEATのスクリプト

eSEATでは、SEATと同じようにseatmlの拡張しをもったXMLのファイルをスクリプトファイルとして用います。現在のところ、オリジナルのSEATで定義していたタグも使えるようになっており、今まで作成したSEATのスクリプトファイルをそのまま利用することが可能です。(まだ、すべてを確認したわけではありませんが)
eSEAT用のスクリプトファイルで利用可能なタグ、属性に関しては、こちらの
を参照してください。
eSEATスクリプトは、独自のスキーマが定義されたXMLファイルです。そのため、下記のような文書構造になっています。
  <?xml version="1.0" encoding="UTF-8" ?>
  <seatml>
    <general>
      - データポートの定義
      - preload scripts
    </general>
    <state name="st1">
      - ruleの定義
      - GUI部品の定義
    </state>
    <state name="st2">
        ...
        ...
    </state>
       ....
       ....
  </seatml>
eSEATのスクリプトの具体的な記述方法については、以下の例を参考にしてください。

バグ? いえいえ、仕様です

eSEATは、GUIと統合したためにいくつかの制限がある。実は、GUIを定義した時にイベントハンドリングによっては、セグメンテ違反が起こる可能性があります。
これは、TEXTやEntryの場合にデフォルトでキーボード入力によるイベントハンドリングが定義されており、入力ポートからのデータでTEXTやEntryの変更ができるようにしていると、eSEATが強制終了する場合があります。
これは、PythonのTkinterの仕様によるものなので、eSEATでは対処が難しい状況です。対処方法としては、TEXTやEntryを使う場合に、キー入力をなるべく行いわないようにしてください。(ただし、入力ポートからのデータで書き換えなどを行っていない場合は大丈夫のようです)

変更履歴

  • 2014/07/09 MLに公開のアナウンス
  • 2014/07/10 状態遷移時に実行するはずのコマンドが実行されないバグを修正
  • 2014/07/18 TimedXXSeqの型の出力ポート利用時にエラーがでて送信できないバグを修正
  • 2014/07/23 ボタンの色を変更するメソッドの追加とMutex Lockの追加。
  • 2014/07/23 seatml.xsd があるディレクトリをSEAT_ROOTで設定できるように修正
  • 2014/07/23 eSEATバイナリ版でrtc_handleが使えるように修正
  • 2014/07/24 独自データ型の入出力ポート生成時のバグを修正, Label、Buttonの色変更を実装とアクセス方法の変更
  • 2014/07/29 GUI以外のイベントで状態遷移するときのバグを修正
  • 2014/07/30 Mutex Lockを付けたことによるデッドロックのバグを修正
  • 2014/08/07 JuliusRTCでまったく動作していなかったバグの修正
  • 2015/07/24 WebAdaptorの追加
  • 2015/08/17 ruleタグで外部seatmlファイルの包含機能を追加、onExecuteの実装のために<onexec>タグの追加
  • 2015/08/19 eSEATのクラス構造の見直しで、RTMの依存部分の切り離し
  • 2017/11/12 サービスポートへの対応
  • 2017/11/20 内部のコマンドの表現を見直し、TaskGroupクラス等を導入。trunkブランチにアップ
  • 2017/11/22 ontimeoutタグを新規に導入(Branch: trunkのみ)
  • 2018/04/27 onactivated, ondeactivatedタグを新規に導入(Branch: trunkのみ)
  • 2018/10/11 ROSノードの機能追加。PublisherとSubscriber機能を追加(Branch: v3aのみ)
  • 2018/10/19 Githubのmasterとv3aをマージ
  • 2018/10/23 GUI部品の追加。OpenRTM-aistなしで動作するようにcore.Manager等を実装
  • 2018/10/24 GUI部品としてFrameとLabelFrameを追加。Githubのブランチ v3aの削除(masterに統合)
    
    

資料