Машина, управляющая машиной: как устроен ИИ в гонках

Заглядываем под капот искусственных интеллектов, отвечающих за управление автомобилями.

Машина, управляющая машиной: как устроен ИИ в гонках

В начале февраля разработчики серии Gran Turismo представили Sophy — искусственный интеллект, который должен вывести гоночные игры на совершенно иной уровень. По заверениям разработчиков, новый алгоритм способен обрабатывать реальную физику движения машины, обходить воздушные потоки и соблюдать этикет соревнований.

И что самое главное – он самообучается, благодаря чему может мастерски проехать серию крутых поворотов, практически прижимаясь к стенам, но, не касаясь их. Также Sophy способна принимать во время гонки тактические решения, чтобы, например, обойти игрока, используя особенности крутого поворота.

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

Базовые подходы

Создание искусственного интеллекта для гоночной игры — задача комплексная. На самом базовом уровне машины, управляемые компьютером, должны хотя бы просто уметь двигаться по трассе. Достигается это разными способами. Одним из самых ранних приёмов, который использовался ещё до того, как центральные процессоры смогли проводить сложные вычисления, было использование заранее проведённых по трассе линий, по которым двигались машины, управляемые ИИ. Их называют сплайнами (spline).

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

Pole Position (1982)
Pole Position (1982)

В идеале машина движется не строго по сплайну, а скорее около него, чтобы на трассе не формировался «поезд» из автомобилей, управляемых ИИ. Эта система не очень реалистичная, однако в играх её используют до сих пор, о чём мы поговорим ниже в этом материале.

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

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

Carmageddon (1997)
Carmageddon (1997)

А в хардкорных симуляторах, например, например в духе гонок «Формулы-1», сплайн будет единой линий, напичканной подробной информацией о тактике прохождения каждого участка трассы.

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

Ещё один старый приём — создание путевых точек (waypoints). Это набор координат в пространстве на трассе. Агент ИИ перебирает их, направляя машину, пока не пройдёт их все.

Driver (1999)
Driver (1999)

Определить, в какой точке на трассе находится машина и есть ли рядом препятствия, можно разными способами, например, через триггер, занимающий некое пространство вокруг машины (огромный невидимый куб, надетый на неё). Он сообщает об опасном приближении другого автомобиля. В этом случае система откорректирует движение машины так, чтобы она поехала в другую сторону от препятствия.

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

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

Допустим, нужно ли им, чтобы машины по трассе двигались на одной высоте или на дороге будут возвышенности и низменности? Надо ли на трассе выполнять разные задачи, вроде эффектного выполнения автомобильных трюков? Будет ли гонка проходить в условиях спортивной трассы, предназначенной только для машин, участвующих в заезде, или на ней найдётся место и автомобильному траффику? Каждый раз к решению этих задач разработчики ИИ подходят по разному. Разберём несколько примеров.

Пьеса, разыгранная по ролям

Во всех случаях основная задача ИИ, во-первых, воссоздать ощущение, будто другой машиной управляет человек, а во-вторых, сделать гонку увлекательной. Как бы хорош ни был ИИ, будет плохо, если все машины, управляемые компьютером, уедут далеко вперёд. Также будет плохо, если опытный игрок сам уедет вперёд, оставив всех позади. В обоих случаях пользователь окажется на трассе в одиночестве и заскучает.

Самый популярный приём, который помогает избежать подобной ситуации — rubber band (резиновая лента). Он применяется в том или ином виде практически в любой гоночной игре, как бы привязывая резиновой лентой ИИ-гонщиков к машине игрока.

Если сильно упростить, при rubber band честность заезда жертвуется в угоду зрелищности. Машины, управляемые ИИ, не стараются вас победить, а скорее отыгрывают разные роли, чтобы вам было интереснее.

Одной машине достаётся роль слабого гонщика и она всегда будет позади вас. Другая обгонит вас, если вы зазеваетесь. Третья отыгрывает парня, который хочет вас унизить, и поэтому он всегда дразнит вас, находясь на несколько метров впереди, но никогда не уезжая слишком далеко.

Mario Kart: Double Dash!!
Mario Kart: Double Dash!!

При этом ближе к финишу все ваши противники вдруг резко сбавляют скорость, чтобы вы как бы превозмогая, как бы из последних сил, победили их. Это немного похоже на систему, реализованную в некоторых шутерах, когда последние очки здоровья тратятся медленнее остальных, чтобы вам казалось, будто вы буквально зубами вырываете победу из рук врага.

Mario Kart: Double Dash!, вышедшая в 2003-м на GameCube — одна из самых известных игр, использовавших приём rubber band. Начиная с этой части, гонщики в Mario Kact, которые находились в хвосте, чаще получали синий самонаводящийся черепаший панцирь, которым они могли сбить игрока-лидера.

Mario Kart: Double Dash!!
Mario Kart: Double Dash!!

В отличие от предыдущих игр, синий панцирь в этой части уже не двигался по земле, а летел словно ракета по воздуху, игнорируя все наземные препятствия. Вроде как это должно было накалить страсти, но в реальности делало игру немного нечестной. Из-за него рваться вперёд уже не было смысла. Зачем, если тебя в итоге обязательно подобьёт один из аутсайдеров?

После Mario Cart этот приём стал чаще применяться и в других играх. Но в хардкорных симуляторах, где нет пауэрапов, его реализуют иначе — за счёт преимуществ, получаемых искусственным интеллектом.

Need for Speed
Need for Speed

Так, серия Need for Speed использовала систему Catch-up, которая представляет собой разновидность rubber band. Её суть в том, что машины, управляемые компьютером, едут тем быстрее, чем дальше вы от них уехали. И наоборот, их скорость будет искусственно занижаться, если вы вдруг сильно отстали. В итоге как бы вы ни старались оторваться от соперников, они всё равно вас догонят. Например, эта система была реализована в Need for Speed 2015 года. В ней можно было столкнуться с абсурдной ситуацией, когда маленький Volskwagen Golf boost вдруг догонял Lamborghini.

У этой несправедливости была и другая сторона — машины, управляемые ИИ, вдруг резко замедлялись перед финишем, чтобы у пользователя всё же был шанс выиграть. Игрокам это не сильно понравилась и разработчикам из Ghost Games пришлось выпустить апдейт, который менял поведение искусственного интеллекта на трассе.

Need for Speed
Need for Speed

Своим путём при реализации rubber band пошли разработчики Pure — аркадного симулятора гонок на квадроциклах, вышедшего в 2008 году. При создании ИИ программисты намеренно использовали этот принцип, чтобы рядом с игроком всегда были другие гонщики. Но саму систему они немного усложнили в связи с тем, что в Pure надо не только приехать к финишу самым первым, но и набрать как можно больше очков, выполняя трюки.

Pure
Pure

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

Навык «выполнение трюков» определяет, насколько хорошо персонаж выполняет трюки, и то, как часто он их проваливает. Навыки представлены в виде действительного числа в диапазоне [0..1], где 0 — худшее, что персонаж может выполнить в соответствующей категории, а 1 — лучшее.

Эдуардо Хименез

, старший программист в Black Rock Studios, разработавшей Pure
Pure
Pure

Навык «агрессивность персонажа» определял, как часто гонщик, управляемый ИИ, будет стараться выбить игрока с трассы. Такие параметры меняли поведения гонщика.

Но разработчики пошли ещё дальше и решили менять их у каждого участника заезда в реальном времени при помощи принципа rubber band. Они сделали так, что каждый компьютерный гонщик целился в некую точку на трассе, привязанную к игроку-человеку. Если эта точка находилась впереди игрока, то его параметры навыков менялись в положительную сторону. Если точка находилась позади игрока, то параметры менялись в отрицательную сторону.

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

Эдуардо Хименез

, старший программист в Black Rock Studios, разработавшей Pure
Pure
Pure

Другая интересная находка — всех компьютерных гонщиков разработчики разделили на три группы. Условно их можно назвать «Лидеры», «Середнячки» и «Отстающие». В каждой группе было четыре машины, управляемых ИИ. Итого 12 гонщиков. Игрок был 13-м. А всего на трассе присутствовало 16 квадроциклов.

Эти три оставшихся персонажа мы относили к так называемой «закрытой группе», которая всегда стремилась быть рядом с игроком. Это нужно, чтобы имитировать гонщиков, которые, как и пользователь, постоянно переходят из одной группы в другую. «Закрытая группа» гарантировала, что некоторые ИИ-гонщики постоянно будут находиться рядом с игроком, если только он не выходил за пределы возможностей искусственного интеллекта.

Эдуардо Хименез, старший программист в Black Rock Studios, разработавшей Pure

Когда начиналась гонка, искусственный интеллект разыгрывал целый спектакль. Сначала все резво устремлялись вперёд, а затем гонщики из группы отстающих начинали стремиться к точке в 0 метров от игрока. То есть в самом начале они старались держаться рядом с ним. Ближе к концу гонки они уже стремились к точке в -500 метров позади игрока. То есть они намеренно оказывались далеко позади — это не пользователь их побеждал, это они ему поддавались.

Pure
Pure

Группа «Середнячков» в начале заезда пыталась занять точку в +250 метров от игрока, то есть оказаться впереди него. К концу гонки они вдруг как бы невзначай отставали к точке в -250 метров от игрока.

Эта группа обгоняет игрока в начале, получая некоторое преимущество над ним, но должна постепенно терять это преимущество. С точки зрения пользователя, он медленно завоёвывает позиции и в конце концов покидает группу «Середнячков» благодаря своим навыкам. Средняя группа отстаёт достаточно медленно, чтобы вам казалось, будто вы их побеждаете сами.

Эдуардо Хименез, старший программист в Black Rock Studios, разработавшей Pure

Тактика группы «Лидеров» была следующей — с самого начала уехать к точке в +500 метров от игрока, а в конце гонки находиться с ним в точке +0 метров. Таким образом, в начале гонки эта группа, как правило, легко оставляла игрока позади, и оказывалась с ним примерно на одной позиции после того, как он побеждал группу середнячков.

Driver: San Francisco
Driver: San Francisco

С интересной проблемой построения ИИ для управления машинами столкнулись разработчики Driver: San Francisco. Дело в том, что у этой игры есть одна особенность — во время движения по городу пользователь может в любой момент «пересесть» в любую другую машину в автомобильном трафике и ехать уже на ней. Не выйти из машины и сесть в другую, как в GTA, а именно переключиться на управление другим транспортным средством. По сюжету это объясняется тем, что главный герой находится в коме, а по водительским местам как бы дрейфует его сознание.

Но реализация такой механики требовала ответа на вопрос — как заставить машину, из которой игрок неожиданно выскочил, продолжать ехать сквозь городской трафик так, будто он по-прежнему в ней, чтобы она не врезалась в другие машины, не останавливалась и вела себя как ни в чём не бывало?

Driver: San Francisco
Driver: San Francisco

Для реализации этой задачи разработчики создали два разных типа искусственного интеллекта. Первый отвечал за поведение трафика на дороге. Второй был более сложной системой искусственного интеллекта, которую разработчики назвали Active Life.

Городской транспорт был частью детерминированной системы дорожного движения, которая просто перемещала машины по набору петлевых сплайнов по всему городу. Каждый сплайн был определён таким образом, чтобы гарантировать, что он не взаимодействует ни с каким другим сплайном. Каждый автомобиль будет следовать за точкой вокруг сплайна, зная, что нет никаких шансов столкнуться с другим транспортом.

Крис Дженнер

, программист из Ubisoft Reflections, разработавшей Driver: San Francisco

В свою очередь система Active Life отвечала за поведение машин, с которыми должен был взаимодействовать игрок. Они участвуют в гонках, преследуют пользователя, уезжают от него или от других транспортных средств. Active Life генерировала для них более сложные траектории движения.

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

Driver: San Francisco
Driver: San Francisco

Если же игрок выскочил из простой машины, не имеющей какой-либо чёткой цели, то ИИ выбирал для неё ближайшее свободное место на одном из дорожных сплайнов, чтобы та могла влиться в трафик. Как только она вставала на это место, ИИ Active Life в этой машине сразу выключался, а включался обычный ИИ, отвечавший за поведений машин внутри трафика.

Кроме того, разработчики наделили каждую машину своими уникальными характеристикам, которые диктовали её поведение на дороге. Эти черты определяли вероятность выезда на полосу встречного движения, возможность двигаться по тротуарам, предпочтительную скорость движения. Также эти характеристики устанавливали, что интереснее машине — движение по шоссе, переулкам или грунтовым дорогам, аккуратно ли будет машина ехать или начнёт таранить окружающие автомобили.

Самообучаемый ИИ

Gran Turismo Sophy создана на принципах машинного обучения. Но в этом плане она вовсе не новатор. Ранее разработчики гоночных игр уже применяли эту технологию или экспериментировали с её внедрением. Один из самых удачных и ярких примеров — система Drivatar в серии игр Forza. Она используется в ней с 2005 года и считается одной из самых долгоживущих систем машинного обучения в игровой индустрии.

Forza Horizon 4
Forza Horizon 4

Если вкратце, ИИ учится у игрока, как водить машину. Но особенность системы Drivatar в том, что она не просто повторяет за игроком его действия. На основе знаний, полученных о вашем умении ездить, она делает реалистичные предположения о том, как бы вы повели себя в ситуации, в которой раньше никогда не оказывались. Грубо говоря, ИИ может проехаться по незнакомой вам трассе так, как это сделали бы вы.

Это система работает на основе нейросети — она обрабатывает все возможные решения, которые мог принять игрок на трассе, и назначает определённый вес тем цепочкам нейронов, которые чаще соответствуют поведению игрока.

А чтобы нейросеть не начинала повторять один и тот же сценарий поведения, вместо обычных нейросетей разработчики использовали так называемые Байесовские сети. Если сильно упростить, в них связи между нейронами представлены не конкретными числами, обозначающими вес этой связи, а вероятностями этих цифр.

Forza Horizon 4
Forza Horizon 4

На примере игры Forza это выглядит так. Зная, как игрок проходит определённый поворот, на каждом кругу Drivatar предлагает несколько вариантов угла, под которым машина будет проходить поворот, а также несколько вариантов скорости, на которой она должна ехать. Затем Drivatar из этих вариантов выбирает тот, который ближе всего к тому, что сделал игрок.

Чтобы лучше понять, как игрок ведёт себя на трассе, Drivatar разбивает трек на небольшие фрагменты и изучает поведение пользователя на каждом из них. Например, трассу Road Atlanta он разбивает на 27 фрагментов и смотрит, в какой позиции машина находится на дороге, на какой скорости едет, а также насколько последовательно игрок действует. При этом ИИ бесполезно учить плохому — он просто не учитывает такие попытки.

Также Drivatar подразумевает, что игрок с каждым разом ездит всё лучше и лучше, поэтому приоритет при воспроизведении его поведения отдаётся более новым данным.

Forza Horizon 4
Forza Horizon 4

В играх Forza Motorsport с первой по четвёртую части использовалась первая версия Drivatar, которая существовала только на консоли игрока и получала знания лишь от него.

Начиная с Forza Motorsport 5, использовалась уже вторая версия системы Drivatar. Теперь ИИ жил не на одной консоли, а обитал в облаке в Xbox Network. А значит, у игрока был доступ не только к своему натренированному Drivatar, но и к тем, которые тренировались у других игроков. Так что можно было покататься с ИИ, который научился ездить у вашего друга, например. При этом у Drivatar есть интересная особенность. Если ваш друг постоянно таранит машины, то наученный им ИИ, будет и вас таранить на трассе, так как вы находитесь в списке его друзей в Xbox. А вот игрока не из списка друзей она таранить не будет.

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

160160
11 комментариев

Хорошо, если все гоночные машины, как в «Формуле-1», одинаковые и равны в своих характеристиках.👀

20
Ответить

И тут такие самовозы..

5
Ответить

Ага, я бы еще понял Формула-2, как моно-серия, пусть и со своими условностями, но Формула-1, где три-четыре поставщика моторов, куча разных решений по шасси и аэродинамике, плюс бюджеты и так далее, где есть такие монстры как Мерсы и Ред Булл и такие сосунки как Хаас образца 2021-го - ну да, ну да, одинаковы и равны :)

Ответить

Блин, такой интересный материал, но люди не ставят плюсики, не пишут комменты, эх…
Автору большое спасибо. Очень познавательно

8
Ответить

Вот тоже негодую в адрес форзовских драйватаров. В FH5 если обогнать всех драйватаров, они просто начинают ехать стройной колонной, без обгонов, атак и маневров, при том что машины хоть и в одном классе производительности, но все же не одинаковые. А с повышением уровня сложности навыки всех ботов не растут, просто появляется 1, 2 или 3 драйватара, которые едут как черти быстро, не допуская ошибок, и догнать их зачастую просто невозможно.
Допускаю, что проблема в том, с кого драйватары считываются, потому что подавляющее количество ботов в гонке оказывается первого уровня, т.е. даже при работающей нейросети считывать попросту нечего. Но в таком случае нужно было учесть этот момент и делать выборку только среди активно играющих. А этого явно нет, как и нормального перемешивания образов ботов, потому что запросто можно увидеть на стриме какого-нибудь особо яростного драйватара, а потом самому в игре из гонки к гонке видеть его уже у себя в оппонентах.
Подводя итог - задумка драйватаров хорошая, но она не работает.

4
Ответить

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

1
Ответить

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

3
Ответить