[openrtm-users 02453] Re: リアルタイム処理を行うRTCのDataportへの接続で起こる問題の調査方法
Geoffrey Biggs
geoffrey.biggs @ aist.go.jp
2012年 2月 17日 (金) 10:41:56 JST
野沢様
ジェフです。
情報でありがとうございます。
Pythonのunicode stringを使うとomniORBはよく問題になります。unicode
stringとただのstringは違うデータを持つが、omniORBは区別なしで両方を普通
のstringとして処理します。したがって、データがRTCがわについたら普通の
stringとして使おうとしますが、もうASCIIの「new」ではなくて別のデータで
す。多分これでエラーになります。その上、rtcatでポートの状態を見たら、
unicodeデータは帰ってきて、pythonはちゃんとunicodeだと理解して「new」を
表示するからRTCがわで違うデータだと見えません。
以上の仮説を確認したがりましたら、RTCが出すログファイルにコネクションの
プロパティを見る方が一番早いです。
これからrtctreeですべてのstringを普通の方に変更させることを検討します。
よろしくお願いいたします。
On 13/02/12 19:57, Shunichi Nozawa wrote:
> ジェフ様、東京大学の野沢です。
> お世話になっております。
>
> 表題の件ですが、こちらでいくつか調査・進展した
> 事項がございますので、私からご報告させていただきます。
> メーリスに投稿させていただいてからしばし時間が経過したしましたので、
> 整理しながらご報告させていただきます。
>
> ロボット体内(Art-Linux)のRTCと
> 外部PCのRTCとのデータポート接続を行う際に、
> rtshellのrtconでsub_typeが'new'だとして
>
> props = {'dataport.subscription_type': sub_type}
> options = optparse.Values({'verbose': False, 'id': '', 'name':None,
> 'properties': props})
> rtcon.connect_ports(source_path, source_full_path,
> dest_path,dest_full_path, options, tree=None)
>
> のように接続を行うと
>
> 1. データポートがrtsystem editor上ではつながっているが
> データが流れてこない(isNewにならない)
> 2. 外部PCのRTCを落とすと、体内RTCが落ちる
> "落ちる"現象は、一切の通信ができなくなる
> (rtcatできない、system editor上でクリックできずフリーズする)
>
> となり、connectPortsで
>
> connectPorts(findRTC(node1).port(port1),findRTC(node2).port(port2),
> subscription='new')
>
> とするとその問題1.と2.が起きないというものでした。
>
>
> こちらでいくつか調べましたところ、
> rtcon.connect_portsをpythonで使用する際の
> 文字コードが問題だったようです。
>
> 上記のsub_typeに
> - pythonのunicode型のu'new'が入っていると1.と2.の症状がおき
> - 'new'になっているとrtcon.connect_portsを使用しても問題がでなくなりました。
>
>
> こちらの環境では、添付のようなスクリプトで
> # workの部分をコメントインすると正しく動作し、
> # does not workの部分をコメントインすると問題1.2.がおきるのが
> 確認できました。
> なお、問題1.2.が起きている状態でもうまくいっている状態でも
> rtsystem editor上では違いが見られませんでした。
> 以下にrtcatしたログを付します。
> basePosの部分が該当データポートなのですが、
> rtcat上でもうまくいく場合いかない場合の
> 接続状況表示の差はみられませんでした。
>
>
> # workでtest_rtcon.pyを実行
> leus @ kentucky:~$ rtcat -ll /hrp4001c/StateHolder0.rtc:basePosOut
> -DataOutPort: basePosOut
> dataport.data_type TimedDoubleSeq
> dataport.dataflow_type push,pull
> dataport.interface_type corba_cdr
> dataport.subscription_type flush,new,periodic
> port.port_type DataOutPort
> -Connected to /hrp4001c/hrp4001c.host_cxt/manager.mgr/seq.rtc:basePosInit
> Name connector0
> ID 1a0c3d9d-8073-4227-9a62-f677b2437cb8
> dataport.subscription_type flush
> dataport.buffer.length 1
> dataport.interface_type corba_cdr
> dataport.dataflow_type Push
> dataport.serializer.cdr.endian little,big
> -Connected to /hrp4001c/hrp4001c.host_cxt/manager.mgr/kpg.rtc:pInit
> Name connector0
> ID dfa950ea-2452-460f-b036-35d4e2938e2e
> dataport.subscription_type flush
> dataport.buffer.length 1
> dataport.interface_type corba_cdr
> dataport.dataflow_type Push
> dataport.serializer.cdr.endian little,big
> -Connected to /hrp4001c/hrp4001c.host_cxt/manager.mgr/log.rtc:basePos
> Name connector0
> ID 5fa59617-9eeb-4132-b1ae-48eaf22aa50a
> dataport.subscription_type flush
> dataport.buffer.length 1
> dataport.interface_type corba_cdr
> dataport.dataflow_type Push
> dataport.serializer.cdr.endian little,big
> -Connected to /hrp4001c/HRP4RStateHolder0.rtc:basePos
> Name basePosOut_basePos
> ID ecfdf0c7-a4b0-4f0f-b883-b266fc97cfca
> dataport.subscription_type new
> dataport.interface_type corba_cdr
> dataport.dataflow_type push
> dataport.data_type TimedDoubleSeq
> dataport.serializer.cdr.endian little,big
>
>
> # does not workでtest_rtcon.pyを実行
> leus @ kentucky:~$ rtcat -ll /hrp4001c/StateHolder0.rtc:basePosOut
> -DataOutPort: basePosOut
> dataport.data_type TimedDoubleSeq
> dataport.dataflow_type push,pull
> dataport.interface_type corba_cdr
> dataport.subscription_type flush,new,periodic
> port.port_type DataOutPort
> -Connected to /hrp4001c/hrp4001c.host_cxt/manager.mgr/seq.rtc:basePosInit
> Name connector0
> ID ba68a33d-af6b-4965-9e37-c72a433b5596
> dataport.subscription_type flush
> dataport.buffer.length 1
> dataport.interface_type corba_cdr
> dataport.dataflow_type Push
> dataport.serializer.cdr.endian little,big
> -Connected to /hrp4001c/hrp4001c.host_cxt/manager.mgr/kpg.rtc:pInit
> Name connector0
> ID 37d3b48a-a084-460f-bf51-86f190372cfc
> dataport.subscription_type flush
> dataport.buffer.length 1
> dataport.interface_type corba_cdr
> dataport.dataflow_type Push
> dataport.serializer.cdr.endian little,big
> -Connected to /hrp4001c/hrp4001c.host_cxt/manager.mgr/log.rtc:basePos
> Name connector0
> ID c84bb61f-18d3-4bac-a1cb-180000000000
> dataport.subscription_type flush
> dataport.buffer.length 1
> dataport.interface_type corba_cdr
> dataport.dataflow_type Push
> dataport.serializer.cdr.endian little,big
> -Connected to /hrp4001c/HRP4RStateHolder0.rtc:basePos
> Name basePosOut_basePos
> ID 520fbf98-4ddf-454c-890d-6efe08ec77af
> dataport.subscription_type new
> dataport.interface_type corba_cdr
> dataport.dataflow_type push
> dataport.data_type TimedDoubleSeq
> dataport.serializer.cdr.endian little,big
>
>
> なお、同様にunicodeの文字列を
>
> connectPorts(findRTC(node1).port(port1),findRTC(node2).port(port2),
> subscription=u'new')
>
> のようにconnecPortsに与えて見たところ、
> こちらでは1.2.の問題がおきませんでした。
>
>
> 長文となりましたが、よろしくお願いいたします。
>
>
> 2011年11月21日8:55 Manabu Saito<saito @ jsk.t.u-tokyo.ac.jp>:
>> ジェフ様
>>
>> 東京大学の斉藤です。
>> 申し訳有りませんが、現在、実機上でRTCが動く環境がありませんので、
>> 実機での結果は木曜日以降にメールで報告させていただきます。
>>
>> 以下はシミュレータの場合ですが、python/rtshell接続したポートの情報(rtcon -ll)です。
>>
>> -DataOutPort: qOut
>> dataport.data_type TimedDoubleSeq
>> dataport.dataflow_type push,pull
>> dataport.interface_type corba_cdr
>> dataport.subscription_type flush,new,periodic
>> port.port_type DataOutPort
>> -Connected to /localhost/HrpsysSeqStateROSBridge0.rtc:rsangle
>> Name qOut_rsangle
>> ID fa477d4a-1734-4d5e-826f-82ce6847afbb
>> dataport.publisher.push_policy all
>> dataport.subscription_type new
>> dataport.interface_type corba_cdr
>> dataport.data_type TimedDoubleSeq
>> dataport.dataflow_type push
>> dataport.serializer.cdr.endian little,big
>>
>> rtconコマンドで接続した場合です。ジェフ様の例と同じ接続状況です。
>>
>> -DataOutPort: qOut
>> dataport.data_type TimedDoubleSeq
>> dataport.dataflow_type push,pull
>> dataport.interface_type corba_cdr
>> dataport.subscription_type flush,new,periodic
>> port.port_type DataOutPort
>> -Connected to
>> /localhost/saito-laptop.host_cxt/manager.mgr/manager/HrpsysSeqStateROSBridge0.rtc:rsangle
>> Name qOutrsangle
>> ID 87e0d997-a3c5-468e-97c1-38b035c39a78
>> dataport.subscription_type new
>> dataport.interface_type corba_cdr
>> dataport.dataflow_type push
>> dataport.data_type TimedDoubleSeq
>> dataport.serializer.cdr.endian little,big
>>
>>
>> 2011年11月17日9:36 Geoffrey Biggs<geoffrey.biggs @ aist.go.jp>:
>>> 斉藤様
>>>
>>> ジェフです。
>>>
>>> subscription_typeの問題について、こちらでrtshellを手動で
>>> subscription_typeをnewにできると確認しました。rtmlaunchを使った後、rtcat
>>> -ll でコネクタのsubscription_typeは何の値かの確認をお願いします。後、手
>>> 動でrtconで接続したらどの値になるかの確認をお願い致します。例えば:
>>>
>>> $ rtcon ConsoleIn0.rtc:out ConsoleOut0.rtc:in -p
>>> dataport.subscription_type=new
>>>
>>> $ rtcat -ll ConsoleIn0.rtc:out
>>> -DataOutPort: out
>>> dataport.data_type IDL:RTC/TimedLong:1.0
>>> dataport.dataflow_type push,pull
>>> dataport.interface_type corba_cdr
>>> dataport.subscription_type flush,new,periodic
>>> port.port_type DataOutPort
>>> -Connected to /localhost/kenroke.host_cxt/ConsoleOut0.rtc:in
>>> Name outin
>>> ID 1936167d-3ab4-4c73-a876-ab2a38c46d65
>>> dataport.subscription_type new
>>> dataport.interface_type corba_cdr
>>> dataport.dataflow_type push
>>> dataport.data_type IDL:RTC/TimedLong:1.0
>>> dataport.serializer.cdr.endian little,big
>>>
>>> クラッシュの問題は、LinuxやOSXの場合ならgdbでコンポーネントを実行して、
>>> クラッシュしたら「bt」というコマンドでbacktraceを取ってみてください。
>>> backtraceでどこにクラッシュしたかが見えます。
>>>
>>> よろしくお願いいたします。
>>>
>>>
>>> On 17/11/11 01:37, Manabu Saito wrote:
>>>> 東京大学の斉藤です。
>>>> ご返信いただきありがとうございます。
>>>>
>>>> 落ちるRTCは送信側/OutPort側のRTCですが、どこで落ちているかはわかっておりません。
>>>> それを調べるのが一番にすべきことでした...
>>>>
>>>> ただ、受信側には接続できていれば得られる出力が一度もないまま、
>>>> SystemEditorでは灰色表示のゾンビコンポーネントとなっておりました。
>>>>
>>>> 2011年11月17日0:30 Ando Noriaki<n-ando @ aist.go.jp>:
>>>>> 産総研 安藤です
>>>>> ちなみに、落ちるRTCはInPort側のRTCですか?OutPort側のRTCですか?また、RTCはどこで落ちているかお分かりになりますか?
>>>>>
>>>>>
>>>>> 2011年11月14日17:14 Manabu Saito<saito @ jsk.t.u-tokyo.ac.jp>:
>>>>>> OpenRTM-usersの皆様
>>>>>>
>>>>>> はじめまして、東京大学の斉藤と申します。
>>>>>>
>>>>>> OpenHRP3を利用したシミュレーション環境内ロボットと通信していた自作RTCを
>>>>>> 実際のロボットで動かした際に、ロボット側RTCとの通信が出来なくなるということが起こりました。
>>>>>> この現象について、subscription_typeがデフォルトのflushのままだと
>>>>>> リアルタイム側に問題が起こるということを詳しい方から聞き、newにして接続することで解決しました.
>>>>>> (データの送信を別スレッドで行う必要があるようです)
>>>>>>
>>>>>> RTSystemEditorをつかって手動でつなげる場合は,これでうまくいくのですが,
>>>>>> rtshellでsubscription_typeをnewにしたデータポートの接続をすると、
>>>>>> どうやらRTCがクラッシュしているようなのですが、
>>>>>> どのように問題を調査すればいいかの指針を皆様に伺いたく存じます。
>>>>>>
>>>>>> 抜粋すると以下のようなスクリプトになっており、これで接続ができていないようです。
>>>>>> (svn co https://rtm-ros-robotics.googlecode.com/svn/trunk/rtmros_common/openrtm/scripts
>>>>>> の rtmlaunch.py)
>>>>>>
>>>>>> props = {'dataport.subscription_type': 'new'}
>>>>>> options = optparse.Values({'verbose': False, 'id': '', 'name':None,
>>>>>> 'properties': props})
>>>>>> rtcon.connect_ports(source_path, source_full_path,
>>>>>> dest_path,dest_full_path, options, tree=None)
>>>>>>
>>>>>> 一方jythonのインタフェースを利用した接続スクリプトを書くと動きました。
>>>>>> (svn co https://rtm-ros-robotics.googlecode.com/svn/trunk/rtmros_commonの
>>>>>> hrpsys/bin/hrpsyspyを実行し、hrpsys_ros_bridge/scripts のhrpsys-bridge-connect.pyをロード)
>>>>>>
>>>>>> connectPorts(findRTC(node1).port(port1),findRTC(node2).port(port2),
>>>>>> subscription='new')
>>>>>>
>>>>>> Dataportの接続について知識不足なこともあり、リアルタイムの問題ともrtshellの問題とも切り分けられておりません。
>>>>>> なにか似たような現象などをご存知の方は、お教えいただきたく思います。
>>>>>>
>>>>>> よろしくお願いいたします。
>>>>>>
>>>>>> --
>>>>>> 斉藤 学 (Saito, Manabu)
>>>>>> 東京大学 情報理工学系研究科 創造情報学専攻 修士2年
>>>>>> mobile:090-3768-2158 e-mail:saito @ jsk.t.u-tokyo.ac.jp
>>>>>> 〒113-8656 東京都文京区本郷7-3-1
>>>>>> 工学部二号館73A4(稲葉研究室) tel:03-5841-8360
>>>>>> _______________________________________________
>>>>>> openrtm-users mailing list
>>>>>> openrtm-users @ openrtm.org
>>>>>> http://www.openrtm.org/mailman/listinfo/openrtm-users
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> 安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
>>>>> 統合知能研究グループ 主任研究員, 博士(工学)
>>>>> 〒305-8568 つくば市梅園1-1-1 中央第2
>>>>> e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
>>>>> OpenRTM-aist: http://www.openrtm.org
>>>>>
>>>>> Noriaki Ando, Ph.D.
>>>>> Senior Research Scientist, RT-Synthesis R.G., ISRI, AIST
>>>>> AIST Tsukuba Central 2, Tsukuba, Ibaraki 305-8568 JAPAN
>>>>> e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
>>>>> OpenRTM-aist: http://www.openrtm.org
>>>>> _______________________________________________
>>>>> 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
>>>
>>
>>
>>
>> --
>> 斉藤 学 (Saito, Manabu)
>> 東京大学 情報理工学系研究科 創造情報学専攻 修士2年
>> mobile:090-3768-2158 e-mail:saito @ jsk.t.u-tokyo.ac.jp
>> 〒113-8656 東京都文京区本郷7-3-1
>> 工学部二号館73A4(稲葉研究室) tel:03-5841-8360
>> _______________________________________________
>> 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 メーリングリストの案内