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

Ando Noriaki n-ando @ aist.go.jp
2009年 8月 3日 (月) 13:02:36 JST


俵様

安藤です

どのgetConnectorProfiles()の呼び出しが、writeの前か、もしくは後か
不明なのですが、ログを見る限り、

> grep getConnectorProfile rtc4052.log
Aug 03 10:50:00 TRACE: steer: getConnectorProfiles(): size = 1
Aug 03 10:50:00 TRACE: steer: getConnectorProfiles(): size = 1
Aug 03 10:50:00 TRACE: vel: getConnectorProfiles(): size = 1
Aug 03 10:50:00 TRACE: vel: getConnectorProfiles(): size = 1
Aug 03 10:50:01 TRACE: steer: getConnectorProfiles(): size = 1
Aug 03 10:50:01 TRACE: steer: getConnectorProfiles(): size = 1
Aug 03 10:50:01 TRACE: vel: getConnectorProfiles(): size = 1
Aug 03 10:50:01 TRACE: vel: getConnectorProfiles(): size = 1

のように、同じ時刻でgetConnectorProfiles() が2つ連続しているので、
それぞれwrite()の前と後であると考えられます。正しいでしょうか?>俵様

この結果を見る限りでは、やはりconnectorsの数はwriteの前後でともに1のようです。

以前、OutPort::write() の

      size_t conn_size(m_connectors.size());
      if (!(conn_size > 0)) { return true; }

の return true でリターンしてしまうので、connectorにデータが
書き込まれないとおっしゃっていましたが、ためしに

      if (!(conn_size > 0)) { return true; }

をコメントアウトした場合どうなりますか?

2009/08/03 11:14 に 俵 崇文@AIST<tawara-takafumi @ aist.go.jp> さんは書きました:
> 安藤様
>
> お世話になっております。俵です。
>
> [openrtm-users 00891]のコードを
> writeメソッドを挟んで実行したところ
> 添付したログファイルの
> 387〜438行の出力を得ました。
> steer OutPortとvel OutPortに対するループ処理となっておりますので、
> 似たような出力が4連続で出力されています。
> 以上です。
> よろしくお願いいたします。
>
> Ando Noriaki wrote 2009/08/03 10:09:
>> 俵様
>>
>> 安藤です
>>
>> では、wrtie()の直線と直後にgetConnectorProfiles()を呼ぶとどうなりますか?
>>
>> 2009/08/03 10:03 に 俵 崇文@AIST<tawara-takafumi @ aist.go.jp> さんは書きました:
>>> 安藤様、清水様
>>>
>>> お世話になっております。俵です。
>>> 返信ありがとうございます。
>>>
>>> m_connectorsのサイズに関しては、
>>> [openrtm-users 00879]で報告いたしましたとおりです。
>>> デバッガによる追跡は何度も繰り返し行なったので
>>> 見間違えではないと断言いたします。
>>>
>>> 接続処理の終わりからwriteメソッドの呼び出しの間に
>>> 原因があるというご指摘を参考にして調査いたします。
>>> 何か分かれば、また報告いたします。
>>> 以上です。
>>>
>>> Ando Noriaki wrote 2009/07/31 18:18:
>>>> 俵様
>>>>
>>>> 安藤です
>>>>
>>>> いただいたlogの424行目で、
>>>> Jul 31 17:04:18 TRACE: steer: getConnectorProfiles(): size = 1
>>>> とありますので、m_connectorsのサイズは1ですね。
>>>>
>>>> OutPortBase.cpp 200行目あたりで以下のようにログを出力しています。
>>>>   ConnectorBase::ProfileList OutPortBase::getConnectorProfiles()
>>>>   {
>>>>     RTC_TRACE(("getConnectorProfiles(): size = %d", m_connectors.size()));
>>>>
>>>> デバッガでご覧になった0という数値は、本当にm_connectorsのsize()ですか?
>>>>
>>>> いただいたlogをgetConnectorProfilesでgrepしたのですが、
>>>>
>>>>> grep 'getConnectorProfiles' rtc4472.log
>>>> Jul 31 17:04:18 TRACE: steer: getConnectorProfiles(): size = 1
>>>> Jul 31 17:04:18 TRACE: vel: getConnectorProfiles(): size = 1
>>>> Jul 31 17:04:19 TRACE: steer: getConnectorProfiles(): size = 1
>>>> Jul 31 17:04:19 TRACE: vel: getConnectorProfiles(): size = 1
>>>> Jul 31 17:04:20 TRACE: steer: getConnectorProfiles(): size = 1
>>>> Jul 31 17:04:20 TRACE: vel: getConnectorProfiles(): size = 1
>>>>
>>>> このように、steerポートもvelポートもどちらも m_connectors のサイズは
>>>> 1となっており、ログの結果からも、少なくともPortBaseのConnectorProfile、
>>>> OutPortのOutPortConnectorの数、ともに正常なようにみえます。
>>>>
>>>> 他のところに原因があるのではないでしょうか?
>>>>
>>>>
>>> Masayuki Shimizu wrote 2009/07/31 18:15:
>>>> 俵様
>>>>
>>>> 清水です。
>>>>
>>>> 安藤さんが言っているように、
>>>>>> Jul 28 15:08:10 TRACE: steer: OutPortPushConnector
>>>>> created
>>>>>> Jul 28 15:08:10 PARANOID: steer: connector push
>>>>> backed: 1
>>>> とあるので、m_connectorsのサイズがゼロという
>>>> ことは無いように思います。
>>>> # OutPortBase.cppのソース参照
>>>> RTC_PARANOID(("connector push backed: %d",
>>>> m_connectors.size()));
>>>>
>>>> どうやってm_connectorsのサイズを確かめてますか?
>>>>
>>>> 上記のログがあるのにm_connectorsのサイズが
>>>> ゼロということは、あと考えられる可能性としては、
>>>> 接続をした後で、何かしらの意図しない動作により
>>>> 接続が解除されてしまっているとしか
>>>> 考えられません。
>>>>
>>>> 清水
>>>>
>>>> 2009/07/31 17:41 に 俵 崇文@AIST<tawara-takafumi @ aist.go.jp> さんは書きました:
>>>>> 安藤様
>>>>>
>>>>> お世話になっております。俵です。
>>>>>
>>>>> 下記コードを適応したログを添付いたします。
>>>>> 出力タイミングは、これまでの通り
>>>>> steerポートとvelポートのwriteメソッドの直前になります。
>>>>>
>>>>> 以上です。
>>>>> よろしくお願いします。
>>>>>
>>>>> Ando Noriaki wrote 2009/07/31 16:29:
>>>>>> 俵様
>>>>>>
>>>>>> 安藤です
>>>>>>
>>>>>> 前回のメールで申し上げた通り、ConnectorProfileは存在するが、
>>>>>> m_connectorsのサイズが0ということですよね。
>>>>>> いただいたコードと表示結果からは、ConnectorProfileは正常である
>>>>>> ということしかわかりません。
>>>>>> ただし、以前いただいたログには
>>>>>> Jul 28 15:08:10 TRACE: steer: OutPortPushConnector created
>>>>>> Jul 28 15:08:10 PARANOID: steer: connector push backed: 1
>>>>>> とあるので、connector は生成されているっぽいです。
>>>>>>
>>>>>> とりあえず、OutPortのPushConnectorのProfileを
>>>>>> 以下のようにして表示させてみていただけますか?
>>>>>>
>>>>>>   ConnectorBase::ProfileList prof(m_outport.getConnectorProfiles());
>>>>>>   for (int i(0), len(prof.size()); i < len; ++i)
>>>>>>   {
>>>>>>     RTC_DEBUG(("ConnectorProfile::name: %s", prof[i].name));
>>>>>>     RTC_DEBUG(("ConnectorProfile::id: %s", prof[i].id));
>>>>>>     RTC_DEBUG(("ConnectorProfile::properties:"));
>>>>>>     rtclog.level(Logger::RTL_DEBUG) << prof[i].properties;
>>>>>>   }
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> 2009/07/31 15:39 に 俵 崇文@AIST<tawara-takafumi @ aist.go.jp> さんは書きました:
>>>>>>> 安藤様、清水様
>>>>>>>
>>>>>>> お世話になっております。俵です。
>>>>>>>
>>>>>>> 助言を参考にして
>>>>>>> PortService,ConnectorProfile,ConnectorProfile::ports
>>>>>>> の状態を表示する関数を添付ファイルのように変更しました。
>>>>>>> 表示結果も合わせて添付いたします。
>>>>>>>
>>>>>>> ConnectorProfileは結果の通り存在しますが、
>>>>>>> m_connectorsのサイズはデバッガ上確認した場合0のままでした。
>>>>>>> 以上です。
>>>>>>> よろしくお願いいたします。
>>>>>>>
>>>>>>> Ando Noriaki wrote 2009/07/31 11:45:
>>>>>>>> 俵様
>>>>>>>>
>>>>>>>> 安藤です
>>>>>>>>
>>>>>>>> out()関数は、オペレーションのout引数に_var型変数を渡す時に使うものです。
>>>>>>>>
>>>>>>>> out()を呼ぶとオブジェクトリファレンスがreleaseされてnilリファレンス
>>>>>>>> になりますので、その後新たにオブジェクトリファレンスを代入しない限り
>>>>>>>> omniORB: ERROR -- the application attempted to invoke an operation
>>>>>>>>  on a nil reference.
>>>>>>>> のようなエラーが出ます。
>>>>>>>>
>>>>>>>>
>>>>>>>> 2009/07/31 11:38 に 俵 崇文@AIST<tawara-takafumi @ aist.go.jp> さんは書きました:
>>>>>>>>> 安藤様
>>>>>>>>> お世話になっております。 俵です。
>>>>>>>>>
>>>>>>>>>> portServiceList[h]->get_connector_profiles()->length();
>>>>>>>>>> を呼ぶ前に
>>>>>>>>>> portServiceList[h].out()
>>>>>>>>>> を呼んでいませんか?
>>>>>>>>> はい。呼んでおります。
>>>>>>>>>
>>>>>>>>> 以上です。
>>>>>>>>>
>>>>>>>>> Ando Noriaki wrote 2009/07/31 10:43:
>>>>>>>>>> 俵様
>>>>>>>>>>
>>>>>>>>>> 安藤です
>>>>>>>>>>
>>>>>>>>>> portServiceList[h]->get_connector_profiles()->length();
>>>>>>>>>> を呼ぶ前に
>>>>>>>>>> portServiceList[h].out()
>>>>>>>>>> を呼んでいませんか?
>>>>>>>>>>
>>>>>>
>>>>> --
>>>>> _/_/_/_/_/_/_/_/_/_/_/_/_/
>>>>> 株式会社 スプリング(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
> _/_/_/_/_/_/_/_/_/_/_/_/_/
>



-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                  知能システム研究部門 統合知能研究グループ
                  〒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 メーリングリストの案内