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

10 posts / 0 new
Last post
root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00560] RTコンポーネントの動的リンクについて

いつもお世話になっております。

富士ソフトの二宮と申します。

現在 OpenRTM 0.4.1(C++) 環境において、コンポーネントの接続を行なう
アプリケーションを作成しようとしているのですが、ホームページ上で
公開されているドキュメントだけでは対応が取れない状態となってしまい
苦慮しております。

つきましては、以下の処理を行う方法をご教授していただけないでしょうか?
・コンポーネントが持っているポートの情報を外部アプリケーションから取得する際に、

 ポートリスト上の配列の位置を指定するのではなく、ポート名文字列を指定して
 取得する事は可能でしょうか?
・また、文字列指定で取得できない場合、ポートの情報を保持しているクラスに
 ポート名を取得する機能は有りますでしょうか?
・外部アプリケーションからコンポーネントをアクティブ化する際に、
 get_contexts()関数を使用して ExecutionContextList_var の情報を取得し、
 activate_component() をコールする、用にしたのですが、コンパイルが
 通りませんでした、使用しているクラスが間違っているのでしょうか?

よろしくお願いいたします。

- 以上 -

Undefined
root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00561] RTコンポーネントの動的リンクについて

富士ソフト 二宮様

産総研 安藤です

> 富士ソフトの二宮と申します。
>
> 現在 OpenRTM 0.4.1(C++) 環境において、コンポーネントの接続を行なう
> アプリケーションを作成しようとしているのですが、ホームページ上で
> 公開されているドキュメントだけでは対応が取れない状態となってしまい
> 苦慮しております。

WebページのクラスリファレンスおよびIDLリファレンスも
合わせてご覧ください。よろしくお願いします。

> つきましては、以下の処理を行う方法をご教授していただけないでしょうか?
> ・コンポーネントが持っているポートの情報を外部アプリケーションから取得する際に、
>  ポートリスト上の配列の位置を指定するのではなく、ポート名文字列を指定して
>  取得する事は可能でしょうか?

どういったことをおやりになりたいのかいま一つつかめないのですが、
Portの名前はPortPorfileのname属性に書かれています。
H:\OpenRTM-aist\docs\IDLReference-en\html\namespaceRTC.html

> ・また、文字列指定で取得できない場合、ポートの情報を保持しているクラスに
>  ポート名を取得する機能は有りますでしょうか?

「ポートの情報を保持しているクラス」とは何でしょうか?
PortProfileの事でしたら、上にも書きましたようにname属性に
ポート名が入っています。

> ・外部アプリケーションからコンポーネントをアクティブ化する際に、
>  get_contexts()関数を使用して ExecutionContextList_var の情報を取得し、
>  activate_component() をコールする、用にしたのですが、コンパイルが
>  通りませんでした、使用しているクラスが間違っているのでしょうか?

どのように使用して、どのようなエラーが出たのかわかりません。
もう少し詳しい情報を頂けますか?

root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00569] RtcLinkのEMFモデルについて

いつもお世話になっております。

root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00562] RT コンポーネントの動的リンクについて

静岡大 清水です。

> ・コンポーネントが持っているポートの情報を外部アプリケ
ーションから取得する際に、
>
>
>  ポートリスト上の配列の位置を指定するのではなく、ポー
ト名文字列を指定して
>  取得する事は可能でしょうか?

現在のところ、そのようなヘルパー関数はないですが、
簡単に自作できるかと思います。

1. RTObject::get_ports()でPortインタフェース
のリストを取得する。
2. 各ポートのget_port_profile()でPortProfile
を取得する。
3. PortProfileのnameでマッチングをとり、
該当するポートの番号を取得する。
4. そのポート番号のPortインタフェースあるいは
PortProfileをreturnする。

以上のようにすればよいと思いますが、
ポートの名前はUniqueではないので、
同名のものが複数ある場合は名前では区別がつかない
ことに注意する必要があります。

> ・外部アプリケーションからコンポーネントをアクティブ化
する際に、
>  get_contexts()関数を使用して
> ExecutionContextList_var の情報を取得し、
>  activate_component()
> をコールする、用にしたのですが、コンパイルが
>  通りませんでした、使用しているクラスが間違っているの
でしょうか?
>

ソースがないのでエラー原因はわかりませんが、
以下のような簡単なコードでactivateできると思います。

ExecutionContextList_var eclist = comp->get_contexts();
eclist[0]->activate_component(comp);

清水

root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00563] [openrtm-users 00560] RTコンポーネントの動的リンクについて

二宮様、小島様、

産総研 末廣です。
今pythonで作りかけているツール(rtc_handle.py)を添付します。
class RtmEnvのlist_rtcがネームサービスからコンポーネントを取得する例になります。
class RtcHandleにコンポーネントのさまざまな情報を集約しています。
test.pyにコンポーネント名やポート名を使ってコンポーネントを接続する例を載せます。
コンポーネントをactivateする場合は、
env.rtc_handles['vel_7dof0.rtc']env.rtc_handles['vel_7dof0.rtc'].activate()
などとすれば良いことになります。

これらはpythonを使った例ですが、C++でもほとんど同様になるはずです。
OpenRTMのレファレンスを参照して掘り下げていくといろいろなことができる
ことが分かります。その掘り下げの苦労を少なくしたのがRtcHandleということになります。

以上、ご参考にして下さい。

root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00564] RTコンポーネントの動的リンクについて

二宮様

中央大学、國井研究室の小島です。

私も同じようなアプリケーションの作成(RTC-linkのようなGUI)などを行おうと思い
以前同じような質問をさせていただき、ちょうどC++で、クラス化をしていました。

ただ、末廣様が作成されたツールの方がスクリプト言語ですし、
多機能のようなので使い勝手が良いとは思いますので、
勉強して参考にさせていただこうと思います・・・。

クラスは、ConnectorCompを参考に、ここで教えていただいたことと
クラスリファレンスなどを調べながら作ったものです。

私が作成したクラスは、クラスリファレンスなどが不十分なため使いにくかったり、
動けばいいというところもあるので、まどろっこしいことをしている部分などもございますが、
使用された際には、改良すべき点や、バグ等があれば修正して、連絡していただけると、助かります。

使用方法は、main文を参考にしていただければ動かせるかと思います。

なお、例のmain文では、exampleのSimpleIOを接続する例となっています。
また、ServiceMain.cppには、exampleのSimpleServiceを接続するものです。
動作は確認していますが、もしかしたら、正しく接続できているかが疑わしいかもしれません。

以下に作成したクラスのリンクをおいておきます。
主に、コンポーネントの接続クラスと、アクティベート・でアクティベート・リセットなどのコントロールクラスとなっております。
http://www.hmsl.elect.chuo-u.ac.jp/~takashi/RTCompConnect,Control-1.0.0.zip
http://www.hmsl.elect.chuo-u.ac.jp/~takashi/Reference_RTCompConnect.zip

ご参考になれば幸いです。

root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00566] [openrtm-users 00560] RTコンポーネントの動的リンクについて

産総研 末廣です。
大事なことを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するようにしましたところ、セグメントエラーはでなくなりました。
>

root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00567] [openrtm-users 00560] RTコンポーネントの動的リンクについて

産総研 末廣です。
大事なことを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するようにしましたところ、セグメントエラーはでなくなりました。
>

root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00605] RTコンポーネントの動的リンクについて

皆様、

末廣@産総研です。
以前、紹介した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するようにしましたところ、セグメントエラーはでなくなりました。
>>
>

root
Offline
Last seen: 8 hours 4 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00568] RTコンポーネントの動的リンクについて

お世話になっております。

富士ソフトの二宮です。

静岡大 清水様、中央大学 小島様よりご教授頂いた内容を
参考に修正を行ったところ、無事、動作することを確認しました。

ご対応頂きありがとうございました。

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