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

Ando Noriaki n-ando @ aist.go.jp
2013年 7月 2日 (火) 13:18:04 JST


三宅さん

安藤です

環境変数でネームサーバのアドレスを取るのはいいと思います。
ただし、RTCTREE_NAMESERVERS はカンマ区切りで複数のネームサーバが書かれている
可能性があります。それでも、ポート番号が必ず記述されていればこのコードでうまくいきますが、
省略されている場合はうまくいかないかもしれません
#rtctreeのソースを見ていないので違ってるかもしれませんが。

なので、念のため
nshost = os.environ["RTCTREE_NAMESERVERS"].split(",")[0].split(":")[0]
こんな感じにしておいた方がいいかもしれません。


根本的な疑問ですが、ネームサーバのあるホストに、RTC Managerがあると仮定するのは
意味があるんでしょうか?hrpsysがそういうポリシーなら、それはそれでいいのですが。





2013年7月2日 12:55 Kenji Miyake <kenji @ jsk.t.u-tokyo.ac.jp>:
> 安藤さん
>
> 三宅です。
> こちらが使っているソースと、変更を加えたパッチ部分を送ります。
> 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
>>>>


More information about the openrtm-users mailing list