[openrtm-users 00462] Re: サービスポートのRTC以外からの利用に関して

Takashi Suehiro t.suehiro @ aist.go.jp
2008年 6月 4日 (水) 10:10:18 JST


野村様、

産総研 末廣です。

まず、OpenRTMのテンプレート生成rtm-templateは
同じインタフェースで異なる複数の実装のcorbaオブジェクトを
同じプロセス内に走らせることを想定して作られていないということを
お断りしておきます。

それ自身は、corbaやrtcの仕様には含まれていませんので実現可能なことです。
rtm-templateを使う場合には多少工夫が必要になります。

野村さんの検討された2つの対策ですが、「同じインタフェース」ということが
クライアントから見て同じようにアクセスできる/したいということであるならば、
同一のIDLにするべきです。したがって第2の方法は誤りだと思います。

さて、第1の方法ですが、これも多少誤解があるようなので
少し詳しく説明させていただきます。
まず、たとえば、MyService.idlで定義されたサービスを持つrtcのテンプレートを
生成すると、サービスに関しては、MyServiceSVC_impl.hと
MyServiceSVC_imple.cppの2つが作られます。

ここでMyServiceSVC_impl.hの最初のほうを見ていただくと分かるのですが、
MyServiceSVC_implというクラスは、POA_MyServiceというクラスを
継承しています。
これらはmakeして、omniidlを走らせた後作られるファイルで定義されます。
このPOA_MyServiceというクラスが外部からMyServiceへのアクセスに
対して窓口になります。これはサービスの実装が異なっても同じで良い、
というか同じでないと困るわけです。

したがって、2つの異なる実装を作りたい場合は、
MyServiceSVC_impl.h、MyService_impl.cppを書き換えて、
MyServiceSVC_impl_A.h、MyService_impl_A.cppおよび
MyServiceSVC_impl_B.h、MyService_impl_B.cppを作るというのが
正統的なやり方になります。
そこで、MyServiceSVC_impl_AとMyServiceSVC_impl_Bの2つの
実装クラスを定義するわけです。
この場合、AとBとの間に継承関係は不要です。
それぞれがPOA_MyServiceを継承していれば良い訳です。
もちろんA、B間にプログラムの重複がある場合は
概念的に継承関係があるなら継承させても良いですし、
それぞれ概念的に元になる他の上位クラスを継承させることも
可能です。

さて、このようにして作られた2つ実装をどのように使うかということですが、
たとえば、MyRtcというコンポーネントを作る場合、
MyRtc.hには(おそらく)、
MyServiceSVC_impl m_MyServiceA;
MyServiceSVC_impl m_MyServiceB:
などと記述されているはずです。それを実装が対応するように、
MyServiceSVC_impl_A m_MyServiceA;
MyServiceSVC_impl_B m_MyServiceB;
などと変更します。
おそらくMyRtc.cppの方は変更なしで大丈夫だと思います。

以上でうまくいくと思うので、お試しください。
安藤さん、どうでしょうか?

野村 琢磨 さんは書きました:
> 対策として、2つの方法について検討してみました。
>
> 1.サービスの実装クラスを継承した、異なる名前のクラスを使用する方法
> MyServiceSVC_implクラスを継承して、MyServiceSVC_impl_Aクラスを作成する
> ことで、
> インターフェースが同じで、名前の異なるクラス(=ロードモジュール?)を
> 使う案です。
> この場合は、コンポーネント内のサービスインスタンスの定義と、Makefileを
> 変更すればよいでしょうか?
> また、オブジェクト参照のnarrowで上手く行われるでしょうか?
>
> (サービスの実装クラスの例)
> class MyServiceSVC_impl_A : public MyServiceSVC_impl {
> ・・・
> };
> 〜〜〜〜〜〜〜〜〜〜
>
> 2.IDLインターフェースを継承して、異なる名前のインターフェースを使用
> する方法
> IDLで記述されたMyServiceインターフェースを継承して、MyService_Aイン
> ターフェースを作成することで、
> 異なるインターフェースを使う案です。
> この場合は、IDLの記述を変更すればよいでしょうか?
> また、異なるインターフェース(親は同じ)をCORBA経由で呼び出せるでしょ
> うか?
>
> (IDLの記述例)
> interface MyService_A : MyService {
> (子インターフェースの定義はしない=親と同じ)
> };
> 〜〜〜〜〜〜〜〜〜〜
>
> 2の方が、CORBAの仕組みを使う上では正統のように思いますが、如何でしょ
> うか?


-- 
Takashi Suehiro, Principal Research Scientist, Intelligent Systems Research Institute, AIST
Tel: +81-29-861-5964 Fax: +81-29-861-5989 E-mail: t.suehiro @ aist.go.jp
1-1-1 Umezono, Tsukuba, Ibaraki 3058568, Japan





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