2015-12-15 2 views
0

Я пытался установить службу ROS, чтобы помочь передавать изображения между программами безрезультатно. Независимо от того, с использованием процедур, идентичных старой версии этой программы - которая работает полностью - все это я получаю здесь такое же удручающе расплывчатым сообщение об ошибке:ROS Indigo/Rospy: AttributeError: объект 'function' не имеет атрибута '_request_class'

Traceback (most recent call last): 
File "/catkin_ws/src/package/scripts/rc.py", line 110, in <module> 
main_function() 
File "/catkin_ws/src/package/scripts/rc.py", line 105, in main_function 
incoming = sessionstart(f, t, x1i, y1i, x2i, y2i) 
File "/catkin_ws/src/package/scripts/rc.py", line 40, in sessionstart 
requestimage = rospy.ServiceProxy('StartSession', sessionstart) 
File "/opt/ros/indigo/lib/python2.7/dist-packages/rospy/impl/tcpros_service.py", line 404, in __init__ 
super(ServiceProxy, self).__init__(name, service_class) 
File "/opt/ros/indigo/lib/python2.7/dist-packages/rospy/service.py", line 59, in __init__ 
self.request_class = service_class._request_class 
AttributeError: 'function' object has no attribute '_request_class' 

Что означает эта ошибка ?? Как это исправить? Ничего, что я пробовал, работает, включая изменение службы, повторение catkin_make, переписывание кода, чтобы убедиться, что нет посторонних пробелов - ничего.

Запрос услуги следующим образом:

global sid, f, x1i, y1i, x2i, y2i 
rospy.init_node('name', log_level = rospy.INFO, anonymous = True) 
bridge = CvBridge() 
refPt = [] 
sid = 0; t = 0; x1i = 0; y1i = 0; x2i = 0; y2i = 0 

def sessionstart(t, x1i, y1i, x2i, y2i): 
    rospy.wait_for_service('StartSession') 
    print '------------------------ service found' 
    try: 
     requestimage = rospy.ServiceProxy('StartSession', sessionstart) 
     print "------------------------ service proxy set" 
     response = requestimage(t, x1i, y1i, x2i, y2i) 
     print "------------------------ service accessed" 
     return response 
    except rospy.ServiceException, e: 
     print "Service call failed: %s"%e 

def imagecallback(data): 
    global sid, f, x1i, y1i, x2i, y2i 
    b, t, sid = data.split() 
    print '------------------------ imagecallback started' 
    t = float(t); sid = int(sid) 
    timestr = time.strftime("%H:%M:%S", time.getgmtime(t)) 
    print "Loaded image from %s."%timestr 
    imagedata = bridge.imgmsg_to_cv2(b, "bgr8") 
    npimg = cv2.imencode('.jpg', imagedata) 
    cv2.imwrite('tempimage.jpg', imagedata) 
    img = cv2.imread('tempimage.jpg') 
    clone = img.copy() 
    cv2.namedWindow('image', cv2.WINDOW_NORMAL) 
    cv2.imshow("image", img) 
    cv2.waitKey(1) 

def main_function(): 
    global sid, f, x1i, y1i, x2i, y2i 
    f = 0 
    t = time.time() 
    print '------------------------ time set, frame set' 
    sid = 0; x1i = 0; y1i = 0; x2i = 0; y2i = 0 
    print "sid %s, x1i %s, y1i %s, x2i %s, y2i %s"%(sid, x1i, y1i, x2i, y2i) 
    print '------------------------ everything else set' 
    incoming = sessionstart(t, x1i, y1i, x2i, y2i) 
    print "------------------------ service assigned" 
    imagecallback(incoming) 
    print "------------------------ service called" 

if __name__ == '__main__': 
    main_function() 

Данная услуга осуществляется следующим кодом (в отдельном rospy сценария):

def handle_sessionstart(req): 
    global assignsid 
    sid = assignsid 
    print "Assigning SID %s to this client."%sid 
    assignsid = assignsid + 1 
    t = req.t 
    x1i = req.x1i 
    y1i = req.y1i 
    x2i = req.x2i 
    y2i = req.y2i 
    requestinfo = "%s %s %s %s %s %s"%(sid, t, x1i, y1i, x2i, y2i) 
    print "Requesting: " + requestinfo 
    client.publish('/imagerequest', requestinfo, 0) 
    rosimg = imgq.get() 
    imgq.join() 
    return sessionstartResponse(sid, rosimg, t, error) 

def handle_sessionend(req): 
    sid = req.sid 
    requestinfo = "%s"%(sid) 
    client.publish('/endsession', requestinfo, 0) 
    closed = endq.get() 
    return sessionendResponse(closed) 

def handle_imgreq(req): 
    # global x1v, y1v, x2v, y2v 
    sid = req.sid; df = req.f; t = req.t # session id, frame increment, abs time 
    xli = req.xli; y1i = req.yli; x2i = req.x2i; y2i = req.y2i 
    requestinfo = "%s %s %s %s %s %s %s"%(sid, f, t, x1i, y1i, x2i, y2i) 
    client.publish('/imagerequest', requestinfo, 0) 
    rosimg = imgq.get() 
    return imgreqResponse(rosimg, t, error) 

def RDtoLDDServiceHandler(): 
    s = rospy.Service('StartSession', sessionstart, handle_sessionstart) 
    print "Services ready..." 
    rospy.spin() 

if __name__ == '__main__': 
    imgq = Queue.Queue(maxsize=1) 
    endq = Queue.Queue(maxsize = 1) 
    imgpub = rospy.Publisher('/ros_image', Image, queue_size = 10) 
    datapub = rospy.Publisher('/ros_data', String, queue_size = 10) 
    client = mqtt.Client() 
    rospy.init_node('RD') 
    client.connect('192.168.1.7', 1883, 60) 
    RDtoLDDServiceHandler() 

Любая помощь будет принята с благодарностью. Благодаря!

ответ

1

Ну, я идиот. Я нашел решение, пытаясь понять его все утро, вскоре после публикации этого.

Моя функция обработки запроса изображения имеет то же имя, что и служба, которую я пытался вызвать. Поэтому, я думаю, я смутил rospy/python. Во-вторых, я сменил функцию на «sessionstart2», она сработала.

Но ... Думаю, теперь это решительно. га.

+0

У меня была аналогичная ошибка, проходящая через объект MyServiceReponse во время создания службы, а не только на MyService – otognan

Смежные вопросы