[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