Читатели нашего блога вероятно помнят наш проект 2016 года Laser Pong, в котором мы создали робота для игры в одну из первых
компьютерных игр – Pong. Этой осенью
мы снова решили вернуться к теме двух ракеток и мяча, взглянуть на эту простую, но увлекательную игру несколько под иным углом. Причем взглянуть - в прямом смысле этого слова: робот с машинным зрением будет смотреть камерой на экран и нажимать кнопки на компьютерной клавиатуре, играя на эмуляторе классического игрового автомата. Никаких регуляторов, только хардкор в виде расчетов траекторий полета мяча и отскоков. Но и это еще не все - в рамках проекта мы разработали свой Pong, с нейросетями и прочим машинным обучением. Интересно кто победит - машинное зрение и четкая математика или нейронные сети и вероятностная логика?
Старший участник команды «Карандаш и Самоделкин» спроектировал, построил и запрограммировал:
Все программы в проекте Pong:Next написаны на языке Python, на ПК используется ОС семейства Windows, на Raspberry Pi и EV3 – Linux.
Для робота разработаны три программы:
1. Программа для позиционирования камеры относительно монитора. Использует веб-сервер для вывода на него видеопотока с камеры.
2. Программа для блока EV3 содержит в себе socket-сервер и пропорциональный регулятор управления двигателем. Для их независимого функционирования используется модуль threading. Кроме этого робот выводит на экран EV3 текущий счет в игре.
3. Основная программа, запускаемая для Raspberry Pi, работает по следующему алгоритму:
Младший участник команды «Карандаш и Самоделкин» в рамках проекта разработал:
Алгоритм обучения сети мы провели в два этапа:
1. «Обучения с учителем», сеть учится базовым правилам игры, играя с игроком.
Демонстрацию работы робота можно посмотреть на следующем видео:
- Робота, использующего камеру и технологии машинного зрения для распознавания и анализа происходящего на экране, способного играть в Pong, нажимая кнопки на компьютерной клавиатуре
- Алгоритм игры в Pong, основанный на математической модели движения мяча, учитывающий траекторию его движения, множественные столкновения со стенками и передающий роботу информацию о том, где должен оказаться мяч после серии отскоков
Все программы в проекте Pong:Next написаны на языке Python, на ПК используется ОС семейства Windows, на Raspberry Pi и EV3 – Linux.
Для робота разработаны три программы:
1. Программа для позиционирования камеры относительно монитора. Использует веб-сервер для вывода на него видеопотока с камеры.
2. Программа для блока EV3 содержит в себе socket-сервер и пропорциональный регулятор управления двигателем. Для их независимого функционирования используется модуль threading. Кроме этого робот выводит на экран EV3 текущий счет в игре.
3. Основная программа, запускаемая для Raspberry Pi, работает по следующему алгоритму:
Однократно:
- Устанавливаем соединение socket-клиентом с сервером на EV3
- Берём пробный кадр с камеры и устанавливаем размеры игрового поля
- Запускаем параллельный процесс, отвечающий за веб-сервер и вещание картинки с отладочной информацией
- Обновляем кадр с камеры
- Производим контурный анализ кадра, выделяя на нем мяч и ракетки с использованием модуля OpenCV
- По данным данного и одного из предыдущих кадров определяем направление движения мяча и рассчитываем точку его касания о линию движения ракетки. Для этого рекурсивно находим пересечения линий, образованных точками текущего положения мяча и его положением в предыдущий момент времени с боковыми частями поля до тех пор, пока не будет вычислена точка касания с линией, вдоль которой двигается ракетка.
- Проверяем, был ли гол, основываясь на перескоке мяча в центр кадра после его пропадания около одной из ракеток
- По данным разницы между фактическим положением ракетки в кадре и желаемым ее положением по расчетным данным, определяем, какие кнопки на клавиатуре нужно нажать
- Отправляем на EV3 данным о кнопках, которые требуется нажать и о счете в игре для отображения на экране блока EV3
Младший участник команды «Карандаш и Самоделкин» в рамках проекта разработал:
- Игру Pong для ПК на двух игроков с возможностью игры с клавиатуры
- Нейронную сеть и алгоритм ее обучения при игре с человеком, позволяющий научить сеть базовым правилам игры в Pong
- Алгоритм машинного обучения для дальнейшего дообучения сети при игре двух ее копий друг против друга
Алгоритм обучения сети мы провели в два этапа:
1. «Обучения с учителем», сеть учится базовым правилам игры, играя с игроком.
- Поначалу вероятность нажатия кнопок «вверх», «вниз» и «не нажата» равны, управляемая сетью ракетка в каждый момент времени движется хаотично
- Параллельно сеть наблюдает в какой зоне, при каком угле полета мяча и при каком начальном положении ракетки человека какие кнопки на клавиатуре он нажимает. Эту информацию она обрабатывается, накапливаясь в коэффициентах (весах) нейронов
- Чем дольше человек обучает сеть, тем больше информации о игровых ситуациях и действиях в них будет аккумулировано в нейронной сети. Уже с первых секунд игры хаотичные движения ракетки начинают трансформироваться в более «разумные». Через час игры сеть почти полностью копирует стиль игры человека.
- Ведем историю последних N комбинаций положения мяча, угла его полета и положения управляемой сетью ракетки в этот момент
- Если управляемая сетью ракетка отбила мяч, увеличиваем коэффициенты соответствующих нейронов, укрепляя желание сети сыграть таким же образом в схожей игровой ситуации
- Если управляемая сетью ракетка пропустила мяч, уменьшаем коэффициенты нейронов для последних N/5 комбинаций в истории
Демонстрацию работы робота можно посмотреть на следующем видео: