Роботическая операционная система ROS является довольно мощной платформой для создания роботических систем, которая включает все необходимое для разработки своих проектов от простейших программных компонентов, называемых “узлами”, и протокола обмена данными до среды симулирования реальной роботической платформы Gazebo. В основном ROS используется в связке с такими микроконтролерами, как RaspberryPi и Blackbone, которые обладают большими вычислительными возможностями и собственной операционной системой.
Arduino является популярной платой для прототипирования, получившее широкое распространение в связи с возникшим не так давно понятием “умный дом” и которая явлется идеальной стартовой точкой для новичков в области микроэлектроники и робототехники.
В данный момент существует не так много информации об использовании роботической операционной системы ROS в связке с микроконтроллером Arduino. В основном это зарубежные интернет ресурсы и книги.
В данной статье я хочу рассказать как «подружить» ROS и Arduino и что мне удалось добиться в этой связке.
Для использования ROS с платой Arduino существует официальная библиотека в ROS — rosserial_arduino.
Установка rosserial_arduino
Установка библиотеки так же проста как установка любых других пакетов ROS:
sudo apt-get install ros-<distribution_name>-rosserial-arduino
sudo apt-get install ros-<distribution_name>-rosserial
После этого нужно установить пакет rosserial_arduino из бинарных файлов. Установка немного отличается для ROS версий начиная с groovy, где для сборки пакетов была создана собственная утилита catkin. Для версий ранее groovy нужно выполнить следующие команды:
hg clone https://kforge.ros.org/rosserial/hg rosserial
rosmake rosserial_arduino
Для версий ROS, использующих catkin (groovy и более поздние) процедура установки будет следующей:
cd <ws>/src
git clone https://github.com/ros-drivers/rosserial.git
cd <ws>
catkin_make
catkin_make install
source <ws>/install/setup.bash
Здесь ws обозначает название папки catkin workspace, обычно catkin_ws.
Добавление rosserial_arduino в Arduino IDE
Теперь осталось только скопировать библиотеку ros_lib в среду Arduino чтобы позволить программам Arduino взаимодействовать с ROS. Библиотека ros_lib была сгенерирована на предыдущих шагах установки.
Библиотека будет скопирована в папку , которая является папкой по умолчанию для хранения скетчей Arduino, обычно sketchbook.
Установка ros_lib отличается для версий ROS, использующих catkin (начиная с версии groovy) и rosbuild (fuerte и более ранние).
Для версий с catkin установка будет следующей:
cd <sketchbook>/libraries
rm -rf ros_lib
rosrun rosserial_arduino make_libraries.py .
А для версий fuerte и более ранних будет так:
roscd rosserial_arduino/src
cp -r ros_lib <sketchbook>/libraries/ros_lib
Запуск примеров для rosserial_ros
Теперь можно открыть примеры для rosserial_arduino в Arduino IDE. Для этого запустите Arduino IDE, выберите File > Examples > ros_lib. Выберите для начала пример HelloWorld.
Скетч из примеров можно сразу загрузить на плату. Загрузка ничем не отличается от загрузки любого другого скетча Arduino.
Осталось лишь запустить ROS мастер и клиентское приложение rosserial, которое будет перенаправлять все сообщение Arduino другим компонентам ROS:
roscore
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
Параметр _port определяет последовательный порт, по которому доступна плата Arduino, у меня это например, /dev/ttyACM0.
Единственное действие, которое выполняет скетч HelloWorld это публикация сообщений в тему chatter. Вы можете увидеть публикуемые сообщения с помощью команды rostopic:
rostopic echo chatter
Решение проблем запуска
Если при запуске клиентского приложения rosserial появилась ошибка: «Unable to sync with device; possible link problem or link software version mismatch such as hydro rosserial_python with groovy Arduino», то нужно добавить строку
#define USE_USBCON
перед включением библиотек ros в скетче.
Возможности rosserial_arduino
rosserial_arduino позволяет публиковать сообщения в темы и подписываться на сообщения из конкретных тем. Также он позволяет использовать ros::Time и TF и публиковать данные tf трансформации.
Например, при экспериментах мне удалось создать скетч для получения данных с ультразвукового сенсора расстояния HC-SR07 и публикации в тему range.
Среди интересных особенностей ROS, которую можно использовать в rosserial_arduino это визуализация численных данных (например, с сенсора) с rqt_plot. Например, визуализовать данные с сенсора HC-RS07 в виде графика можно так:
rqt_plot range
Также можно контролировать серво подписавшись на тему servo и публиковать значения для угла поворота серво командой:
rostopic pub servo std_msgs/UInt16 <angle>
Что дальше?
rosserial_arduino предлагает серию примеров по использованию библиотеки с различными сенсорами, LED, серво и кнопками. Все примеры использования можно найти на официальной странице ROS: wiki.ros.org/rosserial_arduino/Tutorials.
На мой взгляд, rosserial_arduino может иметь множество сценариев использования для мобильных роботов. Например, для колесного робота, оснащенного ультразвуковым сенсором типа SRF08 Ultrasonic Ranger rosserial_arduino можно использовать следующим образом: узел rosserial_arduino может включать Publisher, который через определенный интервал времени посылает данные с сонара, и Subscriber, который подписывается на ту же тему и передает данные методу, который контролирует движение робота. Пакет rosserial_arduino дает полную свободу разработчику: все зависит только от вашей фантазии.
Удачи в экспериментах с ROS и Arduino!
Автор: vovaekb90