пятница, 30 ноября 2018 г.

Pong: Next

Читатели нашего блога вероятно помнят наш проект 2016 года Laser Pong, в котором мы создали робота для игры в одну из первых компьютерных игр – Pong. Этой осенью мы снова решили вернуться к теме двух ракеток и мяча, взглянуть на эту простую, но увлекательную игру несколько под иным углом. Причем взглянуть - в прямом смысле этого слова: робот с машинным зрением будет смотреть камерой на экран и нажимать кнопки на компьютерной клавиатуре, играя на эмуляторе классического игрового автомата. Никаких регуляторов, только хардкор в виде расчетов траекторий полета мяча и отскоков. Но и это еще не все - в рамках проекта мы разработали свой Pong, с нейросетями и прочим машинным обучением. Интересно кто победит - машинное зрение и четкая математика или нейронные сети и вероятностная логика?



Старший участник команды «Карандаш и Самоделкин» спроектировал, построил и запрограммировал:
  • Робота, использующего камеру и технологии машинного зрения для распознавания и анализа происходящего на экране, способного играть в Pong, нажимая кнопки на компьютерной клавиатуре
  • Алгоритм игры в Pong, основанный на математической модели движения мяча, учитывающий траекторию его движения, множественные столкновения со стенками и передающий роботу информацию о том, где должен оказаться мяч после серии отскоков
Робот собран на базе LEGO Mindstorms EV3 и использует мотор для нажатия 2-х кнопок на клавиатуре. Для полноценной обработки видеопотока с камеры в реальном времени вычислительные мощности блока EV3 усилены микрокомпьютером Raspberry Pi 2, объединенным с ним беспроводной сетью. EV3 выступает в роли контроллера двигателя, управляемого по сокету TCP/IP.



Все программы в проекте Pong:Next написаны на языке Python, на ПК используется ОС семейства Windows, на Raspberry Pi и EV3 – Linux.

Для робота разработаны три программы:

1. Программа для позиционирования камеры относительно монитора. Использует веб-сервер для вывода на него видеопотока с камеры.
2. Программа для блока EV3 содержит в себе socket-сервер и пропорциональный регулятор управления двигателем. Для их независимого функционирования используется модуль threading. Кроме этого робот выводит на экран EV3 текущий счет в игре.
3. Основная программа, запускаемая для Raspberry Pi, работает по следующему алгоритму:

  Однократно:
  • Устанавливаем соединение socket-клиентом с сервером на EV3
  • Берём пробный кадр с камеры и устанавливаем размеры игрового поля
  • Запускаем параллельный процесс, отвечающий за веб-сервер и вещание картинки с отладочной информацией
  Главный процесс:
  • Обновляем кадр с камеры
  • Производим контурный анализ кадра, выделяя на нем мяч и ракетки с использованием модуля OpenCV
  • По данным данного и одного из предыдущих кадров определяем направление движения мяча и рассчитываем точку его касания о линию движения ракетки. Для этого рекурсивно находим пересечения линий, образованных точками текущего положения мяча и его положением в предыдущий момент времени с боковыми частями поля до тех пор, пока не будет вычислена точка касания с линией, вдоль которой двигается ракетка.
  • Проверяем, был ли гол, основываясь на перескоке мяча в центр кадра после его пропадания около одной из ракеток
  • По данным разницы между фактическим положением ракетки в кадре и желаемым ее положением по расчетным данным, определяем, какие кнопки на клавиатуре нужно нажать
  • Отправляем на EV3 данным о кнопках, которые требуется нажать и о счете в игре для отображения на экране блока EV3

Младший участник команды «Карандаш и Самоделкин» в рамках проекта разработал:
Программа для игры в Pong для ПК воссоздает классический игровой автомат с квадратным пиксельным мячом. Реализованы «подкручивания» мяча в момент его отбивания ракеткой – для корректировки угла отскока. Алгоритм компьютерного игрока основывается на использовании простейшей однослойной нейронной сети. Мы разбиваем поле на прямоугольные зоны, в каждой из которых выделяем N направлений полета мяча. Кроме этого выделяем зоны, в которых можем находиться управляемая сетью ракетка. Такие сочетания образуют нейрон сети, выход нейрона – вероятность нажатия кнопок «вверх» и «вниз» (либо отсутствия нажатий кнопок вообще, если вероятность низка).

Алгоритм обучения сети мы провели в два этапа:

1. «Обучения с учителем», сеть учится базовым правилам игры, играя с игроком.
  • Поначалу вероятность нажатия кнопок «вверх», «вниз» и «не нажата» равны, управляемая сетью ракетка в каждый момент времени движется хаотично
  • Параллельно сеть наблюдает в какой зоне, при каком угле полета мяча и при каком начальном положении ракетки человека какие кнопки на клавиатуре он нажимает. Эту информацию она обрабатывается, накапливаясь в коэффициентах (весах) нейронов
  • Чем дольше человек обучает сеть, тем больше информации о игровых ситуациях и действиях в них будет аккумулировано в нейронной сети. Уже с первых секунд игры хаотичные движения ракетки начинают трансформироваться в более «разумные». Через час игры сеть почти полностью копирует стиль игры человека.
2. «Машинное обучение». Две копии обученной человеком сети играют друг с другом, улучшая навыки игры, разыгрывая в том числе ранее не встречавшиеся игровые ситуации:
  • Ведем историю последних N комбинаций положения мяча, угла его полета и положения управляемой сетью ракетки в этот момент
  • Если управляемая сетью ракетка отбила мяч, увеличиваем коэффициенты соответствующих нейронов, укрепляя желание сети сыграть таким же образом в схожей игровой ситуации
  • Если управляемая сетью ракетка пропустила мяч, уменьшаем коэффициенты нейронов для последних N/5 комбинаций в истории

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

Самое популярное