[openrtm-users 02831] Re: findRTCmanagerに関する質問
Ando Noriaki
n-ando @ aist.go.jp
2013年 7月 1日 (月) 15:40:44 JST
三宅さま
安藤です
> 遅くなりましたが、アドバイスの通りに修正したところ、無事に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
More information about the openrtm-users
mailing list