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

results matching ""

    No results matching ""