[openrtm-users 00880] Re: OpenRTM1.0.0-RC1 の OutPort に値が格納できない不具合

Masayuki Shimizu masayuki.shimizu @ aist.go.jp
2009年 7月 29日 (水) 12:51:47 JST


俵様

静岡大 清水です。

少し気になったのでコメントです。

OutPortにwriteする前にポートが希望通り
接続されていることを確認してますでしょうか。

ポート接続の確認は、少々面倒なのですが、
PortService::get_connector_profiles()
でConnectorProfileを全て取得し、
各プロファイルごとに、
ConnectorProfile::ports
を調べて希望通りの接続となっているかを
確かめればできます。

それと、接続プログラムの、
CORBA_SeqUtil::push_back(cprof.properties,              
NVUtil::newNV("dataport.dataflow_type",                   
 "Push"));
の所は、"Push"ではなく"push"が正しいようです。

清水

--- 俵 崇文@AIST <tawara-takafumi @ aist.go.jp> wrote:

> 安藤様
> 俵です。
> 
> 返信ありがとうございます。
> 
> > 要は、自作のプログラムからポートの接続をすると、
> >
> OutPortからInPortへデータがいかないということでよろし
いでしょうか?
> はい。
> 
> >
> 「OutPortに値が格納できない」というのがどういう現象を
指しているのですか。
> 具体的にはVirtualRobotRTCが持つ
> RTC::OutPort<RTC::TimedDoubleSeq> インスタンス
> からRTC::OutPort<RTC::TimedDoubleSeq>::write()の実行を
> デバッガで追ったところrtm/OutPort.hの170行目
> virtual bool write(DataType& value)
> {
>   if (m_OnWrite != NULL)
>   {
>     (*m_OnWrite)(value);
>   }
>   // check number of connectors
>   size_t conn_size(m_connectors.size());
>   if (!(conn_size > 0)) { return true; }
> 
> で戻ってしまう現象です。
> SimpleIOだと同様にデバッグで追ってもそのまま戻らず実行
されたので、
> m_connectorsのサイズが0によることが原因で
> バッファに値が書き込まれていないと判断いたしました。
> 
> >
> これらのポートをRTSystemEditorで接続するとどうなります
か?
> 手動で接続することはできましたが、
> その後続行すると自動接続時と同様の動作になりました。
> 
> 以上です。よろしくお願いします。
> 
> Ando Noriaki wrote 2009/07/29 9:49:
> > 俵様
> > 
> > 安藤です
> > 
> > 要は、自作のプログラムからポートの接続をすると、
> >
> OutPortからInPortへデータがいかないということでよろし
いでしょうか?
> >
> 「OutPortに値が格納できない」というのがどういう現象を
指しているのですか。
> > 
> >
> これらのポートをRTSystemEditorで接続するとどうなります
か?
> > 
> > 
> > 2009/07/28 15:40 に
> 俵 崇文@AIST<tawara-takafumi @ aist.go.jp>
> さんは書きました:
> >> 安藤様
> >> 俵です。
> >>
> >> 返信送れて申し訳ありません。
> >> その後試行錯誤してみたのですが、
> >> 結局狙い通りの動作がえられませんでした。
> >> また問題点を整理するための時間が必要でした。
> >> 改めて質問させてください。
> >>
> >>
> 外部プロセスとコアロジックRTC(図ではSampleSV)の仲介を
行なう
> >> ControllerBridgeをOpenRTM0.4.2からOpenRTM1.0.0に
> >>
> 対応する過程でOutPortのバッファに値が格納できない現象
に対処したいので
> >> ご教示ください。
> >>
> >>              torque
> >>      ┌←───────←┐
> >> ┌──□──┐      ┌──□──┐
> >> │  Virtual │steer │ SampleSV │
> >> │          □→─→□          │
> >> │  Robot   │      │          │
> >> │          □→─→□          │
> >> │  RTC     │ vel  │  RTC     │
> >> └─────┘      └─────┘
> >> □:ポート
> >>      ControlllerBridgeの動作例
> >>
> >> 添付したファイルは上図のRTC構築時のログです。
> >>
>
実行例ではControlllerBridgeはSampleSVRTCとVirtualRobotRTC
を
> >>
>
生成して対応するポートを接続します。図ではVirtualRobotRTC
側の
> >> steer OutPort、vel
> OutPortに値が格納できませんでした。
> >>
> >> 特にポート接続ではOpenRTMのサンプルSimpleIOの
> >>
> ConnectorComp.cppを参考にして以下のコードを作成しまし
た。
> >> bool
> Controller_impl::connectPorts(Port_Service_Ptr_Type
> outPort,
> >>                                   
> Port_Service_Ptr_Type inPort)
> >> {
> >>    // connect ports
> >>    RTC::ConnectorProfile cprof;
> >>    cprof.connector_id = "";
> >>    cprof.name = CORBA::string_dup("connector0");
> >>    cprof.ports.length(2);
> >>    cprof.ports[0] =
> Port_Service_Type::_duplicate(inPort);
> >>    cprof.ports[1] =
> Port_Service_Type::_duplicate(outPort);
> >>
> >> #ifdef OPENRTM_VERSION_042
> >>    CORBA_SeqUtil::push_back(cprof.properties,
> >>              
> NVUtil::newNV("dataport.interface_type",
> >>                     "CORBA_Any"));
> >>    CORBA_SeqUtil::push_back(cprof.properties,
> >>              
> NVUtil::newNV("dataport.dataflow_type",
> >>                     "Push"));
> >>    CORBA_SeqUtil::push_back(cprof.properties,
> >>              
> NVUtil::newNV("dataport.subscription_type",
> >>                     "Flush"));
> >> #else
> >>    CORBA_SeqUtil::push_back(cprof.properties,
> >>              
> NVUtil::newNV("dataport.interface_type",
> >>                     "corba_cdr"));
> >>    CORBA_SeqUtil::push_back(cprof.properties,
> >>              
> NVUtil::newNV("dataport.dataflow_type",
> >>                     "Push"));
> >>    CORBA_SeqUtil::push_back(cprof.properties,
> >>              
> NVUtil::newNV("dataport.subscription_type",
> >>                     "flush"));
> >> #endif
> >>    RTC::ReturnCode_t result =
> inPort->connect(cprof);
> >>    return (result == RTC::RTC_OK);
> >> }
> >>
> >>
> サンプルConnectorCompとControlllerBridgeの主な相違点は
、
> >> 1)SimpleIOでは異なるプロセスで別々のRTCを生成、
> >> 接続もConnectorCompプロセスで行なっているが、
> >>
> ControlllerBridgeでは同じプロセスで2つのRTCを生成し、
> >> ポート間を接続して値を授受している。
> >> 2)接続数が複数であること
> >> 3)RTCにInPortとOutPortが混在すること
> >>
> です。0.4.2を利用した場合は問題なく動作していました。
> >>
> ちなみにRTSystemEditorで動作を追った場合、各RTCの登録
、
> >> ポート間接続時のライン描画を確認しました。
> >> 以上です。
> >> よろしくお願いいたします。
> >>
> >> Ando Noriaki wrote 2009/07/24 10:38:
> >>> 俵様
> >>>
> >>> 安藤です
> >>>
> >>> お世話になっております。
> >>>
> >>>
> 申し訳ございませんが、下記のメールはご質問でしょうか?
> >>> 意図がよくつかめませんでした。
> >>>
> >>> 2009/07/24 10:11 に
> 俵 崇文@AIST<tawara-takafumi @ aist.go.jp>
> さんは書きました:
> >>>> 安藤様
> >>>>
> >>>> 俵です。
> >>>>
> >>>> 早速の返信ありがとうございます。
> >>>>
> >>>>
> 仕様変更により接続するまでバッファが無い旨了解いたしま
した。
> >>>>
> >>>> 1)RTC::PortBase::connectの戻り値がtrueである。
> >>>>
> 2)RTCSystemEditorでは動作確認時に接続ラインが描画表示
される。
> >>>>
> 3)ログにはnotify_connect()以下の接続の処理が記録されて
いる
> >>>>
> 等の理由により接続は成功していると当方では判断していま
した。
> >>>>
> >>>> ログからは読み取れませんでしたが、
> >>>>
> 未接続の段階でwriteメンバを呼び出してしまっている
> >>>> というご指摘については調査してみます。
> >>>>
> >>>> 以上です。
> >>>> よろしくお願いいたします。
> >>>>
> >>>> Ando Noriaki wrote 2009/07/23 14:05:
> >>>>> 俵さま
> >>>>>
> >>>>> 安藤です
> >>>>>
> >>>>>
> 1.0からは、バッファはコネクタに属する構造に変更されま
した。
> >>>>>
>
したがって、接続するまではバッファが存在せずOutPortにwrite
> >>>>> しても値はどこにも格納されません。
> >>>>>
> このような仕様で不都合が生じるようでしたら、どのような
ケースで
> >>>>>
> 問題になるのか利用例を教えていただけますでしょうか。
> >>>>> よろしくお願いいたします。
> >>>>>
> >>>>>
> >>>>> 2009/07/23 13:52 に
> 俵 崇文@AIST<tawara-takafumi @ aist.go.jp>
> さんは書きました:
> >>>>>> 産総研 知能システム研究部門
> ヒューマノイド研究グループ
> >>>>>> にてお世話になっております 俵です。
> >>>>>>
> >>>>>>
> 現在OpenHRP3.1.0β2ベースで可能であればOpenRTM0.4.2へ
の
> >>>>>>
> 互換性を保ったままOpenRTM1.0.0-RC1への対応をしておりま
す。
> >>>>>>
> >>>>>> OpenRTM1.0.0-RC1に対応した場合、
> >>>>>> bool OutPort<DataType>::write(DataType&
> value)
> >>>>>> の処理中m_connectorsのサイズが0による理由で
> >>>>>>
> バッファに値を格納できない現象に遭遇しております。
> >>>>>>
> >>>>>>
> 初期化方法に問題があると疑って動作を追っているのですが
、
> >>>>>> ログなどによると
> >>>>>> Jul 23 10:56:41 PARANOID: steer: connector
> push backed: 1
> >>>>>> Jul 23 10:56:41 DEBUG: steer:
> publishInterface() successfully finished.
> >>>>>> Jul 23 10:56:41 PARANOID: steer: 0 connectors
> are existing
> >>>>>>
> と一見m_connectorsコンテナにコネクタインスタンスが
> >>>>>> 格納されるているようです。
> >>>>>>
> >>>>>>
> このような場合の対処方法についてご教示ください。
> >>>>>> 動作時のログも添付いたします。
> >>>>>> よろしくお願いします。
> >>>>>>
> >>>>>> --
> >>>>>> _/_/_/_/_/_/_/_/_/_/_/_/_/
> >>>>>> 株式会社 スプリング(http://www.spring.cc/)
> >>>>>> つくば事業所 俵 崇文
> >>>>>> 俵 崇文@スプリング<tawara @ spring-inc.co.jp>
> >>>>>> 俵 崇文@AIST<tawara-takafumi @ aist.go.jp>
> >>>>>> 事業所 TEL:029-871-7710
> >>>>>> 事業所 FAX:029-830-7037
> >>>>>> _/_/_/_/_/_/_/_/_/_/_/_/_/
> >>>>>>
> >>>>>
> >>>> --
> >>>> _/_/_/_/_/_/_/_/_/_/_/_/_/
> >>>> 株式会社 スプリング(http://www.spring.cc/)
> >>>> つくば事業所 俵 崇文
> >>>> 俵 崇文@スプリング<tawara @ spring-inc.co.jp>
> >>>> 俵 崇文@AIST<tawara-takafumi @ aist.go.jp>
> >>>> 事業所 TEL:029-871-7710
> >>>> 事業所 FAX:029-830-7037
> >>>> _/_/_/_/_/_/_/_/_/_/_/_/_/
> >>>>
> >>>>
> >>>
> >>>
> >>
> >> --
> >> _/_/_/_/_/_/_/_/_/_/_/_/_/
> >> 株式会社 スプリング(http://www.spring.cc/)
> >> つくば事業所 俵 崇文
> >> 俵 崇文@スプリング<tawara @ spring-inc.co.jp>
> >> 俵 崇文@AIST<tawara-takafumi @ aist.go.jp>
> >> 事業所 TEL:029-871-7710
> >> 事業所 FAX:029-830-7037
> >> _/_/_/_/_/_/_/_/_/_/_/_/_/
> >>
> > 
> > 
> > 
> 
> 
> -- 
> _/_/_/_/_/_/_/_/_/_/_/_/_/
> 株式会社 スプリング(http://www.spring.cc/)
> つくば事業所 俵 崇文
> 俵 崇文@スプリング<tawara @ spring-inc.co.jp>
> 俵 崇文@AIST<tawara-takafumi @ aist.go.jp>
> 事業所 TEL:029-871-7710
> 事業所 FAX:029-830-7037
> _/_/_/_/_/_/_/_/_/_/_/_/_/
> 
> 
> 




openrtm-users メーリングリストの案内