UR robot arm speed control
I use ros melodic with ubuntu 18. I wrote this script to change robot speed but I got an error. How can I fix this error?
ERROR: service [/SetSpeedSliderFraction] responded with an error: service cannot process request: service handler returned None
the code:
#!/usr/bin/env python
from __future__ import print_function
from ur_msgs.srv import SetSpeedSliderFraction, SetSpeedSliderFractionRequest, SetSpeedSliderFractionResponse
import rospy
def handle_req(req):
print(SetSpeedSliderFractionRequest(req))
def set_robot_speed_server():
rospy.init_node('set_robot_speed')
s = rospy.Service('SetSpeedSliderFraction', SetSpeedSliderFraction, handle_req)
print("Ready to set robot speed..")
rospy.spin()
if __name__ == '__main__':
set_robot_speed_server()
EDIT and Solution:
The callback should be like this:
def handle_req(req):
if(SetSpeedSliderFractionResponse(req).success == req):
return True
else:
return False
Asked by yemre0642 on 2022-05-24 09:04:41 UTC
Answers
As gvdhoorn said, you're creating a service server. You want to create a client.
Have you seen this tutorial? I've linked to the part of the tutorial that focuses on the client side.
EDIT to respond to your comment:
Okay, so if I understand you correctly, the server set_speed_slider
isn't available, so you want to implement your own server that does exactly the same.
First, take a look at the tutorial that I've linked. In line 10 of the server you can see that it performs a task:
return AddTwoIntsResponse(req.a + req.b)
Which is a simple way of writing:
int answer = req.a + req.b
return AddTwoIntsResponse(answer)
Where the first line is the task that the server needs to do (adding two ints) and the second line is returning the answer.
Taking a look at the srv SetSpeedSliderFraction:
float64 speed_slider_fraction
---
bool success
The input is a float, to set the speed. The output is a bool, to let the client know if it successfully set the speed.
My question here is: Even if you get your custom server working in the sense that it doesn't give errors, how are you actually going to implement the task of setting the speed? How are you going to get the result that you want? I think that's going to take some hacky solution to get it working.
However, this feels like a question where you've got a problem, thought of a solution and now need help implementing that solution. Which is fine, nothing wrong with that, that's what we're here for.
Having said that, sometimes we're also here to point out that your original problem is: Why isn't the set_speed_slider
of ur_robot_driver_node
available and why can't I write a client to connect to it.
Please correct me if I'm wrong, but your problem seems: I want to be able to set the speed and I can't get the server that was implemented working.
Asked by Joe28965 on 2022-05-25 01:52:19 UTC
Comments
I tried running as a client but the existing ros service wasn't available so I decided to create a custom server. As far as I know, If I want to use rospy.wait_for_service the ros service should run. I can't see the ros service when I call rosservice list. Then the question how can start a ros service via script?
Asked by yemre0642 on 2022-05-25 03:58:04 UTC
I found the solution. In my callback, I need to return a boolean type because my response is bool.
Another issue, when I try to control robot arm speed with the real robot I can see the all ros services but I can't see them for simulation. If you want to use the existing ros service for simulation write a script and call it. If you will use a real robot, all services would be there and running.
Please correct me if I'm wrong, but your problem seems: I want to be able to set the speed and I can't get the server that was implemented working.
Thanks man I really appreciate your detailed answer but this is a journey and we learn every day huh :)
Asked by yemre0642 on 2022-05-26 04:49:03 UTC
Comments
What are you trying to do exactly?
rospy.Service(..)
creates a new service server.From your description however I get the impression you're trying to call an existing service.
Asked by gvdhoorn on 2022-05-24 12:10:08 UTC
I would like to create a custom service that uses the existing ros service that is ur_msgs/setSpeedSliderFraction. My aim is to reduce the robot speed by calling my custom service. According to this.
Asked by yemre0642 on 2022-05-24 15:45:44 UTC