Соглашения о расположении файлов Python и ошибки импорта - PullRequest
0 голосов
/ 10 июня 2011

Я новичок в 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, я получаю эту ошибку:

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

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Конечно, я могу помочь вам запустить его.

Из публикации 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 / robot / RFIDreader".Если вы уже не изменили правила udev, это не будет иметь место на вашей машине.Я предлагаю выполнить код:

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

, используя iPython (приглашение Python для командной строки, которое позволит вам выполнять команды python по одной), чтобы убедиться, что все работает (замените / dev / ttyUSB0 нак какому устройству подключен ваш RFID-ридер):

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()

ОК, все работает сейчас.Вы можете сделать свой собственный узел, настроенный на ваши настройки:

#!/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()

Или, отправьте мне ответный сигнал, и я могу настроить 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.

Сообщите мне, если у вас возникнут какие-либо дальнейшие проблемы.

~ Трэвис Дейл ( Hizook.com )

PS - Вы изменили ros_M5e.py на «из hrl.hrl_rfid.msg import RFIDread»?В репо это «из 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
0 голосов
/ 10 июня 2011

Вы должны убедиться, что верно следующее:

  • 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 __init__.py

Как автор пояснил в комментариях, что RFIDRead не имеет расширения .py, вот как это можно импортировать.

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

Ознакомьтесь с imp документация для получения дополнительной информации.

...