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

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


安藤さん

三宅です。
こちらが使っているソースと、変更を加えたパッチ部分を送ります。
jython版を参考にして、initCORBAの中でnshostに代入をしてみました。

変更内容は、環境変数から読むのが楽そうだったので、そのように直してみました。
この変更で動作確認はしたのですが、問題がありそうなら、指摘していただけると幸いです。

よろしくお願いします。


2013年7月2日 8:07 Ando Noriaki <n-ando @ aist.go.jp>:
> 三宅さん
>
> 安藤です
>
> すみません、見てるソースが違うのでいろいろ違うみたいですね。
> 私が見ていたソースではgetPropertiesで取得できるNS_OPTの
> 値(host:port)のhostの部分がnshostに代入されています。
> これはもしかしてJythonで実行することを前提としたスクリプトなんですかね?
>
> こちらのスクリプトでは
> https://code.google.com/p/hrpsys-base/source/browse/trunk/python/rtm.py
> そういう指定はできないみたいですね。
>
> Python単体ではJavaのPropertiesのような仕組みはないですが、
> omniORBpy自体はconfigファイルを読み込む仕組みがあるので、
> それをつかってネームサーバを指定するという手は使えるかもしれません。
> http://omniorb.sourceforge.net/omni40/omniORB/omniORB004.html
>
> あとは、OpenRTMのように自分でconfigファイルを読み込む仕組みを作るか
> rtshellのように環境変数を使うという手があるかと思います。
>
>
>
> 2013年7月2日 0:19 Kenji Miyake <kenji @ jsk.t.u-tokyo.ac.jp>:
>> 安藤さん
>>
>> 三宅です。
>> 度々すいません。
>>
>> 先日は気づかなかったのですが、安藤さんのコードにある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
>> _______________________________________________
>> 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
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: rtm.py
型:         application/octet-stream
サイズ:     17534 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20130702/3268cb13/attachment.obj>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: rtm.py.patch
型:         application/octet-stream
サイズ:     586 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20130702/3268cb13/attachment-0001.obj>


More information about the openrtm-users mailing list