использование python3 libs в ROS kinetic

Я работаю с проектом, связанным с «Росбалтом». Я написал свои узлы, используя Python3 и попытался передать некоторую информацию с ros-сервиса с одного узла на другой. Эта информация представляет собой огромный объект, который не может быть легко отформатирован в обычные типы 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 с сервера каким-то образом

1 ответ

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

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