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をコンパイルしたコードがあると仮定しています。