Глава 29. Arduino и ROS
383
Узлы могут также предоставлять или использовать службы (Service). Службы по-
зволяют узлам послать запрос и получить ответ.
Файлы служб
srv
— такие же простые текстовые файлы, как и файлы
msg
, но они
состоят из двух частей: запроса и ответа. Эти две части, разделяются линией:
- - -
.
Пример файла
srv
:
int64 A
int64 B
---
int64 Sum
В этом примере,
A
и
В
— это запрос, а
Sum
— это ответ.
Файлы
srv
хранятся в подкаталоге
srv
каталога пакета.
29.5. Пакет rosserial
Библиотека
rosserial
устанавливает соединение точка-точка (point-to-point
connection) через последовательный порт с недорогими контроллерами (типа
Arduino) так, что вы можете посылать сообщения ROS туда и обратно.
Библиотека
rosserial
состоит из общего P2P-протокола, библиотеки для работы
с Arduino и узлов для ПК.
Библиотека для работы с Arduino находится в папке проекта
serial
, в каталоге
serial_arduino/libraries
. Копируем папку
ros_lib
в библиотечный каталог
libraries
Arduino
IDE (рис. 29.1). Библиотека
ros_lib
размещена также в папке
libraries
сопровож-
дающего книгу электронного архива.
Рис. 29.1. Подключение библиотеки
ros_lib
384
Часть III. Практическое применение Arduino
29.6. Подготовка сообщения (publisher)
на Arduino
Создадим скетч на Arduino, демонстрирующий создание узла ROS, публикующего
сообщения в тему. Соединяем Arduino с компьютером, на котором запущена ROS
по последовательному порту (в рассматриваемом случае это порт
/dev/ttyUSB0
).
К контроллеру подключен датчик температуры DS18B20. Будем отправлять в ROS
значения температуры с датчика, используя библиотеки
OneWire.h
и
ros_lib
.
Работу с датчиком температуры, работающим по протоколу 1-Wire, мы подробно
рассмотрели в предыдущих главах (см. например,
главы 11 и 12), поэтому здесь
остановимся на работе библиотеки
ros_lib
.
В каждую программу ROS Arduino необходимо включить заголовочный файл
ros.h
и файлы заголовков для всех типов сообщений, которые мы будем использовать, —
в нашем случае это
std_msgs/Float32.h
:
#include
#include
Далее нам необходимо создать экземпляр объекта узла
serial_node
, что позволит
нашей программе выступать в качестве подписчика (subscriber), либо публиковать
сообщения (publisher):
ros::NodeHandle nh;
Создаем экземпляр
publisher
для нашего узла
serial_node
, публикующий сообще-
ния типа
std_msgs::Float32
в тему
temperature
:
std_msgs::Float32 float32_msg;
ros::Publisher chatter("temperature", &float32_msg);
В подпрограмме
setup()
необходимо инициализировать узел и объявить о роли
узла
chatter
в качестве
publisher
:
nh.initNode();
nh.advertise(chatter);
В цикле
loop()
после считывания данных с датчика температуры публикуем сооб-
щение в тему и вызываем
ros::spinOnce()
, где обрабатываются все функции обрат-
ного вызова соединения.
chatter.publish( &float32_msg );
nh.spinOnce();
Код данного скетча представлен в листинге 29.1.
Листинг 29.1
#include
OneWire ds(10); // линия 1-Wire будет на pin 10
#include
#include
Do'stlaringiz bilan baham: |