21 February 2019

OpenAI Gym+ROS+Gazebo: обучение автономного робота в домашних условиях. Часть 1

PythonMachine learningRobotics developmentRoboticsArtificial Intelligence
Sandbox
За последние несколько лет мы стали свидетелями внедрения технологий искусственного интеллекта в нашу повседневной жизни — от роботов-пылесосов до беспилотных дронов. Все они, управляемые искусственным интеллектом, уже являются для нас обыденностью. Но несмотря на это, процесс разработки, от проектирования до реализации, занимает годы и обходится не дешево. Кроме того, алгоритмы машинного обучения требуют большие данные и нет никаких гарантий, что в конечном счете все сработает.

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

Похожие мысли были и у доктора Эндрю Ховарда, когда он со своим учеником Нейтоном Кенигом в 2002 году приступил к разработке 3D симулятора Gazebo в Университете Южной Калифорнии. Концепция симулятора высокой точности возникал из-за необходимости тестировать роботов в различных сложных условиях вне помещений. На первых этапах разработки такой подход позволяет сэкономить время и средства на приобретении необходимого оборудования.

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



Всем привет. Я учусь на магистратуре (Computer Science, M.S.) прикладной информатики в Берлинском Университете Прикладных Наук (HTW-Berlin).

В рамках своей курсовой я работаю над методами обучения автономных роботов в симулируемой среде с использованием ROS [1], Gazebo [2] и OpenAI Gym [3]. Эта курсовая работа разделена на две части.

Первая часть посвящена разработке фреймворка, который бы упростил тестирование Reinforcement Learning (обучение с подкреплением) алгоритмов на различных автономных роботах внутри симуляции Gazebo.

Во второй части я сконцентрируюсь на реализации алгоритма для автономного вождения. Над этим я буду работать весь следующий семестр, поэтому в этой и следующих статьях речь пойдет в основном о реализации окружения OpenAI Gym для Gazebo. Непосредственно Reinforcement Learning (RL) будет затронут поверхностно.

Полный код проекта можно найти тут.

Системные требования


  • Ubuntu 18.04 или Windows WSL Ubuntu 18.04
  • Python 2.7
  • pip
  • Tenserflow CPU или GPU

Мы будем использовать ROS версии Melodic. Эта версия имеет несколько ограничений и самое значительное из них — это Ubuntu 18 (также есть возможность установить ROS на Windows WSL и на Ubuntu Headless, но об этом в другой раз). Кроме того ROS все еще не поддерживает Python 3.

Часть первая: введение


В этой пилотной части я коротко расскажу о технологиях, которые будут использоваться для создания окружения. Также опишу процесс установки и в конце мы запустим полноценную симуляцию, которой можно будет управлять через Gym API.

ROS: «не изобретать велосипед»


Robot Operating System (ROS) — это фреймворк для программирования роботов. ROS является «программным клеем», который дает возможность разработчикам сосредоточиться на своей конкретной задаче. Хотя ROS не является операционной системой, он предоставляет сервисы, такие как аппаратная абстракция, низкоуровневое управление устройствами, реализация часто используемых функций, передача сообщений между процессами и управление пакетами (плагинами).

ROS спроектирована как слабо связанная система, в которой процесс, называемый узлом (node), должен отвечать за одну задачу. Узлы общаются друг с другом, используя сообщения, проходящие через логические каналы, называемые темами (topics). Каждый узел может отправлять или получать данные от другого узла, используя шаблон проектирования издатель-подписчик (publish–subscribe pattern)

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

И так, установим ROS Melodic (полная инструкция)

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt update
sudo apt install ros-melodic-desktop-full
sudo rosdep init
rosdep update
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source /opt/ros/melodic/setup.bash

По какой-то причине полный пакет установки не включает в себя некоторые необходимые пакеты. Установим их отдельно:

sudo apt install ros-melodic-ackermann-msgs
sudo apt install ros-melodic-effort-controllers
sudo apt install ros-melodic-joy
sudo apt install ros-melodic-tf2-sensor-msgs

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

Gazebo


Gazebo — это динамический 3D симулятор с открытым исходным кодом, который развивается Open Source Robotic Foundation и довольно тесно взаимодействует с ROS. Gazebo позволяет точно и эффективно моделировать роботов как в сложных условиях помещений, так и снаружи.

Симулятор состоит из сервера gzserver, который занимается просчетом физики, столкновений и симуляцией сенсоров. К серверу могут подсоединяться клиенты, например gzclient (для десктопа) и gzweb (для браузера). Именно они занимаются рендерингом моделей.

Все это дает возможность тестировать сложные робототехнические системы в виртуальном пространстве гораздо быстрее и без риска нанести ущерб дорогостоящим настоящим роботам.

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

OpenAI Gym


OpenAI — некоммерческая исследовательская компания, занимающаяся искусственным интеллектом, одним из основателей которой является Илон Макс.
OpenAI Gym — это библиотека Python, которая предоставляет API для разработки и сравнения RL алгоритмов с огромным количество виртуальных сред и общим API. Gym уже имеет множество готовых окружений, в том числе для игр Atari.

openai_ros


Мой проект основан на пакете openai_ros. Этот пакет реализует архитектуру, которая была предложена командой The Construct. Ребята из The Construct разработали общую структуру, которая реализует необходимый API для управления симуляцией и описывает API для интеграции Gazebo в Gym, требующий минимальной реализации. Предложенная структура состоит из трех логических слоев (фактически можно использовать любое количество), самый низкий из них является еще одним “клеем”, который соединяет Gym API с Gazebo. Подробней об этом в следующей части, когда мы будем разбирать код.

Собираем все вместе


Для начала нам нужно создать рабочую директорию для catkin. catkin — это система автоматизации сборки наподобие CMake, которая включена по умолчанию в пакет установки ROS:

cd ~
mkdir catkin_ws
cd catkin_ws/
mkdir src
cd src/

и склонировать необходимые пакеты ROS.

MIT Racecar


Нам потребуется разработанная в MIT модель робота со всеми сенсорами.

git clone https://github.com/mit-racecar/racecar.git
git clone https://github.com/mit-racecar/racecar-simulator.git

openai_ros


git clone https://bitbucket.org/theconstructcore/openai_ros.git

neuroracer


Ну и, собственно, сам проект

git clone https://github.com/karray/neuroracer.git

Далее нужно скомпилировать все эти пакеты

cd ~/catkin_ws
catkin_make

Так же нужно установить все необходимые python библиотеки.

pip install -U numpy tensorflow gym keras

Запуск симуляции


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

source ~/catkin_ws/devel/setup.bash

Теперь мы можем запустить симуляцию Racecar робота:

roslaunch racecar_gazebo racecar_tunnel.launch

Эта команда запустит мастер сервер ROS, сервер Gazebo вместе с его UI (на десктопе), загрузит робота и мир для него.

Скриншот:

Заголовок спойлера


И тоже самое во втором терминале для нашего RL алгоритма:

source ~/catkin_ws/devel/setup.bash
roslaunch neuroracer_gym_rl qlearning.launch

Эта команда запустит наш neuroracer_gym_rl пакет, который реализует простенький Q-Learning алгоритм в нашем окружении Gym. Его мы разберем в следующей части.

Те, кому не терпится, могут найти исходный код тут. Забегая вперед, скажу, что после нескольких дней обучения на сервере с картой GeForce GTX 1080 Ti 11GB RAM, этот простой алгоритм толком ничему не научился. В следующей части я причислю возможные причины, но вы уже сейчас можете поэкспериментировать со своей реализацией.

Заключение


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

PS: Это мой первый опыт написания статьей. По этому не стесняйтесь писать, если вы нашли ошибки или у вас есть идеи, или конструктивная критика. Я постараюсь учесть это в следующих частях.

Ссылки


[1] (M. Quigley, K. Conley, B. Gerkey, J. Faust, T. Foote, J. Leibs, R. Wheeler, and A. Y. Ng. Ros: an open-source robot operating system. In ICRA workshop on open source software, volume 3, page 5. Kobe, Japan, 2009.

[2] N. P. Koenig and A. Howard. Design and use paradigms for gazebo, an open-source multi-robot simulator. In IROS, volume 4, pages 2149–2154. Citeseer, 2004.

[3] L. P. J. S. J. S. J. T. W. Z. Greg Brockman, Vicki Cheung. Openai gym, 2016, arXiv:1606.01540
Tags:openai gymgazeborosreinforcement learningself-driving cardeep learning
Hubs: Python Machine learning Robotics development Robotics Artificial Intelligence
+16
7.5k 72
Comments 16