我正在使用与ROS Kinetic相关的项目。我使用Python3编写了我的节点,并尝试将ros-service的一些信息从1个节点传输到另一个节点。这些信息代表了一个巨大的对象,无法轻松格式化为普通的ROS类型,因此我使用pickle.dumps(object, 0).decode()
并将其发送为字符串。在服务器端,我无法使用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
答案 0 :(得分:0)
聚会很晚,但"没有名为search"听起来你的泡菜字符串包含一个自定义类"搜索"接收方无法提供。这是正确的吗?
要验证您可以尝试使用ROS中的pickle(这应该有效)来传输一些简单的本机Python值,如(123," abc")。 另一种选择是编写两个独立的程序,一个将pickle写入磁盘,另一个从该文件读取pickle。然后你可以尝试加载,例如决定你需要导入哪些模块。