[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