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

Kenji Miyake kenji @ jsk.t.u-tokyo.ac.jp
2013年 7月 2日 (火) 00:19:09 JST


安藤さん

三宅です。
度々すいません。

先日は気づかなかったのですが、安藤さんのコードにあるnshostについて疑問が出てきたので、教えていただきたいです。
以下の部分です。

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

この中にあるnshostは、我々のスクリプトでは定義されていないのですが、
どういった意味合いを持つものなのでしょうか?

例えば、今私は
python ./hironx.py RobotHardware0 -ORBInitRef
NameService=corbaloc:iiop:hiro014:2809/NameService
のように、いちいちオプションを設定してロボットを使用しているのですが、
nshostを定義しておくことによって、このオプションが不要になったりするのでしょうか?

よろしくお願いします。

2013年7月1日 15:40 Ando Noriaki <n-ando @ aist.go.jp>:
> 三宅さま
>
> 安藤です
>
>> 遅くなりましたが、アドバイスの通りに修正したところ、無事にIPアドレスから接続できるようになりました。
>> ありがとうございます。hrpsys-baseのプロジェクトへ報告しておきます。
>
> それはよかったです。よろしくお願いいたします。
>
>> あと一点だけ、コメントを頂きたいところがあるのですが、
>> if getManagerFromDirectly(h, mgr): return mgr
>> if getManagerFromNS(h, mgr): return mgr
>> の部分で、getManagermgr〜の結果がmgrに入っておらず、Noneのままになっていたので、
>
> mgrは参照渡しのつもりで書いたのですが、Pythonでやろうと思うと
> 配列に入れなければならなかったですね。
>
>> for h in hostnames:
>>   mgr = getManagerDirectly(h, mgr) or getManagerFromNS(h, mgr)
>>   if mgr: return mgr
>> のように変更しました。
>> これで問題がないようなら良いのですが、問題があるor他に良い書き方があるようならば、教えていただきたいです。
>
> たしかにorを使うと綺麗にかけますね。これは思いつきませんでした。
> こうなるともう引数のmgrはいらないですね。削ってもいいと思います。
> ありがとうございました。
>
>> よろしくお願いします。
>>
>>
>> 最後に、念の為最終的なコードを載せておきます。
>>
>> 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
>> _______________________________________________
>> 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



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


More information about the openrtm-users mailing list