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

6 個の投稿 / 0 new
最終投稿
root
オフライン
Last seen: 5時間 19分 前
登録日: 2009-06-23 14:31
[openrtm-users 00901] OpenRTM1.0.0-RC1 の OutPort に値が格納できない不具合

俵様

安藤です

>
> 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;

あと、ためしにコンポーネントのソースを送ってみてもらえますか?

未定義
root
オフライン
Last seen: 5時間 19分 前
登録日: 2009-06-23 14:31
[openrtm-users 00902] OpenRTM1.0.0-RC1 の OutPort に値が格納できない不具合

俵様
安藤様

清水です。

ログを見る限りでは、m_connectorsのサイズは
やはり1のように思われます。

ただ、コネクタのwrite()は
呼ばれてないようですね。

コネクタタイプがPushであれば、
OutPortのwriteから
OutPortPushConnector::write()が呼ばれ、
ログに「write()」と残るはずです。
どうもそれが見当たらないので、
コネクタのwriteまで辿り着いてない
と思われます。

不可解な挙動ですが、OutPort::write()
から動きを丹念にトレースしていけば、
原因がつかめると思います。

# 安藤様へ
Pull型のOutPortBase::createConnector()
ですが、ログ出力が"OutPortPushConnector created"
となってますが、"Pull"でなくてよいのでしょうか。

あと、OutPortPullConnectorのオペレーションには
ログ出力が無いので、今回のように挙動を
トレースする際に困るように思います。

清水

root
オフライン
Last seen: 5時間 19分 前
登録日: 2009-06-23 14:31
[openrtm-users 00903] OpenRTM1.0.0-RC1 の OutPort に値が格納できない不具

安藤様

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

> 念のため、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のオペレーションには
> ログ出力が無いので、今回のように挙動を
> トレースする際に困るように思います。
>
> 清水
>

root
オフライン
Last seen: 5時間 19分 前
登録日: 2009-06-23 14:31
[openrtm-users 00904] OpenRTM1.0.0-RC1 の OutPort に値が格納できない不具合

俵様

清水です。

不可解ですね。

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())
とすればサイズは必ず一致するはずですが、
どうでしょうか。

清水

root
オフライン
Last seen: 5時間 19分 前
登録日: 2009-06-23 14:31
[openrtm-users 00937] OpenRTM1.0.0-RC1 の OutPort に値が格納できない不具

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

その後の経過ですが、おかげさまで
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())
> とすればサイズは必ず一致するはずですが、
> どうでしょうか。
>
> 清水
>

root
オフライン
Last seen: 5時間 19分 前
登録日: 2009-06-23 14:31
[openrtm-users 00939] OpenRTM1.0.0-RC1 の OutPort に値が格納できない不具合

俵様

安藤です

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

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 さんは書きました:
> 安藤様、清水様
> お世話になっております。俵です。
>
> その後の経過ですが、おかげさまで
> 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 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 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;
>>>>>
>>>>>
>>>>>
>>> あと、ためしにコンポーネントのソースを送ってみてもらえますか?

コメントを投稿するにはログインまたはユーザー登録を行ってください

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2160
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク