PythonによるRTコンポーネント講座(その4)

コンポーネント間の通信


コンポーネント間で通信をします。アウトポートを持つコンポーネントが読み込んだ文字を、
インポート側で表示します。サンプルプログラムはここ
C:\Python24\Lib\site-packages\OpenRTM\examples\SimpleIOのプログラムとほぼ同じです。
まず、アウトポートを持つ以下のコンポーネントをTemplateで作ってください。

Programming language selection Python
モジュール定義 Module name ConsoleIn
Module description Console In Component
Module version 0.0.1
Module vender あなたの名前
Module category TEST
Component type DataFlowComponent
Component's activity type PERIODIC
Number of maximum instance 1
OutPort definition 名前 out
タイプ TimedLong
Output directory 適当なフォルダ

例の如く、C++をPythonにした以外はパクッてます
あとは、ソースを書き換えます。まず、onExcute(self, ec_id)のコメント文をはずしてください。そして、

print "Please input number: ",
self._d_out.data = long(sys.stdin.readline())
print "Sending to subscriber: ", self._data.data
self._outOut.write()

と書き込んでください。printは文字を表示します。
sys.stdin.readline()で入力した文字を読み込めます。
self._d_out.dataに入力したデータを格納して、self._outOut.write()でOutportに出力します。

次はインポートを持つコンポーネントを作成します。

Programming language selection Python
モジュール定義 Module name ConsoleOut
Module description Console Out Component
Module version 0.0.1
Module vender あなたの名前
Module category TEST
Component type DataFlowComponent
Component's activity type PERIODIC
Number of maximum instance 1
InPort definition 名前 in
タイプ TimedLong
Output directory 適当なフォルダ

プログラムは、onExecute(self, ec_id)のコメント分を外して、

if self._inIn.isNew():
  inport = self._inIn.read()
  print "Received",inport.data

と書き込みます。self._inIn.isNew()は新たにデータの入力があったかを確認します。あったらTrue、なかったらFalseです。
inport = self._inIn.read()はself._inIn.read()だけではなぜか知りませんけど駄目みたいです。self._inIn.read()でインポートのデータを読み込みます。あとはprintで表示してます。

さて、作ったら前回のようにrtc.confを作ったコンポーネント両方と同じフォルダに入れます。あとは、rtm-naming、Open New System Editorを起動します。
あとは下の矢印のようにエディタに持っていきます。

次に、

というようにConsoleInの端子からドラッグして、ConsoleOutの端子にドロップします。
あとは両方Activateにして、文字を入力してやるだけです。

次回は回覧人数200人突破記念(そのうち150人ぐらいは自分で学校のパソコンから再読み込みしまくって人数増やした)、pyODEのコンポーネント化をやります。


PythonによるRTコンポーネント講座に戻る

トップページへ戻る