[openrtm-staff:545] Re: OpenRTM trunkバージョンでのシミュレーション用実行コンテキスト

宮本信彦 n-miyamoto @ aist.go.jp
2016年 7月 11日 (月) 12:40:09 JST


ヒューマノイド研究グループ 金広様


ロボットソフトウェアプラットフォーム研究チームの宮本と申します。


実行コンテキストで複数のコンポーネントを実行する際にactivateする順序によって一部のコンポーネントがACTIVE_STATEに遷移しない問題ですが、原因を特定できたのでご報告いたします。


まず実行コンテキストにアタッチしたコンポーネントはExecutionContextWorkerクラスのm_compsという配列に追加されるのですが、ExecutionContextインターフェースのadd_componentで実行コンテキストにコンポーネントを追加しようとても即座にはm_compsにコンポーネントは追加されません。
この時点では別の配列に格納しておいて、updateComponentListという関数が呼び出された時点でm_compsに追加されます。

コンポーネントの処理実行中にコンポーネントの追加をしないようにするために、このようになっています。



> rtc1,rtc2,rtc3という順序でactivateすれば問題ないのですが、rtc3,rtc2,rtc1と
> いう順序でactivateすると、rtc3とrtc2はACTIVE_STATEに遷移しません。


updateComponentList関数はinvokeWorkerDoという関数で呼び出されていて、invokeWorkerDo関数はPeriodicExecutionContextのsvc関数で呼び出されています。

ただ全てのコンポーネントがINACTIVE_STATEの場合、以下の箇所で処理が止められてしまいinvokeWorkerDo関数が実行されずupdateComponentList関数も実行されません。



int PeriodicExecutionContext::svc(void)
{
              (省略)

          Guard guard(m_workerthread.mutex_);
          while (!m_workerthread.running_)
            {
              m_workerthread.cond_.wait();
    //ここで止められているため下のinvokeWorkerDo関数は実行されず、updateComponentList関数も実行されない
    //既にアタッチしたコンポーネントをアクティブにするとsignal関数が呼び出されて下の処理が実行される
            }
        }

        coil::TimeValue t0(coil::gettimeofday());
        ExecutionContextBase::invokeWorkerDo();
        ExecutionContextBase::invokeWorkerPostDo();
        coil::TimeValue t1(coil::gettimeofday());




既にアタッチしてあるコンポーネントをactivateした場合、invokeWorkerDo関数が呼び出されてupdateComponentList関数も呼び出されるのでコンポーネントが追加されます。

rtc1をrtc2、rtc3より先にactivateした場合にはm_compsにrtc2、rtc3が追加されているのでACTIVE_STATEに遷移しますが、rtc2、rtc3を先にactivateした場合はこの時点でm_compsにrtc2、rtc3が追加されておらずコンポーネントを見つけられずに失敗します。



全てのコンポーネントがINACTIVE_STATEの時にコンポーネントを追加しても問題はないので、今後修正する予定です。



よろしくお願いします。



--------------------------------------------------
宮本 信彦 n-miyamoto @ aist.go.jp
産業技術総合研究所 ロボットイノベーション研究センター
ロボットソフトウェアプラットフォーム研究チーム
テクニカルスタッフ

From: openrtm-staff-bounces @ openrtm.org [mailto:openrtm-staff-bounces @ openrtm.org] On Behalf Of Ando Noriaki
Sent: Tuesday, July 5, 2016 9:53 AM
To: 金広文男 <f-kanehiro @ aist.go.jp>
Cc: openrtm-staff <openrtm-staff @ openrtm.org>
Subject: [openrtm-staff:538] Re: OpenRTM trunkバージョンでのシミュレーション用実行コンテキスト

金広様

安藤です

それはおかしいですね。もしかするとバグかもしれません。
こちらでも調べてみます。

宮本さま

講習会のところすみません。
このようなケースをテストするためのサンプルコンポーネントを
作成してもらえないでしょうか?
example の下に3つくらいのコンポーネントを作成して、
様々な順序で同一コンテキストにアタッチ、activate/deactivate
して挙動を確認できるようなものをお願いいたします。




2016年7月4日 18:05 金広文男 <f-kanehiro @ aist.go.jp<mailto:f-kanehiro @ aist.go.jp>>:
安藤様、

金広です。

ありがとうございます。
動くようになってきました。

ただまだ問題があります。
rtc1,rtc2,rtc3と3つのコンポーネントを作って、rtc1の実行コンテキストを使って
rtc2,rtc3も直列実行するように設定すると、
https://github.com/fkanehiro/hrpsys-base/blob/master/python/rtm.py#L454

rtc1,rtc2,rtc3という順序でactivateすれば問題ないのですが、rtc3,rtc2,rtc1と
いう順序でactivateすると、rtc3とrtc2はACTIVE_STATEに遷移しません。
この辺りも何か作法に変更あったのでしょうか。

2016/06/29 18:22 に、"安藤慶昭" <n-ando @ aist.go.jp<mailto:n-ando @ aist.go.jp>> を書き込みました:

金広様


安藤です


trunkでは1.2に向けてECの構造がだいぶ変わっております。
詳しいECの実装方法に関しては、こちらにドキュメントがあります。


http://svn.openrtm.org/OpenRTM-aist/trunk/OpenRTM-aist/src/lib/rtm/ExecutionContextBase.h



おそらくOpenHRPECと似たような構造だと思いますので、trunkのOpenHRPECを
見ていただければ参考になるのではないかと思います。


よろしくお願いいたします。





2016年6月29日 18:00 金広文男 <f-kanehiro @ aist.go.jp<mailto:f-kanehiro @ aist.go.jp>>:

安藤様、

金広です。

Choreonoidを用いたシミュレーションの際に、シミュレーション世界の時計に同期して
RTCを駆動する際には、外部トリガ付きコンテキストを使い、シミュレーションのメイン
ループからtick()を呼び出してRTCを駆動していました。
1.1.2ではこれが機能していますが、trunkバージョンではRTCが駆動されなくなって
しまいました。
trunkバージョンで同様のことを行うに当たって何か変更すべきことがあるのでしょうか?

これまで使ってきた実行コンテキストは↓になります。
https://github.com/s-nakaoka/choreonoid/blob/master/src/OpenRTMPlugin/ChoreonoidExecutionContext.cpp










-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://www.openrtm.org/pipermail/openrtm-staff/attachments/20160711/d7519d98/attachment.html>


More information about the openrtm-staff mailing list