[openrtm-users 00605] RTコンポーネントの動的リンクについて

Takashi Suehiro t.suehiro @ aist.go.jp
2008年 9月 11日 (木) 10:58:05 JST


皆様、

末廣@産総研です。
以前、紹介したrtc_handle.pyを以下のURLからwebで取れるようにしました。

http://staff.aist.go.jp/t.suehiro/rtm/index.html

解説付です。だいぶバグフィックスもされています。
以下のOpenRTM-0.4.xへのパッチが必要になりますが、
よろしければ使ってみてください。


takashi suehiro さんは書きました:
> 産総研 末廣です。
> 大事なことを1つ忘れていました。
> 
> コンポーネントのポート情報を取得するために、そのポート1つだけを指定した
> コネクタを作ってダミーで接続を行っているのですが、
> その後、それをdisconnectするとエラーが発生してそのコンポーネントが死にます。
> これに関して、栗原さんに相談をして以下のような回答をもらっています。
> 私は、OpenRTM-0.4.2にその修正を加えた環境でやっています。
> 今後の新しいバージョンでは直ってくると思いますが、
> 今は手作業で修正する必要があります。
> 
>> 栗原です。
>>
>>  DataOutPortに対するdisconnect()での問題についてデバッグ致しましたので
>>  報告させて頂きます。
>>  OpenRTMのバージョンは、OpenRTM-aist-0.4.2にです。
>>
>>  <問題点>
>>
>>   まず、セグメントエラーになっている箇所ですが、PublisherFactory.cppの
>>   destroy()メソッドのpublisher->release();のところでした。
>>
>>   おそらく、ダミーコネクターでは対になるポートが無いためconnect()時に
>>   Publisher(New,Flush,Periodicのいずれか)が生成されずNULLになっている
>>   と考えられます。
>>   # ConnectorProfileのpropertiesにPublisherのタイプを指定しても
>>   # subscribeInterfaces()にて、DataOutPortに対するConsumerが無い場合、
>>   # Publisherは生成されないようになっています。
>>
>>   この状態で、disconnect()が呼ばれるとunsubscribeInterfaces()内で
>>   Publisherのdestory()を行っておりますので、NULLオブジェクトに対し
>>   release()を呼び、そこでセグメントエラーとなります。
>>
>>   DataInPortに対してdisconnect()を呼んでもエラーにならないのは、
>>   DataOutPortにだけしかPublisherは生成されないため、DataInPortの
>>   unsubscribeInterfaces()では、PublisherFactory::destroy()が呼ばれ
>>   ないためです。
>>
>>   それと、Python版ではエラーとならない点は、Python版ではdestroy()メソッ
>>   ドにて、publisherがNoneかどうかを判定し、Noneではない場合にrelease()
>>   を行うように実装されているためです。
>>
>>  <回避策>
>>   回避策の一つとしまして、PublisherFactory::destroy()にて、引数で渡さ
>>   れるpublisherがNULLかどうかを判定し、NULLではない場合にrelease()と
>>   deleteを行うようにするのが考えられます。
>>   一応、こちらでは、destroy()にてpublisherのチェックを行い、NULLの場合
>>   はreturnするようにしましたところ、セグメントエラーはでなくなりました。
>>
> 


-- 
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 メーリングリストの案内