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

俵 崇文@AIST tawara-takafumi @ aist.go.jp
2009年 9月 4日 (金) 11:01:27 JST


安藤様、清水様
お世話になっております。俵です。

その後の経過ですが、おかげさまで
OpenRTM1.0.0に対応することができました。

Windows環境でOpenHRPのRTMを使用するモジュールを
コンパイルする際 RTC_CORBA_CXXMAPPING11 マクロを
定義していなかったことが直接の不具合原因とわかりました。

このマクロを定義しなかった場合の具体的な動作までは
トレースしていませんが、
このマクロを定義しない状態でサンプルSimpleIOの
ConsoleInComp、ConsoleOutCompを
コンパイルして動作確認したところ
同じ不具合が発生いたいました。

OpenRTMバージョン0.4.2と1.0.0RCでは両方とも
RTC_CORBA_CXXMAPPING11が定義されて
バージョンアップの際の差異として分かりにくかったことと
OpenHRP側ではこのマクロを未定義のままRTMを利用していたため
今まで気づけませんでした。

OpenRTMを使用する際のデバッグ方法、ログの見方についての
ご教示は大変助かりました。
これまで対応してくださってありがとうございました。
以上です。

Masayuki Shimizu wrote 2009/08/03 17:34:
> 俵様
> 
> 清水です。
> 
> 不可解ですね。
> 
> OutPortBaseのm_connectorsはサイズ1なのに、
> その継承クラスのOutPortでは
> m_connectorsのサイズはゼロになっている
> みたいですね。
> 
> 論理的に考えられる可能性としては、
> OutPortBaseクラスのm_connectorsと
> OutPortクラスのm_connectorsが
> 違うオブジェクトになっている
> ぐらいでしょうか。
> 
> OutPortBaseクラスのm_connectors参照を
> 取り出すメソッドがあるようなので、
> それのサイズを確認してみてはどうでしょうか。
> OutPortBase::connectors();
> 
> また、これを使って、
> OutPort::write()のコネクタサイズ取得部を
> size_t conn_size(connectors().size())
> とすればサイズは必ず一致するはずですが、
> どうでしょうか。
> 
> 清水
> 
> --- 俵 崇文@AIST <tawara-takafumi @ aist.go.jp> wrote:
> 
>> 安藤様
>>
>> お世話になっております。俵です。
>>
>>> 念のため、OutPort.h の write()
>> の後半を以下のように書き換えて
>>> ログを見てみてはどうでしょうか?
>> 添付ファイルrtc248.zip
>> の出力を得ました。
>> 387〜446行目にあります通り
>> conn_size, connectos.size()
>> は0のようです。
>>
>>
>> あと、ためしにコンポーネントのソースを送ってみてもらえ
> ますか?
>> 主要なソースコードを抜粋してcore_source.zipとして添付
> いたします。
>> サンプルRTCのコードは、
>> SampleSV/SampleSV.cpp
>> にて定義されています。
>>
>> RTCの生成、接続、外部プロセスとのやり取りを行なう。
>> ControllerBridgeは
>> ControllerBridgeディレクトリ以下のコードにて記述されて
> います。
>> 接続部分は、
>> ControllerBridge/Controller_impl.cpp
>> の340行目の関数
>> bool Controller_impl::connectPorts
>> にて行なっています。
>>
>> 一連のログ出力とwriteメソッドは
>> ControllerBridge/VirtualRobotPortHandler.cpp
>> 150行目の
>> SensorStateOutPortHandler::writeDataToPort
>> 関数にて行なっております。
>>
>> OpenHRP3.1ソースコード全体を
>> 網羅的にご覧になる場合は、
>> RedmineのOpenHRP3プロジェクトから
>> リポジトリのページを表示して
>> 3.1/branches/TRY-warataka/r1122
>> を参照してください。
>> 以上です。
>> よろしくお願いいたします。
>>
>> Masayuki Shimizu wrote 2009/08/03 15:12:
>>> 俵様
>>> 安藤様
>>>
>>> 清水です。
>>>
>>> ログを見る限りでは、m_connectorsのサイズは
>>> やはり1のように思われます。
>>>
>>> ただ、コネクタのwrite()は
>>> 呼ばれてないようですね。
>>>
>>> コネクタタイプがPushであれば、
>>> OutPortのwriteから
>>> OutPortPushConnector::write()が呼ばれ、
>>> ログに「write()」と残るはずです。
>>> どうもそれが見当たらないので、
>>> コネクタのwriteまで辿り着いてない
>>> と思われます。
>>>
>>> 不可解な挙動ですが、OutPort::write()
>>> から動きを丹念にトレースしていけば、
>>> 原因がつかめると思います。
>>>
>>> # 安藤様へ
>>> Pull型のOutPortBase::createConnector()
>>> ですが、ログ出力が"OutPortPushConnector created"
>>> となってますが、"Pull"でなくてよいのでしょうか。
>>>
>>> あと、OutPortPullConnectorのオペレーションには
>>> ログ出力が無いので、今回のように挙動を
>>> トレースする際に困るように思います。
>>>
>>> 清水
>>>
>>> --- Ando Noriaki <n-ando @ aist.go.jp> wrote:
>>>
>>>> 俵様
>>>>
>>>> 安藤です
>>>>
>>>>> rtm/OutPort.hによると
>>>>> その後の処理で
>>>>> conn_sizeが0以下の場合
>>>>> m_connectors[i]->write(m_cdr);
>>>>> のループ処理に至らないということで
>>>>> 同じ結果になると思われます。
>>>>> 以上です。
>>>> Aug 03 10:50:00 TRACE: steer:
>>>> getConnectorProfiles(): size = 1
>>>>
>>>> でも、ログ↑にあるように、m_connectors.size()
>>>> は1を返していますよね。
>>>>
>>>> write()関数の先頭部分で
>>>> size_t conn_size(m_connectors.size());
>>>>
>> のように代入しているので、conn_sizeは1になりそうな気が
>>> しますが。
>>>> 念のため、OutPort.h の write()
>>>> の後半を以下のように書き換えて
>>>> ログを見てみてはどうでしょうか?
>>>>
>>>>       bool result(true);
>>>>    RTC_PARANOID(("0: conn_size = %d",
>>>> conn_size));
>>>>    RTC_PARANOID(("0: connectos.size() = %d",
>>>> m_connectors.size()));
>>>>       for (size_t i(0), len(conn_size); i < len;
>>>> ++i)
>>>>         {
>>>>           ReturnCode ret;
>>>>           ret = m_connectors[i]->write(m_cdr);
>>>>       RTC_PARANOID(("1: conn_size = %d",
>>>> conn_size));
>>>>       RTC_PARANOID(("1: connectos.size() =
>> %d",
>>>> m_connectors.size()));
>>>>           if (ret != PORT_OK)
>>>>             {
>>>>               result = false;
>>>>               if (ret == CONNECTION_LOST)
>>>>                 {
>>>>                  
>> disconnect(m_connectors[i]->id());
>>>>                 }
>>>>             }
>>>>         }
>>>>    RTC_PARANOID(("2: conn_size = %d",
>> conn_size));
>>>>    RTC_PARANOID(("2: connectos.size() = %d",
>>>> m_connectors.size()));
>>>>       return result;
>>>>
>>>>
>>>>
>> あと、ためしにコンポーネントのソースを送ってみてもらえ
>>> ますか?
>>>> -- 
>>>> 安藤慶昭@独立行政法人産業技術総合研究所 研究員
>>>>                   知能システム研究部門
>>>> 統合知能研究グループ
>>>>                   〒305-8568
>> 茨城県つくば市梅園1-1-1
>>>> 中央第2
>>>>                   TEL: 029-861-5981 FAX:
>>>> 029-862-6631
>>>>                   n-ando @ aist.go.jp,
>> n-ando @ ieee.org
>>>>
>>>
>>>
>>>
>>>
>>
> 
> 
> 
> 
> 


-- 
_/_/_/_/_/_/_/_/_/_/_/_/_/
株式会社 スプリング(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 メーリングリストの案内