[openrtm-users 00249] Re: コンポーネントの初期化に関して

Ando Noriaki n-ando @ aist.go.jp
2007年 11月 9日 (金) 07:46:02 JST


金広様

安藤です

> RTコンポーネントを生成する際に、初期化のパラメータを与えたい場合
> どのようにするのが適当でしょうか?
>
> コンフィギュレーションインタフェースを使うのでしょうか。
> その場合、rtc-templateではコンフィギュレーションインタフェースの初期化は
> onInitialize()で行われるようですが、そうなるとそれ以降、例えば
> onActivate()でパラメータを用いた初期化を行うしかないということでしょうか。

現在のところ、コンポーネントに渡すコンフィギュレーションファイルから、
コンポーネントのPropertyとして渡す方法のみ使えます。

examples/ConfigSampleを例にとって説明します。

1. rtc.confにコンポーネントのコンフィギュレーションファイルを指定します。
---rtc.conf---
   :略
# configsample.conf は任意のファイル名
example.ConfigSample.config_file: configsample.conf
   :略
---------------

2. コンポーネントのコンフィギュレーションファイルに渡したいパラメータを記述します
-----configsample.conf------
user_param.hoge: munya
user_param.fuga: piyo
----------------
値は基本的に何でも構いませんが、キーは予約されているものがあります。
以下のキーは予約されているので使用しないでください。
- implementation_id
- type_name
- description
- version
- vendor
- category
- activity_type
- max_instance
- language
- lang_type
- instance_name
- naming
- conf


3. コンポーネント内ではthis->getProperties()でパラメータを取得できます。
コンストラクタでは値がわたっていませんが、それ以降、例えばonInitialize() 以降
ではいつでも値を取得できます。
たとえば、

ReturnCode_t oInitialize()
{
  :略

  std::cout << this->getProperties();
}

とすると、コンポーネント起動直後に

   :略
- instance_name: ConfigSample0
- user_param
  - hoge: munya
  - fuga: piyo
- naming
  - formats: %n.rtc
  - names: ConfigSample0.rtc
   :略

のように、先ほど指定した値がわたっていることがわかります。

4. パラメータを利用する。
たとえば、

  Properties& prop(this->getProperties());

  // munya が表示される
  std::cout << prop["user_param.hoge"] <<std::endl;

  // piyo が表示される
  std::cout << prop["user_param.fuga"] <<std::endl;

5. コンフィギュレーションファイル経由で値を渡すので、基本的に
全て文字列として取得することになります。
数値などは、文字列から変換してください。

変換にはOpenRTMが提供しているstringTo (StringUtil.h内で定義) 関数が使えます。

たとえば、今

prop["user_param.int_val"] = "12345"

だとして、int型の変数(int_val)にこの値を代入したいとします。

int int_val;
if (stringTo(int_param0, prop["user_param.int_val"].c_str()) {
  // 変換成功
  std::cout << int_val << std::endl; // 12345が表示される
} else {
  // 変換失敗
  int_val = 0; // 初期化されていないので、安全のため、何か値を入れておく
}

のようにして変換できます。

この変換は、変換先オブジェクトに
std::istream& operator>>(std::istream& is, 変換先の型& v)
の関数が定義されていれば使用できます。

もし、この関数が定義されていないオブジェクトへの変換をしたい場合は
自分で定義します。
examples/ConfigSample 内の、VectorConvert.h には、
文字列から配列(STLのvector)への変換例がありますので、参考にしてください。



現在、コンストラクタにプロパティを渡す方法を導入するかどうかを検討しています。
ご意見などありましたらお願いします。
-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                   知能システム研究部門 タスクインテリジェンス研究グループ
                   〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                   TEL: 029-861-5981 FAX: 029-861-5971
                   n-ando @ aist.go.jp, n-ando @ ieee.org



openrtm-users メーリングリストの案内