Готовый перевод Обзор roscpp / Обзор roscpp: Сервисы
Сервисы 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);
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 документацию для более детальной информации.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/40174/150067
Переводчики: Allovaro
Настройки
Готово:
