Моделирование дифференциального привода робота, управляемого операционной системой ROS

GazeboВ предыдущей статье мы рассмотрели, как создать модель Chefbot. Эта статья будет посвящена визуализации работы робота с помощью тренажера Gazebo в ROS. Нами будет создана имитационная модель Chefbot. Кроме того, в Gazebo будет создана гостиничная среда, где и будет протестировано приложение, запрограммированное на автоматическую доставку еды клиенту. Также мы предоставим подробное объяснение каждого выполняемого шага. Список тем, рассматриваемых в этой статье, приведен ниже:

Серия статей на тему: «Создание с нуля автономного мобильного обслуживающего робота с использованием Python»

  1. Начало работы с операционной системой для робота (ROS)
  2. Основные понятия роботов с дифференциальным приводом
  3. Моделирование робота с дифференциальным приводом
  4. Моделирование дифференциального привода робота, управляемого операционной системой ROS
  5. Проектирование оборудования и схем ChefBot
  6. Согласование приводов и датчиков с контроллером робота
  7. Согласование датчиков зрения с ROS
  8. Создание аппаратного обеспечения ChefBot и интеграция ПО программного обеспечения
  9. Разработка графического интерфейса для робота с использованием Qt и Python
  • начало работы с симулятором Gazebo;
  • работа с симулятором TurtleBot 2;
  • создание симуляции Chefbot;
  • URDF-теги и плагины для моделирования;
  • начало работы с одновременным определением местоположения и составлением карты местности;
  • реализация SLAM в среде Gazebo;
  • создание карты с помощью SLAM;
  • начало работы с адаптивной локализацией Monte Carlo;
  • реализация AMCL в среде Gazebo;
  • Gazebo: автономная навигация Chefbot в отеле.

Технические условия

Для тестирования приложения и кодов понадобится операционная система Ubuntu 16.04 LTS PC/laptop с установленным Ros Kinetic.

Начало работы с симулятором Gazebo

В первой статье «Начало работы с операционной системой для робота (ROS)» мы ознакомились с основными понятиями симулятора Gazebo и процедурой его установки. В этой статье будет показано, как с помощью симулятора Gazebo сымитировать работу робота с дифференциальным приводом. Сначала мы рассмотрим графический интерфейс пользователя и элементы управления этой программы. Как было сказано ранее, Gazebo состоит из двух разделов: Gazebo-сервер и Gazebo-клиент. Моделирование выполняется на сервере Gazebo, который действует как программно-аппаратная часть сервиса (back-end). Графический интерфейс пользователя является клиентской стороной пользовательского интерфейса к программно-аппаратной части сервиса (front-end) и действует как клиент Gazebo. Мы также рассмотрим Rviz (ROS Visualizer) – инструмент графического интерфейса ROS. ROS Visualizer используется для визуализации различных видов роботов и данных, получаемых от датчиков физического робота или его виртуальной модели, например таких, как Gazebo.

Мы можем использовать Gazebo как имитатор для моделирования робота или использовать интерфейсы ROS и Python для программирования роботов в имитаторе Gazebo.

Если Gazebo будет использоваться в качестве независимого имитатора, то по умолчанию имитация робота будет нужна для написания плагинов на основе С++ (http://gazebosim.org/tutorials/?tut=plugins_hello_world). Мы можем написать плагины на С++. Они будут моделировать поведение робота, создавать новые датчики, новые миры и т. д. По умолчанию моделирование роботов в среде Gazebo осуществляется с помощью SDF-файла (SDF – это формат XML, описывающий объекты и среды для моделирования роботов, визуализации и управления: http://sdformat.org/). Если мы используем интерфейс ROS в Gazebo, нам следует создать URDF-файл, содержащий все параметры робота, и теги Gazebo, содержащие свойства модели. В начале моделирования с использованием URDF-файла преобразуем его в файл SDF и с помощью некоторых инструментов отобразим робота в Gazebo. Интерфейс ROS Gazebo называется gazebo-rospkgs. Это набор оболочек и плагинов, позволяющих сымитировать датчик, контроллер робота и выполнить другое моделирование и взаимодействие Gazebo с ROS. В основном в данной статье мы сфокусируемся на взаимодействии ROSGazebo, позволяющем смоделировать Chefbot. Преимущество взаимодействия ROS-Gazebo заключается в том, что мы можем запрограммировать робота, используя фреймворк ROS и такие популярные языки программирования, как C++ и Python.

Если для программирования робота вы вместо ROS желаете использовать Python, следует воспользоваться интерфейсом pygazebo (https://github.com/jpieper/pygazebo). Это фреймворк, связывающий Python и Gazebo. В следующей части статьи мы познакомимся с графическим интерфейсом Gazebo и некоторыми из важных элементов управления.

Графический интерфейс пользователя Gazebo

Запустить Gazebo можно несколькими способами. Мы это уже делали в первой статье «Начало работы с операционной системой для робота (ROS)«. Сейчас для запуска Gazebo и создания необитаемого мира, в котором отсутствует как робот, так и окружающая среда, мы используем следующую команду:

$ roslaunch gazebo_ros empty_world.launch

Данная команда запустит сервер и клиент Gazebo и загрузит в него необитаемый мир. Ниже показан интерфейс Gazebo с загруженным необитаемым миром:

Пользовательский интерфейс Gazebo
Пользовательский интерфейс Gazebo

Пользовательский интерфейс Gazebo можно разделить на три части: сцену, левую и правую панели.

Сцена

Сцена – это место, где происходит моделирование объекта. Сюда можно добавить различные объекты и взаимодействовать с роботом с помощью мыши и клавиатуры.

Левая панель

Левая панель появляется при каждом запуске Gazebo. Она состоит из трех основных вкладок:

мир. Данная вкладка содержит список моделей активной сцены Gazebo. Здесь можно доработать параметры модели и изменить положение камеры;

вставка. Эта вкладка позволяет добавить на сцену новую модель. Модели можно загрузить как из локальной системы, так и с удаленного сервера.

На компьютере (в локальной системе) файлы модели находятся в папке /home/<user_name>/.gazebo/mode. Адрес удаленного сервера – http://gazebosim.org/models (адрес показан на вкладке Insert (Вставка) левой панели):

Вкладка Insert левой панели
Вкладка Insert левой панели

На приведенном рисунке в верхней части вкладки Insert показаны файлы, расположенные на данном компьютере. Ниже вы увидите названия моделей, хранящихся на удаленном сервере.

После первого запуска Gazebo или при создании мира, содержащего модель с удаленного сервера, вместо сцены некоторое время будет черный экран или предупреждение в терминале. Причина – низкая скорость загрузки модели с удаленного сервера, поэтому Gazebo ждет некоторое время. Время ожидания может варьироваться в зависимости от скорости вашего интернет-соединения. Сразу после загрузки модель будет сохранена в локальной папке Модели. В следующий раз при загрузке не будет никакой задержки;

  • слои. В основном эта вкладка не используется и предназначена для организации слоев при моделировании. Отключая или включая нужный слой, можно скрыть или показать отдельные части модели.

Информационная панель

По умолчанию информационная панель скрыта и появляется только по команде меню, например Window → Topic Visualization.

Информационная панель Gazebo
Информационная панель Gazebo

Панели инструментов Gazebo

Gazebo оснащена двумя панелями инструментов, которые установлены в верхней и нижней частях сцены.

Верхняя панель инструментов

На верхней панели инструментов находятся инструменты управления сценой, такие как выделение модели, изменение масштаба, поворот, добавление новой простой фигуры и т. д.

Верхняя панель инструментов
Верхняя панель инструментов

Ниже приведен полный список инструментов с их полным описанием:

  • Select Mode (Выделение) – данный инструмент позволяет выделять модель, находящуюся на сцене;
  • Translate Mode (Перемещение) – этот инструмент позволяет перемещать модель с помощью нажатия и удерживания левой кнопки мыши;
  • Rotate Mode (Вращение) – изменение ориентации модели;
  • Scale Mode (Масштаб) – изменение масштаба модели;
  • Undo/Redo (Отменить/Повторить) – позволяет отменить или повторить действие на сцене;
  • Simple Shapes (Простые фигуры) – с помощью этого инструмента мы можем вставлять примитивные фигуры на сцену (цилиндр, куб или сферу);
  • Lights (Освещение) – выбор различных источников и вариантов освещения сцены;
  • Copy/Paste (Скопировать/Вставить) – данные инструменты позволяют копировать и вставлять различные модели и целые части сцены;
  • Align (Выравнивание) – выравнивание моделей относительно друг друга;
  • Snap (Привязка) – привязка одной модели и перемещение ее внутри сцены;
  • Change view (Изменение вида) – изменяет вид сцены, в основном выбирается перспектива или ортогональный вид;
  • Screenshot (Снимок экрана) – снимок экрана текущей сцены;
  • Record Log (Запись журнала) – сохраняет логи (журнал) Gazebo.

Нижняя панель инструментов

Основная задача нижней панели инструментов – дать нам представление о визуализации. На этой панели отображается время, в течение которого происходит моделирование. Процесс моделирования можно ускорять и замедлять. Это зависит от вычислений, необходимых для текущего моделирования.

Отображение в реальном времени относится к фактическому времени, за которое объект совершает действие при моделировании.

Коэффициент реального времени (RTF) – это соотношение между временем моделирования и скоростью реального времени. Если RTF равно 1, это означает, что моделирование происходит со скоростью, тождественной скорости реального времени.

Состояние мира в Gazebo может меняться с каждым циклом. Каждый цикл может вызвать изменения в Gazebo за равные временные промежутки. Эти равные временные промежутки называются размером шага. Размер шага равен 1 мс. Размер шага и циклы отображаются на нижней панели инструментов:

Нижняя панель инструментов
Нижняя панель инструментов

Мы можем приостановить моделирование и с помощью кнопки Step (Шаг) рассмотреть каждый шаг в любой момент времени.

Прежде чем перейти к следующему разделу, можно попробовать поработать с Gazebo и подробнее узнать о том, как он устроен.

Работа с симулятором TurtleBot 2

После того как вы познакомились с Gazebo и самостоятельно опробовали его инструменты, пришло время запустить моделирование и поработать с моделью робота. Одним из популярных роботов, доступных для изучения, является TurtleBot. Программное обеспечение TurtleBot было разработано в рамках ROS. Оно содержит хорошую симуляцию, работающую в Gazebo. Популярными версиями TurtleBot являются TurtleBot 2 и 3. В этой части статьи познакомимся с TurtleBot 2, потому что конструкция Chefbot очень напоминает конструкцию этого робота.

Читать также:  Строковый массив C++: реализация и представление

Установить пакеты моделирования TurtleBot 2 в Ubuntu 16.04 просто. Для этого можно использовать следующую команду:

$ sudo apt-get install ros-kinetic-turtlebot-gazebo

После того как пакеты будут установлены, можно запустить симуляцию. Внутри пакетов turtlebot-gazebo находится несколько исполняемых файлов, содержащих разные файлы мира в Gazebo. Мир Gazebo представляет собой SDF-файл (*.world), состоящий из свойств моделей в среде. При изменении файла привязки в Gazebo загрузится другая среда.

Следующая команда запустит мир, который имеет определенный набор компонентов:

$ roslaunch turtlebot_gazebo turtlebot_world.launch

Загрузка модели займет некоторое время. По окончании загрузки на сцене Gazebo появится загруженная модель:

Моделирование в Gazebo робота Turtlebot
Моделирование в Gazebo робота Turtlebot

Возможно, после загрузки камера будет смотреть на модель сверху. Поэтому сцену со всеми находящимися на ней моделями следует развернуть и изменить масштаб.

Прежде чем развернуть сцену, познакомимся с базовыми операциями, выполняемыми с помощью мыши:

Основные операции, выполняемые в Gazebo мышью
Основные операции, выполняемые в Gazebo мышью

С помощью мыши вы можете выполнять следующие операции:

  • Drag = rotate – для вращения сцены нажмите колесико мыши и перемещайте мышь;
  • Drag = pan – для панорамирования (перемещения всей сцены) нажмите левую кнопку мыши и, удерживая ее, перемещайте мышь в направлении, в котором требуется сместить сцену;
  • Drag + Shift = rotate – для вращения сцены нажмите и удерживайте левую кнопку мыши и клавишу Shift. Удерживая нажатыми левую кнопку и клавишу Shift, перемещайте указатель мыши в нужном направлении;
  • Double-click = move to point – переместить в точку;
  • Drag up = zoom in – для увеличения масштаба нажмите правую кнопку мыши и, удерживая правую кнопку нажатой, переместите указатель мыши вверх;
  • Drag down = zoom out – для уменьшения масштаба нажмите правую кнопку мыши и, удерживая правую кнопку нажатой, переместите указатель мыши вниз;
  • Single-click opens context menu – для вызова контекстного меню щелкните на сцене правой кнопкой мыши;
  • Scroll = zoom in/out – изменение масштаба с помощью вращения колесика мыши.

Разверните сцену. Для этого нажмите колесико мыши и, не отпуская его, проведите примерно на 1/3 оборота по дуге в направлении против часовой стрелки. Изменяя масштаб и поворачивая сцену в нужном направлении, добейтесь того, чтобы робот был хорошо виден.

Сцена развернута
Сцена развернута

При загрузке модели робота в Gazebo будут загружены плагины, необходимые для взаимодействия с ROS. TurtleBot 2 состоит из таких компонентов, как:

  • мобильная платформа с дифференциальным приводом;
  • датчик глубины для создания карты;
  • выключатель бампера для обнаружения столкновения.

При загрузке модели будут загружены плагины ROS-Gazebo, позволяющие сымитировать управление мобильной платформой с дифференциальным приводом, плагины датчика глубины (Kinect или Astra) и плагины для переключателей бампера. Если после загрузки модели ввести в терминале команду $ rostopic list, то в терминале получим информацию о загруженных плагинах. Список этих плагинов показан на представленном ниже снимке экрана.

Темы ROS для моделирования TurtleBot 2
Темы ROS для моделирования TurtleBot 2

В этом списке показаны файлы плагинов дифференциального привода, датчика глубины и переключателей бампера. В дополнение показаны файлы плагинов ROS-Gazebo, содержащих в основном сведения о текущем состоянии робота и других моделей в симуляции.

Датчики Kinect/Astra раскладывают изображение на RGB составляющие и обеспечивают глубину изображения. Плагин дифференциального привода отправляет одометрические данные робота в тему /odom (nav_msgs/Odometry) и публикует трансформацию робота в темах /tf (tf2_msgs/TFMessage).

Мы можем визуализировать модель робота и данные датчика в Rviz. Для этих целей предусмотрен пакет TurtleBot. Для визуализации робота можно установить следующий пакет данных:

$ sudo apt-get install ros-kinetic-turtlebot-rviz-launchers

После установки этого пакета запустите визуализацию робота и данных датчиков. Для этого выполните следующие действия.

Не завершая работу Gazebo, запустите еще один терминал, введите команду Sudo su и пройдите авторизацию. Далее введите команду:

$ roslaunch turtlebot_rviz_launchers view_robot.launch

После отработки команды на экране появится окно программы визуализации Rviz, в котором вы увидите модель робота.

Визуализация TurtleBot 2 в RViz
Визуализация TurtleBot 2 в RViz

Теперь мы можем включить необходимые датчики.

Закройте окно RViz, Gazebo и один из терминалов.

В следующем разделе этой статьи вы узнаете, как дистанционно управлять перемещением этого робота.

Перемещение робота

Плагин дифференциального привода робота позволяет принимать сообщения Ros Twist (geometry_msgs/Twist), состоящие из текущих линейных и угловых скоростей робота. Дистанционное управление роботом осуществляется вручную, с помощью джойстика или клавиатуры и сообщений Ros Twist. Далее мы рассмотрим, как осуществляется дистанционное управление роботом Turtlebot 2 с помощью клавиатуры. Для этого нам необходимо установить пакет для управления роботом TurtleBot 2. Для установки пакета дистанционного управления TurtleBot запустите окно терминала (если ранее оно было закрыто), введите команду sudo su, свой пароль и воспользуйтесь следующей командой:

$ sudo apt-get install ros-kinetic-turtlebot-teleop

Теперь запустите моделирование робота ($ roslaunch turtlebot_gazebo turtlebot_world.launch) и разверните сцену так, чтобы робот стоял на горизонтальной плоскости и был хорошо виден. Далее запустите еще одно окно терминала и узел дистанционного управления:

$ roslaunch turtlebot_teleop keyboard_teleop.launch

Дистанционное управление TurtleBot 2
Дистанционное управление TurtleBot 2

После запуска узла дистанционного управления в терминале отобразятся комбинации клавиш для перемещения робота. С их помощью робот перемещается в Gazebo и Rviz.

Для движения робота вперед используется клавиша , (запятая); назад – клавиша I; для разворота на месте по часовой стрелке – клавиша L; для разворота на месте против часовой стрелки – клавиша J; для поворота вправо – клавиша M; влево – клавиша . (точка); назад вправо – клавиша U.

При нажатии клавиш на клавиатуре Gazebo посылает сообщение регулятору управления дифференциальным приводом, а регулятор, в свою очередь, дает команду на перемещение робота. Узел teleop отправляет тему с именем /cmd_vel_mux/input/teleop (geometry_msgs/Twist). Описанное взаимодействие показано на схеме:

Узел дистанционного управления TurtleBot
Узел дистанционного управления TurtleBot

Создание симуляции в Chefbot

В предыдущей части статьи мы смоделировали дистанционное управление роботом TurtleBot 2. В этой части рассмотрим, как с помощью Gazebo смоделировать созданный ранее робот ChefBot.

Сначала нужно скопировать пакет chefbot_gazebo в рабочее пространство catkin и выполнить команду catkin_make для сборки пакета. Убедитесь, что в рабочей области находятся 2 пакета: chefbot_description и chefbot_gazebo. Пакет chefbot_gazebo содержит файл запуска, связанный с моделированием и его параметрами, а chefbot_description содержит модель urdf-робота вместе с его параметрами моделирования и файлом запуска, который используется для просмотра робота в Rviz и Gazebo.

Приступим к созданию нашей модели и ознакомимся с порядком создания робота Chefbot в Gazebo, после чего более подробно изучим файл xacro и рассмотрим параметры моделирования.

$ roslaunch chefbot_description view_robot_gazebo.launch

На следующем рисунке показан снимок экрана Chefbot в Gazebo:

Chefbot в Gazebo
Chefbot в Gazebo

Посмотрим, как добавить модель робота URDF в Gazebo. Вы можете найти URDF-описание модели робота в chefbot_description/launch/view_robot_gazebo.launch.

Первый раздел кода вызывает файл upload_model.launch, назначение которого – создание параметра robot_description. Если все пройдет успешно, то в Gazebo будет создан незаполненный мир:

<launch>
<include file=»$(find chefbot_description)/launch/upload_model.launch» />
<include file=»$(find gazebo_ros)/launch/empty_world.launch»>
<arg name=»paused» value=»false»/>
<arg name=»use_sim_time» value=»true»/>
<arg name=»gui» value=»true»/>
<arg name=»recording» value=»false»/>
<arg name=»debug» value=»false»/>
</include>

Так как же модель робота в параметре robot_description отображается в Gazebo? Для этого предназначается следующий фрагмент кода:

<node name=»spawn_urdf» pkg=»gazebo_ros» type=»spawn_model» args=»-param robot_description -urdf -z 0.1 -model chefbot»/>

Узел под названием spawn_model, находящийся внутри пакета gazebo_ros, прочитает robot_description и создаст модель в Gazebo. Аргумент –z 0.1 указывает на высоту модели, размещенной в Gazebo. Значение высоты отображает, на каком расстоянии от земли будет создана модель. Например, если значение высоты будет 0.1, то модель зависнет на высоте 0.1. При включенном режиме гравитации она упадет на землю. Однако этот параметр можно изменить так, как нужно нам. Аргумент –model обозначает имя модели робота в Gazebo. Этот узел проведет анализ файла описания робота robot_description и начнет визуализацию робота в Gazebo.

После того как модель появится на экране, можно начать преобразование робота (tf), используя следующие строки программного кода:

<node pkg=»robot_state_publisher» type=»robot_state_publisher»
name=»robot_state_publisher»>
<param name=»publish_frequency» type=»double» value=»30.0″ />
</node>

Ros tf публикуется на частоте 30 Гц.

Преобразование глубины изображения с помощью лазерного сканера

Датчик глубины робота обеспечивает 3D-координаты окружающей его среды. Чтобы робот мог автономно передвигаться, необходимо создать трехмерную карту. Для этого и используются трехмерные координаты окружающей среды, получаемые от датчика глубины. Есть разные методы создания такой карты. Один из алгоритмов, используемых для этого робота, называется gmapping (http://wiki.ros.org/gmapping). Алгоритм gmapping для создания карты в основном использует лазерное сканирование, но в нашем случае мы получаем от датчика целое 3D-облако точек. Мы можем преобразовать трехмерные данные глубины, полученные с помощью лазерного сканирования, взяв срез данных глубины. Исполняемый файл nodelet (http://wiki.ros.org/nodelet) предназначен для получения данных глубины и их конвертации в данные лазерного сканирования:

Читать также:  Полиморфизм времени выполнения в C++

<node pkg=»nodelet» type=»nodelet» name=»laserscan_nodelet_manager»
args=»manager»/>
<node pkg=»nodelet» type=»nodelet» name=»depthimage_to_laserscan»
args=»load depthimage_to_laserscan/DepthImageToLaserScanNodelet
laserscan_nodelet_manager»>
<param name=»scan_height» value=»10″/>
<param name=»output_frame_id» value=»/camera_depth_frame»/>
<param name=»range_min» value=»0.45″/>
<remap from=»image» to=»/camera/depth/image_raw»/>
<remap from=»scan» to=»/scan»/>
</node>
</launch>

Nodelet – это особый тип узла ROS, которому присущи свойства транспортного средства нулевого копирования, т. е. для подписки на тему данному узлу не требуется пропускная способность сети. Благодаря этому свойству преобразование изображения глубины (sensor_msgs/Image) в лазерное сканирование (sensor_msgs/LaserScan) будет проходить быстрее и эффективнее. Одно из свойств nodelet заключается в том, что этот узел может быть динамически загружен как плагин. Этому узлу можно задавать различные свойства, такие как range_min, название темы изображения и темы вывода лазера.

Теги и плагины URDF для моделирования Gazebo

Ранее вы узнали, как создать визуализацию модели робота в Gazebo. Теперь более подробно рассмотрим все связанные с моделированием теги и плагины, включенные в URDF-модель.

Большая часть из тегов Gazebo находится в файле chefbot_description/gazebo/chefbot.gazebo.xacro. Кроме того, в моделировании используются некоторые теги chefbot_description/urdf/chefbot.xacro. В моделировании chefbot.xacro также очень большую роль играют теги <collision> и <inertial>. Тег <collision> определяет в URDF границу вокруг робота, которая в основном используется для обнаружения столкновения. Тег <inertial> описывает массу всех компонентов конструкции и момент инерции. Ниже приведен пример определения тега:

<inertial>:
<inertial>
<mass value=»0.564″ />
<origin xyz=»0 0 0″ />
<inertia ixx=»0.003881243″ ixy=»0.0″ ixz=»0.0″
iyy=»0.000498940″ iyz=»0.0″
izz=»0.003879257″ />
</inertial>

Эти параметры являются частью динамики робота, поэтому при моделировании данные величины будут оказывать влияние на модель. Кроме того, при моделировании все эти сообщения, соединения и свойства робота будут обновляться.

Далее ознакомимся с тегами, находящимися внутри файла gazebo/chefbot.gazebo.xacro. Важный тег Gazebo, используемый нами, называется <gazebo>. Он нужен для определения свойств моделирования элемента в роботе. Мы можем определить свойство, применимое ко всем сообщениям или одному конкретному сообщению. Ниже представлен фрагмент кода, находящегося внутри xacro-файла и определяющего коэффициент трения:

<gazebo reference=»chefbot_wheel_left_link»>
<mu1>1.0</mu1>
<mu2>1.0</mu2>
<kp>1000000.0</kp>
<kd>100.0</kd>
<minDepth>0.001</minDepth>
<maxVel>1.0</maxVel>
</gazebo>

Свойство reference используется для указания ссылки в роботе. Таким образом, предыдущие свойства будет применяться только к chefbot_wheel_left_link.

В следующем фрагменте кода показано, как задается цвет робота. Можно задать собственный цвет, определить пользовательские цвета или использовать цвета, предлагаемые в Gazebo по умолчанию. Для base_link используется белый цвет Gazebo из свойств, предлагаемых в Gazebo по умолчанию:

<material name=»blue»>
<color rgba=»0 0 0.8 1″/>
</material>
<gazebo reference=»base_link»>
<material>Gazebo/White</material>
</gazebo>

Чтобы увидеть все теги, используемые в моделировании, перейдите по ссылке http://gazebosim.org/tutorials/?tut=ros_urdf.

Мы рассмотрели основные теги, применяемые в моделировании. Теперь рассмотрим плагины Gazebo-ROS, которые были использованы в моделировании.

Плагин датчика препятствия

Датчик препятствия представляет собой комплект ИК-датчиков, которые предназначены для обнаружения препятствий на пути робота. Данный комплект позволяет предотвратить столкновение робота с препятствием или его падение.

Это один из датчиков ходовой части робота Turtlebot 2, называемый kobuki (http://kobuki.yujinrobot.com/). Этот плагин был использован при моделировании робота Turtlebot 2.

Мы можем самостоятельно задать такие параметры датчиков, как минимальный и максимальный углы развертки ИК-лучей, разрешение и частота, с которой будут проводиться замеры. Этот параметр представляет собой количество замеров в секунду. Также можно ограничить зону обнаружения датчика. Из нижеприведенного кода видно, что в модели предусмотрены три датчика препятствия:

<gazebo reference=»cliff_sensor_front_link»>
<sensor type=»ray» name=»cliff_sensor_front»>
<always_on>true</always_on>
<update_rate>50</update_rate>
<visualize>true</visualize>
<ray>
<scan>
<horizontal>
<samples>50</samples>
<resolution>1.0</resolution>
<min_angle>-0.0436</min_angle> <!— -2.5 degree —>
<max_angle>0.0436</max_angle> <!— 2.5 degree —>
</horizontal>
</scan>
<range>
<min>0.01</min>
<max>0.15</max>
<resolution>1.0</resolution>
</range>
</ray>
</sensor>
</gazebo>

Плагин контактного датчика

Вот фрагмент кода контактного датчика нашего робота. Если робот столкнется с любым объектом, сработает этот плагин. Обычно он подключается к base_link робота. Датчик срабатывает сразу после того, как бампер робота коснется препятствия:

<gazebo reference=»base_link»>
<mu1>0.3</mu1>
<mu2>0.3</mu2>
<sensor type=»contact» name=»bumpers»>
<always_on>1</always_on>
<update_rate>50.0</update_rate>
<visualize>true</visualize>
<contact>
<collision>base_footprint_collision_base_link</collision>
</contact>
</sensor>
</gazebo>

Плагин гироскопа

Назначение данного плагина – измерение угловой скорости робота. Зная угловую скорость, можно вычислить положение. Положение робота используется в контроллере привода ходовой части для вычисления позы устройства (смотрите приведенный ниже код):

<gazebo reference=»gyro_link»>
<sensor type=»imu» name=»imu»>
<always_on>true</always_on>
<update_rate>50</update_rate>
<visualize>false</visualize>
<imu>
<noise>
<type>gaussian</type>
<rate>
<mean>0.0</mean>
<stddev>${0.0014*0.0014}</stddev> <!— 0.25 x 0.25 (deg/s) —>
<bias_mean>0.0</bias_mean>
<bias_stddev>0.0</bias_stddev>
</rate>
<accel> <!— not used in the plugin and real robot, hence
using tutorial values —>
<mean>0.0</mean>
<stddev>1.7e-2</stddev>
<bias_mean>0.1</bias_mean>
<bias_stddev>0.001</bias_stddev>
</accel>
</noise>
</imu>
</sensor>
</gazebo>

Модуль дифференциального привода

Плагин дифференциального привода является наиболее важным в моделировании. Он имитирует поведение дифференциального привода нашего робота и после получения команды velocity (линейная и угловая скорости) в виде Ros Twist-сообщения (geometry_msgs/Twist) перемещает модель робота. Данный плагин также вычисляет одометрию, в результате чего мы получаем локальное положение робота (смотрите приведенный ниже код):

<gazebo>
<plugin name=»kobuki_controller» filename=»libgazebo_ros_kobuki.so»>
<publish_tf>1</publish_tf>
<left_wheel_joint_name>wheel_left_joint</left_wheel_joint_name>
<right_wheel_joint_name>wheel_right_joint</right_wheel_joint_name>
<wheel_separation>.30</wheel_separation>
<wheel_diameter>0.09</wheel_diameter>
<torque>18.0</torque>
<velocity_command_timeout>0.6</velocity_command_timeout>
<cliff_detection_threshold>0.04</cliff_detection_threshold>
<cliff_sensor_left_name>cliff_sensor_left</cliff_sensor_left_name>
<cliff_sensor_center_name>cliff_sensor_front</cliff_sensor_center_name>
<cliff_sensor_right_name>cliff_sensor_right</cliff_sensor_right_name>
<cliff_detection_threshold>0.04</cliff_detection_threshold>
<bumper_name>bumpers</bumper_name>
<imu_name>imu</imu_name>
</plugin>
</gazebo>

Для вычисления одометрии нам необходимо знать такие параметры, как расстояние между колесами, диаметр колеса и вращающий момент моторов. В нашей конструкции расстояние между колесами составляет 30 cм, диаметр колеса – 9 cм, а вращающий момент равен 18 Н. Чтобы опубликовать преобразование робота, следует установить значение publish_tf, равное 1. Каждый тег внутри плагина является его параметром. Вы можете видеть, что данный плагин принимает все входные сигналы от датчика контакта (imu) и датчика препятствия.

Плагин libgazebo_ros_kobuki.so устанавливается вместе с пакетами симуляции Turtlebot 2. Этот плагин мы используем в нашем роботе. Перед запуском моделирования убедитесь, что моделирование Turtlebot 2 установлено в вашей системе.

Плагин камеры глубины

Данный плагин имитирует характеристики камеры глубины таких камер, как Kinect или Astra, и разных датчиков глубины с различными характеристиками. Имя этого плагина – libgazebo_ros_openni_kinect.so. Ниже приведен его код:

<plugin name=»kinect_camera_controller»
filename=»libgazebo_ros_openni_kinect.so»>
<cameraName>camera</cameraName>
<alwaysOn>true</alwaysOn>
<updateRate>10</updateRate>
<imageTopicName>rgb/image_raw</imageTopicName>
<depthImageTopicName>depth/image_raw</depthImageTopicName>
<pointCloudTopicName>depth/points</pointCloudTopicName>
<cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
<depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
<frameName>camera_depth_optical_frame</frameName>
<baseline>0.1</baseline>
<distortion_k1>0.0</distortion_k1>
<distortion_k2>0.0</distortion_k2>
<distortion_k3>0.0</distortion_k3>
<distortion_t1>0.0</distortion_t1>
<distortion_t2>0.0</distortion_t2>
<pointCloudCutoff>0.4</pointCloudCutoff>
</plugin>

Плагин публикует изображение в трех основных цветах (красном, зеленом и синем – RGB), показывает глубину изображения и данные облака точек. Можно установить матрицу камеры в плагине, а также настроить другие параметры.

Визуализация данных датчика робота

В этой части статьи вы узнаете, как сделать видимыми данные датчика от моделируемого робота. В пакете chefbot_gazebo есть два файла запуска: для запуска робота в незаполненном мире и в окружающей среде (в нашем случае – в отеле). Пользовательскую среду можно построить с использованием инструментов и самого Gazebo. Cоздайте с помощью примитивных меш-объектов простую среду и сохраните ее как *.world-файл, который может быть входом узла gazebo_ros в файле запуска. Для запуска гостиничной среды в Gazebo используйте следующую команду:

$ roslaunch chefbot_gazebo chefbot_hotel_world.launch

Chefbot в Gazebo в среде отеля
Chefbot в Gazebo в среде отеля

Девять кубиков внутри пространства представляют девять столов. Робот может перемещаться к любому из этих столов для доставки еды. Мы расскажем, как это делать, но перед этим узнаем, как сделать видимыми различные типы данных, получаемых от датчиков модели робота.

Среда отеля в Gazebo с роботом Chefbot
Среда отеля в Gazebo с роботом Chefbot

Чтобы сделать видимыми данные, получаемые от датчика робота, запустим Rviz. Для этого выполните следующую команду:

$ roslaunch chefbot_description view_robot.launch

Как данные будут отображаться на экране, показано на приведенном ниже рисунке:

Визуализация датчика Chefbot в Rviz
Визуализация датчика Chefbot в Rviz

Для просмотра разных типов данных от датчиков Chefbot можем в Rviz выбирать требуемые способы отображения. На предыдущем рисунке показаны облако глубины, данные, полученные от датчика лазерного сканирования, TFракеты, сама модель робота и RGB-камера изображения.

Начало работы с одновременной локализацией и картографированием

Одно из требований к Chefbot – то, что он должен уметь автономно перемещаться в окружающей среде и доставлять пищу. Для достижения этого требования следует использовать несколько алгоритмов, таких как SLAM (одновременная локализация и отображение) и AMCL (Адаптивная локализация Монте-Карло). Существует несколько подходов к решению проблемы автономной навигации. В данной статье мы в основном придерживаемся данных алгоритмов. Алгоритмы SLAM используются для решения двух задач: отображения окружающей среды и одновременного определения положения робота на карте. Это похоже на проблему с курицей и яйцом. Но теперь для одновременного решения этих двух задач существуют различные алгоритмы. Алгоритм AMCL используется для локализации робота на существующей карте. Алгоритм, который мы используем в этой статье, называется Gmapping (http://www.openslam.org/gmapping.html), который реализует Fast SLAM 2.0 (http://robots.stanford.edu/papers/Montemerlo03a.html). Стандартная библиотека gmapping упакована в пакет ROS и называется Ros Gmapping (http://wiki.ros.org/gmapping). Этот пакет может быть использован в нашем приложении.

Идея узла SLAM заключается в том, что при перемещении робот, используя данные лазерного сканирования и одометрии, создает карту окружающей среды.

Более подробную информацию вы можете получить, обратившись к странице Ros Gmapping, расположенной по адресу: http://wiki.ros.org/gmapping.

Реализация SLAM в среде Gazebo

В этой части будет рассказано, как реализовать SLAM и применить его к созданной нами визуализации. Вы можете проверить код в chefbot_gazebo/launch/gmapping_demo.launch и launch/includes/gmapping.launch.xml.

Читать также:  Квалификаторы типов и классов хранения в C++

Мы в основном используем узел из пакета gmapping и настраиваем его с соответствующими параметрами. Фрагмент кода gmapping.launch.xml полностью определяет этот узел. Ниже приведен фрагмент кода данного узла:

<launch>
<arg name=»scan_topic» default=»scan» />
<node pkg=»gmapping» type=»slam_gmapping» name=»slam_gmapping» output=»screen»>
<param name=»base_frame» value=»base_footprint»/>
<param name=»odom_frame» value=»odom»/>
<param name=»map_update_interval» value=»5.0″/>
<param name=»maxUrange» value=»6.0″/>
<param name=»maxRange» value=»8.0″/>

Имя используемого нами узла – slam_gmapping, а имя пакета – gmapping. Для правильной работы необходимо этому узлу предоставить несколько необходимых параметров, которые можно найти на странице Gmapping wiki.

Создание карты с помощью SLAM

В этой части вы узнаете, как с помощью SLAM создать карту нашей среды. Однако, перед тем как начать отображение, следует выполнить несколько команд. Все эти команды поочередно выполняются в терминале Linux.

Во-первых, используя следующую команду, необходимо начать симуляцию:

$ roslaunch chefbot_gazebo chefbot_hotel_world.launch

Далее запустите еще один терминал и запустите в нем узел клавиатуры teleoperation. Это поможет нам настроить перемещение робота вручную с помощью клавиатуры:

$ roslaunch chefbot_gazebo keyboard_teleop.launch

Запустите еще один терминал и выполните в нем нижеприведенную команду, которая запустит SLAM:

$ roslaunch chefbot_gazebo gmapping_demo.launch

Теперь начнется создание карты. Чтобы показать на экране, как создается карта, запустите Rviz с помощью настроек навигации:

$ roslaunch chefbot_description view_navigation.launch

Теперь мы можем видеть карту, созданную в Rviz (см. рисунок ниже).

Создание карты в Rviz с помощью Gmapping
Создание карты в Rviz с помощью Gmapping

Теперь для перемещения робота мы можем использовать узел teleop. В результате мы увидим, как создается карта в Rviz. Для создания хорошей, качественной карты робот должен перемещаться с как можно меньшей скоростью и как можно чаще поворачиваться на 360°. После того как робот пройдет весь путь и карта будет создана, сохраните ее с помощью следующей команды:

$ rosrun map_server map_saver -f ~/Desktop/hotel

Карта будет сохранена с расширениями *.pgm и *.yaml, где расширение .pgm обозначает карту, а файл .yaml – конфигурацию этой карты. Согласно данной команде, карта будет сохранена на Рабочем столе.

На показанном ниже рисунке представлена карта, созданная роботом, который перемещался по окружающей среде:

Финальная карта, построенная с помощью Gmapping
Финальная карта, построенная с помощью Gmapping

Карту можно сохранить в любое время. Но прежде убедитесь, что робот охватил всю область окружения и сопоставил все пространство, как показано на предыдущем снимке экрана. Когда мы убедимся, что карта полностью построена, снова введите команду map_saver, после чего закройте все терминалы. Если окружающую среду отобразить не удастся, вы можете воспользоваться картой из chefbot_gazebo/maps/hotel.

Начало работы с адаптивным методом локализации Монте-Карло

Итак, карта окружающей среды создана. Теперь мы должны научить робота перемещаться со своего текущего положения к целевой позиции. Перед тем как запустить автономную навигацию, следует определить положение робота на текущей карте. Алгоритм, который применяется для определения местоположения робота на карте, называется AMCL. AMCL использует многочастичный фильтр для отслеживания положения робота на карте. В нашем роботе для реализации AMCL мы используем пакет ROS (http://wiki.ros.org/amcl). Алгоритм AMCL похож на Mapping, в котором для настройки узла amcl, находящегося внутри пакета amcl, предусмотрено множество настроек. Все параметры amcl вы можете найти на странице Ros wiki.

Итак, настало время запустить AMCL для нашего робота. Для запуска этого алгоритма предусмотрен файл запуска, который помещен в chefbot_gazebo/amcl_demo.launch и chefbot_gazebo/includes/amcl.launch.xml.

Рассмотрим код amcl_demo.launch, описание которого показано в коде исполняемого файла:

<launch>
<!— Map server —>
<arg name=»map_file» default=»$(find chefbot_gazebo)/maps/hotel.yaml»/>
<node name=»map_server» pkg=»map_server» type=»map_server» args=»$(arg
map_file)» />

Первый узел запускает исполняемый файл map_server из пакета map_server. Узел map_server загружает статическую карту, которую мы ранее сохранили, и публикует ее в тему под названием карта (map) (nav_msgs/OccupancyGrid). Можно файл карты упомянуть как аргумент файла amcl_demo.launch, и при наличии такого файла узел map_server будет загружен; в противном случае будет загружена карта по умолчанию, расположенная в файле chefbot_gazeob/maps/hotel.yaml.

После загрузки карты мы запускаем узел amcl и перемещаем базовый узел. Узел AMCL помогает локализовать робота на текущей карте, а узел move_base в стеке навигации ROS помогает в навигации робота от текущей до целевой позиции. Об узле move_base подробнее будет рассказано в следующих статьях. В узле move_base также необходимо настроить параметры. Файлы параметров хранятся внутри папки chefbot_gazebo/param, что и показано в следующем коде:

<!— Localization —>
<arg name=»initial_pose_x» default=»0.0″/>
<arg name=»initial_pose_y» default=»0.0″/>
<arg name=»initial_pose_a» default=»0.0″/>
<include file=»$(find chefbot_gazebo)/launch/includes/amcl.launch.xml»>
<arg name=»initial_pose_x» value=»$(arg initial_pose_x)»/>
<arg name=»initial_pose_y» value=»$(arg initial_pose_y)»/>
<arg name=»initial_pose_a» value=»$(arg initial_pose_a)»/>
</include>
<!— Move base —>
<include file=»$(find
chefbot_gazebo)/launch/includes/move_base.launch.xml»/>
</launch>

Чтобы узнать больше о навигационном стеке ROS, перейдите по следующей ссылке:
http://wiki.ros.org/navigation/Tutorials/RobotSetup.

Реализация AMCL в среде Gazebo

В этой части будет рассказано о том, как реализовать AMCL в создаваемом нами роботе Chefbot. Для включения AMCL в моделирование воспользуйтесь командами, приведенными ниже. Каждая команда выполняется в отдельном терминале.

Первая команда запускает имитатор Gazebo:

$ roslaunch chefbot_gazebo chefbot_hotel_world.launch

Теперь мы можем запустить файл запуска AMCL. Обратите внимание, как уже упоминалось ранее, в этом файле запуска в качестве аргумента может присутствовать файл карты. Но файл карты в качестве аргумента может и отсутствовать. Чтобы загрузить созданную ранее пользовательскую карту, выполните следующую команду:

$ roslaunch chefbot_gazebo amcl_demo.launchmap_file:=/home/<your_user_name>/Desktop/hotel

Если вы хотите использовать карту, предлагаемую по умолчанию, выполните команду

$ roslaunch chefbot_gazebo amcl_demo.launch

После того как AMCL запустится, можно начинать визуализацию карты и робота в Rviz. На экране появится окно Rviz, в котором будет показана карта (см. рисунок, показанный ниже). Можно увидеть карту и робота в окружении зеленых точек. Зеленые точки называются частицами amcl. Они указывают на неопределенность положения робота. Если концентрация частиц amcl вокруг робота высокая, значит, неопределенность положения робота очень высокая. Когда робот начнет движение, количество частиц начнет уменьшаться, и местоположение станет более точным. Если робот не может определить свое местонахождение на карте, воспользуйтесь кнопкой 2D Pose Estimate, которая расположена на панели инструментов RViz. Далее укажите положение робота на карте вручную. Эта кнопка видна на показанном ниже рисунке.

Кнопка 2D Pose Estimate в RViz
Кнопка 2D Pose Estimate в RViz

При приближении камеры к роботу в Rviz вы увидите частицы, как на предыдущем рисунке. Мы также сможем увидеть окрашенные в разные цвета препятствия, находящиеся вокруг робота.

Облако AMCL вокруг робота
Облако AMCL вокруг робота

В следующей части статьи вы узнаете, как запрограммировать Chefbot для автономного перемещения по этой карте. Вам не нужно закрывать ранее запущенные терминалы; мы можем перемещаться роботом автономно в самой Rviz.

Автономная навигация Chefbot в отеле с использованием Gazebo

Чтобы запустить автономную навигацию робота, нам просто роботу нужно подать команду, в которой устанавливается расположенная на карте конечная точка маршрута. Ранее мы показали, где в панели инструментов RViz находится кнопка 2D Pose Estimate. Рядом с ней вы увидите кнопку 2D Nav Goal, назначение которой – выбор конечной точки маршрута. Нажмите на эту кнопку и щелкните мышью на конечной точке маршрута. На экране появится стрелка, указывающая на положение робота. После указания на карте конечной точки маршрута вы увидите, как робот планирует путь со своей текущей позиции к конечной точке. Робот медленно двинется со своего текущего положения в область, где расположена цель, избегая всех препятствий. На рисунке, показанном ниже, представлено планирование пути и перемещение робота в заданную позицию.

Цветная сетка вокруг робота показывает карту затраченных ресурсов и путь, запланированный роботом на обход препятствий.

Кнопка 2D Nav Goal в панели инструментов RViz
Кнопка 2D Nav Goal в панели инструментов RViz

Итоги

Из этой статье вы узнали, как имитировать нашего робота под названием Chefbot. О конструкции робота Chefbot было рассказано в предыдущей статье «Моделирование робота с дифференциальным приводом«. Эту статью мы начали с обзора имитатора Gazebo, его различных возможностей и особенностей. После этого мы рассмотрели, как с помощью взаимодействия ROS и имитатора Gazebo выполнить визуализацию робота. Для этого нами был установлен пакет TurtleBot 2 и смоделирован Turtlebot 2 в Gazebo. Далее было создано моделирование Chefbot с использованием Gmapping, AMCL сымитирована автономная навигация робота в гостиничной среде. Теперь вы знаете, что точность визуализации робота зависит от того, насколько хорошо была сгенерирована карта. В следующей статье «Проектирование оборудования и схем ChefBot» мы подробно рассмотрим конструкцию робота и его электронную схему.

За основу данной статьи взята книга Д. Лентина «Изучение робототехники с использованием Python» 

С Уважением, МониторБанк

Добавить комментарий