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

Ando Noriaki n-ando @ aist.go.jp
2009年 9月 4日 (金) 11:33:28 JST


俵様

安藤です

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

RTC_CORBA_CXXMAPPING11 の定義の問題とのこと了解しました。
Windowsで使用していたのですね。

WindowsはUNIXのように、configureおよびconfig_rtc.hが利用できないので
少々複雑で、RTC_CORBA_CXXMAPPING11 の定義は、omniORBの
バージョンに応じてプロパティシートを切り替えることで実現しております。

Widnows上でRTCをコンパイルする際にcopy_props.batを実行するのはこのためです。
このバッチファイルでは、%RTM_ROOT%/etc/rtm_config.vsprops をカレントにコピーします。

RTCのVCプロジェクトではこのプロパティシートを読み込むようになっていて、
その環境にインストールされているOpenRTMを使用してコンパイルするときに
必要なdefineやライブラリのパスなどを与えるようになっています。


なお、ご存知かもしれませんが RTC_CORBA_CXXMAPPING11  の対応関係は

omniORB-4.0.x -> RTC_CORBA_CXXMAPPING11 なし
omniORB-4.1.x -> RTC_CORBA_CXXMAPPING11 あり

となっております。これは、CORBAのC++マッピングの ver1.0 と ver1.1
を切り替えるためのものです。omniORBは4.0系ではC++マッピングver1.0
4.1系からはC++マッピングver1.1を使用するようになっています。

ver1.0 のマッピングでは、リファレンスカウント方式のサーバントを使用する場合
PortableServer::RefCountServantBase を使用しますが、ver1.1からは
リファレンスカウント方式がデフォルトとなり ServantBase 自体がレファレンス
カウント方式のサーバントになっています。

omniORB-4.1.xでは、RefCountServantBase は以下のように空の定義になっており、

poa.h:  struct RefCountServantBase {};

4.0時のソースをそのまま使うことができず、RefCountServantBase -> ServantBase
に変更してやる必要があります。RTC_CORBA_CXXMAPPING11 はそのためのマクロです。

OpenHRPでRTCを使用する際には、独自のプロジェクトを使用していと思いますが、
インストールされているOpenRTMの種々の設定を適切に反映させるためにも、
OpenRTMが提供しているプロパティシートをインクルードして利用されることをお勧めします。


2009年9月4日11:01 に 俵 崇文@AIST<tawara-takafumi @ aist.go.jp> さんは書きました:
> 安藤様、清水様
> お世話になっております。俵です。
>
> その後の経過ですが、おかげさまで
> 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
> _/_/_/_/_/_/_/_/_/_/_/_/_/
>
>



-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                  知能システム研究部門 統合知能研究グループ
                  〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                  TEL: 029-861-5981 FAX: 029-862-6631
                  n-ando @ aist.go.jp, n-ando @ ieee.org



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