[openrtm-users 02913] Re: RTC::Manager の Servant の取得について

Shin'ichiro Nakaoka s.nakaoka @ aist.go.jp
2013年 9月 19日 (木) 14:00:30 JST


産総研の中岡です。

本件ですが、Managerを継承したクラスにstatic_castしてm_mgrservantを無理や
りゲットするという以下のようなコーディングでとりあえず出来るようになりま
した。

class ManagerEx : public RTC::Manager
{
public:
    RTM::ManagerServant* servant() {
        return m_mgrservant;
    }
};

ManagerEx* manager =
    static_cast<ManagerEx*>(RTC::Manager::init(argc, argv)));

RTM::Manager_ptr servantRef = manager->servant()->getObjRef();
if(CORBA::is_nil(servantRef)){
    manager->servant()->createINSManager();
}

ただこれだと行儀がよくないので、先ほどの件についてもし問題なければ次期
バージョンで取り込んで頂けるとうれしいです。

よろしくお願いします。


(09/19/13 12:05), 中岡 慎一郎 wrote:
> 
> 産総研の中岡です。
> 
> RTC::Manager の CORBAサーバントについて、 m_mgrservantというメンバに格納
> されているようですが、これが protected になっています。
> 
> これについて、例えば
> 
> RTM::ManagerServant* servant();
> 
> のような public関数を追加して、外部からサーバントを取得できるようにして
> もらえないでしょうか?
> 
> なぜこれが必要かというと、Choreonoid上でシミュレーション等を行うときに、
> 組み込みのPythonインタプリタからPythonスクリプトを使ってManagerにアクセ
> スし、コンポーネントの操作をしています。
> 
> Managerをマスターとして起動しておけばネームサーバからManagerのCORBAオブ
> ジェクトを取得してアクセスできますが、マスターは別に起動している状態で
> Choreonoid上でローカルなシミュレーションを行いたい場合や、Choreonoidを複
> 数起動してそれぞれ別のシミュレーションを行いたい場合などに、Managerをマ
> スターとして起動せずにローカルにアクセスする必要が出てきます。C++からは
> 普通にローカルなManagerオブジェクトにアクセスすれば良いわけですが、
> Pythonからアクセスしようとすると現状ではCORBAオブジェクト経由でしかでき
> ないかと思います。その場合、サーバントのCORBAオブジェクトリファレンス
> (getObjRef()で取得)をPythonに渡してアクセスすることになります。
> 
> m_mgrservant は protected なので RTC::Manager を継承したクラスを作ってそ
> こから m_mgrservant をゲットすれば何とかなるかとも思ったのですが、これだ
> と RTC::Manager::instance() が返すインスタンスの変数を初期化することが出
> 来ないので、いろいろと問題が出てきます。
> 
> というわけで、上記の改良について採用をご検討していただければ幸いです。
> よろしくお願いします。
> 


-- 
Shin'ichiro Nakaoka <s.nakaoka @ aist.go.jp>


More information about the openrtm-users mailing list