2011-06-10 6 views
0

私はPythonを初めて使い、この特定の問題の処理方法を知らないだけです。 ディレクトリ/opt/ros/diamondback/stacks/hrl/hrl_rfid/src/hrl_rfid/ros_M5e.pyにある実行可能ファイル(ros_M5e.py)を実行しようとしています面倒な長いファイルパス、私は知っているが、必要)。ただし、ros_M5e.pyファイル内には、ファイルパスをさらに上にして別のファイルが呼び出されます(from hrl.hrl_rfid.msg import RFIDread)。ディレクトリmsgは実際には/opt/ros/diamondback/stacks/hrl/hrl_rfid/にあり、実際にはファイルRFIDreadを含んでいます。私はros_M5e.pyを実行しようとするたびしかし、私はこのエラーを取得する:Pythonファイルの場所の規則とインポートのエラー

Traceback (most recent call last): File "/opt/ros/diamondback/stacks/hrl/hrl_rfid/src/hrl_rfid/ros_M5e.py", line 37, in <module> from hrl.hrl_rfid.msg import RFIDread ImportError: No module named hrl.hrl_rfid.msg

いくつかの専門知識を持つ誰かが私のために、この問題にいくつかの光を当てるていただけますか?これは単なる初歩的なファイルの場所の問題のようですが、私はそれを修正するために適切なPythonの慣習を知りません。私はros_M5e.pyファイルを、それが呼び出すファイルと同じディレクトリに置き、ファイルパスを変更しようとしましたが、役に立たなかったのです。

どうもありがとう、

Khiya

答えて

0

あなたは以下に該当することを確認する必要があります。

  • Directory /opt/ros/diamondback/stacks/は、あなたのpythonのパスです。
  • /opt/ros/diamondback/stacks/hr1はので、ここで、__init__.py
  • /opt/ros/diamondback/stacks/hr1/hr1_rfid contians__init__.py
  • /opt/ros/diamondback/stacks/hr1/hr1_rfid/msg contians

アスカーはRFIDReadはの.py拡張子を持っていないことをコメントで説明したように__init__.pyが含まれていることをインポートすることができる方法です。

import imp 
imp.load_source('RFIDRead', '/opt/ros/diamondback/stacks/hr1/hr1_rfid/msg/RFIDRead.msg') 

詳細についてはimp documentationをチェックしてください。

+0

ありがとうございました。私は "export PYTHONPATH = $ PYTHONPATH:/ opt/ros/diamondback/stacks/'で最初に"' _ _init_ _.py 'ファイルを3つのディレクトリすべてにコピーしました(以前は'/opt// hrl_rfid/'ディレクトリ内の' msg 'ディレクトリを見つけることができるようになりましたが、今は別のエラーを受け取っています: "' ImportError:インポートできません名前RFIDread '"。より多くの提案? – Khiya

+0

RFIDreadの完全なファイル名を確認するだけですRFIDread.py –

+0

実際にその特定のファイルの名前はRFIDread.msgです。ros_M5e.pyファイルの名前を変更できますか? ? – Khiya

1

確かに、私はそれを起動して実行するのを手助けすることができます。

StackOverflowの投稿から、スタックを/ opt/ros/diamondbackにチェックアウトしているように見えます。システムパスなので、これはうまくいきません。ローカルパスにインストールする必要があります。リポジトリの "読み取り専用"の理由は、コードに変更を加える権限がないことです。ローカルマシンでもうまく動作します。私はここで、このパッケージ(少なくともPythonのバージョン)を使用する方法を示すかなりの時間を費やし:

http://www.ros.org/wiki/hrl_rfid 

私はそれをインストールするための迅速な実行スルーをやろうよ....以下を実行しますコマンド:

cd 
mkdir sandbox 
cd sandbox/ 
svn checkout http://gt-ros-pkg.googlecode.com/svn/trunk/hrl/hrl_rfid hrl_rfid (double-check that this checkout works OK!) 

bashrcの下に次の行を追加して、ROSに新しいパッケージを見つける場所を伝えます。 ( "gedit〜/"を使うことができます。bashrcに「)

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$HOME/sandbox/hrl_rfid 

は今すぐ次のコマンドを実行します。すべてが実際に正しくインストールされている。この時点で

roscd hrl_rfid (did you end up in the correct directory?) 
rosmake hrl_rfid (did it make without errors?) 
roscd hrl_rfid/src/hrl_rfid 

デフォルトでは、ros_M5e.pyは読者がに位置していることを前提とし、」/は/ dev /ロボットRFIDリーダ」すでにudevルールを変更してある場合を除き、これはあなたのマシン上のケースではありません私は、コードを実行しているお勧め:。。

iPython(コマンドラインpythonのプロンプトそのウィルを使用して
http://www.ros.org/wiki/hrl_rfid 

lは(あなたのRFIDリーダーは次のように接続されているどんなデバイスでは/ dev/ttyUSB0を置き換え)すべてが動作していることを確認するために)あなたのpython、一度に1つのコマンドを実行してみましょう:

import lib_M5e as M5e 

r = M5e.M5e('/dev/ttyUSB0', readPwr = 3000) 
r.ChangeAntennaPorts(1, 1) 
r.QueryEnvironment() 

r.TrackSingleTag('test_tag_id_') 
r.ChangeTagID('test_tag_id_') 
r.QueryEnvironment() 
r.TrackSingleTag('test_tag_id_') 

r.ChangeAntennaPorts(2, 2) 
r.QueryEnvironment() 

これは、基礎となるライブラリはちょうど働いていることを意味します良い。次に、テストROSは( "roscoreが" 実行されていることを確認してください!)、Pythonのファイルでこれを入れて実行することにより:

import lib_M5e as M5e 

def P1(r): 
    r.ChangeAntennaPorts(1,1) 
    return 'AntPort1' 

def P2(r): 
    r.ChangeAntennaPorts(2,2) 
    return 'AntPort2' 

def PrintDatum(data): 
    ant, ids, rssi = data 
    print data 

r = M5e.M5e('/dev/ttyUSB0', readPwr = 3000) 
q = M5e.M5e_Poller(r, antfuncs=[P1, P2], callbacks=[PrintDatum]) 
q.query_mode() 

t0 = time.time() 
while time.time() - t0 < 3.0: 
    time.sleep(0.1) 

q.track_mode('test_tag_id_') 

t0 = time.time() 
while time.time() - t0 < 3.0: 
    time.sleep(0.1) 

q.stop() 

[OK]を、すべてが動作するようになりました。あなたのセットアップにチューニングされている独自のノードにすることができます。

#!/usr/bin/python 
import ros_M5e as rm 

def P1(r): 
    r.ChangeAntennaPorts(1,1) 
    return 'AntPort1' 

def P2(r): 
    r.ChangeAntennaPorts(2,2) 
    return 'AntPort2' 

ros_rfid = rm.ROS_M5e(name = 'my_rfid_server', 
         readPwr = 3000, 
         portStr = '/dev/ttyUSB0', 
         antFuncs = [P1, P2], 
         callbacks = []) 

rospy.spin() 
ros_rfid.stop() 

それとも、戻って私にpingを実行すると、私は、オプションの「portStr」を取るためにros_M5e.pyを微調整することができます - 私はあなたがそのよう自分自身を行うことをお勧めしますけれどもあなたのアンテナを分かりやすく名付けることができます。また、私は非常にRFIDリーダーが常に同じデバイスに割り当てられますことを確認するために、udevルールを設定することをお勧めします:http://www.hsi.gatech.edu/hrl-wiki/index.php/Linux_Tools#udev_for_persistent_device_naming

BUS=="usb", KERNEL=="ttyUSB*", SYSFS{idVendor}=="0403", SYSFS{idProduct}=="6001", SYSFS{serial}=="ftDXR6FS", SYMLINK+="robot/RFIDreader" 

これを行わないと...リーダーは常に列挙されるという保証はありません/ dev/ttyUSBxにあります。

さらに問題がある場合はお知らせください。

〜トラヴィスDeyle(Hizook.com

PS - あなたが "hrl.hrl_rfid.msgインポートRFIDreadから" ros_M5e.pyを修正しましたか?レポでは、 "hrl_rfid.msg import RFIDreadから"です。後者は正しい。 ROS_PACKAGE_PATHが正しく定義されていて、パッケージでrosmakeを実行している限り、import文は正常に動作するはずです。また、ROS関連の質問をStackOverflowに投稿することはお勧めしません。ここにはROSエコシステム(これは非常に複雑です)に精通している人はほとんどいません。代わりに質問を投稿してください。

http://answers.ros.org/ 
http://code.google.com/p/gt-ros-pkg/issues/list 
関連する問題