rtcmd:inject
Simple Wiki Based Contents Management System
ソフトウェア関連 >> rtcmd >> rtcmd:inject

inject:指定した入力ポートにデータを送信

書式

inject [オプション] Port [-c Data]

オプション

'-m MODULE'
import MODULEの実行し、外部モジュールをインポートします。
'-n NUM'
NUN回データ送信するまで実行します。
'-p PATH'
モジュールのサーチパスを追加します。sys.pathに設定したパスが追加されます。
'-r RATE'
送信する周期を指定します。単位はHz。デフォルトは、1Hz。
'-t TIMEOUT'
タイムアウトの時間を指定します。[-c Data]が省略され対話入力モードの場合には無効になります。
'--seat'
eSEATと同じように簡易入力モードになります。

概要

指定した入力ポートに対して、データを送信します。
デフォルトでは、''-c Data'' の形でデータを指定した場合には、1回のデータ送信で終了します。
データが指定されなかった場合には、対話モードで ''Ctrl-D''が押下されるまで連続的にデータ入力が可能です。
すなわち、[-c Data]を指定した場合には「連続入力モード」、省略した場合には、「対話入力モード」となります。
''連続入力モードの場合:''
連続入力モードの場合には、 '' '-c' '' の後に続く文字列を入力データとして処理を行います。このモードの時には、'' '-t'オプション''を指定した場合には、'' '-n'オプション''は無視されることになります。連続モードの繰り返しの周期は、'' '-r'オプション''で指定することができます。
このモードでは、injectのコマンドを与えるときに送信データを指定しますので、多くの場合、Time以外のデータは同じデータが入力されることになります。
rtcmdの内部で送信データをevalで評価していますので、単純な数式をデータとして入力することが可能になります。また、デフォルトでは rtinjectと同じように Timeの構造体に対して '{time}' を指定して現在の時刻を入力することが可能です。
''--seat''オプションを設定すると、eSEATで使用しているようにBasicDataTypeの多くの型に対して、簡易入力を行うことができます。例えば、RTC::TimedStringの場合には、単に文字列を入力するとRTC::TimedString.dataに文字列を格納し、Timeには、現在時刻を入力して送信します。
また、'' '--seat'オプション''を使わない場合には、入力された文字列を評価して、送信しますので、日本語(2バイトコードを含む)の文字列を使う場合には注意が必要です。
これは、Python3以降では、文字列の取り扱いが変更になったため、送信時には、''data.encode().decode('unicode_escape')'' のような変換が必要になります。
また、受信時には、''data.encode('raw-unicode-escape').decode()'' の変換が必要になることに注意してください。
''対話入力モードの場合:''
対話入力モードでは、''"inject ==> "''というプロンプトが表示され、標準入力からデータを入力することができます。対話入力モードでは、'' '-r'オプション''と'' '-t’オプション''は無視されます。

実行例

OpenRTM-aistを標準インストトールされるConsoleOutへデータを送る

 $ rtcmd inject %h.host_cxt/ConsoleOut0.rtc:in
このように出力データポートを指定すると対話入力モードになり。stdinからの値を ConsoleOut0.rtc の in ポートに送ります。rtcmdでは、RTC名の指定に、rtc.confのname formatで使用している %h.host_cxt を使用するとrtcmdを実行しているホスト名に置き換えるようになっています。
$ rtcmd inject %h.host_cxt/ConsoleOut0.rtc:in -c RTC.TimedLong({time}, 42)
この例では、42 と現在の時刻を consoleout0.rtc の in ポートに送ります。必要に応じて、「'」または「”」でステートメントを保護してください。
$ rtcmd inject  %h.host_cxt/ConsoleOut0.rtc:in -c  RTC.TimedLong(RTC.Time(1, 0), 42)
この例では、42 とタイムスタンプを1秒として ConsoleOut0.rtc の in ポートに送ります。
$ rtcmd inject  %h.host_cxt/ConsoleOut0.rtc:in -n 5
この例では、対話入力モードになり、stdinからの値を5回 ConsoleOut0.rtc の in ポートに送ります。
$ rtcmd inject  %h.host_cxt/ConsoleOut0.rtc:in -n 5 -c  RTC.TimedLong({time}, 42)
この例では、42 と現在の時刻を Consoleout0.rtc の in ポートに5回送ります。
$ rtcmd inject %h.host_cxt/ConsoleOut0.rtc:in -t 5 -r 10 -c  RTC.TimedLong({time}, 42)
この例では、42 と現在の時刻を10Hzで Consoleout0.rtc の in ポートに5秒間送ります。
rtcmdでは、データを送信する直前に、その文字列を評価していますので、下記のような記述も可能です。
$ rtcmd inject %h.host_cxt/ConsoleOut0.rtc:in -m random -n 5 -r 2 -c  RTC.TimedLong({time}, random.randint(0,100))
この例では、0~100の間の乱数と現在の時刻を、2Hzで5回 Consoleout0.rtc の in ポートに5秒間送ります。

新しいデータ型を持つコンポーネントへのデータ送信

injectコマンドでは、新しデータ型を持つ入力データポートへもデータ送信を行うことができます。
#include "BasicDataType.idl"

module MyData
{
  struct TimedStrLong
  {
     RTC::Time tm;
     string name;
     sequence<long> data;
  };

  struct MyVal
  {
      long data;
  };
};
上記のような内容を持つMyData.idlファイルに定義された TimedStrLongをデータ型の入力ポート mydata_in をもつコンポーネント SimpleIO.rtcがある場合、下のように入力することができます。
$ rtcmd inject SimpleIO.rtc:in  -c  MyData.TimedStrLong({time}, "hara", [1,2,3])
ここでは、MyDataのモジュールが、PYTHONPATHに記載されているパス内にある場合には、自動的にimportされます。
PYTHONPATHに記載されたパスにモジュールがない場合には、-pオプションを使います。
$ rtcmd inject SimpleIO.rtc:mydata_in -p C:\work\rtm -c  MyData.TimedStrLong({time}, "hara", [1,2,3])
この例では、C:\work\rtm にMyData.idlをコンパイルしたコードがあると仮定しています。