[openrtm-users 01160] Re: コンポーネントの実行周期に関して

kurihara shinji shinji.kurihara @ aist.go.jp
2010年 3月 12日 (金) 10:45:35 JST


菅様

お世話になっております。
産総研 栗原です。

ご連絡、有難うございます。

ご指摘の通り、RELEASE版では実行コンテキストの実行周期をrtc.confで
指定しても反映されません。
(RTCBuilderで生成されたコンポーネントのソースに"exec_cxt.periodic.rate"が
 埋め込まれているため、 上書きされてしまいます。)

> 現状での優先順位として,
> rtc.conf < デフォルトの値
> になっていますが,本来は
> rtc.conf > コード内のデフォルトの値
> でなくては,バイナリで配信する際に不便です.
ご指摘の通りです。
最新版(リポジトリ上)での優先順位としましては、
 component.conf > rtc.conf > コード内のデフォルト値
となります。
リポジトリ上のソースでは既に修正しておりますので、最新版をご使用頂けますと
幸いです。
(リビジョン1929にて修正致しました。)
 http://openrtp.jp/openrtm/svn/OpenRTM-aist/branches/RELENG_1_0/OpenRTM-aist

ただし、”コード内のデーフォルト値”で指定した値が、rtc.confで指定されていない
場合、DefaultConfiguration.hで設定された値が使用されますので注意が必要です。
仮に、"exec_cxt.periodic.rate", "1.0"がソースコードで指定されていて、かつ、
rtc.confにてこの値を指定していない場合、DefaultConfiguration.hで指定されてい
るrate:1000が有効になってしまいます。

実は、この問題(ソースコードでは、"1.0Hz"と指定しているのにも関わらず、実際は、
"1000Hz"で実行されてしまうため混乱を招く)を解消するために、下記でご指摘頂きま
した「if (m_config[inherit_prop[i]] != "")」の処理を入れておりました。
この処理は、OpenRTM-aist-1.0.0-RC1では入れておりませんでした。

> それともほかの問題回避方法がありますか?
RTM本体に手を加えない方法といたしましては、コード内のデフォルト値
"exec_cxt.periodic.rate", "1.0"の行を削除する。がよろしいかと思います。
次期リリース版のRTCBuilderでは、この行を入れないようになっております。

> それともこういう仕様になったのでしょうか?
Manager.cppに下記の記載がありますが、これらの属性については、コンポーネントの
ソースコードにデフォルト値として指定しない事が推奨されております。
(上で述べたように、ソースコードで指定した場合でも、rtc.confで指定しない限り、
 DefaultConfiguration.hで指定された値が有効になるため、ソースコードで指定しな
 い事が推奨されています。)

    const char* inherit_prop[] = {
      "exec_cxt.periodic.type",
      "exec_cxt.periodic.rate",
      "exec_cxt.evdriven.type",
      "logger.enable",
      "logger.log_level",
      "naming.enable",
      "naming.type",
      "naming.formats",
      ""
    };


以上、長文になり、申し訳ございません。
宜しくお願い致します。



On Thu, 11 Mar 2010 23:41:30 +0900
ysuga <ysuga @ pop07.odn.ne.jp> wrote:

> OpenRTM-aist MLの皆さま:
> 早大の菅です.お世話になっております.
> いつもお騒がせしてすみません.
> 
> 
> 今回はOpenRTM-aist1.0 C++リリース版の実行周期についてです.
> 
> RTCにPERIODICな実行コンテクストを設定した場合
> (いまはこの場合がほぼすべてですが)
> rtc.confの設定が強く反映されるべきだと思いますが,
> 自分の環境だとrtc.confの変更を行っても実行周期が変更されません.
> (WinXP Pro, WinVista, Win7x64で確認)
> 
> 現状での優先順位として,
> rtc.conf < デフォルトの値
> になっていますが,本来は
> rtc.conf > コード内のデフォルトの値
> でなくては,バイナリで配信する際に不便です.
> 
> 
> C++版のコード状では,RTC::Manager::createComponentで
> 下記のようにデフォルトpropertyが空の場合に,
> m_configで上書きするようになっていますが,
> おそらくこの部分が良くないのではないかと思っています.
> 
> if (prop[inherit_prop[i]] == "")
>   prop[inherit_prop[i]] = m_config[inherit_prop[i]];
> }
> (propはregisterFactoryメソッド時に渡した構造体の値,
> m_configはrtc.confからの値)
> 
> 
> 本来のコードの流れとしては,
> if (m_config[inherit_prop[i]] != "")
>   prop[inherit_prop[i]] = m_config[inherit_prop[i]];
> }
> ではないでしょうか?
> std::stringのoperator!=演算子をあまり使ったことがないので
> よくわかりませんが,とりあえず狙い通りの動作はしました.
> 
> 
> ほかに現状ではデフォルトの値をバイナリに含めない方法が有効ですが,
> その場合は,rtc.confの設定が不足していた場合に
> 動作を保証できず危険だと思います.
> 
> 
> それともほかの問題回避方法がありますか?
> それともこういう仕様になったのでしょうか?
> お教えいただけますでしょうか.
> 
> お忙しい中とは存じますがよろしくお願いします.
> 
> -- 
> //////////////////////////////////////////////
>  菅 佑樹 (すが ゆうき)
> E-mail: ysuga @ ysuga.net
> 研究者関連: http://www.ysuga.net/research
> ロボット関連: http://www.ysuga.net/robot
> インラインスケート: http://www.ysuga.net/inline
> 
> おしらせ: RTミドルウエアやってます
>  http://www.ysuga.net/robot/rtm
> /////////////////////////////////////////////
> 


-- 
----------
栗原 眞二 <shinji.kurihara @ aist.go.jp>

独立行政法人産業技術総合研究所
  知能システム研究部門 統合知能研究グループ
  〒305-8568
  茨城県つくば市梅園1-1-1 中央第2

  TEL: 029-861-5956



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