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

4 posts / 0 new
Last post
root
Offline
Last seen: 14 hours 45 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00248] コンポーネントの初期化に関して

金広@産総研です。

RTコンポーネントを生成する際に、初期化のパラメータを与えたい場合
どのようにするのが適当でしょうか?

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

Undefined
root
Offline
Last seen: 14 hours 45 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00249] コンポーネントの初期化に関して

金広様

安藤です

> 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::istream& is, 変換先の型& v)
の関数が定義されていれば使用できます。

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

現在、コンストラクタにプロパティを渡す方法を導入するかどうかを検討しています。
ご意見などありましたらお願いします。

root
Offline
Last seen: 14 hours 45 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00254] コンポーネントの初期化に関して

金広@産総研です。

回答ありがとうございます。

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

configsample.confにはmode0とmode1が定義されていますが、このモードを
インスタンス化の際に指定するようなことがしたいのです。うまい方法が
ありますでしょうか?

なぜこのような質問をしているかと言いますと、以下の2つを両立させたいのです。

・コンポーネントをリアルタイムスレッドにより数ms周期で実行する。
・インスタンス固有のパラメータを用いて数秒程度かかる初期化処理を行う。

onInitialize()等のコールバック関数はリアルタイムスレッドによって実行される
(実行周期以上かかるような処理は行えない)かと思いますので、このような
初期化処理はコンストラクタで行うしかないように思えます。
- 引用テキストを表示しない -

root
Offline
Last seen: 14 hours 45 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00255] コンポーネントの初期化に関して

金広様

安藤です

> 回答ありがとうございます。
>
> > 1. rtc.confにコンポーネントのコンフィギュレーションファイルを指定します。
> > ---rtc.conf---
> > :略
> > # configsample.conf は任意のファイル名
> > example.ConfigSample.config_file: configsample.conf
> > :略
> > ---------------
>
> configsample.confにはmode0とmode1が定義されていますが、このモードを
> インスタンス化の際に指定するようなことがしたいのです。うまい方法が
> ありますでしょうか?
>
> なぜこのような質問をしているかと言いますと、以下の2つを両立させたいのです。
>
> ・コンポーネントをリアルタイムスレッドにより数ms周期で実行する。
> ・インスタンス固有のパラメータを用いて数秒程度かかる初期化処理を行う。
>
> onInitialize()等のコールバック関数はリアルタイムスレッドによって実行される
> (実行周期以上かかるような処理は行えない)かと思いますので、このような
> 初期化処理はコンストラクタで行うしかないように思えます。

onInitialize()はマネージャから実行されますので、仮にWeb上で公開しているARTLinux
用のECを使用したとしても、リアルタイムスレッドで実行されることはありません。
「on何とか」関数のうち、
- onInitialize()
- onFinalize()
はECではなく、マネージャ(ミドルウエア)からコールされます。
ですので、onInitialize()内で時間のかかる処理をすることは許されるかと思います。
これら以外の、引数にECのidをとる「on何とか」関数は、ECから実行されます。

あと、C++一般の話ですが、コンストラクタであまり複雑な処理は
させないほうが安全なのではないでしょうか?

#余談ですが、上記のような構造のため、スレッドのコンテキストに依存するような
#関数には注意が必要です。
#例えば、ioperm()をonInitialize()で呼んでから、onExecute()でIOにアクセス
#しようとしても、IOにアクセスできません。
#ioperm()はスレッドに対してIOアクセスの許可を与えているので。。。
#正しくはonActivated()で呼ぶ必要があります。

確かに、コンストラクタでパラメータを渡す必要がある場合がありますので、
次のバージョンでは何とかしたいと思います。

なお、現状のOpenRTMでは、一応以下のような方法でrtc.confファイルに
記述したパラメータを渡すことは可能です。

ただ、コンストラクタで自分のインスタンス名などを知る方法はありません。
(インスタンス名はコンストラクタとonInitialize()の間でマネージャから与えられる)
したがって、インスタンス毎に与えるパラメータを変えるには、
static変数などを使って、自分が何番目のインスタンスかを数えて
おかなければいけないかもしれません。

1. rtc.confにパラメータを記述
my_conf.hoge: foobar

2. コンストラクタのmanagerを使ってManagerのConfigurationを取得
ConfigSample::ConfigSample(RTC::Manager* manager)
: 略
{
: 略
// foobarが表示される
std::cout << manager->getConfig()["my_conf.hoge"] << std::endl;

Properties& prop(manager->getConfig());
// foobarが表示される
std::cout << prop["my_conf.hoge"] << std::endl;
}

Log in or register to post comments

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK