Глава 29. Arduino и ROS
387
Утилита
rostopic
позволяет получить информацию о темах ROS. Команда
rostopic
echo
показывает данные, опубликованные в теме. Набираем в терминале:
$ rostopic echo /temperature
и видим постоянно поступающие с Arduino данные датчика температуры (рис. 22.3).
Рис. 22.3. Публикация сообщений из Arduino в тему temperature
Данный скетч находится в папке
examples/_29_01
сопровождающего книгу элек-
тронного архива.
29.7. Создание подписки (subscriber)
на Arduino
Теперь рассмотрим пример использования Arduino в качестве узла subscriber для
приема сообщений. В этом примере мы будем включать/выключать светодиод,
подключенный к выводу 13 Arduino, получая сообщения из ROS.
Включаем заголовочный файл
ros.h
и файлы заголовков для всех типов сообщений,
которые мы будем использовать, — в нашем случае это
std_msgs/Empty.h
(для пус-
тых сообщений):
#include
#include
Далее необходимо создать экземпляр объекта узла
serial_node
, что позволит нашей
программе выступать в качестве подписчика (subscriber), либо публиковать сооб-
щения (publisher):
ros::NodeHandle nh;
Создаем экземпляр
subscriber
для нашего узла, публикующий пустые сообщения
типа
std_msgs::Float32
в тему
toggle_led
:
ros::Subscriber sub("toggle_led", &messageCb );
388
Часть III. Практическое применение Arduino
Создаем для нашего узла функцию обратного вызова
messageCb
. Эта функция
должна постоянно получать сообщение в качестве аргумента. Для нашей функции
обратного вызова
messageCb
назначим тип сообщения
std_msgs::Empty
. По получе-
нии сообщения функция инвертирует значение сигнала на выводе 13 Arduino, при
этом включая/выключая светодиод.
void messageCb( const std_msgs::Empty& toggle_msg){
digitalWrite(13, HIGH-digitalRead(13)); // blink the led
}
В подпрограмме
setup()
необходимо инициализировать узел и объявить о роли уз-
ла в качестве подписчика на сообщения:
nh.initNode();
nh.subscribe(sub);
И наконец, в цикле
loop()
вызываем
ros::spinOnce()
, где обрабатываются все
функции обратного вызова соединения:
nh.spinOnce();
Код данного скетча представлен в листинге 29.2.
Листинг 29.2
#include
#include
ros::NodeHandle nh;
void messageCb( const std_msgs::Empty& toggle_msg){
digitalWrite(13, HIGH-digitalRead(13)); // blink the led
}
ros::Subscriber sub("toggle_led", &messageCb );
void setup()
{
pinMode(13, OUTPUT);
nh.initNode();
nh.subscribe(sub);
}
void loop()
{
nh.spinOnce();
delay(1);
}
Запускаем узел
serial_node.py
пакета
rosserial_python
, который соединяет нашу
Arduino с остальной частью ROS. Необходимо выставить используемый последова-
тельный порт (здесь использована другая плата Arduino, подключенная к порту
ttyACM0
):
rosrun rosserial_python serial_node.py /dev/ttyACM0
Do'stlaringiz bilan baham: |