fkanehiro / hrpsys-base

Basic RT components and utilities to control robots using OpenRTM
Other
41 stars 88 forks source link

hrpsys_config.pyでOpenHRPが見つからない #145

Open fkanehiro opened 10 years ago

fkanehiro commented 10 years ago

From muro...@jsk.imi.i.u-tokyo.ac.jp on October 18, 2013 11:48:41

hrpsys-base-source/python/hrpsys_config.py の352行目で, mdlldr = obj._narrow(OpenHRP.ModelLoader_idl._0_OpenHRP__POA.ModelLoader) とありますが, OpenHRPという名前が見つからないエラーが出ます.

7行目で from OpenHRP import * をしているため,"OpenHRP."が不要ではないかと思います.

Original issue: http://code.google.com/p/hrpsys-base/issues/detail?id=145

fkanehiro commented 10 years ago

From kei.ok...@gmail.com on October 17, 2013 19:53:55

Please check if you have latest hrpsys-bsae, This problem was reported on Issue 138 and should be resolved. This also check in jenkins and passed, http://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hironx-rosbuild/ . please check if roslaunch hironx_ros_bridge hironx_startup.launch works on your computer. https://code.google.com/p/hrpsys-base/issues/detail?id=138

Owner: kei.ok...@gmail.com
Cc: m117...@gmail.com

fkanehiro commented 10 years ago

From ik0...@gmail.com on October 17, 2013 22:36:41

rtmlaunch hironx_ros_bridge hironx_startup.launch では確かにエラーは出ませんが, rtmlaunch hrpsys_ros_bridge_tutorials hrp2jsk.launch や rtmlaunch jsk_hrpsys_ros_bridge hrp4r.launch では以下のようにOpenHRPのnamespaceに関するエラーが出ます. hironxでエラーが出ないのはhironx_ros_bridge/launch/hironx_startup.launch でHRPSYS_PY_NAMEとして利用しているhironx.py内15行目で import OpenHRP をしているためだと思います. なおhrpsysは r5728 , hrpsys-base-sorceは r879 です. 確認よろしくお願いいたします.

-- 以下エラー -- Traceback (most recent call last): File "/home/iori/ros/fuerte/rtm-ros-robotics/rtmros_common/hrpsys_tools/scripts/hrpsys_config.py", line 12, in hcf.init(sys.argv[1], sys.argv[2]) File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 572, in init self.sensors = self.getSensors(url) File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 361, in getSensors return sum(map(lambda x : x.sensors, filter(lambda x : len(x.sensors) > 0, self.getBodyInfo(url)._get_links())), []) # sum is for list flatten File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 352, in getBodyInfo mdlldr = obj._narrow(OpenHRP.ModelLoader_idl._0_OpenHRP__POA.ModelLoader) NameError: global name 'OpenHRP' is not defined

fkanehiro commented 10 years ago

From kei.ok...@gmail.com on October 17, 2013 22:46:29

なるほど,ありがとう r880 で直しました. ただ,元々は mdlldr = obj._narrow(ModelLoader_idl._0_OpenHRP__POA.ModelLoader) ではなく mdlldr = obj._narrow(ModelLoader) で動いていたんだけど,どうしたらこうなるか分かるかな.

fkanehiro commented 10 years ago

From ik0...@gmail.com on October 18, 2013 02:44:02

ModelLoader_idl.pyを見てみたところ, ModelLoader(= OpenHRP.ModelLoader)とModelLoader_idl._0_OpenHRPPOA.ModelLoaderは実質同一のものであるように思います(ModelLoader_idl.py 733行目). ただpythonモジュールのインストール先が issue138 でdist-packagesからdist-packages/hrpsysに変わった結果, OpenHRPへのアクセス方法がhrpsys.OpenHRPに変わったため, 最上層で from hrpsys.hrpsys_config import HrpsysConfigurator すると(この時点でhrpsys/init__.pyによりsys.pathの末尾にdist-packages/hrpsysが追加されるが名前空間は変わっていない)OpenHRP.ModelLoaderがModelLoaderとして呼べなくなることが原因だと思います. ModelLoader_idl._0_OpenHRP__POA.ModelLoaderはModelLoader_idl.pyがhrpsys直下にあるためその次の from hrpsys import * でパスが通り呼べるようになります.

また最上層(hironx.py, hrpsys_tools/scripts/hrpsys_config.py等)で from hrpsys.hrpsys_config import HrpsysConfigurator した場合, 以下のようなエラーが出ます. これはsys.modulesにおけるOpenHRPのkeyがhrpsys.OpenHRPになることが原因であり, from hrpsys import * (ここでhrpsys.OpenHRP->OpenHRPになる) from hrpsys_config import とすれば回避可能です. 以上の変更を加えるとdist-packages/hrpsys/hrpsys_config.pyで from hrpsys import を消して mdlldr = obj._narrow(ModelLoader) としてもhironx_startup.launch, samplerobot_startup.launchが上がることを確認しました.

最後に, dist-packages/hrpsys/init.pyでappendではなく sys.path.insert(0, os.path.dirname(file)) としないとhrpsys_config.pyがhrpsys_toolsの方を見に行ってエラーを起こしていました. ただこれはhrpsys_toolsのhrpsys_configを消すのであれば問題にならないような気はします.

-- 以下ログ -- Traceback (most recent call last): File "/home/iori/ros/fuerte/rtm-ros-robotics/rtmros_common/hrpsys_tools/scripts/hrpsys_config.py", line 13, in hcf.init(sys.argv[1], sys.argv[2]) File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 575, in init self.createComps() File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 322, in createComps exec(create_str) File "", line 1, in File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 310, in createComp comp_svc = narrow(comp.service("service0"), compName+"Service") File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/rtm.py", line 640, in narrow return ior._narrow(getattr(sys.modules[package], klass)) KeyError: 'OpenHRP'

fkanehiro commented 10 years ago

From you...@jsk.imi.i.u-tokyo.ac.jp on October 18, 2013 06:33:39

どうやら、これがうまく行っていない。

した場合, 以下のようなエラーが出ます. これはsys.modulesにおけるOpenHRPのkeyがhrpsys.OpenHRPになることが原因であり, from hrpsys import * (ここでhrpsys.OpenHRP->OpenHRPになる) from hrpsys_config import * とすれば回避可能です.

以下のように回避しています。最後のimport OpenHRP で hrpsys.OpenHRP->OpenHRPになる import hrpsys from hrpsys.hrpsys_config import * import OpenHRP

以下がうまく行っていないようだ。pathの順番とかの問題かな? from hrpsys import * (ここでhrpsys.OpenHRP->OpenHRPになる)

fkanehiro commented 10 years ago

From kei.ok...@gmail.com on October 18, 2013 19:59:05

ようやく話に追いつきました. hrpsys_tools_config.py (やその他のプログラム)では, from hrpsys import * hcf = HrpsysConfigurator() あるいは import hrpsys hcf = hrpsys.HrpsysConfigurator() として使いたい(というのでいいですか?),とすると,

Index: python/init.py

--- python/init.py (リビジョン 875) +++ python/init.py (作業コピー) @@ -1,2 +1,6 @@ import sys, os sys.path.append(os.path.dirname(file)) + +import hrpsys +from hrpsys import +from hrpsys_config import

とするとよい.というのはOKでしょうか?

ただこうすると上の熊谷くんの「以下ログ」というエラーが出て,垣内くんがいっているように, import OpenHRP を追加する必要がある.上のinit.pyをしたときの,hrpsys_tools_config.pyは以下のようになっていますが,ここからimport OpenHRPを外すにはどうしたらいいでしょうか?

!/usr/bin/env python

import roslib; roslib.load_manifest("hrpsys")

from hrpsys import * import OpenHRP

copy from hrpsys/lib/python2.7/dist-packages/hrpsys_config.py

if name == 'main': hcf = HrpsysConfigurator() if len(sys.argv) > 2 : hcf.init(sys.argv[1], sys.argv[2]) elif len(sys.argv) > 1 : hcf.init(sys.argv[1]) else : hcf.init()

Cc: ik0...@gmail.com

fkanehiro commented 10 years ago

From ik0...@gmail.com on October 19, 2013 03:03:20

from hrpsys import するとhrpsys内のモジュールがローカルの名前空間からアクセスできるようになりますが,sys.modules.keys()に入るモジュール名にはhrpsys.hogehogeのようにhrpsysが付くようです. 従ってfrom hrpsys import としてhrpsysのモジュール内でOpenHRPをimportしている限りOpenHRPのKeyErrorは解決できない気がしています.

一方hrpsys_tools_config.pyでimport OpenHRPすると通るのは同一モジュールが別の名前空間内でimportされたことによりhrpsys.OpenHRP(from hrpsys import *でimportされたもの)とは別に OpenHRP(import OpenHRPでトップレベルからimportされたもの)がmodulesに入るためのようです.

しかし, rtm.pyのnarrowにおけるpackageのデフォルトを"hrpsys.OpenHRP"にしても 以下のようなエラーでうまく動きません. どうやらOpenHRP/init.pyでimportしている自動生成ファイルhogehoge_idl.py郡の中でnameを"OpenHRP"に変更して各種class等のnamespaceをOpenHRPとして定義していることが原因のようです. namespaceがhrpsys.OpenHRPしかない場合これらのクラスにアクセスできなくなり, エラーが発生します. どうやらhrpsys_config.pyでmdlldr = obj._narrow(ModelLoader)が動かなくなったのもこれによるもの(ModelLodaerはOpenHRP.ModelLoderになっている)な気がしています. これらは自動生成ファイルらしく, 定義されている関数群もよくわからなったのでこれ以上の変更・検証は困難でした.

結論として解決策ですが, どうにかしてOpenHRPのimport時にOpenHRPを存在させる(今のように再上層でimport OpenHRPする等)か, いっそmanifest.xmlのpathをdist-packages/hrpsysまで通してしまうかくらいしか思いつきません. 自動生成ファイル郡を書き換える方法もあるのかもしれませんが僕にはよくわかりませんでした.

何か良い方法をご存知であれば教えていただけますと幸いです.

-- 以下ログ -- Traceback (most recent call last): File "/home/iori/ros/fuerte/rtm-ros-robotics/rtmros_common/hrpsys_tools/scripts/hrpsys_tools_config.py", line 15, in hcf.init(sys.argv[1], sys.argv[2]) File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 574, in init self.createComps() File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 321, in createComps exec(create_str) File "", line 1, in File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 309, in createComp comp_svc = narrow(comp.service("service0"), compName+"Service") File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/rtm.py", line 640, in narrow return ior._narrow(getattr(sys.modules[package], klass)) AttributeError: 'module' object has no attribute 'SequencePlayerService'

fkanehiro commented 10 years ago

From ik0...@gmail.com on October 20, 2013 21:14:34

omniidlのpythonについてのpackageを-Wbpackageで設定できるらしいので, idl/CMakeLists.txtを以下のように変更しましたが, これだとhogehoge_idl.py内でimportしているOpenRTM関連のidlまでhrpsysのnamespaceに入るらしくエラーが出ます.

hrpsys関連以外のmoduleのnamespaceに手を出さないようにするにはhogehoge_idl.pyを生成する規則を変更する必要がありそうですが, どこを変更すれば良いのでしょうか. いっそdist-packages/hrpsysではなくdist-packages直下にOpenHRPを入れるのも有りな気はしますが, この場合どのような問題がありそうでしょうか.

-- 以下ログ -- svn diff hrpsys-base-source/idl/CMakeLists.txt

Index: CMakeLists.txt

--- CMakeLists.txt (リビジョン 881) +++ CMakeLists.txt (作業コピー) @@ -119,8 +119,8 @@ endif() endforeach()

-install(CODE "execute_process(COMMAND omniidl -bpython -C${python_dist_pkg_dir}/hrpsys -I${OPENRTM_IDL_DIR} ${idl_files} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") -install(CODE "execute_process(COMMAND omniidl -bpython -C${python_dist_pkg_dir}/hrpsys -I${OPENRTM_IDL_DIR} ${openhrp_idl_files} WORKING_DIRECTORY ${OPENHRP_DIR}/share/OpenHRP-3.1/idl/OpenHRP)") +install(CODE "execute_process(COMMAND omniidl -bpython -C${python_dist_pkg_dir} -Wbpackage=hrpsys -I${OPENRTM_IDL_DIR} ${idl_files} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})") +install(CODE "execute_process(COMMAND omniidl -bpython -C${python_dist_pkg_dir} -Wbpackage=hrpsys -I${OPENRTM_IDL_DIR} ${openhrp_idl_files} WORKING_DIRECTORY ${OPENHRP_DIR}/share/OpenHRP-3.1/idl/OpenHRP)")

rtmlaunch hrpsys_ros_bridge_tutorials samplerobot_startup.launch Traceback (most recent call last): File "/home/iori/ros/fuerte/rtm-ros-robotics/rtmros_common/hrpsys_tools/scripts/hrpsys_tools_config.py", line 6, in from hrpsys import File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/init.py", line 4, in from hrpsys_config import HrpsysConfigurator File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/hrpsys_config.py", line 7, in from OpenHRP import File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/OpenHRP/init.py", line 14, in import hrpsys.ForwardKinematicsService_idl File "/home/iori/ros/fuerte/rtm-ros-robotics/openrtm_common/hrpsys/lib/python2.7/dist-packages/hrpsys/ForwardKinematicsService_idl.py", line 10, in import hrpsys.BasicDataType_idl ImportError: No module named BasicDataType_idl

fkanehiro commented 10 years ago

From gm130s on December 31, 2013 02:37:59

この件ハマっています.色々試しても,上でレポートされているいづれかの状態になります.解決できた方が居たら方法を教えて頂きたいです.

参考まで,私がやろうとしているのは:

hironx_ros_robotics/file_a.py: try: # Since Groovy does not requires load_manifest import roslib import hironx_ros_bridge except: import roslib; roslib.load_manifest('hironx_ros_bridge')

from hrpsys_ros_bridge.file_b import ClassB

hrpsys_ros_robotics/file_b.py:

import roslib; roslib.load_manifest("hrpsys")  # These 2 lines need ordered this way.
#import roslib; roslib.load_manifest('hrpsys_ros_bridge')

from hrpsys.hrpsys_config import *
import OpenHRP
import OpenRTM_aist
import OpenRTM_aist.RTM_IDL
import rospy
import rtm
from waitInput import waitInputConfirm, waitInputSelect

SWITCH_ON = hrpsys.OpenHRP.RobotHardwareService.SWITCH_ON
SWITCH_OFF = hrpsys.OpenHRP.RobotHardwareService.SWITCH_OFF

class ClassB(HrpsysConfigurator):
    :

Error: /home/roo/groovy_precise/catkinws/install/lib/python2.7/dist-packages/hrpsys_ros_bridge/file_b.py 44 from hrpsys.hrpsys_config import * ---> 45 import OpenHRP 46 import OpenRTM_aist 47 import OpenRTM_aist.RTM_IDL

/home/roo/groovy_precise/catkinws/install/lib/python2.7/dist-packages/hrpsys_ros_bridge/OpenHRP/__init__.py in <module>()
  4 
  5 import omniORB

----> 6 omniORB.updateModule("OpenHRP") 7 8 # \ 1. Stub files contributing to this module

/usr/lib/python2.7/dist-packages/omniORB/__init__.pyc in updateModule(mname)
    618     if _partialModules.has_key(mname):
    619         pmod = _partialModules[mname]
--> 620         mod  = sys.modules[mname]
    621         mod.__dict__.update(pmod.__dict__)
    622         del _partialModules[mname]

KeyError: 'OpenHRP'
fkanehiro commented 10 years ago

From gm130s on January 27, 2014 10:58:51

上の二点のエラーがどうにも回避できないので,再現性のあるコードを付けて次のリンクで報告しなおしています.どなたか見て頂けると幸いです. https://code.google.com/p/rtm-ros-robotics/issues/detail?id=305

fkanehiro commented 10 years ago

From kei.ok...@gmail.com on January 27, 2014 19:00:08

groovy/12.04で以下のようにしてエラーが出ていないのですが,これでは確認にならないでしょうか?これ以外の状況で利用されているという事になるでしょうか?

$ rtmlaunch hrpsys_ros_bridge_tutorials samplerobot_startup.launch $ roslaunch hrpsys_ros_bridge_tutorials samplerobot_ros_bridge.launch

fkanehiro commented 10 years ago

From gm130s on January 28, 2014 23:36:55

groovy/12.04で以下のようにしてエラーが出ていないのですが,これでは確認にならないでしょうか?これ以外の状況で利用されているという事になるでしょうか?

はい,下記リンクで書いているように,クラス構造変更を試している最中で起きています. http://code.google.com/p/rtm-ros-robotics/issues/detail?id=305

fkanehiro commented 10 years ago

From kei.ok...@gmail.com on January 28, 2014 23:56:40

クラスの構造変更は何故必要でしょうか?hrpsysで提供されているサービスは全てOpenRTMレイヤで動いているものなので,ROSとしてサービスコールする必要があるレイヤは無い,あるいは,冗長になると思っているのですが...

もし,hrpsys_ros_bridgeレベルで,なにかコードが必要だとすると,hrpsysが提供せずに,hrpsys_ros_bridgeが提供するコード,例えばJointTrajectoryActionに対する操作を行う関数/クラスになると思っていて,例えば,それには, http://ehc.ac/p/jsk-ros-pkg/code/HEAD/tree/trunk/pr2eus/robot-interface.l のようにロボットのモデルを読み込んだら必要な関節の名前を取ってきて,:angle-vector #f(0 0 0 0 0 0) で,jointtrajectionに投げる,というものが有りそうです.がこれは,hrpsys_ros_bridgeレベルではなくて,jointTrajectryActionレベルなので,ros_controlあたりのパッケージに入れるべきコードになると思います.

fkanehiro commented 10 years ago

From gm130s on January 29, 2014 06:11:05

混乱を招いてすみません.クラス構造の変更は hrpsys に対してではありません.{ hrpsys, hironx }_ros_bridge の間で試みています.次のチケットの課題への対応です http://code.google.com/p/rtm-ros-robotics/issues/detail?id=291