Обзор roscpp / Обзор roscpp: Сервисы

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

1. Определения сервисов, сообщения запросов и сообщения ответов.

Allovaro 05.05.13 в 07:23

0

Сервисы ROS определяются srv файлами, которые состоят из двух частей: сообщение запроса и сообщение ответа. Они идентичны сообщениям используемых в ROS topic, roscpp конвертирует srv файлы в C++ код и создает 3 необходимых нам класса вроде таких: определение сервиса, сообщения запросов, и сообщения ответов. Имена этих классов берутся непосредственно из названий файлов srv.

my_package/srv/Foo.srv →
my_package::Foo
my_package::Foo::Request
my_package::Foo::Response

Генерируемая структура
Генератор служб roscpp создает структуру подобную этой:

1 namespace my_package
2 {
3 struct Foo
4 {
5 class Request
6 {
7 ...
8 };
9
10 class Response
11 {
12 ...
13 };
14
15 Request request;
16 Response response;
17 };
18 }
Класс запроса обеспечивает входные параметры сервиса. Класс ответа возвращается клиенту с выхода сервиса.

Создание Запросов/Ответов сервиса.
Есть два способа для вызова сервиса: один из которых например принимает структуру показанную выше, а другой отдельно принимает объект запроса и объект ответа. Их написание очень простое. Посмотрим на примере структуры Foo.
1 my_package::Foo foo;
2 foo.request.<var> = <value>;
3 ...
4 <call>(foo);

Используем отдельные объекты:
1 my_package::Foo::Request req;
2 my_package::Foo::Response res;
3 req.<var> = <value>;
4 ...
5 <call>(req, res);

Allovaro 05.05.13 в 07:43

0

2. Вызов Сервисов

Существует два способа вызова Сервиса в roscpp, "handle" способ и "bare" способ.

"Bare"
Для удобства, ros::service namespace обеспечивает такой способ вызова, при котором нет необходимости создания NodHandle:
1 //помните что необходимо вызвать ros::init(...)
2 my_package::Foo foo;
3 ...
4 if (ros::service::call("my_service_name", foo))
5 {
6 ...
7 }
ros::service namespace также предоставляет некоторые удобные функции, такие как exist() и waitForService(). Смотри ros::service namespace API документацию для более подробной информации.

"Handle"
Работа Handle способа похожа на работу roscpp. Создается ros::ServiceClient который потом используется для вызова сервиса:
ros::ServiceClient client = nh.serviceClient<my_package::Foo>("my_service_name");
my_package::Foo foo;
...
if (client.call(foo))
{
...
}
ros::ServiceClient также предоставляет некоторые полезные функции, такие как exist() и waitFor Existence(). Смотрите ros::ServiceClient API документацию для более детальной информации.

Allovaro 05.05.13 в 07:57

0
Минутку...