我正在与ROS Kinetic连接的项目工作。我使用Python3编写节点,并尝试使用ros-service将一些信息从一个节点传输到另一个节点。这个信息代表了一个巨大的对象,它不能简单地格式化为普通的ROS类型,所以我使用pickle.dumps(object, 0).decode()并像string.In一样发送它在服务器端,我不能使用pickle,并且遇到了一个异常:No module named search。服务端代码如下:
#!/usr/bin/env python3
from visualization.srv import *
import rospy
import pickle
megafoo = []
def handle_nodes(req):
global megafoo
print(type(req.nodes))
megafoo.extend(pickle.loads(req.nodes.encode()))
print(len(megafoo))
a=1
print("A request type: {0}".format(type(req)))
return ListNodesResponse(a)
def nodes_creater_server():
rospy.init_node('nodes_server')
s = rospy.Service('draw_some_nodes', ListNodes, handle_nodes)
print('ready to draw nodes')
rospy.spin()
if __name__ == "__main__":
nodes_creater_server()我试着在不调用pickle的情况下做这件事,但问题已经解决了,所以我想我不能从服务器调用pickle
发布于 2017-09-07 16:02:47
很晚才开始,但是“没有名为search的模块”听起来像是您的pickle字符串包含一个自定义类"search“,该类在接收端不可用。这是正确的吗?
为了验证,您可以尝试在ROS中使用pickle传输一些简单的原生Python值,如(123,"abc") (这应该是可行的)。另一种选择是编写两个独立的程序,一个将pickle写入磁盘,另一个从该文件中读取pickle。然后你可以尝试加载,例如决定你需要导入哪些模块。
https://stackoverflow.com/questions/40362802
复制相似问题