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

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

Похожие мысли были и у доктора Эндрю Ховарда, когда он со своим учеником Нейтоном Кенигом в 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

Комментарии (12)


  1. KonkovVladimir
    21.02.2019 19:15
    -3

    Python 2.7 — вы серьезно? Часики тикают.


    1. karay Автор
      21.02.2019 19:35
      +1

      К сожалению, ROS Melodic (рекомендуемая версия) все еще не поддерживает python3 полностью и изначально это не планировалось. Но работы уже ведутся.
      Исходя из моего опыта, python2 вполне справляется со всеми задачами.


      1. NeoPhix
        22.02.2019 11:03

        Там довольно просто свичнуться на python3.

        answers.ros.org/question/237613/how-to-define-ros-kinetic-to-use-python3-instead-of-python27

        В некоторых случаях достаточно даже простой замены верхней строчки в запускаемом через rosrun python скрипте на #!/usr/bin/env python3


  1. fivehouse
    21.02.2019 20:45

    У любого автономного робота при взаимодействии с реальным миром (вне зависимости от того, проектировали ли мы это или нет) проявляется его «реальная психика». Это как можно вкратце охарактеризовать цель существования робота в этом мире. Краткое описание всей его активности. Ничего такого не увидел в вашей статье. На мой взгляд именно с этого и надо начинать проектирование роботов. А уже потом прибавлять все технические детали, которыми наводнена ваша статья.


    1. karay Автор
      22.02.2019 17:20

      что именно вы подразумеваете под «реальной психикой?»


    1. iskateli
      22.02.2019 17:55

      Какая еще «реальная психика»? Психика это уже на уровне высших абстракций, здесь же всё на уровне простейших животных инстинктов «реакция — действие».


      1. fivehouse
        22.02.2019 19:52

        Психика это уже на уровне высших абстракций, здесь же всё на уровне простейших животных инстинктов «реакция — действие».
        С одной стороны если робот заточен на обнаружение элементарных ситуаций и элементарных реакций на них, надо так и писать про это. Про список всего этого элементарного. А с другой стороны этот список формирует некоторое определенное поведение, которое можно охарактеризовать как определенную психику проявляющуюся в конкретной среде. И про это тоже надо писать. Хотя это не видно сразу.


        1. karay Автор
          23.02.2019 18:23

          Нейронные сети — это инструмент, который выявляет взаимосвязи в больших данных и являются крайне узкоспециализированными. Например, если прямо по курсу препятствие, нужно повернуть направо. Другими словами, мы имеем марковский процесс с конечным количеством действий (поворот направо, налево, ничего не делать). В случае Q-Learning нейронная сеть выступает в роли апроксиматором математического ожидания награды от выполненного действия. Так что я искренне не могу понять, что вы имеете ввиду под «психикой». Сколько я читал научных работ, никто ни разу не вводил понятие «психики»


          1. fivehouse
            23.02.2019 19:08

            Так что я искренне не могу понять, что вы имеете ввиду под «психикой».
            Под «психикой» робота я имею ввиду полученное в результате поведение робота в конкретной среде. То есть, например:
            «В условиях обычной квартиры без длинношерстных ковров робот бесцельно катается по полу, пытаясь обходить препятствия пока не кончится заряд.»
            Или «В условиях обычной квартиры без длинношерстных ковров робот бесцельно катается по полу, пытаясь обходить препятствия пока заряд не кончится на 70%. Потом выполняет поиск зарядного устройства с успехом в 80%.»
            Или «В условиях обычной квартиры без длинношерстных ковров робот катается по полу пытаясь побывать на всех участках пола по такому-то алгоритму, пытаясь обходить препятствия пока заряд не кончится на 70%. Потом выполняет поиск зарядного устройства с успехом в 80%.»
            Это и есть краткие описание «психики» робота. Или цели его существования.
            Иногда простые алгоритмы воспроизводят в конкретных средах весьма сложное поведение. Иногда такое встречается у простейших одноклеточных. Они умеют метить среду специальными маркерами и вообще не имея нервной системы могут выдавать весьма сложное (и «разумное») поведение реагируя на ранее оставленные отметки специфическим образом.
            Сколько я читал научных работ, никто ни разу не вводил понятие «психики»
            Все бывает в первый раз.


            1. karay Автор
              23.02.2019 19:19

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

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


  1. blacksoul000
    21.02.2019 22:21

    Связка ROS2 (crystal) + python3 + Gazebo вполне неплохо заводится.
    а если нужны какие-то ноды из ros1, которых нет в ros2, можно поднять ноду ros1_bridge.


    1. NeoPhix
      22.02.2019 11:08

      А ROS2 уже достаточно стабильна для использования? Я тут полгода к ним на сайт заглядываю, и создается впечатление все еще глубокой беты (хотя вроде релизнули уже пару лет назад), тотального отсутствия туториалов и прочих полезных материалов по сравнению с ROS1.