2016-11-01 2 views
0

저는 ROS Kinetic와 연결된 프로젝트에서 작업하고 있습니다. 파이썬 3을 사용하여 노드를 작성하고 ros-service를 사용하여 노드간에 정보를 전송하려고했습니다. 이 정보는 일반 ROS 유형으로 쉽게 포맷 할 수없는 거대한 객체를 나타냅니다. 따라서 pickle.dumps(object, 0).decode()을 사용하여 string처럼 보냅니다. 서버 측에서는 피클을 사용할 수 없어서 예외적으로 만났습니다. No module named search. 서버 측의 코드 :rothon kinetic에서 python3 라이브러리 사용

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

아주 늦게 파티에 서버에서 피클을 호출 할 수 있다고 생각합니다 그래서 해결 된 피클과 문제를 호출하지 않고이 만들려고 "No module named search"라는 소리는 pickle 문자열에 수신 측에서 사용할 수없는 맞춤 검색 클래스 "search"가 포함 된 것 같습니다. 이게 맞을까요?

ROS에서 pickle을 사용하여 (123, "abc")와 같은 간단한 원시 Python 값을 전송하려고 시도하는지 확인할 수 있습니다. 또 다른 옵션은 두 개의 개별 프로그램을 작성하는 것입니다. 하나는 디스크에 피클을 쓰고 다른 하나는 파일에서 피클을 읽는 프로그램입니다. 그런 다음 로딩을 실험 할 수 있습니다. 예를 들어 가져올 모듈을 결정할 수 있습니다.