[openrtm-users 00741] Re: コンポーネントの複数起動に関して
Masayuki Shimizu
masayuki.shimizu @ aist.go.jp
2009年 1月 16日 (金) 23:36:23 JST
安藤様
静岡大の清水です。
実装レベルまでの詳細な説明ありがとうございます。
いくつか気になった点があるので質問させてください。
> [ノード(ホスト)名]/[カテゴリ名]/[RTC型名]/[インスタ
ンス名]
この命名法は一意であるとしていますが、
ノード名の一意性は確実に保証されるのでしょうか?
ノード名としてホスト名(human readableなので)を
用いる場合、ホスト名はユーザが勝手に決められるので、
かぶる可能性があります。
実際、Linuxの場合、ホスト名をデフォルトの
localhostのままでネットワークに参加できる
(IPはネットワーク内で一意なので)ため、
複数マシンがlocalhostノード名を
持つことになると思います。
こういった場合はどう対応するのでしょうか?
> #ネームサーバに登録済みコンポーネント名から、次に生成
するRTCのインスタンス名を決める
> #たとえば、すでに MyComponent0, MyComponent1, ...,
> MyComponentNがネームサーバ上に登録されて
> #いるのであれば、次のコンポーネントの名前は
> MyComponent(N+1) のようになる。
RTCのインスタンスごとにどのネームサーバに登録
するかをconfで決められるようになっているので、
たとえば、一つ目のインスタンスはServer1のみに登録し、
二つ目のインスタンスはServer1とServer2に登録する場合、
Server1ではMyComp0とMyComp1が存在しますが、
Server2ではMyComp0のみになります。
ここで問題なのは、Server1のMyComp0と
Server2のMyComp0が違うオブジェクトになることです。
ネームサーバ上の名前を見ながらオブジェクトを
操作するのは人間であることが多いので、
サーバによって名前が違ったり、
同じ名前だけど実態は違うといった状態になると
ユーザが混乱しないでしょうか?
私としては、違うサーバでも同じ名前で
あって欲しいと考えるのですが、
安藤様はいかがお考えでしょうか?
以上、ご意見をお聞かせ頂ければ幸いです。
清水
--- Ando Noriaki <n-ando @ aist.go.jp> wrote:
> 安藤です
>
> 続き(実装について)です
>
> 実は、0.4.0にはAPIとしてユーザには解放されていませんが
、
> コンポーネントの名前付けのポリシーを変えられる仕組みが
用意されています。
>
> これは、コンポーネントのFactoryクラスです。
>
http://www.is.aist.go.jp/rt/OpenRTM-aist/doxygen/ClassReference/classRTC_1_1FactoryCXX.html
>
> コンストラクタの最後の引数に NumberingPolicy
> が渡されていますが、
> これがインスタンスの名前付けの方法を決めています。
> デフォルトでは DefaultNumberingPolicy
> オブジェクトが渡されますが、
> 別のPolicyオブジェクトを渡すと任意の名前の付け方に変更
することができます。
>
> ただし、現在の0.4.0では
>
http://www.is.aist.go.jp/rt/OpenRTM-aist/doxygen/ClassReference/classRTC_1_1Manager.html#09c70d1b01c1f1969abe64d928c435ee
>
> のregisterFactoryの引数にNumberingPolicyがないのを見て
もお分かりいただけるように
> Policyを変更するすべはありません。
>
> 今、手元にソースがないので嘘を書いているかも知れません
が、registerFactory関数はたぶん中で、
>
> registerFactory(....)
> {
> :
> // Factoryのリストに新しいファクトリを登録する
> m_factory_list.push_back(new FactoryCXX(property,
> newfunc, delfunc))
> :
> }
>
> のようになっているのではないかと思いますが、これを
>
> registerFactory(Properties, NewFunc, DeleteFunc,
> NumberingPolicy)
> {
> :
> m_factory.list.push_back(new FactoryCXX(property,
> newfunc, delfunc, policy))
> :
> }
> のようにpolicyを渡せるようにした上で、各コンポーネント
のナントカInit()関数内の
> registerFactoryの呼び出しで、独自のNumberingPolicyを渡
してあげれば、
> 任意の命名方法を与えることができます。
>
>
> NumberingPolicyの具体的な実装方法ですが、
>
>
http://www.is.aist.go.jp/rt/OpenRTM-aist/doxygen/ClassReference/classNumberingPolicy.html
>
> のNumberingPolicyクラスを継承して、onCreate (void
> *obj)関数を実装するだけです。
> 先ほどのメールで提案した、以下の2種類の命名方法を実現
する方法を書きます。
>
> 1.
> [ノード(ホスト)名]/[カテゴリ名]/[RTC型名]/[インスタ
ンス名]
>
> std::string onCreate(void* obj)
> {
> names =
> 同一マシン上の他のマネージャ上でインスタンス化されてい
る
> 同一カテゴリ・型名のインスタンス名を取得
> namesから当該RTCの次のインスタンス名を計算
>
> return 新しいRTCのインスタンス名;
> }
>
> このようになると思います。
> ここで、「同一マシン上の他のマネージャ上のインスタンス
名」を取得するのが
> 現状では難しいです。同一マシン別プロセスのマネージャ同
士が、どういう
> RTCのインスタンスを持っているかの情報を交換できる必要
があります。
> 今のところそのようなことはできませんが、1.0では少なく
とも同一ノード上の
> のマネージャ同士がこれらの情報を共有できるようにはする
つもりです。
>
> この方法は、同一ノード上で一意なナンバリングをするだけ
でよいので、
> Managerを少々拡張するだけで実現可能です。
>
> 2.[カテゴリ名]/[RTC型名]/[インスタンス名]
>
> std::string onCreate(void* obj)
> {
> typename = obj->getTypeName();
> //とりあえずベースとなる型名を取得
> nmformats =
> Manager::instaqnce().getConfig()["naming.formats"];
> //
> 名前付けのフォーマットを取得
> nss =
> Manager::instaqnce().getConfig()["corba.name_servers;
> // ネームサーバ名を取得
>
> for (各ネームサーバ毎に) {
> # 当該
> [ノード(ホスト)名]/[カテゴリ名]/[RTC型名]/[インスタ
ンス名]
> で登録されている名前を取得
> }
> #ネームサーバに登録済みコンポーネント名から、次に生成
するRTCのインスタンス名を決める
> #たとえば、すでに MyComponent0, MyComponent1, ...,
> MyComponentNがネームサーバ上に登録されて
> #いるのであれば、次のコンポーネントの名前は
> MyComponent(N+1) のようになる。
>
> return "MyComnponent(N+1)";
> }
>
> 以上、こんな感じで実装すれば、菅さんがご希望の名前付け
が実現できるのですが、
>
0.4.0のときにはそこまでやる余裕がなかったので、DefaultNumberingPolicy
のみとなっています。
>
> 最後の末廣さんのメールにもありましたように、OpenRTM-aist
に
> あまりたくさん機能を詰め込まないほうがいいというのも同
意です。
> 最近、OpenRTMをuITRONに移植したのですが、uITRONでRTCを
> 動かしたいようなターゲットは、上記のような複雑な名前付
けをさせるのは
> メモリ的にも、CPUパワー的にもしんどそうです。
>
>
安藤個人の意見としては、各コンポーネントの*Init()内でPolicy
を渡すのではなく、
> いくつかのタイプのNumberingPolicyをあらかじめ用意して
おいて、
> (かつ、それがDLLでローダブルだともっといいかも。)
>
confファイルから各コンポーネント毎に適当なNumberingPolicy
を指定する
> というやり方が良いのではないかと考えています。
>
> これなら、菅案、清水案、末廣案にも何とか対応できるでし
ょうし、
> 将来的に別のユースケースが現れた時にも対応可能です。
>
> いかがでしょうか。
> --
> 安藤慶昭@独立行政法人産業技術総合研究所 研究員
> 知能システム研究部門
> タスクインテリジェンス研究グループ
> 〒305-8568 茨城県つくば市梅園1-1-1
> 中央第2
> TEL: 029-861-5981 FAX:
> 029-862-6631
> n-ando @ aist.go.jp, n-ando @ ieee.org
>
>
openrtm-users メーリングリストの案内