我是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时,我都会得到这样的错误:
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
发布于 2011-06-14 02:29:47
当然,我可以帮助您启动和运行它。
从StackOverflow的帖子来看,您似乎是在将堆栈签出到/opt/ros/diamondback。这是不好的,因为它是一个系统路径。您需要安装到本地路径中。在存储库上使用"readonly“的原因是您没有更改代码的权限--它在您的本地计算机上仍然可以很好地工作。我在这里花了相当多的时间来展示如何使用这个包(至少是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()或者,对我执行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处枚举。
如果你还有什么问题,请告诉我。
~特拉维斯·德伊尔(Hizook.com)
PS --您是否将ros_M5e.py修改为“从hrl.hrl_rfid.msg导入RFIDread"?在存储库中,它是"from hrl_rfid.msg import RFIDread“。后者是正确的。只要您正确地定义了ROS_PACKAGE_PATH,并且已经在包上运行了rosmake,那么import语句就应该可以正常工作。此外,我不建议在StackOverflow上发布与ROS相关的问题。这里几乎没有人会熟悉ROS生态系统(这是非常复杂的)。请在此处发布问题:
http://answers.ros.org/
http://code.google.com/p/gt-ros-pkg/issues/list发布于 2011-06-11 02:59:28
您需要确保以下情况属实:
Directory /opt/ros/diamondback/stacks/在您的python中path./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 documentation。
https://stackoverflow.com/questions/6310828
复制相似问题