суббота, 9 мая 2020 г.

NeyroGamer 1

На самоизоляции сейчас непросто всем, но сидеть и унывать скучнее, чем заниматься любимым делом. Мы не сидим сложа руки и придумали довольно фановую штуку, назвав ее NeyroGamer.

NeyroGamer это своего рода бот, играющий в видео игры. Так как нам нравятся старые консоли, первая игра, в которую мы хотим научить играть нашего бота - гоночная аркада на Sega Genesis под названием Nigel Mansell's World Championship Racing. Игры запускаются на эмуляторе консоли (мы используем Fusion 3). Проект немного похож на один из наших прошлых проектов "Длинный хвост питона", так как использует машинное зрение с OpenCV.


Исходный код проекта

В коде реализовано 2 класса, каждый из которых отвечает за свою область.
   Класс ScreenReader содержит функциональность, позволяющую получать информацию о данных с экрана. Для этого делается скриншот. Мы пробовали множество вариантов — но самым быстрым был метод ImageGrab из модуля PIL. Он показал FPS в 25 кадров в секунду. Этого вполне достаточно для реагирования на повороты. После взятия изображения оно обрабатывается с помощью библиотеки OpenCV. Я накладываю маску, что бы выделить дорогу из кадра. Маска берётся не на всём кадре, а на 2 полосах экрана, первая из которых находится в самом низу кадра, а вторая почти под линией горизонта. Таким образом можно понять в какую сторону изгибается дорога. С помощью двух моментов можно притормаживать на поворотах и газовать максимально на прямых участках.
  Второй класс, Сontrol — отвечает за управление машинкой путем передачи в игру нажатия кнопок на виртуальном геймпаде.

Настройка эмулятора и виртуального геймпада. 
Для управления игрой в эмуляторе была установлена программа Vjoy, с помощью которой к компьютеру был подключен виртуальный геймпад. На геймпаде 11 кнопок и 1 стик. Для управления этим геймпадом из программы я использую модуль PyVjoy. Для корректной работы модуля внутрь папки требуется положить специальный DLL-файл, который генерируется в папке, куда вы установили Vjoy.  После этого вы сможете управлять виртуальным геймпадом из программы на Python. Необходимо установить в настройках эмулятора вход 1. На него следует поставить 3х кнопочный джойстик Genesis и выбрать в качестве него ваш виртуальный геймпад.
После этого надо запустить программу AssignKeys.py. Она будет нажимать кнопки виртуального геймпада в том порядке, какого требует эмулятор Fusion 3. Во время назначения клавиш фокус должен быть всё время на программе-эмуляторе. Когда эмулятор будет ждать клавиши старт, нажмите любую удобную кнопку на клавиатуре. Это нужно для возможности войти в гонку и поставить паузу. Всё готово! Вы можете запускать гонку в полноэкранном режиме предварительно запустив run.py.


  У вас наверно возник вопрос - почему проект носит порядковый номер 1? Всё просто. В репозитории пока открыт только демо-код, алгоритм которого не идеальный. Гонку мы пока проходим на 8-9 месте, поэтому будем дорабатывать NeyroGamer. Первая часть проекта - научиться взаимодействовать с игрой, получать игровые события, передавать команды управления. Сейчас мы работаем над нейронной сетью, которая улучшит игровые результаты.

Язык Python.
Автор - Платон, 14 лет ("Карандаш и Самоделкин")

Комментариев нет:

Отправить комментарий

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