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我都会收到此错误:

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文件放在与其调用的文件相同的目录中并更改文件路径但无济于事。

非常感谢,

奇亚

4

2 回答 2

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/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 中枚举。

如果您还有其他问题,请告诉我。

~Travis Deyle ( Hizook.com )

PS——你是否将 ros_M5e.py 修改为“from hrl.hrl_rfid.msg import RFIDread”?在 repo 中,它是“从 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
于 2011-06-13T18:29:47.123 回答
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 文档以获取更多信息。

于 2011-06-10T18:59:27.623 回答