[openrtm-users 02852] Re: コンポーネントの中からコンポーネントを終了する

shinji.k shinji0608 @ gmail.com
2013年 7月 30日 (火) 23:23:50 JST


栗原と申します。

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

下記エラーに関しては、原因を追えてないのですが、
onExecute()内にて、 mgr.shutdown()ではなく、
self.exit()を呼んでみてはいかがでしょうか?

その際に、一か所だけOpenRTM-aist-Pythonのコードの
修正をお願い致します。

修正箇所:
 Task.pyの__del__(self)メソッド

修正前:
    def __del__(self):
      self._count = 0
      if self._thread:
        self._thread.join()
        self._thread = None
      return

修正後
    def __del__(self):
      if self._thread:
        if self._count > 0:
          self._thread.join()
          self._count = 0
        self._thread = None
      return

join()の前にself._countのチェックが抜けておりましたので、
self._countをチェックするようにしています。


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


2013/7/23 Kei Okada <k-okada @ jsk.t.u-tokyo.ac.jp>:
> 岡田です.
>
> ありがとうございます.
> ご教示いただいた内容を
> 追加して,こちらで試すと,10秒ぐらいプログラムが停止したあと,以下のようにエラーになります.私は1.1.0を使っています.
>
> prev data =  356 , current data =  357
> 2 12712
> Exception in thread Thread-2:
> Traceback (most recent call last):
>   File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
>     self.run()
>   File "/usr/lib/python2.7/threading.py", line 504, in run
>     self.__target(*self.__args, **self.__kwargs)
>   File "/home/k-okada/ros/fuerte/rtm-ros-robotics/rtmros_common/openrtm/src/openrtm/OpenRTM_aist/Task.py",
> line 80, in svc_run
>     self.svc()
>   File "/home/k-okada/ros/fuerte/rtm-ros-robotics/rtmros_common/openrtm/src/openrtm/OpenRTM_aist/PeriodicExecutionContext.py",
> line 450, in svc
>     comp._sm.worker()
>   File "/home/k-okada/ros/fuerte/rtm-ros-robotics/rtmros_common/openrtm/src/openrtm/OpenRTM_aist/PeriodicExecutionContext.py",
> line 317, in worker
>     return self._sm.worker()
>   File "/home/k-okada/ros/fuerte/rtm-ros-robotics/rtmros_common/openrtm/src/openrtm/OpenRTM_aist/StateMachine.py",
> line 469, in worker
>     self._do[states.curr](states)
>   File "/home/k-okada/ros/fuerte/rtm-ros-robotics/rtmros_common/openrtm/src/openrtm/OpenRTM_aist/PeriodicExecutionContext.py",
> line 256, in on_execute
>     if self._obj.on_execute(self.ec_id) != RTC.RTC_OK:
>   File "/home/k-okada/ros/fuerte/rtm-ros-robotics/rtmros_common/openrtm/src/openrtm/OpenRTM_aist/RTM_IDL/RTC_idl.py",
> line 401, in on_execute
>     return _omnipy.invoke(self, "on_execute",
> _0_RTC.DataFlowComponentAction._d_on_execute, args)
> BAD_INV_ORDER: CORBA.BAD_INV_ORDER(omniORB.BAD_INV_ORDER_WouldDeadLock,
> CORBA.COMPLETED_NO)
>
> Traceback (most recent call last):
>   File "/home/k-okada/ros/fuerte/rtm-ros-robotics/rtmros_common/openrtm/src/openrtm/OpenRTM_aist/CorbaNaming.py",
> line 616, in unbind
>     self._rootContext.unbind(name_)
>   File "/usr/lib/python2.7/dist-packages/CosNaming_idl.py", line 234, in unbind
>     return _omnipy.invoke(self, "unbind",
> _0_CosNaming.NamingContext._d_unbind, args)
> NotFound: CosNaming.NamingContext.NotFound(why=missing_node,
> rest_of_name=[CosNaming.NameComponent(id='test_seqio0', kind='rtc')])
>
>
> 2013/7/23 Ando Noriaki <n-ando @ aist.go.jp>:
>> 岡田先生
>>
>> 安藤です
>>
>> 添付のコードを実行するとどうなりますか?
>>
>>             if ( self.data_received > 10 ) :
>>                 mgr.shutdown()
>>
>> だと、プロセスごと終了になります。
>> コンポーネントだけを終了させたかったら
>>     self.exit()
>> でいけそうな気もするのですが、onExecute() の中で呼べたかどうかは
>> 確信がありません。
>>
>>
>>
>>
>> 2013/7/22 Kei Okada <k-okada @ jsk.t.u-tokyo.ac.jp>:
>>> 岡田です.
>>>
>>> コンポーネントの中からコンポーネントを終了させる,というようなことはできるのでしょうか?
>>> 具体的には,例えばonExecuteで10回データをもらったら,exitしたい,と思っています.
>>>
>>> # rtm modules
>>> import sys, time, signal
>>> import RTC
>>> import OpenRTM_aist
>>>
>>> global mgr
>>>
>>> class TestComp(OpenRTM_aist.DataFlowComponentBase):
>>>     def __init__ (self, manager):
>>>         OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
>>>         return
>>>
>>>     def onInitialize(self):
>>>         port = "Short"
>>>         self.inport = OpenRTM_aist.InPort(port, RTC.TimedShort)
>>>         self.registerInPort(port, self.inport)
>>>         self.data_received = 0
>>>
>>>         return RTC.RTC_OK
>>>
>>>     def onExecute(self, ec_id):
>>>         if self.inport.isNew():
>>>             data = self.inport.read()
>>>             print data
>>>             self.data_received += 1
>>>             if ( self.data_received > 10 ) :
>>>                 mgr.shutdown()
>>>
>>>         return RTC.RTC_OK
>>>
>>> module_spec = ["implementation_id", "test_seqio",
>>>                "type_name",         "test_seqio",
>>>                "description",       "Dataport ROS bridge component",
>>>                "version",           "1.0",
>>>                "vendor",            "Kei Okada",
>>>                "category",          "example",
>>>                "activity_type",     "DataFlowComponent",
>>>                "max_instance",      "10",
>>>                "language",          "Python",
>>>                "lang_type",         "script",
>>>                ""]
>>>
>>> def TestInit(manager):
>>>     profile = OpenRTM_aist.Properties(defaults_str=module_spec)
>>>     print  profile
>>>     manager.registerFactory(profile,
>>>                             TestComp,
>>>                             OpenRTM_aist.Delete)
>>>     comp = manager.createComponent("test_seqio")
>>>
>>> def test_seqio():
>>>     mgr = OpenRTM_aist.Manager.init(sys.argv)
>>>     mgr.setModuleInitProc(TestInit)
>>>     mgr.activateManager()
>>>     mgr.runManager()
>>> _______________________________________________
>>> openrtm-users mailing list
>>> openrtm-users @ openrtm.org
>>> http://www.openrtm.org/mailman/listinfo/openrtm-users
>> _______________________________________________
>> openrtm-users mailing list
>> openrtm-users @ openrtm.org
>> http://www.openrtm.org/mailman/listinfo/openrtm-users
> _______________________________________________
> openrtm-users mailing list
> openrtm-users @ openrtm.org
> http://www.openrtm.org/mailman/listinfo/openrtm-users


More information about the openrtm-users mailing list