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

Kenji Miyake kenji @ jsk.t.u-tokyo.ac.jp
2013年 7月 1日 (月) 12:59:29 JST


安藤さん

三宅です。

遅くなりましたが、アドバイスの通りに修正したところ、無事にIPアドレスから接続できるようになりました。
ありがとうございます。hrpsys-baseのプロジェクトへ報告しておきます。


あと一点だけ、コメントを頂きたいところがあるのですが、
if getManagerFromDirectly(h, mgr): return mgr
if getManagerFromNS(h, mgr): return mgr
の部分で、getManagermgr〜の結果がmgrに入っておらず、Noneのままになっていたので、

for h in hostnames:
  mgr = getManagerDirectly(h, mgr) or getManagerFromNS(h, mgr)
  if mgr: return mgr
のように変更しました。
これで問題がないようなら良いのですが、問題があるor他に良い書き方があるようならば、教えていただきたいです。

よろしくお願いします。


最後に、念の為最終的なコードを載せておきます。

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(obj._narrow(RTM.Manager))
    except:
      mgr = None
    return mgr
  def getManagerDirectly(hostname, mgr = None):
    global orb
    corbaloc = "corbaloc:iiop:" + hostname + ":2810/manager"
    try:
      obj = orb.string_to_object(corbaloc)
      mgr = RTCmanager(obj._narrow(RTM.Manager))
    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:
     mgr = getManagerDirectly(h, mgr) or getManagerFromNS(h, mgr)
     if mgr: return mgr
  print "Manager not found"
  return None


2013年6月29日 0:38 Ando Noriaki <n-ando @ aist.go.jp>:
> 三宅さん
>
> 安藤です
>
> 失礼しました。RTCmanagerオブジェクトはCORBAオブジェクトではないですね。
> narrowしているので、None以外が返ってくればCORBAオブジェクトはnilではないはずなので、
>
> if not CORBA.is_nil(getManagerFromDirectly(h, mgr)): return mgr
> if not CORBA.is_nil(getManagerFromNS(h, mgr)): return mgr
>> if getManagerFromDirectly(h, mgr): return mgr
> if getManagerFromNS(h, mgr): return mgr
>
> でいいと思います。
>
> ちなみに、getManagerFromDirectly() にもバグがありました。
> corbalocのポート番号が抜けていました。以下のようになります。
>
>      def getManagerDirectly(hostname, mgr = None):
>    global orb
>        corbaloc = "corbaloc:iiop:" + hostname + ":2810/manager"
>        try:
>          obj = orb.string_to_object(corbaloc)
>          mgr = RTCmanager(obj._narrow(RTM.Manager))
>        except:
>          mgr = None
>        return mgr
>
>
> 2013年6月29日 0:15 Kenji Miyake <kenji @ jsk.t.u-tokyo.ac.jp>:
>> 安藤さん
>>
>> 三宅です。
>>
>> 頂いたプログラムのように変更を加えてみましたが、
>> objの生成の段階で例外が発生してしまいます。
>>
>> また、getManagerFromNSの方は、
>> #mgr = RTCmanager(ManagerHelper.narrow(obj))
>> とコメントアウトして、元から書いてあったものを参考に、
>> mgr = RTCmanager(obj._narrow(RTM.Manager))
>> とすると、以下のようにインスタンスは生成されました。
>> <rtm.RTCmanager instance at 0x2ab4b00>
>>
>> しかしその後、
>>   File "/home/leus/ros/fuerte/rtm-ros-robotics/rtmros_common/hrpsys/share/hrpsys/python/rtm.py",
>> line 337, in findRTCmanager
>>     if not CORBA.is_nil(getManagerFromNS(h, mgr)):
>>   File "/usr/lib/python2.7/dist-packages/omniORB/CORBA.py", line 1139, in is_nil
>>     raise BAD_PARAM(omniORB.BAD_PARAM_WrongPythonType, COMPLETED_NO)
>> omniORB.CORBA.BAD_PARAM:
>> CORBA.BAD_PARAM(omniORB.BAD_PARAM_WrongPythonType, CORBA.COMPLETED_NO)
>>
>> とエラーが出てしまいます。
>>
>>
>> どのように変更すれば良いでしょうか?
>> また、もう少し詳細なログや環境変数などの情報は必要でしょうか?
>> お手数をおかけしますが、よろしくお願い致します。
>>
>> 2013年6月28日 20:39 Ando Noriaki <n-ando @ aist.go.jp>:
>>> 三宅さん
>>>
>>> 安藤です
>>>
>>>> JSKの三宅です。
>>>>
>>>> 頂いたコードを少し修正して試しましたが、
>>>> System.getProperties()のところで例外が出ました。
>>>>
>>>> こちらの環境では、jythonではなくてCpythonを使っているのですが、
>>>> その場合はどのように書けば良いのでしょうか?
>>>
>>> グローバル変数 orb に ORB の参照が代入されているようですので、
>>> getProperites() を使わないでgetManagerDirectly()を以下のように書けばいいかもしれません。
>>> # initCORBA() が実行されていることが前提です。
>>>
>>>      def getManagerDirectly(hostname, mgr = None):
>>>    global orb
>>>        corbaloc = "corbaloc:iiop:" + hostname + "/manager"
>>>        try:
>>>          obj = orb.string_to_object(corbaloc)
>>>          mgr = RTCmanager(ManagerHelper.narrow(obj))
>>>
>>>> また、以下の、
>>>> for h in hostnames:
>>>>        if not CORBA.is_nil(getManagerDirectly(hostname, mgr)): return
>>>> mgr   #getmanager -> getManager
>>>>        if not CORBA.is_nil(getManagerFromNS(hostname, mgr)): return mgr
>>>>
>>>> については、hostname -> hに置き換えればよろしいでしょうか?
>>>
>>> そうですね。for の中なので getManager*(h, mgr) じゃないとだめですね。
>>> これらのif文は最初for文の外にあったのですが、修正し忘れです。すみません。
>>> _______________________________________________
>>> openrtm-users mailing list
>>> openrtm-users @ openrtm.org
>>> http://www.openrtm.org/mailman/listinfo/openrtm-users
>>
>>
>>
>> --
>> 三宅 健司
>> 東京大学 情報理工学系研究科 創造情報学専攻
>> 稲葉・岡田研究室 修士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
> _______________________________________________
> openrtm-users mailing list
> openrtm-users @ openrtm.org
> http://www.openrtm.org/mailman/listinfo/openrtm-users



-- 
三宅 健司
東京大学 情報理工学系研究科 創造情報学専攻
稲葉・岡田研究室 修士2年
E-mail: kenji @ jsk.t.u-tokyo.ac.jp


More information about the openrtm-users mailing list