Карта действий XR
Godot имеет свойство "action map" (карты действий) в составе системы XR. В настоящее время эта система является частью модуля OpenXR. В ближайшем будущем планируется включить в неё WebXR, поэтому в этом документе мы называем её системой карт действий XR. Она реализует встроенную систему карт действий OpenXR практически в том виде, в котором она предлагается.
Система карт действий XR предоставляет вашей игре/приложению входные, позиционные и выходные данные для контроллеров XR. Это достигается за счёт предоставления именованных действий, которые можно адаптировать к вашей игре/приложению, и их привязки к фактическим входам и выходам на ваших устройствах XR.
Поскольку карта действий XR в настоящее время является частью модуля OpenXR, для ее отображения необходимо включить OpenXR в настройках проекта:
Затем в нижней части экрана вы увидите интерфейс карты действий XR:
Примечание
Встроенная система ввода Godot имеет много общего с системой карт действий XR. По сути, наша первоначальная идея заключалась в том, чтобы расширить функциональность существующей системы ввода и предоставить данные системе карт действий OpenXR. Возможно, мы когда-нибудь вернёмся к этой идее, но, как оказалось, было слишком много проблем, которые нужно было решить. Вот некоторые из них:
Система ввода Godot в основном основана на кнопочном управлении, а XR добавляет триггеры, оси, позы и тактильные (выходные) в миксе. Это значительно усложнило бы систему ввода функциями, которые не работают с обычными контроллерами или контрастируют с текущим подходом. Предполагалось, что это приведет к путанице у большинства пользователей Godot.
Система ввода Godot работает с необработанными входными данными, которые анализируются и запускают соответствующие действия. Эти данные доступны конечному пользователю. OpenXR полностью скрывает необработанные данные и выполняет весь анализ автоматически, мы получаем доступ только к уже проанализированным данным действий. Эта несогласованность может привести к ошибкам, когда ничего не подозревающий пользователь попытается использовать XR-устройство как обычное устройство ввода.
Система ввода Godot позволяет изменять привязку входных данных к действиям во время выполнения, а OpenXR — нет.
Система ввода Godot основана на идентификаторах устройств, которые не имеют смысла в OpenXR.
Это означает, что в игре/приложении, сочетающем традиционные устройства ввода с XR-контроллерами, будет присутствовать разделение. В большинстве приложений используется либо один, либо другой, и это не считается проблемой. В конечном счёте, это ограничение системы.
Карта действий по умолчанию
Godot автоматически создаст карту действий по умолчанию, если файл карты действий не найден.
Предупреждение
По умолчанию, эта карта была разработана, чтобы помочь разработчикам портировать свои XR-игры/приложения с Godot 3 на Godot 4. В результате эта карта, по сути, привязывает все известные входы на всех контроллерах, поддерживаемых по умолчанию, к действиям один на один. Это не лучший пример настройки карты действий. Она даёт новому разработчику отправную точку для знакомства с Godot XR. Это избавляет от необходимости сначала разрабатывать полноценную карту действий для своей игры/приложения.
В этом пошаговом руководстве мы начнём с пустой карты действий. Вы можете удалить запись "Godot action set" вверху, нажав на значок корзины. Это очистит все действия. Также можно удалить контроллеры, которые вы не хотите настраивать, подробнее об этом позже.
Наборы действий
Примечание
Прежде чем мы углубимся в детали, в этом документе мы встретим термин "XR runtime" (среда выполнения XR). Под XR runtime мы подразумеваем программное обеспечение, которое управляет гарнитурой дополненной или виртуальной реальности и взаимодействует с ней. XR runtime предоставляет нам доступ к этим функциям через API, например, OpenXR. Итак:
для Steam это SteamVR,
для Meta на десктопе это Oculus Client (в том числе при использовании Quest Link),
для Meta on Quest это собственный клиент OpenXR от Quest,
в Linux это может быть Monado и т. д.
Карта действий позволяет нам организовывать действия в наборы. Каждый набор можно включать и отключать по отдельности.
Идея здесь заключается в том, что можно использовать разные наборы, обеспечивающие привязки в разных сценариях. Например:
набор
Character controlдля тех случаев, когда вы ходите,
Vehicle control, установленное для случаев, когда вы управляете транспортным средством,
Menuустанавливается, когда меню открыто.
После этого можно будет включить только тот набор действий, который применим к текущему состоянию вашей игры/приложения.
Это особенно важно, если вы хотите привязать один и тот же входной сигнал контроллера к другому действию. Например:
в вашем наборе
Character controlу вас может быть действиеJump,в вашем наборе
Vehicle controlу вас может быть действиеAccelerate,в вашем наборе
Menuможет быть действиеВыбрать.
Все они привязаны к триггеру на вашем контроллере.
OpenXR привязывает вход или выход только к одному действию. Если один и тот же вход или выход привязан к нескольким действиям, обновляться/использоваться будет тот, который находится в активном наборе действий с наивысшим приоритетом. Поэтому в нашем примере выше важно, чтобы был активен только один набор действий.
Для вашей первой XR-игры/приложения мы настоятельно рекомендуем начать с одного набора действий и не усложнять все слишком сильно.
Для нашего пошагового руководства в этом документе мы создадим один набор действий с именем my_first_action_set. Для этого мы нажмём кнопку :
Столбцы в нашей таблице следующие:
Col |
Значение |
Описание |
|---|---|---|
1 |
my_first_action_set |
This is the internal name of the action set. OpenXR doesn't specify specific restrictions on this name other than size, however some XR runtimes will not like spaces or special characters. |
2 |
Мой первый набор действий |
Это понятное человеку имя набора действий. Некоторые среды выполнения XR отображают это имя конечному пользователю, например, в диалоговых окнах настройки. |
3 |
0 |
Это приоритет набора действий. Если несколько активных наборов действий привязаны к одним и тем же входам или выходам контроллера, обновляемое действие будет определяться набором действий с наивысшим приоритетом. |
Действия
На карте действий XR действия — это сущности, с которыми будет взаимодействовать ваша игра/приложение. Например, мы можем определить действие Shoot (Стрельба), и входные данные, связанные с этим действием, активируют сигнал button_pressed в соответствующем узле XRController3D в вашей сцене, используя Стрельба в качестве параметра name сигнала.
Вы также можете опрашивать текущее состояние действия. XRController3D например имеет метод is_button_pressed.
Действия могут использоваться как для ввода, так и для вывода, и каждое действие имеет тип, который определяет его поведение.
Тип
Boolиспользуется для дискретного ввода, например кнопок.Тип
Floatиспользуется для аналогового входа, например, триггеров.
Эти два типа являются особенными, поскольку только они взаимозаменяемы. OpenXR обрабатывает преобразования между входными данными и действиями Bool и Float. Вы можете получить значение действия типа Float, вызвав метод get_float в узле XRController3D. При изменении значения он генерирует сигнал input_float_changed.
Примечание
При запросе аналоговых входов в виде кнопок применяется пороговое значение. В настоящее время этим пороговым значением управляет исключительно среда выполнения XR. В будущем планируется расширить Godot, чтобы обеспечить определённый уровень контроля над этими пороговыми значениями.
Тип Vector2 определяет входные данные как осевые. Сенсорные панели, мини-джойстики и аналогичные устройства ввода представлены как векторы. Вы можете получить значение действия типа Vector2, вызвав метод get_vector2 в узле XRController3D. При изменении значения он генерирует сигнал input_vector2_changed.
Тип Pose определяет пространственно отслеживаемый входной сигнал. В OpenXR доступно несколько типов входных сигналов «поза»: aim, grip и palm. Узел XRController3D автоматически позиционируется на основе действия позы, назначенного свойству pose этого узла. Подробнее о позах позже.
Примечание
Реализация OpenXR в Godot также предоставляет специальную позу, называемую Skeleton. Она является частью реализации отслеживания рук. Эта поза доступна через действие Skeleton, которое поддерживается вне системы карт действий. Таким образом, она всегда присутствует, если поддерживается отслеживание рук. Для её использования не требуется привязывать действия к этой позе.
Наконец, единственный тип выхода — Haptic, позволяющий настроить интенсивность тактильной обратной связи, например, вибрации контроллера. Контроллеры могут иметь несколько тактильных выходов, а поддержка тактильных жилетов появится в OpenXR.
Итак, давайте добавим действие для нашей позы прицеливания. Для этого мы нажимаем кнопку + для нашего набора действий:
Столбцы в нашей таблице следующие:
Col |
Значение |
Описание |
|---|---|---|
1 |
aim_pose |
Это внутреннее имя действия. OpenXR не устанавливает конкретных ограничений на это имя, кроме размера, однако некоторые среды выполнения XR не поддерживают пробелы или специальные символы. |
2 |
Aim pose (Поза цели) |
Это понятное человеку имя действия. Некоторые среды выполнения XR отображают это имя конечному пользователю, например, в диалоговых окнах настройки. |
3 |
Pose (поза) |
Тип этого действия. |
OpenXR определяет ряд связываемых поз ввода, которые обычно доступны для контроллеров. Нет правил, определяющих, какие позы поддерживаются различными контроллерами. В настоящее время OpenXR определяет следующие позы:
На большинстве контроллеров прицельная поза расположена немного впереди контроллера и направлена вперёд. Это положение отлично подходит для лазерных указок или для выравнивания дула оружия.
На большинстве контроллеров поза захвата расположена там, где расположена кнопка захвата. Ориентация этой позы различается в зависимости от контроллера и может различаться для одного и того же контроллера в разных средах выполнения XR.
На большинстве контроллеров ладонь располагается по центру ладони руки, держащей контроллер. Это новая поза, доступная не во всех средах выполнения XR.
Примечание
Если используется отслеживание рук, в настоящее время существуют значительные различия в реализациях между различными средами выполнения XR. В результате карта действий пока не подходит для отслеживания рук. Работа над этим ведётся, поэтому следите за новостями.
Давайте завершим наш список действий для очень простой игры/приложения-стрелялки:
Действия, которые мы добавили:
движение, которое позволяет пользователю перемещаться за пределами обычного отслеживания масштаба помещения.
grab (захват), который определяет, что пользователь хочет что-то удержать.
shoot (выстрел), который определяет, что пользователь хочет выстрелить из оружия, которое он держит.
haptic (тактильный), который позволяет нам выводить тактильную обратную связь.
Обратите внимание, что мы не различаем левую и правую руку. Это определяется на следующем этапе. Мы реализовали систему действий таким образом, что можно назначить одно и то же действие обеим рукам. Соответствующий узел XRController3D будет генерировать сигнал.
Предупреждение
Для захвата и выстрела мы использовали тип Bool. Как упоминалось ранее, OpenXR автоматически преобразует аналоговые элементы управления, однако не все среды выполнения XR в настоящее время применяют разумные пороговые значения.
В качестве обходного пути мы рекомендуем использовать тип Float при взаимодействии с триггерами и кнопками захвата и применять собственное пороговое значение.
Для кнопок типа A/B/X/Y и подобных, где нет аналоговой опции, тип Bool подходит отлично.
Примечание
Вы можете привязать одно и то же действие к нескольким входам одного контроллера в одном профиле. В этом случае среда выполнения XR попытается объединить входы.
Для входных данных
Boolэто выполнит операциюOR (ИЛИ)между кнопками.Для входных данных
Floatбудет использоваться наибольшее значение из связанных входных данных.Поведение для входных данных
Poseне определено, но, скорее всего, будет использоваться первый привязанный входной сигнал.
Не следует привязывать несколько действий из одного набора к одному входу контроллера. В этом случае, или если действия привязаны из нескольких наборов действий с перекрывающимися приоритетами, поведение не определено. Среда выполнения XR может просто не принять вашу карту действий или будет принимать её в порядке живой очереди.
Мы всё ещё изучаем ограничения, связанные с привязкой нескольких действий к одному и тому же выходу, поскольку этот сценарий имеет смысл. Спецификация OpenXR, похоже, не допускает этого.
Теперь, когда мы определили основные действия, пришло время их подключить.
Profiles
В OpenXR привязки контроллеров хранятся в так называемых "Профилях взаимодействия". Мы сократили название до "Profiles", поскольку это занимает меньше места.
Такое общее название выбрано потому, что контроллеры не охватывают всю систему. В настоящее время существуют также профили для трекеров, пультов дистанционного управления и отслеживаемых ручек. Также предусмотрены такие устройства, как беговые дорожки, тактильные жилеты и т.п., хотя они пока не включены в спецификацию.
Предупреждение
Важно знать, что OpenXR строго проверяет поддерживаемые устройства. Базовая спецификация определяет ряд контроллеров и аналогичных устройств с их поддерживаемыми входами и выходами. Каждая среда выполнения XR должна принимать эти профили взаимодействия, даже если они неприменимы.
Новые устройства добавляются через расширения, и среды выполнения XR должны указывать, какие из них они поддерживают. Среды выполнения XR, не поддерживающие устройства, добавленные через расширения, не будут принимать эти профили. Среды выполнения XR, не поддерживающие добавленные типы входных или выходных данных, часто приводят к сбоям при их наличии.
Таким образом, Godot хранит метаданные всех доступных устройств, их входов и выходов, а также информацию о том, какие расширения поддерживают их. Вы можете создать профили взаимодействия для всех устройств, которые хотите поддерживать. Godot отфильтрует те, которые не поддерживаются средой выполнения XR, используемой пользователем.
Это означает, что для поддержки новых устройств вам может потребоваться обновить Godot до более новой версии.
Однако важно отметить, что карта действий была разработана с учётом этого. Когда на рынке появляются новые устройства или ваши пользователи используют устройства, к которым у вас нет доступа, система карты действий опирается на среду выполнения XR. Задача среды выполнения XR — выбрать наиболее подходящий профиль взаимодействия из указанных и адаптировать его к контроллеру, используемому пользователем.
То, как это делает среда выполнения XR, зависит от её реализации, поэтому между средами выполнения существуют существенные различия. Некоторые среды выполнения даже позволяют пользователям самостоятельно редактировать привязки.
Распространённый подход для среды выполнения — сначала найти соответствующий профиль взаимодействия. Если он не найден, она проверит наиболее распространённые профили, например, профиль "Touch controller", и выполнит преобразование. Если всё вышеперечисленное не удаётся, она проверит общий профиль "Simple controller".
Примечание
Здесь следует сделать важный вывод: когда контроллер найден и к нему применена карта действий, среда выполнения XR не ограничена точными конфигурациями, заданными в редакторе карт действий Godot. Хотя среда выполнения обычно выбирает подходящее сопоставление на основе одной из привязок, заданных в карте действий, она может отклоняться от него.
Например, при использовании профиля "Touch controller" может иметь место любой из следующих сценариев:
мы могли бы использовать контроллер Quest 1,
мы могли бы использовать контроллер Quest 2,
мы могли использовать контроллер Quest Pro, но профиль Quest Pro не был предоставлен, или используемая среда выполнения XR не поддерживает контроллер Quest Pro,
это может быть совершенно другой контроллер, для которого не предоставлен профиль, но среда выполнения XR использует сенсорные привязки в качестве базы.
Таким образом, в настоящее время нельзя так просто взять и узнать, какой именно контроллер использует пользователь.
Предупреждение
Наконец, и это многих сбивает с толку, привязки не являются незыблемыми. Вполне допустимо и даже ожидаемо, что среда выполнения XR позволяет пользователю настраивать привязки.
На данный момент ни одна из сред выполнения XR не предлагает такой функционал, хотя в SteamVR есть существующий пользовательский интерфейс из системы карт действий OpenVR, который всё ещё доступен. Работа над этим активно ведётся.
Наша первая привязка контроллера
Давайте настроим нашу первую привязку контроллера, используя в качестве примера Touch (Сенсорный) контроллер.
Нажмите"Add profile", найдите контроллер Touch и добавьте его. Если его нет в списке, возможно, он уже добавлен.
Теперь в нашем пользовательском интерфейсе отображаются панели как для левого, так и для правого контроллеров. Панели содержат все возможные входы и выходы для каждого контроллера. Мы можем использовать + рядом с каждой записью, чтобы привязать её к действию:
Давайте завершим нашу настройку:
Каждое действие привязано к заданному входу или выходу для обоих контроллеров, что указывает на поддержку этого действия на любом из них. Исключением является действие движения, которое привязано только к правому контроллеру. Вероятно, нам понадобится использовать левый стик для другой цели, например, для телепортации.
При разработке игры/приложения необходимо учитывать вероятность того, что пользователь изменит привязку и привяжет движение к левому джойстику.
Также обратите внимание, что наши булевы действия «стрелять» и «схватить» связаны с входными данными типа Float. Как уже упоминалось, OpenXR выполняет преобразования между этими типами, но обязательно ознакомьтесь с предупреждением по этому поводу, данным ранее в этом документе.
Примечание
Некоторые из входных данных, похоже, появляются в нашем списке несколько раз.
Например, мы можем обнаружить кнопку X дважды: один раз как X click, а второй раз как X touch. Это связано с тем, что сенсорный контроллер Touch оснащен емкостным датчиком.
X touchбудет верным, если пользователь просто касается кнопки X.X clickбудет верным, когда пользователь действительно нажмет на кнопку.
Аналогично для джойстика имеем:
Thumbstick touch (Касание джойстиком), которое будет верным, если пользователь касается джойстика.Thumbstick, который задает значение направления, в котором перемещается джойстик.Thumbstick click, который происходит, когда пользователь нажимает на джойстик.
Важно отметить, что лишь ограниченное число контроллеров XR поддерживают сенсорные датчики или имеют функцию нажатия на джойстиках. Имейте это в виду при разработке игры/приложения. Убедитесь, что они используются для дополнительных функций вашей игры/приложения.
Простой контроллер
"Simple controller" — это универсальный контроллер, предлагаемый OpenXR в качестве запасного варианта. Применим наше сопоставление:
Как становится до боли ясно, простой контроллер зачастую оказывается слишком простым и не подходит ни для чего, кроме самых простых игр/приложений виртуальной реальности.
Вот почему многие среды выполнения XR используют его только в качестве крайней меры и сначала пытаются использовать привязки из одной из наиболее популярных систем в качестве запасного варианта.
Примечание
Поскольку простой контроллер, вероятно, не покрывает потребности вашей игры, возникает соблазн предоставить привязки для каждого контроллера, поддерживаемого OpenXR. Карта действий по умолчанию, похоже, предполагает такой вариант. Как упоминалось ранее, карта действий по умолчанию была разработана для упрощения миграции из Godot 3.
Рабочая группа OpenXR рекомендует настраивать только привязки для контроллеров, действительно протестированных разработчиком. Среды выполнения XR разработаны с учётом этого. Они могут лучше выполнить перепривязку предоставленной привязки, чем разработчик может делать обоснованные предположения. Тем более, что разработчик не может проверить, насколько это удобно для конечного пользователя.
Мы также советуем: ограничьте свою карту действий профилями взаимодействия для устройств, на которых вы действительно тестировали игру. Контроллер Oculus Touch широко используется в качестве резервного контроллера во многих средах выполнения. Если вы сможете протестировать игру на Meta Rift или Quest и добавить этот профиль, то с высокой вероятностью она будет работать и на других гарнитурах.
Модификаторы привязки
Одна из основных целей карты действий — исключить необходимость знания приложению используемого оборудования. Однако иногда оборудование имеет физические различия, требующие изменения входных данных способами, отличными от тех, которые привязаны к действиям. Эта потребность варьируется от установки пороговых значений до изменения входных данных, доступных на контроллере.
Модификаторы привязки отключены по умолчанию и требуют включения в настройках проекта OpenXR. Кроме того, нет гарантии, что эти модификаторы поддерживаются всеми средами выполнения. Вам необходимо обратиться в службу поддержки целевых сред выполнения и решить, стоит ли использовать модификаторы или реализовать какой-либо резервный механизм.
Если вы ориентируетесь на несколько сред выполнения, поддерживающих одни и те же контроллеры, вам может потребоваться создать отдельные карты действий для каждой среды выполнения. Вы можете контролировать, какую карту действий будет использовать Godot, используя разные шаблоны экспорта для каждой среды выполнения и используя специальный тег feature tag для настройки карты действий.
В Godot модификаторы привязок делятся на две группы: модификаторы, работающие на уровне профиля взаимодействия, и модификаторы, работающие на отдельных привязках.
Модификаторы привязки в профиле взаимодействия
Доступ к модификаторам привязки, применяемым ко всему профилю взаимодействия, можно получить с помощью кнопки модификаторов в правой части редактора профиля взаимодействия.
Вы можете добавить новый модификатор, нажав кнопку .
Предупреждение
Поскольку Godot не знает, какие контроллеры и среды выполнения поддерживают модификатор, ограничений на добавление модификаторов нет. Неподдерживаемые модификаторы будут игнорироваться.
Модификатор привязки Dpad
Модификатор привязки dpad (крестовины) добавляет новые входы в профиль взаимодействия для каждого джойстика и сенсорной панели на этом контроллере. Он превращает вход в dpad с отдельными кнопками вверх, вниз, влево и вправо, которые отображаются как кнопки:
Примечание
Входные данные, относящиеся к расширениям, обозначены звездочкой.
Чтобы использовать модификатор привязки dpad, вам необходимо включить расширение модификатора привязки dpad в настройках проекта:
Включения расширения достаточно, чтобы эта функция работала с настройками по умолчанию.
Добавление модификатора необязательно, но позволяет точно настроить работу Dpad. Вы можете добавить модификатор несколько раз, чтобы задать разные настройки для разных устройств ввода.
Эти настройки используются следующим образом:
Action Setопределяет набор действий, к которому применяются эти настройки.
Input Pathопределяет исходный ввод, который сопоставляется с новыми вводами dpad.
Thresholdуказывает пороговое значение, которое активирует действие dpad, например, значение0.6означает, что если расстояние от центра превысит0.6, будет нажато действие dpad.
Threshold Releaseуказывает пороговое значение, которое отключает действие dpad, например, значение0.4означает, что если расстояние от центра становится меньше0.4, действие dpad отменяется.
Center Regionопределяет расстояние от центра, на котором активируется центральное действие. Поддерживается только для трекпадов.
Wedge Angleопределяет угол каждого клина. Значение90 градусовили меньше означает, что для up «вверх», down «вниз», left «влево» и right «вправо» существуют отдельные срезы, в которых они находятся в нажатом состоянии. Значение выше90 градусовозначает, что срезы перекрываются, и в нажатом состоянии могут находиться несколько действий.
Is Sticky, если эта опция включена, действие остается в нажатом состоянии до тех пор, пока джойстик или трекпад не переместился в другой клин, даже если он покинул клин для этого действия.
On Hapticпозволяет нам определить тактильный вывод, который автоматически активируется при нажатии действия.
Off Hapticпозволяет нам определить тактильный вывод, который автоматически активируется при прекращении действия.
Модификаторы привязки для индивидуальных привязок
Доступ к модификаторам привязки, применяемым к отдельным привязкам, можно получить с помощью кнопки модификатора привязки рядом с действием, прикрепленным к входу:
Вы можете добавить новый модификатор, нажав кнопку .
Предупреждение
Поскольку Godot не знает, какие входные данные в каждой среде выполнения поддерживают модификатор, ограничений на добавление модификаторов нет. Если расширение модификатора не поддерживается, модификаторы будут отфильтрованы во время выполнения. Добавление модификаторов к неправильному входному сигналу может привести к ошибке во время выполнения.
Вам следует протестировать свою карту действий на реальном оборудовании и в среде выполнения, чтобы убедиться в правильности настройки.
Аналоговый модификатор порога
Модификатор аналогового порога позволяет задать пороговые значения, используемые для любого аналогового входа, например, триггера, имеющего логический вход. Он управляет состоянием нажатия входа.
Для использования этого модификатора необходимо включить расширение аналогового порога в настройках проекта:
Аналоговый модификатор порога имеет следующие настройки:
Они определяются следующим образом:
On Thresholdуказывает пороговое значение, которое включит действие, например, значение0,6означает, что когда аналоговое значение становится выше0,6, действие устанавливается в нажатое состояние.
Off Thresholdуказывает пороговое значение, при котором действие отключается, например, значение0,4означает, что когда аналоговое значение опускается ниже0,4, действие переходит в отключенное состояние.
On Hapticпозволяет нам определить тактильный вывод, который автоматически активируется при нажатии на кнопку ввода.
Off Hapticпозволяет нам определить тактильный выход, который автоматически активируется при прекращении ввода.
Тактильные ощущения на модификаторах
Модификаторы могут поддерживать автоматический тактильный вывод, который срабатывает при достижении пороговых значений.
Примечание
В настоящее время оба доступных модификатора поддерживают эту функцию, однако нет никаких гарантий, что будущие модификаторы также будут иметь эту возможность. Поддерживается только один тип тактильной обратной связи, но в будущем могут появиться и другие варианты.
Тактильная вибрация
Тактильная вибрация позволяет нам определить простой тактильный импульс:
Он имеет следующие возможности:
Duration— это длительность импульса в наносекундах.-1позволяет среде выполнения выбрать оптимальное значение для короткого импульса, подходящего для текущего оборудования.
Frequency— это частота импульса в Гц.0позволяет среде выполнения выбирать оптимальную частоту для короткого импульса, подходящую для текущего оборудования.
Amplitude— амплитуда импульса.