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

12 posts / 0 new
Last post
root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00725] コンポーネントの複数起動に関して

RTミドルウェア開発者の皆様:
初めて投稿します.早稲田大学の菅です.
いつも大変お世話になっております.

コンポーネントの複数起動について皆様のご意見を頂きたく,
メールを差し上げました.
現在のOpenRTM-aist 0.4.2で,同一のコンポーネントを同一マシン上で,
複数のプロセスとして起動すると,ネームサーバー上の名前が,
○○Component0.rtcのように同一のものとして
上書きされてしまう問題があります.

これについてはすでに,
1.同一プロセス内で複数のコンポーネントを起動する方法
(メーリス内208番の記事参照)
2.rtc.confに%pとしてプロセスIDを付加する方法(同554番)
が議論されていますが,それぞれに大きな問題があると思います.

1.同一プロセス内で複数のコンポーネントを起動
・プロセス起動時に挿入されている枚数を決定する必要がある.
・プロセス実行中にコンポーネントの数を変更できる?

2.rtc.confでプロセスIDを名前に入れる
・次回起動時にプロセスIDが変更されるので,
RTC-LINKなどでSystemEditorを保存しても,
前回起動したときのシステムを再現できない.

ということで,非常に困っています.
1.の方法が現在取れる方法として妥当かと思います.
プロセス実行中に無理やりにコンポーネント数を増やしたり減らしたり
できるかもしれません.
何よりSystemEditorのシステム図保存が使えないのはかなり不便です.

そこで,OpenRTMメーリスのメンバーの皆様で,
ほかに方法をご存知でしたらお教えいただけませんでしょうか?
また,次期OpenRTM-1.0ヴァージョンでは,
このあたりの使い勝手はどうなりますでしょうか?

よろしくお願いします.

Undefined
root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00732] コンポーネントの複数起動に関して

静岡大の清水です。

私も現状の名前bindの仕方には少々問題が
あると思っているので、議論させてください。

まず、現時点での対処法ですが、
スタティックに名前を決めたいようなので、
以下のような方法はいかがでしょう。

--------------------------------------
1.立ち上げるRTCの数の分だけ
confファイルを用意する。
(例)RTCを2つあげるのであれば、
rtc0.conf, rtc1.confをつくる。

2.それぞれのconfファイルにスタティックかつ
グローバルに固有なネーミングフォーマットを書く。
(例)
[rtc0.conf]
naming.formats: %h.cxt0/%n.rtc
[rtc1.conf]
naming.formats: %h.cxt1/%n.rtc

3.それぞれのRTCをconfファイル指定で起動する。
$ MyComp -f rtc0.conf
$ MyComp -f rtc1.conf

上記のようにすると、
ネームサーバには次のように登録されるはずです。
hostname.cxt0/MyComp0.rtc
hostname.cxt1/MyComp0.rtc
同じRTCのバインド名でも、コンテキストが異なるため
上書きはされないはずです。
また、プロセス番号等の動的に決まるパラメータ
も入っていないので、RTCLINKでも使えると思います。
--------------------------------------

以上のような方法でも、RTCを何個あげるかが
あらかじめ決まってないといけないので、
汎用な方法とは言えません。

以前から,スマートかつ汎用な名前決定ルールを
考えているのですが、なかなか良い解決法が
思いつきません。悩んでいる問題点は次のようなものです。

1)同じRTCを複数起動する場合、
ネームサーバごとにスタティックかつ
グローバルに固有な名前が自動的に
決まらないといけない(RTCLINKで再呼び出しするため)が、
RTC自体はローカルなプロセスレベルで起動・管理
されるため、どうやってグローバルに固有な名前を
きめるのか。また、この場合のグローバルとは
どのレベルにするのが良いのか。
最も上位を取ると、全世界レベルになってしまうが、
そうすると、UUIDのような長い名前が必要になってしまう。

2)RTCをある名前(仮に、MyComp0.rtcとする)で
登録しようとしたとき、あるネームサーバでは
MyComp0.rtcが無いため登録可能であるが、
別のネームサーバでは既にMyComp0.rtcが使われている
ので別の名前にしなければならない場合、
どうするのがよいのか。
ネームサーバごとに別々の名前で登録してもよいが、
同じCORBAオブジェクトに対して、複数の別名が
付くことになるので、ユーザが混乱したり
副作用が起きたりしないか。

少し長くなってしまいましたが、
名前決定法について良いお知恵をお持ちでしたら
ご教示頂けると助かります。
解決法さえ示して頂ければ
0.4系で実装してみたいと思います。

清水

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00733] コンポーネントの複数起動に関して

清水様、菅様、

産総研 末廣です。
問題の所在が良く理解できないので少し教えてください。

たとえば、rtc.confに
naming.formats: myComp1.rtc
などと明示的に記述しておけば
Naming Serviceには myComp1.rtc として登録されますよね。
(rtclinkでの表示名はインスタンス名でプログラムごとに固定ですが)

それではだめなのでしょうか?
結局コンポーネントごとに自分の好きな名前を書き込んだ
confファイルを用意しておくということですが。

よろしくお願いします。

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00734] コンポーネントの複数起動に関して

早大の菅です.

まずは問題としているユースケースについてお話します.

私の所属している研究室のプロジェクトで,
USBでPC(Windows)と接続できるサーボコントローラボードを使用しています.
そこで,このボード用のRTコンポーネントのソフトウェアを開発しました.

ソフトウェアはバイナリ(Setup.exe)の形式で配布しており,
1枚ずつ認識して制御するものです.
普通の機械工学科の学部生にとって,
ソースコードに触れることのメリットは少ないと思われます.

しかし,このボードを1台のPCで複数枚利用する場合が発生したため,
同じコンポーネントをスタートメニューから2つ起動したところ,
ネームサーバー上の名前が更新されないという症状が見られました.

原因は,2度目に起動したコンポーネントが1度目のコンポーネントの名前を
上書きしてしまうというものでした.
(rtc.confでは,命名ルールは%h/%n.rtcとしています.)

現状ではプログラムを複数枚認識用に変更して対応しています.
(ソフトを起動すると,使用枚数の入力を求めたのち,
MyModuleInit関数内でManagerクラスの
createComponent関数を複数回実行します.)

この変更は容易でしたが,このような名前付けサービスに関する実装は
RTミドルウェアのコアな部分(RTM本体か,CORBAか)で実装されるべきと考えて
メールを差し上げました.

rtc.confを容易したり,コンソールからコマンドラインで起動したり,
そう難しいことではないですし,
おそらく卒業論文の今の時期はこういった場当たり的な方法で解決します.

しかし,今後,よりユーザや開発者の負担を軽減できる仕組みとして,
自動的な名前解決機能の実装が必要と考えています.

> 産総研 末廣です。
> 問題の所在が良く理解できないので少し教えてください。
>
> たとえば、rtc.confに
> naming.formats: myComp1.rtc
> などと明示的に記述しておけば
> Naming Serviceには myComp1.rtc として登録されますよね。
> (rtclinkでの表示名はインスタンス名でプログラムごとに固定ですが)
>
> それではだめなのでしょうか?
> 結局コンポーネントごとに自分の好きな名前を書き込んだ
> confファイルを用意しておくということですが。
>
> よろしくお願いします。

Takashi Suehiro さんは書きました:
> 清水様、菅様、
>
> 産総研 末廣です。
> 問題の所在が良く理解できないので少し教えてください。
>
> たとえば、rtc.confに
> naming.formats: myComp1.rtc
> などと明示的に記述しておけば
> Naming Serviceには myComp1.rtc として登録されますよね。
> (rtclinkでの表示名はインスタンス名でプログラムごとに固定ですが)
>
> それではだめなのでしょうか?
> 結局コンポーネントごとに自分の好きな名前を書き込んだ
> confファイルを用意しておくということですが。
>
> よろしくお願いします。

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00735] コンポーネントの複数起動に関して

菅様、

産総研 末廣です。
問題点のご説明ありがとうございました。

ただコンポーネントの命名規則はアプリケーションに
依存する部分が大きいように思います。

たとえばRTルームのようなものを考えたときには、
Room0/light0.rtc, Room0/light1.rtc, Room0/light2.rtc,
Room0/aircon0.rtc,
Room1/light0.rtc, Room1/ight2.rtc,
Room2/aircon0.rtc
などとかしたいでしょうし、
多数のセンサがばらまかれた自己組織化まで考えたような
分散協調システムの場合は場当たりな連番で名前がつけられれば
良いかもしれません。

ということで私の個人的な意見としては、

Yuki Suga さんは書きました:
>
> この変更は容易でしたが,このような名前付けサービスに関する実装は
> RTミドルウェアのコアな部分(RTM本体か,CORBAか)で実装されるべきと考えて
> メールを差し上げました.

このような名前付けサービスはRTミドルウェアのコアな部分ではなく
アプリケーション用のツール、アプリケーション用のミドルウェアで
吸収したほうが良いのではないかと思います。

> rtc.confを容易したり,コンソールからコマンドラインで起動したり,
> そう難しいことではないですし,
> おそらく卒業論文の今の時期はこういった場当たり的な方法で解決します.

コンソールからコマンドラインで起動するというのはそれほど
場当たり的ではないと思います。大変ならばコマンドスクリプトや
pythonスクリプトなどを用いて自動化することも可能だと思います。

最終的にアプリケーションのフレームワークが明確になったなら
それにあわせたツールを作るというのが良いのではないでしょうか。

> しかし,今後,よりユーザや開発者の負担を軽減できる仕組みとして,
> 自動的な名前解決機能の実装が必要と考えています.

いろいろなアプリケーションで利用できる自動的な名前解決機能を
サポートしようとすると、そのような名前解決ルール記述を定めて
それを解釈し動作するようなものを実装することになります。

それは新たなスクリプト言語を開発するのと同じことになる
のではないでしょうか。

それよりは、その部分は既存のスクリプト言語にお任せするのが
良いと思います。

いかがでしょうか。

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00736] コンポーネントの複数起動に関して

産総研 末廣様:
早稲田の菅です.

丁寧な返信,ありがとうございます.
せっかくなので,僕の考え方も述べさせてください.

> ただコンポーネントの命名規則はアプリケーションに
> 依存する部分が大きいように思います。

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00737] コンポーネントの複数起動に関して

早稲田大 菅様

静岡大の清水です。

番号の自動インクリメントの方式ですが、
複数サーバに登録する場合どういうルールが
よいとお考えでしょうか?

自動インクリメントの実装は以前から
考えてはいるのですが、
複数サーバが存在する場合に
どう対処すべきかで悩んでいます。

こういうのが良いというのを
ご提案いただければ幸いです。

清水

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00738] コンポーネントの複数起動に関して

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

産総研 安藤です

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で採用すると、一意性が失われます。

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

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

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00740] コンポーネントの複数起動に関して

安藤です

続き(実装について)です

実は、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を指定する
というやり方が良いのではないかと考えています。

これなら、菅案、清水案、末廣案にも何とか対応できるでしょうし、
将来的に別のユースケースが現れた時にも対応可能です。

いかがでしょうか。

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00741] コンポーネントの複数起動に関して

安藤様

静岡大の清水です。

実装レベルまでの詳細な説明ありがとうございます。
いくつか気になった点があるので質問させてください。

> [ノード(ホスト)名]/[カテゴリ名]/[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が違うオブジェクトになることです。

ネームサーバ上の名前を見ながらオブジェクトを
操作するのは人間であることが多いので、
サーバによって名前が違ったり、
同じ名前だけど実態は違うといった状態になると
ユーザが混乱しないでしょうか?
私としては、違うサーバでも同じ名前で
あって欲しいと考えるのですが、
安藤様はいかがお考えでしょうか?

以上、ご意見をお聞かせ頂ければ幸いです。

清水

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00742] コンポーネントの複数起動に関して

安藤様,清水様,末廣様:
早稲田の菅です.

いろいろとご指導ありがとうございました.

>末廣様の投稿[739]より
> ・上書きする、
> ・自動的に連番を振る、
> ・失敗する、
> のどれが本当のところ使いやすいか
> と考えた場合、私は3番目だろうと思っています。
> さらに、なぜ失敗したかの情報も分かるとより嬉しい。

なるほど.
僕はcreateComponentの引数によって上記3つが選べる仕様がよいと思います.
僕自身の使用感だと,デフォルトで2番が使いやすいと思いました.

この点で,安藤様の実装方法に関する投稿[740]の中で,
> registerFactory(Properties, NewFunc, DeleteFunc, NumberingPolicy)
> {
>  :
>  m_factory.list.push_back(new FactoryCXX(property,
> newfunc, delfunc, policy))
>  :
> }
> のようにpolicyを渡せるようにした上で、
> 各コンポーネントのナントカInit()関数内の
> registerFactoryの呼び出しで、独自のNumberingPolicyを渡してあげれば、
> 任意の命名方法を与えることができます。

との実装でうまくいきそうですよね.
次期ミドルウェアではregisterFactoryの
4番目の引数の開放があるとよいと思います.
デフォルトは今のままでもミドルウェアの再コンパイル無しに
カスタマイズしたNumberingPolicyが指定できるといいですよね.

NumberingPolicyの実装方法についても
丁寧にご説明くださりありがとうございました.
時間があるときに自分で実装してみるつもりです.

ではでは

Ando Noriaki さんは書きました:
> 安藤です
>
> 続き(実装について)です
>
> 実は、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を指定する
> というやり方が良いのではないかと考えています。
>
> これなら、菅案、清水案、末廣案にも何とか対応できるでしょうし、
> 将来的に別のユースケースが現れた時にも対応可能です。
>
> いかがでしょうか。

root
Offline
Last seen: 1 day 5 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00739] コンポーネントの複数起動に関して

菅様、

産総研 末廣です。

Yuki Suga さんは書きました:
>
> ミドルウェアが独自の名前規則を利用して,
> 自動的に連番を振らない理由も無いと思いますがどうでしょう.
>
> アプリケーションごとにツールを作成すると,
> いちいち労力を割かれますし,
> 連番が自動的に振られない理由が無いと思うのです.

ここは、完全には反対ではないのですが、、、、。
たとえば、
・上書きする、
・自動的に連番を振る、
・失敗する、
のどれが本当のところ使いやすいか
と考えた場合、私は3番目だろうと思っています。
さらに、なぜ失敗したかの情報も分かるとより嬉しい。

最終的には、菅さんも書かれているように、
> たしかに.
> あとはRTC_LauncherなるものをjavaかPythonで作って,
> システムにインストールされたRTコンポーネントをそこから起動することで,
> 名前付けのルールをLauncherで吸収する方法も考えました.
> この方法でもやれそうですね.
>
> Launcherからコンポーネントが実行されるたびに
> 新しいrtc.confを生成して,名前のサフィックス番号を変更できますよね.
とするのが良いと考えているので、
その中で、ネームサーバの中身を事前にチェックすれば
どれでも対応可能ではありますが、、、。

基本的には”ミドルウェア”で対応してくれると嬉しいという
考えには反対ではないのですが、私はミドルウェアも
モジュラーな方が良いと思っています。
したがって、OpenRTM-aist-XXXXにあまり多くの機能を盛り込むのには
少し疑問を感じています。

たとえばRTC_LauncherをOpenRTM-aistから独立に作成しておけば、
Corbaレベルで動作が保障されている他のOpenRTM、たとえば
OpenRTM-wasedaなるものができたとしても、対応が容易になる
のではないかと考えています。

あるアプリケーション領域から見れば、RTC_Launcherまで含めて
使いやすい”ミドルウェア”ということになるのだと思っています。

上記、あくまで私個人の考えですが、いかがでしょうか?

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