onRateChanged関数内にprint文を書いてRTCの実行周期を変更してみたのですが何も表示されませんでした。
on_rate_changed関数がどこかで呼び出される必要があるとは思うのですが、調べた限りではどこでも呼び出されていません。
以前のバージョンではPeriodicExecutionContextのsetRate関数内で呼び出しています。
def set_rate(self, rate):
self._rtcout.RTC_TRACE("set_rate(%f)", rate)
if rate > 0.0:
self._profile.rate = rate
self._usec = long(1000000/rate)
if self._usec == 0:
self._nowait = True
for comp in self._comps:
comp._sm.on_rate_changed()
return RTC.RTC_OK
return RTC.BAD_PARAMETER
現在の実装ではsetRate関数内でExecutionContextBaseクラスのsetRate関数を呼び出している。
解決方法としては、まずExecutionContextWorkerクラスに以下のonRateChanged関数を追加する。
#
# @if jp
# @brief ExecutionContext の実行周期変更
#
# ExecutionContext の実行周期を変更した際にRTCのonRateChangedコールバックを呼び出す
#
# @return ReturnCode_t 型のリターンコード
#
# @else
#
# @brief
#
# @return The return code of ReturnCode_t type
#
# @endif
# RTC::ReturnCode_t stop(void);
def onRateChanged(self):
self._rtcout.RTC_TRACE("onRateChanged()")
guard = OpenRTM_aist.ScopedLock(self._mutex)
ret_ = RTC.RTC_OK
for comp in self._comps:
state = comp.onRateChanged()
if state != RTC.RTC_OK:
ret_ = state
del guard
return ret_
そしてExecutionContextBaseクラスのsetRate関数でonRateChanged関数を呼び出せばRTCのコールバックも呼び出される。
def setRate(self, rate):
self._rtcout.RTC_TRACE("setRate(%f)", rate)
ret_ = self._profile.setRate(self.onSettingRate(rate))
if ret_ != RTC.RTC_OK:
self._rtcout.RTC_ERROR("Setting execution rate failed. %f", rate)
return ret_
ret_ = self.onSetRate(rate)
if ret_ != RTC.RTC_OK:
self._rtcout.RTC_ERROR("onSetRate(%f) failed.", rate)
return ret_
ret_ = self._worker.onRateChanged()
if ret_ != RTC.RTC_OK:
self._rtcout.RTC_ERROR("onSetRate(%f) failed.", rate)
return ret_
self._rtcout.RTC_INFO("setRate(%f) done", rate)
return ret_