2016-11-01 11 views
0

Я работаю с проектом, связанным с ROS Kinetic. Я написал свои узлы, используя Python3, и попытался передать некоторую информацию с помощью ros-сервиса с одного узла на другой. Эта информация представляет собой огромный объект, который не может быть легко отформатирован для обычных типов ROS, поэтому я использовал pickle.dumps(object, 0).decode() и отправлял его как строку. На стороне сервера я не мог использовать pickle и встретил исключение: No module named search. код на стороне сервера:using python3 libs in ros kinetic

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

Я попытался сделать это, не вызывая рассол и проблема была решена, так что я думаю, что я не могу назвать рассол от сервера каким-то образом

ответ

0

Довольно поздно к партии, но «Нет модуля с именем search» звучит так, как ваша строка pickle содержит пользовательский класс «поиск», который недоступен на принимающей стороне. Правильно ли это?

Чтобы проверить, что вы можете попробовать передать какое-то простое родное значение Python, например (123, «abc»), используя pickle в ROS (что должно работать). Другой вариант - написать две отдельные программы: одну, которая записывает рассол на диск, и другую, которая читает рассол из этого файла. Затем вы можете поэкспериментировать с загрузкой и, например, решить, какие модули вам нужно импортировать.