2011-06-10 40 views
0

我是新來的Python,我根本不知道如何處理這個特定問題: 我試圖運行一個可執行文件(名字爲ros_M5e.py),位於目錄/opt/ros/diamondback/stacks/hrl/hrl_rfid/src/hrl_rfid/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,則爲__init__.py

由於提問者在評論認爲,RFIDRead沒有.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'文件複製到所有三個目錄中(以前它只在'/ opt/ros/diamondback/stacks/hrl/hrl_rfid/src/hrl_rfid /'目錄。現在它能夠在'hrl/hrl_rfid /'中找到'msg'目錄,但現在我收到了另一個錯誤:''ImportError:can not import名稱爲RFIDread'「。其他建議? – Khiya 2011-06-10 20:15:07

+0

只需確認RFIDread的完整文件名是RFIDread.py? – 2011-06-10 22:00:45

+0

Hello again。其實這個文件的名稱是RFIDread.msg。我可以在ros_M5e.py文件中更改名稱? – Khiya 2011-06-13 17:36:29

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的

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

(命令行Python提示符是WIL升讓你一次執行Python命令一個),以確保一切正常(與任何設備的RFID閱讀器連接的)替換/ dev/ttyUSB0:

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通我回來,我可以調整ros_M5e.py採取一個可選的「portStr」 - 雖然我建議在做你自己,讓你可以合理地命名您的天線。另外,我強烈建議您設置udev規則,以確保RFID閱讀器總是被分配到同一個設備: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導入RFIDread」。後者是正確的。只要你正確定義了你的ROS_PACKAGE_PATH,並且你已經在包上運行了rosmake,那麼import語句應該可以正常工作。另外,我不會推薦將與ROS相關的問題發佈到StackOverflow。這裏很少有人會熟悉ROS生態系統(這非常複雜)。請在此處發帖提問:

http://answers.ros.org/ 
http://code.google.com/p/gt-ros-pkg/issues/list