[openrtm-users 00311] 動的なサービスポートの追加について

6 posts / 0 new
Last post
root
Offline
Last seen: 2 days 18 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00311] 動的なサービスポートの追加について

中央大学の小島です。
お世話になっております。

動的なサービスポートの追加および削除を行おうと思ったのですが、
警告がでながらもコンパイルは通りますが、実行しポートにアクセス
するようなことを行うと、RTCLink上で赤くなってしまいます。

その時には
omniORB: ERROR -- the aplication attemped to invoke an operation on a
nil reference

特に必要がない部分については省略しますが、
ポートの追加はだいたい以下のように行いました。

---service.idl---
interface RQ
{
void request();
}

interface RP
{
void reply();
}
---serviceSVC_impl.h--
RPSVC_impl
{
public :
short flag(0);
}

---service.h---

long dynamicPortCounter
std::vector m_ServicePort;
std::vector< RQSVC_impl > m_ request;
std::vector< RTC::CorbaConsumer > m_reply;

---service.cpp---

void service::onInitialize(...){
addport();
}

void service::onExecute(...)
{
for(unsigned long i(0);iflag == 1) m_request[i].request();
}
}

void service::addport()
{
std::string portName("IDServicePort");
std::string requestName("requestID");
std::string provideName("providerID");

portName += otos(dynamicPortCounter);
requestName += otos(dynamicPortCounter);
provideName += otos(dynamicPortCounter);

//provider port
RQSVC_impl tmpRequest;
m_request.push_back(tmpRequest);

//consumer port
RTC::CorbaConsumer tmpReply;
m_request.push_back(tmpReply);

//regist port
m_ServicePort.push_back(new RTC::CorbaPort(portName.c_str()));
m_ServicePort.back()->registerProvider(provideName.c_str()
,provideName.c_str() ,m_request.back());
m_ServicePort.back()->registerConsumer(requestName.c_str)
,requestName.c_str() ,m_reply.back());
}

警告内容は添付させていただきます。
service.cpp 192は、m_request.push_back(tmpReply)に該当します。

エラー内容から推測すると、接続しないでアクティブ化してしまったために、
コンシューマーの実体が存在していないというエラーなのでしょうか?

もし、仮にそうであれば、回避する方法もありますでしょうか?

ご教授お願いいたします。

Undefined
root
Offline
Last seen: 2 days 18 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00312] 動的なサービスポートの追加について

中央大学 小島 様。

お世話になっております。
産総研 栗原です。

一つ、気になった点があります。

> 警告内容は添付させていただきます。
> service.cpp 192は、m_request.push_back(tmpReply)に該当します。
と書いてありますが、m_requestは"std::vector< RQSVC_impl > m_ request;"
と宣言されておりますので、m_request.push_back()ではなく、
m_reply.push_back()の間違いではないでしょうか?
m_replyには何も入ってないようですので、Consumerの方でnilオブジェクト
に対してオペレーション呼び出しを試みてエラーになると思います。

ご確認の程、宣しくお願い致します。

> 中央大学の小島です。
> お世話になっております。
>
> 動的なサービスポートの追加および削除を行おうと思ったのですが、
> 警告がでながらもコンパイルは通りますが、実行しポートにアクセス
> するようなことを行うと、RTCLink上で赤くなってしまいます。
>
> その時には
> omniORB: ERROR -- the aplication attemped to invoke an operation on a
> nil reference
>
> 特に必要がない部分については省略しますが、
> ポートの追加はだいたい以下のように行いました。
>
> ---service.idl---
> interface RQ
> {
> void request();
> }
>
> interface RP
> {
> void reply();
> }
> ---serviceSVC_impl.h--
> RPSVC_impl
> {
> public :
> short flag(0);
> }
>
> ---service.h---
>
> long dynamicPortCounter
> std::vector m_ServicePort;
> std::vector< RQSVC_impl > m_ request;
> std::vector< RTC::CorbaConsumer > m_reply;
>
> ---service.cpp---
>
> void service::onInitialize(...){
> addport();
> }
>
> void service::onExecute(...)
> {
> for(unsigned long i(0);i {
> if(m_reply[i]->flag == 1) m_request[i].request();
> }
> }
>
> void service::addport()
> {
> std::string portName("IDServicePort");
> std::string requestName("requestID");
> std::string provideName("providerID");
>
> portName += otos(dynamicPortCounter);
> requestName += otos(dynamicPortCounter);
> provideName += otos(dynamicPortCounter);
>
> //provider port
> RQSVC_impl tmpRequest;
> m_request.push_back(tmpRequest);
>
> //consumer port
> RTC::CorbaConsumer tmpReply;
> m_request.push_back(tmpReply);
>
> //regist port
> m_ServicePort.push_back(new RTC::CorbaPort(portName.c_str()));
> m_ServicePort.back()->registerProvider(provideName.c_str()
> ,provideName.c_str() ,m_request.back());
> m_ServicePort.back()->registerConsumer(requestName.c_str)
> ,requestName.c_str() ,m_reply.back());
> }
>
> 警告内容は添付させていただきます。
> service.cpp 192は、m_request.push_back(tmpReply)に該当します。
>
> エラー内容から推測すると、接続しないでアクティブ化してしまったために、
> コンシューマーの実体が存在していないというエラーなのでしょうか?
>
> もし、仮にそうであれば、回避する方法もありますでしょうか?
>
> ご教授お願いいたします。
>

root
Offline
Last seen: 2 days 18 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00313] 動的なサービスポートの追加について

中央大学の小島です。
お世話になります。

> 一つ、気になった点があります。
>
> > 警告内容は添付させていただきます。
> > service.cpp 192は、m_request.push_back(tmpReply)に該当します。
> と書いてありますが、m_requestは"std::vector< RQSVC_impl > m_ request;"
> と宣言されておりますので、m_request.push_back()ではなく、
> m_reply.push_back()の間違いではないでしょうか?
> m_replyには何も入ってないようですので、Consumerの方でnilオブジェクト
> に対してオペレーション呼び出しを試みてエラーになると思います。
>
> ご確認の程、宣しくお願い致します。

そうですね。栗原様の言うとおり、こちらの記述ミスのようです。
実際のソースコードではご指摘があったように書いてありました。

むしろ、あのコードではコンパイルできませんでした。
原因は、コンシューマにくるんでしまうと、変数の参照ができないようです。
そこで、関数したコードを添付しました。
(おそらくIDLファイルから *.hhファイルなどを作っていて、
 リンクの解決ができてないように思います)

今度は、そのエラーがおこるサンプルプログラムを作成し、添付いたしますので
何か情報があればお願いいたします。

また、interface内で、変数の宣言の仕方等わかりましたら
ご教授願います。

> > 中央大学の小島です。
> > お世話になっております。
> >
> > 動的なサービスポートの追加および削除を行おうと思ったのですが、
> > 警告がでながらもコンパイルは通りますが、実行しポートにアクセス
> > するようなことを行うと、RTCLink上で赤くなってしまいます。
> >
> > その時には
> > omniORB: ERROR -- the aplication attemped to invoke an operation on a
> > nil reference
> >
> > 特に必要がない部分については省略しますが、
> > ポートの追加はだいたい以下のように行いました。
> >
> > ---service.idl---
> > interface RQ
> > {
> > void request();
> > }
> >
> > interface RP
> > {
> > void reply();
> > }
> > ---serviceSVC_impl.h--
> > RPSVC_impl
> > {
> > public :
> > short flag(0);
> > }
> >
> > ---service.h---
> >
> > long dynamicPortCounter
> > std::vector m_ServicePort;
> > std::vector< RQSVC_impl > m_ request;
> > std::vector< RTC::CorbaConsumer > m_reply;
> >
> > ---service.cpp---
> >
> > void service::onInitialize(...){
> > addport();
> > }
> >
> > void service::onExecute(...)
> > {
> > for(unsigned long i(0);i > {
> > if(m_reply[i]->flag == 1) m_request[i].request();
> > }
> > }
> >
> > void service::addport()
> > {
> > std::string portName("IDServicePort");
> > std::string requestName("requestID");
> > std::string provideName("providerID");
> >
> > portName += otos(dynamicPortCounter);
> > requestName += otos(dynamicPortCounter);
> > provideName += otos(dynamicPortCounter);
> >
> > //provider port
> > RQSVC_impl tmpRequest;
> > m_request.push_back(tmpRequest);
> >
> > //consumer port
> > RTC::CorbaConsumer tmpReply;
> > m_request.push_back(tmpReply);
> >
> > //regist port
> > m_ServicePort.push_back(new RTC::CorbaPort(portName.c_str()));
> > m_ServicePort.back()->registerProvider(provideName.c_str()
> > ,provideName.c_str() ,m_request.back());
> > m_ServicePort.back()->registerConsumer(requestName.c_str)
> > ,requestName.c_str() ,m_reply.back());
> > }
> >
> > 警告内容は添付させていただきます。
> > service.cpp 192は、m_request.push_back(tmpReply)に該当します。
> >
> > エラー内容から推測すると、接続しないでアクティブ化してしまったために、
> > コンシューマーの実体が存在していないというエラーなのでしょうか?
> >
> > もし、仮にそうであれば、回避する方法もありますでしょうか?
> >
> > ご教授お願いいたします。
> >

root
Offline
Last seen: 2 days 18 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00314] 動的なサービスポートの追加について

小島 様。

栗原です。

添付して頂いたファイルを拝見させて頂きました。

確認したい事が2点程あります。
・ 対になるサービスポートとコンシューマポートにおいて、"Name"(今回の例ですと、
myservice0またはcallback0)と"Type"(RPまたは、RQ)は同じになっていますでしょ
うか?
(OpenRTM-aistサポートページの"FAQ"->"RtcTemplate"を参照下さい。)

・ RTCLinkにてサービスポート間の接続時に警告等はでておりませんでしょうか?
"No corresponding port interface."等。

> また、interface内で、変数の宣言の仕方等わかりましたら
> ご教授願います。
interfaceの属性であれば、以下のように記述できます。

interface hoge {
attribute string version;
};

以上、宣しくお願い致します。

> 中央大学の小島です。
> お世話になります。
>
> > 一つ、気になった点があります。
> >
> > > 警告内容は添付させていただきます。
> > > service.cpp 192は、m_request.push_back(tmpReply)に該当します。
> > と書いてありますが、m_requestは"std::vector< RQSVC_impl > m_ request;"
> > と宣言されておりますので、m_request.push_back()ではなく、
> > m_reply.push_back()の間違いではないでしょうか?
> > m_replyには何も入ってないようですので、Consumerの方でnilオブジェクト
> > に対してオペレーション呼び出しを試みてエラーになると思います。
> >
> > ご確認の程、宣しくお願い致します。
>
> そうですね。栗原様の言うとおり、こちらの記述ミスのようです。
> 実際のソースコードではご指摘があったように書いてありました。
>
> むしろ、あのコードではコンパイルできませんでした。
> 原因は、コンシューマにくるんでしまうと、変数の参照ができないようです。
> そこで、関数したコードを添付しました。
> (おそらくIDLファイルから *.hhファイルなどを作っていて、
>  リンクの解決ができてないように思います)
>
> 今度は、そのエラーがおこるサンプルプログラムを作成し、添付いたしますので
> 何か情報があればお願いいたします。
>
> また、interface内で、変数の宣言の仕方等わかりましたら
> ご教授願います。
>
> > > 中央大学の小島です。
> > > お世話になっております。
> > >
> > > 動的なサービスポートの追加および削除を行おうと思ったのですが、
> > > 警告がでながらもコンパイルは通りますが、実行しポートにアクセス
> > > するようなことを行うと、RTCLink上で赤くなってしまいます。
> > >
> > > その時には
> > > omniORB: ERROR -- the aplication attemped to invoke an operation on a
> > > nil reference
> > >
> > > 特に必要がない部分については省略しますが、
> > > ポートの追加はだいたい以下のように行いました。
> > >
> > > ---service.idl---
> > > interface RQ
> > > {
> > > void request();
> > > }
> > >
> > > interface RP
> > > {
> > > void reply();
> > > }
> > > ---serviceSVC_impl.h--
> > > RPSVC_impl
> > > {
> > > public :
> > > short flag(0);
> > > }
> > >
> > > ---service.h---
> > >
> > > long dynamicPortCounter
> > > std::vector m_ServicePort;
> > > std::vector< RQSVC_impl > m_ request;
> > > std::vector< RTC::CorbaConsumer > m_reply;
> > >
> > > ---service.cpp---
> > >
> > > void service::onInitialize(...){
> > > addport();
> > > }
> > >
> > > void service::onExecute(...)
> > > {
> > > for(unsigned long i(0);i > > {
> > > if(m_reply[i]->flag == 1) m_request[i].request();
> > > }
> > > }
> > >
> > > void service::addport()
> > > {
> > > std::string portName("IDServicePort");
> > > std::string requestName("requestID");
> > > std::string provideName("providerID");
> > >
> > > portName += otos(dynamicPortCounter);
> > > requestName += otos(dynamicPortCounter);
> > > provideName += otos(dynamicPortCounter);
> > >
> > > //provider port
> > > RQSVC_impl tmpRequest;
> > > m_request.push_back(tmpRequest);
> > >
> > > //consumer port
> > > RTC::CorbaConsumer tmpReply;
> > > m_request.push_back(tmpReply);
> > >
> > > //regist port
> > > m_ServicePort.push_back(new RTC::CorbaPort(portName.c_str()));
> > > m_ServicePort.back()->registerProvider(provideName.c_str()
> > > ,provideName.c_str() ,m_request.back());
> > > m_ServicePort.back()->registerConsumer(requestName.c_str)
> > > ,requestName.c_str() ,m_reply.back());
> > > }
> > >
> > > 警告内容は添付させていただきます。
> > > service.cpp 192は、m_request.push_back(tmpReply)に該当します。
> > >
> > > エラー内容から推測すると、接続しないでアクティブ化してしまったために、
> > > コンシューマーの実体が存在していないというエラーなのでしょうか?
> > >
> > > もし、仮にそうであれば、回避する方法もありますでしょうか?
> > >
> > > ご教授お願いいたします。
> > >

root
Offline
Last seen: 2 days 18 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00315] 動的なサービスポートの追加について

中央大学の小島です。
お世話になっております。

栗原様ありがとうございました。

おかげさまで、一応エラーを起こさずに動作はさせることができました。
原因は、単体でコンポーネントをアクティブかしたために起こっていたようです。
(未だ、警告はでておりますが・・・)

コルバについての知識がほとんどないため、わからないのですが、
RTC::CorbaConsumerは、やはり実体を持っていないのですね。

ゆえに、接続していないと、内部の変数や関数の情報が存在しないため、
nil を返してしまい、エラーとなっていたようです。

そこで現在は、ポートが接続しているかどうかをたしかめようとしているのですが、
実現方法がわからず悩んでいます。

ただ、過去のメーリングリストの内容からget_connector_profile を使って取得
可能とあるのですが、うまく調べることができません。

簡単なサンプル等が、どこかにございますでしょうか?

07/12/10 に kurihara shinji さんは書きました:
> 小島 様。
>
> 栗原です。
>
> 添付して頂いたファイルを拝見させて頂きました。
>
> 確認したい事が2点程あります。
> ・ 対になるサービスポートとコンシューマポートにおいて、"Name"(今回の例ですと、
> myservice0またはcallback0)と"Type"(RPまたは、RQ)は同じになっていますでしょ
> うか?
> (OpenRTM-aistサポートページの"FAQ"->"RtcTemplate"を参照下さい。)

同じになっておるはずです。
実際にはmyservice0, callbackは使っておらず、2つのinterfaceを持つ
1つのServicePortとしております。
ただ、その際には、同じ名前を使っておりますので、大丈夫かとは思います。

> ・ RTCLinkにてサービスポート間の接続時に警告等はでておりませんでしょうか?
> "No corresponding port interface."等。

接続せずに単体で、起動させておりました。
ゆえに、そのようなエラーは出ておりませんでした。
結局、接続させていないことに原因があったようです。

>
> > また、interface内で、変数の宣言の仕方等わかりましたら
> > ご教授願います。
> interfaceの属性であれば、以下のように記述できます。
>
> interface hoge {
> attribute string version;
> };
>

ありがとうございます。attributeをつければいいのですね。
これで、もう少し簡単に機能の実現ができそうです。

ところで、idlファイルに記述する、intefaceなどの書き方は
Corbaに準拠しているのでしょうか?

ご教授願います。

root
Offline
Last seen: 2 days 18 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00316] 動的なサービスポートの追加について

小島 様。

栗原です。

> おかげさまで、一応エラーを起こさずに動作はさせることができました。
> 原因は、単体でコンポーネントをアクティブかしたために起こっていたようです。
> (未だ、警告はでておりますが・・・)
>
> コルバについての知識がほとんどないため、わからないのですが、
> RTC::CorbaConsumerは、やはり実体を持っていないのですね。
>
> ゆえに、接続していないと、内部の変数や関数の情報が存在しないため、
> nil を返してしまい、エラーとなっていたようです。
そうですね。
Provider側のコンポーネントと接続していない場合はProvider側のオブジェクトリ
ファレンスが取得できないため、IDLで定義したオペレーションの呼び出しはでき
ませんね。

> そこで現在は、ポートが接続しているかどうかをたしかめようとしているのですが、
> 実現方法がわからず悩んでいます。
>
> ただ、過去のメーリングリストの内容からget_connector_profile を使って取得
> 可能とあるのですが、うまく調べることができません。
>
> 簡単なサンプル等が、どこかにございますでしょうか?
OpenRTMに付属のSimpleIOコンポーネントにて、ポート接続が行われるまでonActivated()
内でループするサンプルコンポーネントを作成しましたので、添付させて頂きます。

確認方法は、
1. CheckConnetコンポーネントを実行。(実行の前にビルドを行って下さい。)
2. OpenRTM/examples/SimpleIOのConsoleInコンポーネントを実行。
3. CheckConnect, ConsoleInコンポーネントをRTCLinkにてアクティベイト。
(この段階では、RTCLink上のCheckConnectコンポーネントは青色のままです。)
4. ConsoleInとCheckConnectを接続。
(接続後にCheckConnectコンポーネントは緑になり、onExecute()が呼ばれるよう
になります。)
です。

"ポートが接続しているかどうか"は、CheckConnectのonActivated()内でInPortに対して
行っております。

参考にして頂けると幸いです。

以上、宣しくお願い致します。

> 07/12/10 に kurihara shinji さんは書きました:
> > 小島 様。
> >
> > 栗原です。
> >
> > 添付して頂いたファイルを拝見させて頂きました。
> >
> > 確認したい事が2点程あります。
> > ・ 対になるサービスポートとコンシューマポートにおいて、"Name"(今回の例ですと、
> > myservice0またはcallback0)と"Type"(RPまたは、RQ)は同じになっていますでしょ
> > うか?
> > (OpenRTM-aistサポートページの"FAQ"->"RtcTemplate"を参照下さい。)
>
> 同じになっておるはずです。
> 実際にはmyservice0, callbackは使っておらず、2つのinterfaceを持つ
> 1つのServicePortとしております。
> ただ、その際には、同じ名前を使っておりますので、大丈夫かとは思います。
>
> > ・ RTCLinkにてサービスポート間の接続時に警告等はでておりませんでしょうか?
> > "No corresponding port interface."等。
>
> 接続せずに単体で、起動させておりました。
> ゆえに、そのようなエラーは出ておりませんでした。
> 結局、接続させていないことに原因があったようです。
>
> >
> > > また、interface内で、変数の宣言の仕方等わかりましたら
> > > ご教授願います。
> > interfaceの属性であれば、以下のように記述できます。
> >
> > interface hoge {
> > attribute string version;
> > };
> >
>
> ありがとうございます。attributeをつければいいのですね。
> これで、もう少し簡単に機能の実現ができそうです。
>
> ところで、idlファイルに記述する、intefaceなどの書き方は
> Corbaに準拠しているのでしょうか?
>
> ご教授願います。
>

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