[openrtm-users 01841] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

8 posts / 0 new
Last post
Kei Okada
Offline
Last seen: Never ago
Joined: 2011-05-17 20:20
[openrtm-users 01841] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法を
ご存知の方がいらっしゃいましたら,方法をご教示いただけると幸いです.

XXComp.cpp のなかで,
CORBA::ORB_var orb;
orb = CORBA::ORB_init(argc, argv);
CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);
PortableServer::POAManager_var manager = rootPOA -> the_POAManager();
CosNaming::NamingContext_var cxt;
CORBA::Object_var nS = orb->resolve_initial_references("NameService");
cxt = CosNaming::NamingContext::_narrow(nS);
CosNaming::Name ncName;
ncName.length(1);
ncName[0].id = CORBA::string_dup("ClockGenerator");
ncName[0].kind = CORBA::string_dup("");
CORBA::Object_var obj = NULL;
do {
try {
obj = cxt->resolve(ncName);
} catch(...) {
std::cerr << "[" << argv[0] << "] wait ClockGenerator" << std::endl;
sleep(3);
}
} while ( obj == NULL );

とすると,所望の振る舞いをしてくれるのですが,
コンポーネントの中のInit関数で以下のようにすると,

void MySampleInit(RTC::Manager* manager)
{
{
CORBA::ORB_var orb = manager->getORB();
CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);
PortableServer::POAManager_var manager = rootPOA -> the_POAManager();
CosNaming::NamingContext_var cxt;
CORBA::Object_var nS = orb->resolve_initial_references("NameService");
cxt = CosNaming::NamingContext::_narrow(nS);
CosNaming::Name ncName;
ncName.length(1);
ncName[0].id = CORBA::string_dup("ClockGenerator");
ncName[0].kind = CORBA::string_dup("");
CORBA::Object_var obj = NULL;
std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;
do {
try {
obj = cxt->resolve(ncName);
} catch(...) {
std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;
sleep(3);
}
} while ( obj == NULL );
}
とするとwhile文からぬけてこずに,

RTC::Properties &props = manager->getConfig();
RTC::CorbaNaming cn
= RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());
CORBA::Object_ptr obj = NULL;
do {
try {
obj = cn.resolve("ClockGenerator");
}catch(RTC::CorbaNaming::NotFound& ex){
std::cerr << "Can not find ClockGenerator" << std::endl;
sleep(3);
}catch(CORBA::SystemException &e){
std::cerr << "Exception" << std::endl;
sleep(3);
}
} while ( obj == NULL );

としてみると,最初はnotFoundのexceptionが発生していますが,
途中からSystemException が発生している,という状況です.
_______________________________________________
openrtm-users mailing list
openrtm-users@openrtm.org
http://www.openrtm.org/mailman/listinfo/openrtm-users

Undefined
isao-hara
Offline
Last seen: 4 years 6 months ago
Joined: 2011-06-04 18:20
[openrtm-users 01842] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

岡田先生:産総研の原です。下記の振る舞いですが、CosNamingのresolveメソッドは、指定さえたネーミングコンテキストがあればそのreferenceを返しますが、存在しなければExceptionを発生させるようになっています。そのため、最初のやり方では、無限ループになってしまったのだと思います。一番最初のコードでncNameが存在しなえれば、やはり無限ループとなって抜け出せないというのが正常な動作だと思います。また、2番目のコードで、CosNamingを 

  RTC::CorbaNaming cn

     = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());

とされていますが、これでは、NameServiceのCORBAリファレンスが取得できていないとだと思います。#corba.nameserersがどうなっているか分かりませんので、判断に迷いますが、、、、NamingServiceのCORBAリファレンスを得るには、

   CORBA::Object_var   nS = orb->resolve_initial_references("NameService");   cxt = CosNaming::NamingContext::_narrow(nS);

でよいと思いますので、そのネーミングコンテキストに対して、resolveを実行すれば、CORBAの参照を取得するか、NotFoundのExceptionが発生すると思います。ちなみに、RT System Editorは、CosNamingExのCORBAリファレンスを取得して、listメソッドでNameServiceに登録されているCORBAリファレンスの一覧を取得しているようです。On 2011/07/09, at 15:59, Kei Okada wrote:

コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法をご存知の方がいらっしゃいましたら,方法をご教示いただけると幸いです.XXComp.cpp のなかで,    CORBA::ORB_var orb;    orb = CORBA::ORB_init(argc, argv);    CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");    PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);    PortableServer::POAManager_var manager = rootPOA -> the_POAManager();    CosNaming::NamingContext_var cxt;    CORBA::Object_var   nS = orb->resolve_initial_references("NameService");    cxt = CosNaming::NamingContext::_narrow(nS);    CosNaming::Name ncName;    ncName.length(1);    ncName[0].id = CORBA::string_dup("ClockGenerator");    ncName[0].kind = CORBA::string_dup("");    CORBA::Object_var obj = NULL;    do {      try {        obj = cxt->resolve(ncName);      } catch(...) {        std::cerr << "[" << argv[0] << "] wait ClockGenerator" << std::endl;        sleep(3);      }    } while ( obj == NULL );とすると,所望の振る舞いをしてくれるのですが,コンポーネントの中のInit関数で以下のようにすると,  void MySampleInit(RTC::Manager* manager)  {    {    CORBA::ORB_var orb = manager->getORB();    CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");    PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);    PortableServer::POAManager_var manager = rootPOA -> the_POAManager();    CosNaming::NamingContext_var cxt;    CORBA::Object_var   nS = orb->resolve_initial_references("NameService");    cxt = CosNaming::NamingContext::_narrow(nS);    CosNaming::Name ncName;    ncName.length(1);    ncName[0].id = CORBA::string_dup("ClockGenerator");    ncName[0].kind = CORBA::string_dup("");    CORBA::Object_var obj = NULL;    std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;    do {      try {        obj = cxt->resolve(ncName);      } catch(...) {        std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;        sleep(3);      }    } while ( obj == NULL );    }とするとwhile文からぬけてこずに,    RTC::Properties &props = manager->getConfig();    RTC::CorbaNaming cn      = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());    CORBA::Object_ptr obj = NULL;    do {      try {        obj = cn.resolve("ClockGenerator");      }catch(RTC::CorbaNaming::NotFound& ex){        std::cerr << "Can not find ClockGenerator"  << std::endl;        sleep(3);      }catch(CORBA::SystemException &e){        std::cerr << "Exception" << std::endl;        sleep(3);      }    } while ( obj == NULL );としてみると,最初はnotFoundのexceptionが発生していますが,途中からSystemException が発生している,という状況です._______________________________________________openrtm-users mailing listopenrtm-users@openrtm.orghttp://www.openrtm.org/mailman/listinfo/openrtm-users

------------------------------------------------------------

isao-hara
Offline
Last seen: 4 years 6 months ago
Joined: 2011-06-04 18:20
[openrtm-users 01843] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

岡田先生:産総研の原です。少し、OpenRTM-aistのソースコードを見てみました。そこで、分かったのですが、

  RTC::CorbaNaming cn

     = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());

を実行することで、一応は、NamingContext が取得できているようです。RTC::CorbaNamingでは、2番目の引数のStringを使って、corbaloc::Hostname/NameService という、URIをstring_to_objectでCORBAリファレンスにして、CosNamingExオブジェクトのリファレレンスを取得しています。RTC::CorbaNamingオブジェクトのresolveメソッドも最終的には、CosNamingExのresolveをコールしていますので、指定したオブジェクトリファレンスが登録されていなければ、NotFoundのExceptionが帰ってきます。SystemExceptionは「その他のエラー」と定義されていますので、もしかするとNameServerのエラーかもしれません。しかし、Whileのループで待っているのは、なぜでしょうか?また、NameServiceに登録されていても、CORBAサービスが起動しているかどうか分かりませんので、得られたCORBAリファレンスに対して、non_existentメソッドをコールして確かめた方がよいと思います。On 2011/07/09, at 22:07, isao-hara wrote:

岡田先生:産総研の原です。下記の振る舞いですが、CosNamingのresolveメソッドは、指定さえたネーミングコンテキストがあればそのreferenceを返しますが、存在しなければExceptionを発生させるようになっています。そのため、最初のやり方では、無限ループになってしまったのだと思います。一番最初のコードでncNameが存在しなえれば、やはり無限ループとなって抜け出せないというのが正常な動作だと思います。また、2番目のコードで、CosNamingを 
  RTC::CorbaNaming cn

     = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());

とされていますが、これでは、NameServiceのCORBAリファレンスが取得できていないとだと思います。#corba.nameserersがどうなっているか分かりませんので、判断に迷いますが、、、、NamingServiceのCORBAリファレンスを得るには、

   CORBA::Object_var   nS = orb->resolve_initial_references("NameService");   cxt = CosNaming::NamingContext::_narrow(nS);

でよいと思いますので、そのネーミングコンテキストに対して、resolveを実行すれば、CORBAの参照を取得するか、NotFoundのExceptionが発生すると思います。ちなみに、RT System Editorは、CosNamingExのCORBAリファレンスを取得して、listメソッドでNameServiceに登録されているCORBAリファレンスの一覧を取得しているようです。On 2011/07/09, at 15:59, Kei Okada wrote:

コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法をご存知の方がいらっしゃいましたら,方法をご教示いただけると幸いです.XXComp.cpp のなかで,    CORBA::ORB_var orb;    orb = CORBA::ORB_init(argc, argv);    CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");    PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);    PortableServer::POAManager_var manager = rootPOA -> the_POAManager();    CosNaming::NamingContext_var cxt;    CORBA::Object_var   nS = orb->resolve_initial_references("NameService");    cxt = CosNaming::NamingContext::_narrow(nS);    CosNaming::Name ncName;    ncName.length(1);    ncName[0].id = CORBA::string_dup("ClockGenerator");    ncName[0].kind = CORBA::string_dup("");    CORBA::Object_var obj = NULL;    do {      try {        obj = cxt->resolve(ncName);      } catch(...) {        std::cerr << "[" << argv[0] << "] wait ClockGenerator" << std::endl;        sleep(3);      }    } while ( obj == NULL );とすると,所望の振る舞いをしてくれるのですが,コンポーネントの中のInit関数で以下のようにすると,  void MySampleInit(RTC::Manager* manager)  {    {    CORBA::ORB_var orb = manager->getORB();    CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");    PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);    PortableServer::POAManager_var manager = rootPOA -> the_POAManager();    CosNaming::NamingContext_var cxt;    CORBA::Object_var   nS = orb->resolve_initial_references("NameService");    cxt = CosNaming::NamingContext::_narrow(nS);    CosNaming::Name ncName;    ncName.length(1);    ncName[0].id = CORBA::string_dup("ClockGenerator");    ncName[0].kind = CORBA::string_dup("");    CORBA::Object_var obj = NULL;    std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;    do {      try {        obj = cxt->resolve(ncName);      } catch(...) {        std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;        sleep(3);      }    } while ( obj == NULL );    }とするとwhile文からぬけてこずに,    RTC::Properties &props = manager->getConfig();    RTC::CorbaNaming cn      = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());    CORBA::Object_ptr obj = NULL;    do {      try {        obj = cn.resolve("ClockGenerator");      }catch(RTC::CorbaNaming::NotFound& ex){        std::cerr << "Can not find ClockGenerator"  << std::endl;        sleep(3);      }catch(CORBA::SystemException &e){        std::cerr << "Exception" << std::endl;        sleep(3);      }    } while ( obj == NULL );としてみると,最初はnotFoundのexceptionが発生していますが,途中からSystemException が発生している,という状況です._______________________________________________openrtm-users mailing listopenrtm-users@openrtm.orghttp://www.openrtm.org/mailman/listinfo/openrtm-users

isao-hara
Offline
Last seen: 4 years 6 months ago
Joined: 2011-06-04 18:20
[openrtm-users 01844] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

岡田先生、安藤さん:産総研の原です。岡田先生の最後のコードで、最初にNotFoundで、次からSystemExceptionが帰ってくる理由ですが、多分、CorbaNaming.cppの中のtoNameメソッドで            name[i].id   = CORBA::string_dup(name_comps[i].c_str());            name[i].kind = (char *)"";のような記述がありために、2度目からエラーが出ているのだと思います。正しくは、            name[i].id   = CORBA::string_dup(name_comps[i].c_str());            name[i].kind =   CORBA::string_dup(””);としてあげないといけないのではないでしょうか?岡田先生の例の場合には、id="ClockGenerator"で、kind=""となっているので、問題が起きたのだと思います。On 2011/07/09, at 22:40, isao-hara wrote:

岡田先生:産総研の原です。少し、OpenRTM-aistのソースコードを見てみました。そこで、分かったのですが、
  RTC::CorbaNaming cn

     = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());

を実行することで、一応は、NamingContext が取得できているようです。RTC::CorbaNamingでは、2番目の引数のStringを使って、corbaloc::Hostname/NameService という、URIをstring_to_objectでCORBAリファレンスにして、CosNamingExオブジェクトのリファレレンスを取得しています。RTC::CorbaNamingオブジェクトのresolveメソッドも最終的には、CosNamingExのresolveをコールしていますので、指定したオブジェクトリファレンスが登録されていなければ、NotFoundのExceptionが帰ってきます。SystemExceptionは「その他のエラー」と定義されていますので、もしかするとNameServerのエラーかもしれません。しかし、Whileのループで待っているのは、なぜでしょうか?また、NameServiceに登録されていても、CORBAサービスが起動しているかどうか分かりませんので、得られたCORBAリファレンスに対して、non_existentメソッドをコールして確かめた方がよいと思います。On 2011/07/09, at 22:07, isao-hara wrote:

岡田先生:産総研の原です。下記の振る舞いですが、CosNamingのresolveメソッドは、指定さえたネーミングコンテキストがあればそのreferenceを返しますが、存在しなければExceptionを発生させるようになっています。そのため、最初のやり方では、無限ループになってしまったのだと思います。一番最初のコードでncNameが存在しなえれば、やはり無限ループとなって抜け出せないというのが正常な動作だと思います。また、2番目のコードで、CosNamingを 
  RTC::CorbaNaming cn

     = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());

とされていますが、これでは、NameServiceのCORBAリファレンスが取得できていないとだと思います。#corba.nameserersがどうなっているか分かりませんので、判断に迷いますが、、、、NamingServiceのCORBAリファレンスを得るには、

   CORBA::Object_var   nS = orb->resolve_initial_references("NameService");   cxt = CosNaming::NamingContext::_narrow(nS);

でよいと思いますので、そのネーミングコンテキストに対して、resolveを実行すれば、CORBAの参照を取得するか、NotFoundのExceptionが発生すると思います。ちなみに、RT System Editorは、CosNamingExのCORBAリファレンスを取得して、listメソッドでNameServiceに登録されているCORBAリファレンスの一覧を取得しているようです。On 2011/07/09, at 15:59, Kei Okada wrote:

コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法をご存知の方がいらっしゃいましたら,方法をご教示いただけると幸いです.XXComp.cpp のなかで,    CORBA::ORB_var orb;    orb = CORBA::ORB_init(argc, argv);    CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");    PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);    PortableServer::POAManager_var manager = rootPOA -> the_POAManager();    CosNaming::NamingContext_var cxt;    CORBA::Object_var   nS = orb->resolve_initial_references("NameService");    cxt = CosNaming::NamingContext::_narrow(nS);    CosNaming::Name ncName;    ncName.length(1);    ncName[0].id = CORBA::string_dup("ClockGenerator");    ncName[0].kind = CORBA::string_dup("");    CORBA::Object_var obj = NULL;    do {      try {        obj = cxt->resolve(ncName);      } catch(...) {        std::cerr << "[" << argv[0] << "] wait ClockGenerator" << std::endl;        sleep(3);      }    } while ( obj == NULL );とすると,所望の振る舞いをしてくれるのですが,コンポーネントの中のInit関数で以下のようにすると,  void MySampleInit(RTC::Manager* manager)  {    {    CORBA::ORB_var orb = manager->getORB();    CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");    PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);    PortableServer::POAManager_var manager = rootPOA -> the_POAManager();    CosNaming::NamingContext_var cxt;    CORBA::Object_var   nS = orb->resolve_initial_references("NameService");    cxt = CosNaming::NamingContext::_narrow(nS);    CosNaming::Name ncName;    ncName.length(1);    ncName[0].id = CORBA::string_dup("ClockGenerator");    ncName[0].kind = CORBA::string_dup("");    CORBA::Object_var obj = NULL;    std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;    do {      try {        obj = cxt->resolve(ncName);      } catch(...) {        std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;        sleep(3);      }    } while ( obj == NULL );    }とするとwhile文からぬけてこずに,    RTC::Properties &props = manager->getConfig();    RTC::CorbaNaming cn      = RTC::CorbaNaming(manager->getORB(), props["corba.nameservers"].c_str());    CORBA::Object_ptr obj = NULL;    do {      try {        obj = cn.resolve("ClockGenerator");      }catch(RTC::CorbaNaming::NotFound& ex){        std::cerr << "Can not find ClockGenerator"  << std::endl;        sleep(3);      }catch(CORBA::SystemException &e){        std::cerr << "Exception" << std::endl;        sleep(3);      }    } while ( obj == NULL );としてみると,最初はnotFoundのexceptionが発生していますが,途中からSystemException が発生している,という状況です._______________________________________________openrtm-users mailing listopenrtm-users@openrtm.orghttp://www.openrtm.org/mailman/listinfo/openrtm-users

root
Offline
Last seen: 14 hours 50 min ago
Joined: 2009-06-23 14:31
[openrtm-users 01846] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

原さん

安藤です

kind や id の型であるCORBA::String クラス (実際にはomniORB
などでは String_member クラスになりますが)では、const char* に対する
コンストラクタ・代入演算子ともに定義されているので、

name[i].kind = "";

という記述でも問題ありません。
普通は中で string_dup していますので。

2011年7月9日22:49 isao-hara :
> 岡田先生、安藤さん:
> 産総研の原です。
> 岡田先生の最後のコードで、最初にNotFoundで、次からSystemExceptionが帰ってくる理由ですが、
> 多分、CorbaNaming.cppの中のtoNameメソッドで
> name[i].id = CORBA::string_dup(name_comps[i].c_str());
> name[i].kind = (char *)"";
> のような記述がありために、2度目からエラーが出ているのだと思います。
> 正しくは、
> name[i].id = CORBA::string_dup(name_comps[i].c_str());
> name[i].kind = CORBA::string_dup(””);
> としてあげないといけないのではないでしょうか?
> 岡田先生の例の場合には、id="ClockGenerator"で、kind=""となっているので、問題が起きたのだと思います。
>
>
>
> On 2011/07/09, at 22:40, isao-hara wrote:
>
> 岡田先生:
> 産総研の原です。
> 少し、OpenRTM-aistのソースコードを見てみました。
> そこで、分かったのですが、
>
> RTC::CorbaNaming cn
>
> = RTC::CorbaNaming(manager->getORB(),
> props["corba.nameservers"].c_str());
>
> を実行することで、一応は、NamingContext が取得できているようです。
> RTC::CorbaNamingでは、2番目の引数のStringを使って、corbaloc::Hostname/NameService という、
> URIをstring_to_objectでCORBAリファレンスにして、CosNamingExオブジェクトのリファレレンスを
> 取得しています。
> RTC::CorbaNamingオブジェクトのresolveメソッドも最終的には、CosNamingExのresolveをコールして
> いますので、指定したオブジェクトリファレンスが登録されていなければ、NotFoundのExceptionが帰ってきます。
> SystemExceptionは「その他のエラー」と定義されていますので、もしかするとNameServerのエラーかもしれません。
> しかし、Whileのループで待っているのは、なぜでしょうか?
> また、NameServiceに登録されていても、CORBAサービスが起動しているかどうか分かりませんので、
> 得られたCORBAリファレンスに対して、non_existentメソッドをコールして確かめた方がよいと思います。
>
>
> On 2011/07/09, at 22:07, isao-hara wrote:
>
> 岡田先生:
> 産総研の原です。下記の振る舞いですが、CosNamingのresolveメソッドは、指定さえたネーミングコンテキストがあれば
> そのreferenceを返しますが、存在しなければExceptionを発生させるようになっています。
> そのため、最初のやり方では、無限ループになってしまったのだと思います。
> 一番最初のコードでncNameが存在しなえれば、やはり無限ループとなって抜け出せないというのが正常な動作だと思います。
> また、2番目のコードで、CosNamingを
>
> RTC::CorbaNaming cn
>
> = RTC::CorbaNaming(manager->getORB(),
> props["corba.nameservers"].c_str());
>
> とされていますが、これでは、NameServiceのCORBAリファレンスが取得できていないとだと思います。
> #corba.nameserersがどうなっているか分かりませんので、判断に迷いますが、、、、
> NamingServiceのCORBAリファレンスを得るには、
>
> CORBA::Object_var nS = orb->resolve_initial_references("NameService");
> cxt = CosNaming::NamingContext::_narrow(nS);
>
> でよいと思いますので、そのネーミングコンテキストに対して、resolveを実行すれば、CORBAの参照を取得するか、
> NotFoundのExceptionが発生すると思います。
> ちなみに、RT System
> Editorは、CosNamingExのCORBAリファレンスを取得して、listメソッドでNameServiceに登録されている
> CORBAリファレンスの一覧を取得しているようです。
>
> On 2011/07/09, at 15:59, Kei Okada wrote:
>
> コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法を
> ご存知の方がいらっしゃいましたら,方法をご教示いただけると幸いです.
>
> XXComp.cpp のなかで,
> CORBA::ORB_var orb;
> orb = CORBA::ORB_init(argc, argv);
> CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");
> PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);
> PortableServer::POAManager_var manager = rootPOA -> the_POAManager();
> CosNaming::NamingContext_var cxt;
> CORBA::Object_var nS = orb->resolve_initial_references("NameService");
> cxt = CosNaming::NamingContext::_narrow(nS);
> CosNaming::Name ncName;
> ncName.length(1);
> ncName[0].id = CORBA::string_dup("ClockGenerator");
> ncName[0].kind = CORBA::string_dup("");
> CORBA::Object_var obj = NULL;
> do {
> try {
> obj = cxt->resolve(ncName);
> } catch(...) {
> std::cerr << "[" << argv[0] << "] wait ClockGenerator" << std::endl;
> sleep(3);
> }
> } while ( obj == NULL );
>
> とすると,所望の振る舞いをしてくれるのですが,
> コンポーネントの中のInit関数で以下のようにすると,
>
> void MySampleInit(RTC::Manager* manager)
> {
> {
> CORBA::ORB_var orb = manager->getORB();
> CORBA::Object_var poaObj = orb -> resolve_initial_references("RootPOA");
> PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj);
> PortableServer::POAManager_var manager = rootPOA -> the_POAManager();
> CosNaming::NamingContext_var cxt;
> CORBA::Object_var nS = orb->resolve_initial_references("NameService");
> cxt = CosNaming::NamingContext::_narrow(nS);
> CosNaming::Name ncName;
> ncName.length(1);
> ncName[0].id = CORBA::string_dup("ClockGenerator");
> ncName[0].kind = CORBA::string_dup("");
> CORBA::Object_var obj = NULL;
> std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;
> do {
> try {
> obj = cxt->resolve(ncName);
> } catch(...) {
> std::cerr << "[" << "" << "] wait ClockGenerator" << std::endl;
> sleep(3);
> }
> } while ( obj == NULL );
> }
> とするとwhile文からぬけてこずに,
>
> RTC::Properties &props = manager->getConfig();
> RTC::CorbaNaming cn
> = RTC::CorbaNaming(manager->getORB(),
> props["corba.nameservers"].c_str());
> CORBA::Object_ptr obj = NULL;
> do {
> try {
> obj = cn.resolve("ClockGenerator");
> }catch(RTC::CorbaNaming::NotFound& ex){
> std::cerr << "Can not find ClockGenerator" << std::endl;
> sleep(3);
> }catch(CORBA::SystemException &e){
> std::cerr << "Exception" << std::endl;
> sleep(3);
> }
> } while ( obj == NULL );
>
> としてみると,最初はnotFoundのexceptionが発生していますが,
> 途中からSystemException が発生している,という状況です.
> _______________________________________________
> openrtm-users mailing list
> openrtm-users@openrtm.org
> http://www.openrtm.org/mailman/listinfo/openrtm-users
>

isao-hara
Offline
Last seen: 4 years 6 months ago
Joined: 2011-06-04 18:20
[openrtm-users 01847] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

安藤さん

原です。
下記の件ですが、RtORBではstrdupを明示的にしないとsegmentation errorがでる
と思いますので、omniの方で問題なければ、明示的にstrdupをして下さい。
よろしくお願いいたします。

root
Offline
Last seen: 14 hours 50 min ago
Joined: 2009-06-23 14:31
[openrtm-users 01848] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

安藤です

現状RtORB用のコードはifdefで切り分けているので
問題のでないようにしていますが、string_dupをして
ifdef がいらなくなるのであれば今後はそうします。

> 安藤さん
>
> 原です。
> 下記の件ですが、RtORBではstrdupを明示的にしないとsegmentation errorがでる
> と思いますので、omniの方で問題なければ、明示的にstrdupをして下さい。
> よろしくお願いいたします。
>
>

root
Offline
Last seen: 14 hours 50 min ago
Joined: 2009-06-23 14:31
[openrtm-users 01845] コンポーネントのなかから,他のCORBAサービスが動いているか確認する方法

岡田先生

安藤です

おそらく、コンポーネントが何も存在しないため、ORBのシャットダウンが
行われて、SystemExceptionが発生しているのだと思います。
起動後10秒くらいでSystemExceptionが出てませんか?

rtc.conf に以下の1行を追加してみてください。

manager.shutdown_auto: NO

詳細はこちらをご覧ください。
http://www.openrtm.org/openrtm/ja/content/rtcconf%E8%A8%AD%E5%AE%9A%E9%A0%85%E7%9B%AE%E4%B8%80%E8%A6%A7#toc3

このオプション、スタンドアロンコンポーネントではデフォルトが
YESになっていますが、マネージャがマスタの場合 (-d オプション) はNOになります。

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