Service. Пример клиента
На уроке ранее мы написали Сервер add_two_ints Давайте напишем клиент для него.
Рассмотрим код (service_client.py)
import rospy
import random
from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest
def add_two_ints_client(a, b):
rospy.wait_for_service('add_two_ints')
service_client = rospy.ServiceProxy('add_two_ints', AddTwoInts)
resp = service_client.call(AddTwoIntsRequest(a, b))
return resp.sum
a = random.randint(-100 , 100)
b = random.randint(-100 , 100)
sum = add_two_ints_client(a,b)
print("%s + %s = %s"%(a, b, sum))
Подключаем необходимые внешние библиотеки
import rospy
import random
from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest
Библиотека random нам понадобится, чтобы мы могли генерировать случайные числа для запросов. Также мы получили два класса с сообщениями AddTwoInts и AddTwoIntsRequest. Первый определяет тип используемого сообщения, второй помогает создавать правильный объект при формировании запроса на сервер.
Далее мы рассмотрим саму функцию выполнения запроса на сервер
def add_two_ints_client(a, b):
rospy.wait_for_service('add_two_ints')
service_client = rospy.ServiceProxy('add_two_ints', AddTwoInts)
resp = service_client.call(AddTwoIntsRequest(a, b))
return resp.sum
Первая строчка - это ожидание когда "появится" сервис. Данный код "заморозит" работу программы до тех пор, пока не будет доступен сервер (например, когда мы забыли запустить его сами). Это точно позволит обработать запрос, а не завершить программу ошибкой из-за вызова несуществующего сервиса.
rospy.wait_for_service('add_two_ints')
Далее мы создаем объект самого клиента.
service_client = rospy.ServiceProxy('add_two_ints', AddTwoInts)
Параметрами мы указывавшем имя сервиса и тип сообщений.
Непосредственно вызов сервиса.
resp = service_client.call(AddTwoIntsRequest(a, b))
При вызове мы создаем правильный для нас тип запроса AddTwoIntsRequest
И после выполнения запроса мы вернем результат
return resp.sum
Остальной код генерирует два числа и вызывает нашу функцию сложения, которая потом вызывает уже сам сервис.
a = random.randint(-100 , 100)
b = random.randint(-100 , 100)
sum = add_two_ints_client(a,b)
print("%s + %s = %s"%(a, b, sum))
Запустим код
Прежде чем запустить клиента, нужно запустить сначала сам сервер, иначе клиент не сможет работать.
python3 service_server.py
После этого уже запустим клиент
python3 service_client.py
-59 + -37 = -96
Мы увидим результат работы клиента.
При этом в терминале сервера мы тоже увидим, что сервер обработал запрос
Returning [-59 + -37 = -96]
Дополнительные материалы
Основной пакет http://wiki.ros.org/Services
Примеров использования rospy http://wiki.ros.org/rospy/Overview/Services