[openrtm-devel:00381] Re: Manager::getPOAからのPOA::reference_to_servantでWrongAdapterエラーが出てるのですが・・・

Yuki Suga ysuga @ ysuga.net
2014年 6月 13日 (金) 15:22:19 JST


安藤先生:
菅です.お世話になります.

いただいたコードで動作しました.OSX10.9,Xcode5.1,omniORB4.1.6で試しました.

一点,お聞きしたいのですが,
現状で,ExecutionContextBase::addCompnentをすると,
ExecutionContextWorker内のm_addedCompsにRTObjectStateMachineが格納されて,m_compsには入りません.
一度,tickが呼ばれて,ExecutionContextWorker::invokeWorkerが呼ばれない限りは,
ExecutionContextWorker::m_compsメンバに移動されないので,
activateComponentを送っても,findComponentで失敗します.
これは仕様ですか?あまり直感的じゃないのですが・・・

できれば,

RTObject_ptr comp = ....;
EC_ptr ec = Manager::instance::createContext(ec_id);
ec.addComponent(comp);
ec.activateComponent(comp);

としたいところでしたが・・・

ではでは



2014年6月13日 0:14 Ando Noriaki <n-ando @ aist.go.jp>:
> 菅さん
>
> 安藤です
>
> とりあえず下記のように変更しました。テストしてません。
> すみませんがそちらの環境で試していただけると助かります。
> よろしくお願いいたします。
>
>
> Index: RTObjectStateMachine.cpp
> ===================================================================
> --- RTObjectStateMachine.cpp (リビジョン 2557)
> +++ RTObjectStateMachine.cpp (作業コピー)
> @@ -161,8 +161,19 @@
>      if (CORBA::is_nil(m_caVar)) { return; }
>      m_ca = true;
>      PortableServer::POA_ptr poa = RTC::Manager::instance().getPOA();
> -    m_rtobjPtr =
> -      dynamic_cast<RTC::RTObject_impl*>(poa->reference_to_servant(comp));
> +    try
> +      {
> +        m_rtobjPtr =
> +          dynamic_cast<RTC::RTObject_impl*>(poa->reference_to_servant(comp));
> +      }
> +    catch (CORBA::SystemException& ex)
> +      {
> +        m_rtobjPtr = NULL;
> +      }
> +    catch (...)
> +      {
> +        m_rtobjPtr = NULL;
> +      }
>    }
>
>    void RTObjectStateMachine::
>
>
>
> 2014年6月13日 0:07 Ando Noriaki <n-ando @ aist.go.jp>:
>> 安藤です
>>
>> poa->reference_to_servant(comp) ってException出るんですね?
>> 単にNULLが帰ってくるのだと思っていました。単純にcatchし忘れですねこれ。
>> ちなみに,m_rtobjPtr はNULLでも大丈夫なようになっています。
>>
>> ----
>> 経済産業省 産業機械課 情報化推進係長
>> 博士(工学) 安藤 慶昭
>> TEL: 029-861-5981 (携帯) TEL: 03-3501-1691(産機課代表)
>> TEL: 03-3501-1512(経産省代表)→ 72545(個人PHS)
>> E-MAIL: ando-noriaki @ meti.go.jp
>>
>> Noriaki Ando, Ph.D. Assistant Director
>> Industrial Machinery Division, Manufacturing Industries Bureau
>> Ministry of Economy, Trade and Industry
>> E-MAIL: ando-noriaki @ meti.go.jp
>>
>>
>> 2014年6月12日 22:40  <ysuga @ ysuga.net>:
>>> お世話になります.菅です.
>>> CORBAの初歩的な質問かもしれませんが,どなたか教えてください.
>>> v_repというシミュレータ内でManagerを立て,RTCを起動し,外からシミュレータ全体をサービスポートで制御するプラグインを開発をしています.
>>> そのサービスポートで,さらに外部プロセスのRTCのURIを投げると,その外部RTCに対して,シミュレータ内でSynchExtTriggerECを生成し,addComponentをするようにしています.
>>> 結果としてECが2つ,RTCに取り付く形になっちゃいますが,こうすると,何気なく起動したRTCを同期させることが出来ると考えています.
>>> ・・・が,上手く行きません.外部のRTCはJava版およびC++版のRTCですが同様の失敗です.シミュレータはC++版です.
>>> 上手く行かない症状は, 0.addComponentの返り値が2
>>> (BAD_PARAMETER?)になる.
>>> 1.participantsのECがSystemEditorで上手く表示されない.rateなどがnullと表示されてしまう.
>>> 2.addComponentした直後のactivate_componentが失敗する.
>>> C++のtrunkのコードを追っていくと,ECから外部のRTCのRTObject_ptrに対してaddComponent()をすると,RTObjectのattach_context()の呼び出し後に,
>>> RTObjectStateMachineを生成して,そのコンストラクタの中で,setComponentAction()メソッド内で,
>>> Manager::getPOA()で得たアダプタでreference_to_servantをやっているようですが,この部分で失敗しているようです.
>>> ログを見てみましたが,この辺のログ出力があまりないのです・・・が,おおよそこの辺で失敗して,CORBA::Exceptionを送出しているというのは分かりました.
>>> この部分のコードだけ取り出して実験してみたところ,reference_to_servantの部分でCORBA::WrongAdapterExceptionを送出してしまいます.
>>> そもそもオブジェクトをactivateしたアダプタじゃないと,reference_to_servantできないと思うのですが,
>>> 僕の使い方が悪いのでしょうか?
>>> どなたか詳しい方,回避方法など教えていただけませんか?
>>>
>>> _______________________________________________
>>> openrtm-devel mailing list
>>> openrtm-devel @ openrtm.org
>>> http://www.openrtm.org/mailman/listinfo/openrtm-devel
> _______________________________________________
> openrtm-devel mailing list
> openrtm-devel @ openrtm.org
> http://www.openrtm.org/mailman/listinfo/openrtm-devel



-- 
///////////////////////////////////////////////////////////////////
// Yuki Suga, Ph.D.
// URL: http://www.ysuga.net/?lang=en
// E-mail: ysuga @ ysuga.net
///////////////////////////////////////////////////////////////////


More information about the openrtm-devel mailing list