[openrtm-users 02823] Re: findRTCmanagerに関する質問

Ando Noriaki n-ando @ aist.go.jp
2013年 6月 28日 (金) 11:39:11 JST


三宅さん

産総研 安藤と申します

findRTCmanager() というのは hrpsysの一部のこのrtm.py内のfindRTCManagerのことであってますでしょうか?

https://github.com/thomas-moulard/hrpsys-base-deb/blob/master/jython/rtm.py

これが三宅さんのおっしゃるfindRTCmanager()だと仮定して、ソースを読む限り、
findRTCmanager()関数はネームサーバの

 + <hostname>.host_cxt
     + manager.mgr

というところに登録されているマネージャを探しに行っているようです。
また、findRTCmanager()の引数がIPアドレスの場合、ホスト名に変換して
探しているので、一見よさそうに見えるのですが、

OpenRTM-aist側: <hostname>はドメイン名なしのホスト名
# 具体的には uname (2) の nodename からとっています。

rtm.py側: <hostname>はFQDNなホスト名
# 正確には gethostbyaddr (2) で取得される正式名(FQDNとは限らない?)
http://docs.python.jp/2.5/lib/module-socket.html

となっているため見つけられないのではないかと思います。

ですので、一番簡単な対処法はマネージャに与える rtc.conf で以下のように指定することです。
#ちょっと美しくないやり方ですが。
manager.naming_formats: %h.host_cxt/%n.mgr, <fqdn hostname>.host_cxt/%n.mgr

http://www.openrtm.org/openrtm/ja/content/rtcconf%E8%A8%AD%E5%AE%9A%E9%A0%85%E7%9B%AE%E4%B8%80%E8%A6%A7#toc5

これで、マネージャが

 + <hostname>.host_cxt
     + manager.mgr
 + <fqdn hostname>.host_cxt
     + manager.mgr

のように2か所に登録されます。(美しくないです。)

あとは、rtm.pyに手を加えることが許されるなら、マネージャの特性を利用して、
orb.string_to_object() を利用してダイレクトに参照を取得する方法が使えます。
findRTCmanager() を下のような感じで書き換えてあげれば、だいたい
どんなアドレスを与えてやっても取得できると思います。
#ただし、下のコードは動かしたことがないのでエラーはあると思います。

 def findRTCmanager(hostname=None, rnc=None):
   if not hostname:
     hostname = nshost
     cxt = None

     def getManagerFromNS(hostname, mgr = None):
       try:
         obj = findObject("manager","mgr", findObject(hostname,
"host_cxt", rnc))
         mgr = RTCmanager(ManagerHelper.narrow(obj))
       except:
         mgr = None
       return mgr

     def getManagerDirectly(hostname, mgr = None):
       corbaloc = "corbaloc:iiop:" + hostname + "/manager"
       try:
         obj = ORB.init([], System.getProperties()).string_to_object(corbaloc)
         mgr = RTCmanager(ManagerHelper.narrow(obj))
       except:
         mgr = None
       return mgr
     import CORBA
     # fqdn
     mgr = None
     hostnames = [hostname, hostname.split(".")[0],
                  socket.gethostbyaddr(hostname)[0],
                  socket.gethostbyaddr(hostname)[0].split(".")[0]]
     for h in hostnames:
       if not CORBA.is_nil(getmanagerDirectly(hostname, mgr)): return mgr
       if not CORBA.is_nil(getManagerFromNS(hostname, mgr)): return mgr
     print "Manager not found"
     return None

以上、参考になれば幸いです。

#ちなみに、このrtm.pyは誰に言えば修正できるんでしょうか?


2013年6月27日 22:03 Kenji Miyake <kenji @ jsk.t.u-tokyo.ac.jp>:
> はじめまして、JSK修士2年の三宅と申します。
>
> hiro014(192.168.128.14)というロボットで、RTMを使用しています。
>
> 以下のようにfindRTCmanagerを行った時に、managehostにhiro014を使用すると問題なく実行できるのですが、
> hiro014のIPアドレスでは、exeptionが発生してしまいます。
>
> IPアドレスからも通信ができると良いのではないか、とも思うのですが、
> これは何故このような仕様になっているのでしょうか?
>
> よろしくお願い致します。
>
> *** Problem ***
> leus @ parsnip:~/tmp_hiro$ ipython bag_report_sample.py
> managehost =  hiro014
> ms =  <rtm.RTCmanager instance at 0x2a0db48>
> managerhost =  192.168.128.14
> exception in findRTCmanager(192.168.128.14)
> ms =  None
>
> *** My sample program ***
> #!/usr/bin/env python
> import roslib; roslib.load_manifest("hrpsys")
>
> import os
> import rtm
>
> from rtm import *
> from OpenHRP import *
>
> import socket
> import time
>
> managerhost = "hiro014"
> print "managehost = ", managerhost
> ms = rtm.findRTCmanager(managerhost)
> print "ms = ", ms
>
> managerhost = "192.168.128.14"
> print "managerhost = ", managerhost
> ms = rtm.findRTCmanager(managerhost)
> print "ms = ", ms
>
> *** My Environment ***
> leus @ parsnip:~$ route
> カーネルIP経路テーブル
> 受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
> default         raspberry.jsk.t 0.0.0.0         UG    0      0        0 eth0
> link-local      *               255.255.0.0     U     1000   0        0 eth0
> 192.168.101.0   *               255.255.255.0   U     1      0        0 eth0
> 192.168.128.0   *               255.255.255.0   U     1      0        0 eth1
>
> leus @ parsnip:~$ ifconfig
> eth0      Link encap:イーサネット  ハードウェアアドレス 00:1f:29:05:a4:11
>           inetアドレス:192.168.101.164  ブロードキャスト:192.168.101.255  マスク:255.255.255.0
>           inet6アドレス: fe80::21f:29ff:fe05:a411/64 範囲:リンク
>           UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
>           RXパケット:364712 エラー:0 損失:0 オーバラン:0 フレーム:0
>           TXパケット:100019 エラー:0 損失:0 オーバラン:0 キャリア:0
>           衝突(Collisions):0 TXキュー長:1000
>           RXバイト:91506001 (91.5 MB)  TXバイト:23520376 (23.5 MB)
>           割り込み:16
>
> eth1      Link encap:イーサネット  ハードウェアアドレス 00:1f:29:05:a4:10
>           inetアドレス:192.168.128.254  ブロードキャスト:192.168.128.255  マスク:255.255.255.0
>           inet6アドレス: fe80::21f:29ff:fe05:a410/64 範囲:リンク
>           UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
>           RXパケット:476946 エラー:0 損失:55804 オーバラン:0 フレーム:0
>           TXパケット:399160 エラー:0 損失:0 オーバラン:0 キャリア:0
>           衝突(Collisions):0 TXキュー長:1000
>           RXバイト:320400400 (320.4 MB)  TXバイト:52379713 (52.3 MB)
>           割り込み:17
>
> lo        Link encap:ローカルループバック
>           inetアドレス:127.0.0.1  マスク:255.0.0.0
>           inet6アドレス: ::1/128 範囲:ホスト
>           UP LOOPBACK RUNNING  MTU:16436  メトリック:1
>           RXパケット:410223 エラー:0 損失:0 オーバラン:0 フレーム:0
>           TXパケット:410223 エラー:0 損失:0 オーバラン:0 キャリア:0
>           衝突(Collisions):0 TXキュー長:0
>           RXバイト:161057733 (161.0 MB)  TXバイト:161057733 (161.0 MB)
>
> virbr0    Link encap:イーサネット  ハードウェアアドレス ba:5c:0c:ca:90:a0
>           inetアドレス:192.168.122.1  ブロードキャスト:192.168.122.255  マスク:255.255.255.0
>           UP BROADCAST MULTICAST  MTU:1500  メトリック:1
>           RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
>           TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
>           衝突(Collisions):0 TXキュー長:0
>           RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)
>
>
>
> --
> 三宅 健司
> 東京大学 情報理工学系研究科 創造情報学専攻
> 稲葉・岡田研究室 修士2年
> E-mail: kenji @ jsk.t.u-tokyo.ac.jp
> _______________________________________________
> 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


More information about the openrtm-users mailing list