首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ROS Indigo/Rospy: AttributeError:'function‘object没有属性'_request_class’

ROS Indigo/Rospy: AttributeError:'function‘object没有属性'_request_class’
EN

Stack Overflow用户
提问于 2015-12-15 17:33:19
回答 1查看 3.1K关注 0票数 0

我一直试图建立一个ROS服务来帮助在程序之间传输图像,但没有效果。不管使用与此程序的旧版本相同的过程(这完全有效),我在这里得到的都是同样令人沮丧的模糊错误信息:

代码语言:javascript
复制
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、重写代码以确保没有多余的空间--什么都没有。

服务请求如下:

代码语言:javascript
复制
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() 

此服务由以下代码(在单独的ro间谍脚本中)处理:

代码语言:javascript
复制
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() 

任何帮助都将不胜感激。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-15 17:59:15

我是个白痴。在发布这篇文章后不久,我找到了解决方案,整个上午我都在想办法解决这个问题。

我处理图像请求的函数与我试图调用的服务的名称相同。所以我想我搞混了罗间谍/蟒蛇。当我将函数更改为"sessionstart2“时,它起了作用。

但是..。我想现在已经解决了。哈哈。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34295752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档