[openrtm-users 00738] Re: コンポーネントの複数起動に関して

Ando Noriaki n-ando @ aist.go.jp
2009年 1月 15日 (木) 03:26:09 JST


議論が盛り上がっているところ失礼します。

産総研 安藤です

RTCの名前付けに関しては、私もかれこれ5年ほど考え続けているのですが、
なかなか美しい方法が見つかりません。

RTCの名前付けに関しては、以下のような要求があると思われます。
以下、要求を整理します。

1. human-readable な名称であること ≠ UUID or GUID
 UUIDのような無機質な名前だと、RTSystemEditorなどでエディットする場合、
 スクリプトで参照する場合など、非常にやりにくい。
 しかもインスタンスの名称なのでCOMなどで使用するクラスに対応するGUID
 などとは性質が異なる。また、個人的にUUIDやGUIDは見たくない。

2. persistentな名称であること
 RTSystemEditorなどでシステムを構築して、構成情報からシステムを
 再構成する場合など、各RTCのインスタンスの名称はプロセス/インスタンス
 の寿命を超えて一意でなければならない。
 また、ロボットのように特定のハードとRTCが密接に結び付く場合は、
 RTCは物理的存在の抽象であるのでそれと切り離して名前付けはしたくない。

3. システムにおいて一意であること
 これはNameServer上でのコンテキストも含めて一意であることを意味します。
 かつ、複数のRTCを別々のノードから起動した際にも、名前上で衝突がなく
 それぞれを区別できる必要があります。

4.名前付けは自動であることが望ましい
 末廣さんからも解決策が提示されたように、rtc.confで上記の1〜3の要求を
 満たすことはできますが、名前付けに関してシステム開発者が、手動で
 何らかの設定をしてやる必要があり、システム構築をより容易にするための
 ミドルウエアというRTMのコンセプトからすると、その辺の機能は自動にやってほしい。

こんなところでしょうか。

0.2.0までは、とりあえず、1、2、4を満たす名前付けの方法として、
[ホスト名]/[マネージャ名(PID含む)]/[カテゴリ名]/[RTC型名]/[コンポーネントインスタンス名]
という名称を使用していました。

このフォーマットはhuman-readableかつ完全に一意です。(persistentではないけど。)
#ホスト+PIDを含むマネージャ名は同一ネットワーク上で必ず一意。
#RtcManagerはカテゴリ、RTC型名で同一の者の登録を認めていないので一意。
#インスタンス名は同一のFactory内では必ず一意。

ただし、この名前は長すぎるのでRtcLinkでツリーを展開するのが面倒、
階層が深すぎてみにくいなど、不評だったので、aliasも付けられるようには
なっています。
また、aliasは結局一意性をある程度捨ててしまわなければ成立しないので、
aliasだけではさまざまな状況での名前付けに関する問題は解決しませんでした。

一つには、名前付けの方法が固定であることが問題でした。
また、名前付けのバリエーションが、PIDとインスタンス数、あとaliasくらいしか
存在しないこともまた問題でした。
ユースケースごとに名前付けの方法もいろいろあるということも問題を複雑にしています。
#したがって、末廣さんがおっしゃるように、名前付けのポリシーは使用者にまかせる
#というのも一つの手だとは思います。

そこで、0.4.0では名前付けのバリエーションを増やす方向で、
現在のように、%hでホスト名、%nでインスタンス名など、
RTC、システムなどの情報を変数として利用できるようにし、
naming.formats オプションでいろいろなケースに対応できるように
作っておいて使用者に任せるという方針にしました。

この方法では少なくとも、0.2.0の一意な名前付けも conf ファイルで
指定できる(etc/rtc.conf.sampleを参照のこと)ので、特定の名前付けを
強制することもやめました。
この機能を駆使すれば、rtc.confにいろいろ工夫をすれば、末廣さん提示の
方法のように1〜4の要求を満たす名前付けをなんとか実現できます。
ただし、これによってユーザが名前の一意性に気を配らなくなってしまいました。



それで、これまでの経験から最近は一意な名前付けが必要な場合、
以下のようなものがいいのではないかと考えるようになってきました。

[ノード(ホスト)名]/[カテゴリ名]/[RTC型名]/[インスタンス名]

0.2.0のと似ていますが、マネージャ名+PIDがない点が異なります。
human-readableであるという観点と、persistentであるという観点からすると
マネージャ+PIDという命名が違和感があります。
PIDはpersistentではありませんし、その番号には少なくともそれを見る
人間側にとってはなにも意味がありません。
しかし、それ以外は人間にとって意味がある命名ですし、persistentです。
また、分散システムにおいては、ノード名(ホスト名)というのは
システムを組み立てる開発者にとっては常に頭に入っている(であろう)名称です。
もし、ノード名がそれほど重要でない場合には、ノード名を省いた

[カテゴリ名]/[RTC型名]/[インスタンス名]

という命名方法も、もう一つの候補としてありうるかと思います。
ただし、この命名法を現状の0.4で採用すると、一意性が失われます。

ちょっと長くなりましたので、この件に関してはここでおしまいにします。

上記の命名法で、かつ一意性をどう実現するかについては、
次のメールで例を示させていただきたいと思います。

-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                  知能システム研究部門 タスクインテリジェンス研究グループ
                  〒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 メーリングリストの案内