Программирование робототехники с Arduino и ROS

    Роботическая операционная система 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
    


    image

    Также можно контролировать серво подписавшись на тему 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!
    • +10
    • 17,3k
    • 2
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 2
    • +1
      Несколько лет назад я пытался использовать rosserial, но очень уж тогда не стабильно работала нода связи.
      Сейчас жду ROS2, с их переходом на DDS. Уже есть примеры запуска ноды прямо на STM32F407. Но я сомневаюсь, что получится впихнуть в атмегу.
      • 0
        Спасибо, что поделились опытом!

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.