[openrtm-users 00255] Re: コンポーネントの初期化に関して
Ando Noriaki
n-ando @ aist.go.jp
2007年 11月 10日 (土) 10:09:30 JST
金広様
安藤です
> 回答ありがとうございます。
>
> > 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;
}
--
安藤慶昭@独立行政法人産業技術総合研究所 研究員
知能システム研究部門 タスクインテリジェンス研究グループ
〒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 メーリングリストの案内