[openrtm-users 02889] ExtTrigExecutionContext, SynchExtTriggerEC の deactivate_component()

中岡 慎一郎 s.nakaoka @ aist.go.jp
2013年 8月 26日 (月) 17:39:27 JST


産総研の中岡です。

以前静岡大の清水さんが本MLにポストされた02356の投稿を見つけたのですが、
そこでSynchExtTriggerECのdeactivate_component()の挙動に関する指摘があり
ました。

具体的にはExtTrig系のECでは deactivate_component()内にてtick()を行わない
と、状態遷移が行われずにタイムアウトするまで処理がブロックしてしまうとい
うものです。

これについてはバージョン1.1.0-RC3に関する指摘だったようなのですが、
1.1.0-RELEASEについても修正がされていないようです。

実は開発中のChoreonoidでRTCを用いたシミュレーションを行なっていると、
コンポーネントのdeactivate時に一定の時間固まる症状が出まして、
これをなんとかしたく思って上記の投稿を見つけた次第です。
(Windowsだと場合によってはRTCひとつをdeactivateするのに何秒も固まってし
まいます…。)

とりあえずChoreonoidにおいて以下のようなdeactivate_componentをもつECを
作って動かしたところ、固まる症状がなくなりました。

RTC::ReturnCode_t
ChoreonoidExecutionContext::deactivate_component(RTC::LightweightRTObject_ptr
comp) throw (CORBA::SystemException)
{
    RTC_TRACE(("deactivate_component()"));

    CompItr it = std::find_if(m_comps.begin(), m_comps.end(),
find_comp(comp));
    if(it == m_comps.end()) {
        return RTC::BAD_PARAMETER;
    }
    if(!(it->_sm.m_sm.isIn(RTC::ACTIVE_STATE))){
        return RTC::PRECONDITION_NOT_MET;
    }

    it->_sm.m_sm.goTo(RTC::INACTIVE_STATE);

    tick();

    if(it->_sm.m_sm.isIn(RTC::INACTIVE_STATE)){
        RTC_TRACE(("The component has been properly deactivated."));
        return RTC::RTC_OK;
    }

    RTC_ERROR(("The component could not be deactivated."));
    return RTC::RTC_ERROR;
}

ただ、やはりOpenRTM-aist本体でこの修正がなされていることが望ましいので、
今後のリリースで修正をお願いできますでしょうか(ExtTrigExecutionContext,
SynchExtTriggerECの両方にしておくべきかと思います。)

以上よろしくお願い致します。

-- 
中岡 慎一郎 <s.nakaoka @ aist.go.jp>
産業技術総合研究所 知能システム研究部門
ヒューマノイド研究グループ



More information about the openrtm-users mailing list