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