Сегодня я начну изучение библиотеки rosserial, которая позволяет использовать Arduino в качестве узла ROS. Вместе с библиотекой идут многочисленные примеры, и, конечно же, первый из рассмотренных будет HelloWorld. Этот пример публикует используя Arduino тему ROS с фразой «hello world!».
В Arduino IDE открываем пример HelloWorld, найдя его в меню Файл → Примеры → ros_lib → HelloWorld. В открывшемся окошке перед нами предстает следующий код:
/* * rosserial Publisher Example * Prints "hello world!" */ #include <ros.h> #include <std_msgs/String.h> ros::NodeHandle nh; std_msgs::String str_msg; ros::Publisher chatter("chatter", &str_msg); char hello[13] = "hello world!"; void setup() { nh.initNode(); nh.advertise(chatter); } void loop() { str_msg.data = hello; chatter.publish( &str_msg ); nh.spinOnce(); delay(1000); }
Частью каждой Arduino-программы, работающей совместно с ROS является заголовочный файл ros.h, а также заголовочные файлы сообщений, которые мы будем использовать
#include <ros.h> #include <std_msgs/String.h>
Далее, нам необходимо создать экземпляр обработчика узла, который позволяет нашей программе создавать издателей (publishers) и подписчиков (subscribers). Обработчик узла также заботится о передачи данных по последовательному порту.
ros::NodeHandle nh;
Мы должны создать экземпляры издателей и подписчиков, которых мы будем использовать. Здесь мы создаем экземпляр Publisher с названием темы «chatter». Вторым параметром Publisher является ссылка на экземпляр сообщения, которое будет публиковаться.
std_msgs::String str_msg; ros::Publisher chatter("chatter", &str_msg);
В функции setup () нам необходимо инициализировать обработчик ROS для информирования о любых публикуемых темах, а также для подписки на темы.
void setup() { nh.initNode(); nh.advertise(chatter); }
Наконец, в функции loop () узел публикует «hello world!» и вызывает ros::spinOnce () в которой происходит обработка всех обратных вызовов для соединений.
void loop() { str_msg.data = hello; chatter.publish( &str_msg ); nh.spinOnce(); delay(1000); }
Загружаем скетч в Arduino.
После того, как скетч успешно загрузится, открываем окно Терминала Linux и запускаем в нем ROS, выполнив
$ roscore
Далее, в новом окне или вкладке Терминала запускаем клиентское приложение rosserial, которое будет перенаправлять сообщения Arduino в ROS. Убедитесь, что указываете правильный последовательный порт:
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
Наконец, наблюдаем приветственное сообщение Arduino, выполнив опять же в новом окошке Терминала:
$ rostopic echo chatter
Я записал небольшое видео, в котором показал все вышеописанные шаги по использованию Arduino в качестве издателя ROS.
[add_ratings]