Мне тут сказали, что вам понравился мой предыдущий рассказ про историю и устройство летной модели самолетов в нашем проекте, и что вам хотелось бы услышать рассказ еще про что-нибудь эдакое. Вообще руководителю проекта сложно рассказывать о чем-нибудь интересно, так как специфика работы сугубо техническая и вся «закручена» вокруг довольно сложных понятий. Но я попробую. Поразмышляв, мы решили, что уж коли в прошлый раз мы вам рассказывали о том, как устроена физическая модель самолета, то в этот раз логично было бы рассказать, как устроена модель искусственного интеллекта (ИИ) летчика им управляющего.

В начале, снова немного истории и общих понятий. Вообще, надо сказать, что принципиальные различия в устройстве ИИ в разных авиасимуляторах найти достаточно сложно, т.к. оптимальные методы решения подобных задач известны давно и используются повсеместно. ИИ летчика, как и любой другой ИИ «водителя технического средства» — это всегда так называемая «машина состояний», когда весь объем решаемых ИИ задач разделяется на такое количество основных режимов (состояний), при котором поведение ИИ в каждом из режимов может быть описано своим достаточно простым алгоритмом с минимальным количеством условностей. Для летчика Второй мировой это порядка 20-30 «состояний» таких, как «руление по аэродрому», «взлет», «полет на точку», «полет за ведущим», «поиск, выбор и распределение воздушных целей», «заход на атаку воздушной цели», «атака воздушной цели» и так далее.

Каждое «состояние» имеет также набор условий, когда происходит вход в это состояние и набор условий выхода.

Внутри каждого состояния находится алгоритм управления самолетом, его системами и вооружением в зависимости от ряда внешних условий. Например, в состоянии «захода на атаку наземной цели» есть пять основных уровней принятия решений:

  1. ИИ строит траекторию полета и график изменения скорости вдоль этой траектории в зависимости от своего положения и положения наземной цели.
  2. ИИ управляет ручкой управления, педалями и ручкой газа в зависимости от отклонения от построенной траектории и заданной скорости, с учетом текущей скорости и высоты, а также особенностей самолета.
  3. ИИ продолжает оценивать обстановку вокруг себя и, в случае появлении угрозы или преждевременного пропадания цели, или появления более приоритетных целей – выходит из «состояния захода» и переходит в то состояние, которое будет наилучшим образом соответствовать сложившейся обстановке.
  4. ИИ продолжает следить за поступающими из системы скрипта миссии командами, и, в случае поступления новой команды, прекратит выполнять атаку и перейдет в состояние, соответствующее выполнению вновь поступившей команды.
  5. ИИ следит за состоянием самолета, и если, например, остаток топлива или оружия не будет позволять ему продолжать атаку, то он выйдет из этого состояния и перейдет в «состояние возврата на базу».

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

ИИ самолетов в РоФ.

Когда мы разрабатывали ИИ для проекта РоФ, в основном он был сделан так же, как и во всех предшественниках, но нам необходимо было привнести какую-то изюминку, которая отличала бы наш ИИ от остальных в лучшую сторону. Мест для «изюминок» было выбрано два:

  1. ИИ в РоФ управляет ровно таким же самолетом, каким управляет игрок, без упрощений физической модели. Это приятно для пользователя тем, что самолеты ИИ, так же, как и самолет игрока, движутся «как живые», также правдоподобно себя ведут при взлете/посадке, маневрировании и при получении повреждений. Игрок не чувствует, что «ИИ меня перекручивает, потому что летает по рельсам», и наоборот, не чувствует что «слишком просто перекрутить ИИ потому, что тот летает на упрощенной ФМ». Все по-честному, и это чувствуется.
  2. Особенный упор был сделан на комплексном подходе к логике «состояния поиска, выбора и распределения воздушных целей», алгоритм выбора был сделан весьма разветвленным, со множеством дополнительных условий, направленных на усиление влияния воздушной обстановки вокруг ИИ-самолета на принятие им решений по выбору целей и распределения их между своими ведомыми.

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

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

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

— Разница максимальных скоростей целей на их текущих высотах

— Разница максимальных скороподъемностей целей на их текущих высотах

— Разница высот целей

— Разница в количестве других вражеских самолетов в районе целей

— Разница в классе целей (истребитель, разведчик, бомбардировщик)

Обработав стандартным способом экспертные оценки нескольких человек и внеся корректировки в эти оценки для разных уровней сложности ИИ, мы получили стандартный метод сортировки целей по их приоритетности. Если взять, что разница по времени перехвата в 60 секунд дает +1 в копилку «приоритетности цели», то разница в 120 секунд даст +2. А экспертное сравнение говорит нам, что если 60 секунд — это +1, то разница в максимальных скоростях в 100км/ч — это тоже +1, а разница в 50 км/ч — это +0.5. И так далее по всем параметрам.

Далее происходит выбор цели из списка всех видимых ИИ-летчиком целей: сначала исключаются те, которые подпадают под условия фильтрации, такие, как:

— Цели, перехват которых займет слишком много времени (по причине большой дальности, или по причине их большой высоты, или по причине того, что они очень скоростные)

— Цели, вокруг которых настолько больше истребителей противников, чем истребителей союзников вокруг самолета игрока, что бой с ними самоубийствен (это условие в основном влияет на ИИ-асов).

— Цели выше, чем максимальная высота полета самолета ИИ-летчика.

— Цели, значительно выше самолета ИИ-летчика, у которых при этом значительно выше скороподъемность.

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

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

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

В результате РоФ получил логику выбора целей ИИ-лидером звена наиболее приближенную к реальной практике воздушного боя среди всех аналогов на тот момент. Причем логика эта получилась прозрачной и легко корректируемой, просто изменением значений указанных выше «парных параметров». Кроме того, в РоФ реализовано множество интересных особенностей поведения ИИ, таких, как: противозенитные маневры, система учета видимости цели, учитывающая освещенность, закрытие облаками, подсвет прожекторами. При этом на освещенность цели влияют также и источники света на самой цели такие, как аэронавигационные огни, вспышки выстрелов пулеметов, пожары.

Надо заметить, что часть пользователей воспринимали часть этих «фич» за баги. Например, когда ИИ-лидер звена игрока не хотел атаковать значительно превосходящие силы противника. А на самом деле, ИИ-лидер просто не хотел лезть в бой, в котором вряд ли выживет он и его звено. Или когда, опять же, ИИ-лидер не хотел атаковать разведчик, идущий прямо над головой звена игрока, на большой высоте. А на самом деле, ИИ-лидер просто прикинул, что время набора высоты до этого разведчика настолько велико, что к тому моменту, как это свершиться, он, скорее всего, улетит на свою территорию. В этих случаях нам приходилось объяснять, что «так мол и так, ИИ-летчики высокого уровня не глупые и в авантюры стараются не пускаться». Хотя, конечно же, при столь высоком уровне сложности ИИ, как в РоФ, проблем было не избежать. Но мы их планомерно вычленяли и исправляли. Отдельное спасибо хочется сказать Александру Петряеву, программисту ИИ, который создавал программную архитектуру и код, что уже 4 с половиной года служат в проекте РоФ и которые еще много лет будут служить основой для ИИ-летчиков в новом проекте «Ил-2: Штурмовик».

ИИ самолетов в БзС.

Вообще надо сказать, что ИИ летчика в РоФ изначально разрабатывался с «дальним прицелом» на самолеты Второй Мировой войны. И базово ИИ из РоФ мог быть использован с минимальными изменениями и в «Ил-2: БзС». Однако мы решили, что очередной шаг вперед в этой области необходим, и выбрали место, где этот шаг будет наиболее ожидаем пользователями. Если в РоФ при проектировании и разработке ИИ мы сделали фокус на логике поиска и выбора целей, то в БзС мы решили сосредоточиться на боевом маневрировании при ведении ближнего воздушного боя. В РоФ в «состоянии атаки воздушной цели» ИИ-истребители фактически выполняют всегда один универсальный маневр – поворачивают на цель по кратчайшей 3-х мерной дуге, где бы цель ни находилась (сзади, справа, сверху, снизу). Для Первой Мировой войны такой подход был оправдан по той причине, что воздушный бой на самолетах ПМВ очень компактный, скоротечный, время разворота очень маленькое, маневрирование происходит на скоростях порой меньше 100 км/ч, и разложить его на «маневры» очень сложно.

Однако во Второй Мировой войне картина воздушного боя радикально отличается от таковой в ПМВ: бой занимает в разы больший объем, расстояния между самолетами при маневрировании намного больше, намного выше скорости, намного больше время разворота. В этой ситуации структурирование маневренного боя становится более очевидным, и появляется возможность это структурирование формализовать. Этой задачей занялся наш новый программист ИИ, Илья aka «naryv» Стешов. Надо сказать, что в первую очередь он занялся доводкой и отладкой ИИ в проекте РоФ, и все изменения, которые произошли в ИИ весной этого года – его заслуга и его работа. Кроме того, для составления технического задания снова были привлечены эксперты, которые давали консультации по вопросам боевого маневрирования – какие маневры применялись, в каких случаях они применялись, как влиял уровень летчика на применение тех или иных маневров, каковы были условия начала и прекращения маневров. Получив такую экспертную оценку, мы выбрали следующий путь решения данной задачи: «состояние атаки воздушной цели» стало «макроуровнем», раскрывающимся внутри себя в «машину состояний» нижнего уровня. Каждый маневр ближнего воздушного боя проектировался как отдельное «состояние» этой новой низкоуровневой машины. При этом логика «макросостояния атаки воздушной цели» продолжала функционировать со всеми условиями входа и выхода, что позволило сделать это нововведение в рамках архитектуры ИИ РоФа без серьезных трудозатрат на архитектурные изменения в верхнем уровне «машины состояний» и всей остальной логики ИИ. Итак, какие маневры и когда применяет ИИ-истребитель в ближнем бою в БзС:

— «Доворот и стрельба». Это основной режим, в целом аналогичный алгоритму наведения, использовавшемуся в РоФ. Применяется, когда цель близко к линии прицеливания и надо довернуть на нее и стрелять.

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

— «Полупетля». Самолет выполняет половину «Петли Нестерова». Цель применения та же, что и у «Свечи».

— «Горка». Самолет набирает высоту по прямой по довольно крутой траектории (но не вертикальной). Применяется тогда, когда происходит «проскакивание» цели при умеренном превышении по скорости в случае, когда атака была произведена сбоку или «в лоб». Цель применения снова та же – сохранение энергии путем перевода скорости в высоту.

— «Боевой разворот». Самолет набирает высоту по крутой спирали с потерей скорости. Цель применения та же, что и у «Горки», но также может  применяться после атаки на цель сзади.

— «Восходящая спираль». Самолет выполняет разворот на максимальном газу в сторону цели, на постоянной скорости и с набором высоты. Применяется в тех случаях, когда в процессе атаки цель оказывается выше более чем на 100-200 метров и сбоку от нас (не по курсу).

— «Нисходящая спираль». Самолет выполняет разворот на максимальном газу в сторону цели со снижением и набором скорости. Применяется тогда, когда цель ниже более чем на 100-200 метров и сбоку от нас (не по курсу). Также может быть применена для попытки сбросить противника с хвоста при достаточном запасе высоты, т.к. в нисходящих спиралях развиваются очень высокие и продолжительные перегрузки.

— «Форсированный разворот». Самолет выполняет разворот в горизонтальной плоскости на максимальном газу и перегрузке. Применяется, когда цель на приблизительно той же высоте, что и наш самолет, сбоку от нас, но в передней полусфере.

— «Вираж». Самолет выполняет разворот в горизонтальной плоскости на максимальном газу, перегрузкой поддерживая постоянную оптимальную скорость выполнения виража. Применяется во всех остальных случаях.

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

— «Low Yo-Yo». Самолет при выполнении «виража» немного увеличивает крен на непродолжительное время, немного набирая скорость за счет потери высоты, что, в свою очередь, позволяет кратковременно ускорить разворот на цель за счет увеличения перегрузки. Этот подрежим маневра «вираж» применяется тогда, когда угол на цель не меняется продолжительное время (когда самолеты не могут обойти друг друга в вираже).

— «Переворот». Самолет «переворачивается на спину» и выполняет вторую половину «Петли Нестерова» с максимальной перегрузкой на максимальном газу. Применяется в случае, когда надо сбросить противника с хвоста и когда есть достаточный запас высоты.

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

— «Ножницы». Самолет сбрасывает скорость и выполняет последовательные отвороты вправо и влево. Применяется, чтобы сбросить противника с хвоста, когда запас высоты недостаточен и когда наш самолет более устойчив на малых скоростях, чем самолет противника.

— «Штопорная бочка». ИИ-летчик «подрывает» самолет вверх, и одновременной закруткой его по крену. Также применяется для сбрасывания противника с хвоста. Маневр очень сложный и доступен только ИИ-асам.

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

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

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

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

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

— При уклонении от истребителей противника штурмовики и бомбардировщики теперь выполняют не только «змейку», но и пикирование, когда это позволяет высота и расстояние до противника.

— Позже, зимой, мы планируем создать функционал передового авианаводчика, который сможет оценивать обстановку на вверенном ему участке поля боя и наводить истребители и штурмовики на цели, используя радиообмен. В то же время сами ИИ-самолеты тоже получат все навыки для взаимодействия и радиообмена с наводчиком.

— В дополнение к существующей логике атаки наземных целей ИИ-самолеты будут обучены применять неуправляемые ракеты с пикирования, аJu-87 и Пе-2 – выполнять бомбометание с отвесного пикирования.

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

Кроме того:

— ИИ-летчики были обучены вести радиообмен с аэродромом и со своими ведомыми/ведущими

— ИИ-самолеты также были научены выполнять руление со стоянки на взлетную полосу для взлета и с полосы на стоянку после посадки

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

Важно отметить, что почти весь этот новый функционал готов, и вы сможете все это увидеть и попробовать во время раннего доступа. Конечно, система ИИ уже в РоФ была очень сложна, и в БзС она стала еще сложнее, что неминуемо приведет к некоторым багам, но времени для отладки достаточно, и к релизу мы рассчитываем довести ИИ-летчиков до очень качественного состояния.

Вы, конечно, можете спросить – «а зачем это все надо?» Ответ так же прост, как и вопрос – мы стремимся сделать картину воздушного боя максимально правдоподобной не только за счет детальной и реалистичной флайт-модели (о чем я рассказывал вам в прошлый раз), но и за счет разветвленной, комплексной и реалистичной логики поведения ИИ-союзников и ИИ-противников. В следующий раз я вам расскажу, что еще мы делаем для повышения уровня реализма и зрелищности воздушных боев, так как ФМ и ИИ далеко не единственные составляющие этого вопроса.

До встречи! 🙂

ZAK: Как вы, наверняка, помните, мы обещали уникальный скин на Bf.109 F-4 каждому, кто оформит предзаказ до 1 октября. И теперь предлагаем вам самостоятельно определить, как он будет выглядеть.Подробности в специально созданной темеУникальный скин для Bf.109F-4 — сбор предложений

Напоминаю также, что в группе Товарищей продолжается голосование, цель которого — выяснить мнение пилотов об эксклюзивности подарка (R7 для Bf.109F-4) — ССЫЛКА.

И на десерт — обои для рабочего стола с главным героем предыдущего голосования о подарочном скине — ЛаГГ-3 «Товарищ» (4:3 и 16:9)

 

wp_comrad_1920x1080_ru.jpg            wp_comrad_1920x1200_ru.jpg

Leave a Reply

Your email address will not be published. Required fields are marked *

*


2 + 9 =


Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.