18 — Демо Fuzzy Turret Defense¶
🇬🇧 English | 🇺🇦 Українська
Опціональний модуль плагіна FuzzyLogicDemo постачає другу демонстраційну сцену: турель обороняється від хвиль ворожих дронів за допомогою трьох послідовних систем Мамдані замість одного вручну підібраного порогу. Одна система оцінює загрозу, друга наводиться, а третя вирішує, коли справді безпечно стріляти — і жодна з них не є конструкцією switch.
Як запустити¶
У Content Browser увімкніть іконку налаштувань (шестерня) → Show Plugin Content, якщо Plugins не видно, а потім перейдіть у Plugins → Fuzzy Logic Content → Demo → FuzzyTurretDefense → Maps і відкрийте FuzzyTurretDefense.
Запустіть Play або Standalone Game. Ворожі дрони наближаються з краю арени; турель супроводжує найближчого, розганяється й стріляє, коли її нечіткий вихід FireAuthorization перевищує поріг. Гільзи вилітають із бічного вікна гармати, падають на підлогу з фізикою і зникають через 14 секунд. Панель візуалізації Fire Control у нижньому правому куті малює три вхідні функції належності та агреговану поверхню FireAuthorization у реальному часі — про кнопки HIDE/SHOW і PAUSE/RESUME див. 16 — Демонстраційний контент.
Асети¶
Усі асети цього демо лежать у Content Browser під Plugins → Fuzzy Logic Content → Demo → FuzzyTurretDefense (увімкніть Show Plugin Content, якщо Plugins не видно):
| Ресурс | Призначення |
|---|---|
Maps/FuzzyTurretDefense |
Демонстраційна карта |
DA_RadarAssessment |
UFuzzySystemAsset пріоритету загрози |
DA_TrackingControl |
UFuzzySystemAsset швидкості наведення |
DA_FireControl |
UFuzzySystemAsset дозволу на вогонь |
RadarAssessment.json, TrackingControl.json, FireControl.json |
Редаговані JSON-вихідники трьох систем |
Blueprints/BP_FuzzyTurret |
Актор турелі: обертання, зчитування радара, стрільба, накопичення тепла |
Назви множин у JSON залишені англійськими, щоб їх було зручно шукати в Blueprint, але нижче наведено їхнє точне значення.
Число на виході не є перемикачем. Це дефазифікований результат у вказаному діапазоні: правила активують нечіткі множини, вони накладаються одна на одну, а метод Centroid повертає їхній центр ваги. Тому перехід між станами плавний.
Як читати параметри¶
Для Triangle параметри Left, Peak, Right означають: ступінь належності дорівнює 0 у лівій і правій точках та 1 у вершині. Між ними значення змінюється лінійно. Для Trapezoid повна належність триває від LeftShoulder до RightShoulder. У Ramp значення змінюється від 0 в Foot до 1 у Shoulder; якщо Shoulder менше за Foot, це спадна множина.
Накладання сусідніх множин навмисне: наприклад, результат може бути водночас частково Standby і Authorize. Детальніше про форми — у Функціях належності, а про правила та дефазифікацію — у Мові правил і Налаштуваннях висновку.
1. RadarAssessment — оцінювання загрози¶
Система визначає, наскільки пріоритетною є найближча ворожа ціль. TargetDistance вимірюється в Unreal units, ClosingRate — у Unreal units за секунду. Щокадру турель обчислює ClosingRate як (попередня дистанція − поточна дистанція) / Delta Seconds і обмежує результат діапазоном 0…1200: віддалення дає 0, швидке зближення — більше значення. Результат ThreatPriority передається у FireControl.
| Змінна | Діапазон | Множина | Параметри | Значення |
|---|---|---|---|---|
TargetDistance |
0…3200 | Critical |
Ramp: 1600 → 100 | критично близько; повна належність біля 100 і менше, зникає до 1600 |
Tactical |
Triangle: 700 / 1700 / 2700 | робоча дальність; найтиповіша близько 1700 | ||
Distant |
Ramp: 1900 → 3200 | далека ціль; сила зростає після 1900 і повна біля 3200 | ||
ClosingRate |
0…1200 | Slow |
Ramp: 650 → 0 | ціль зближується повільно або майже не зближується |
Fast |
Ramp: 250 → 1100 | швидке зближення; повна належність біля 1100 | ||
ThreatPriority |
0…1 | Observe |
Triangle: 0 / 0.12 / 0.45 | спостерігати, без високого пріоритету |
Track |
Triangle: 0.30 / 0.58 / 0.82 | супроводжувати ціль | ||
Engage |
Triangle: 0.68 / 0.93 / 1 | загроза достатня для ураження |
Правила підвищують пріоритет для близької або швидко наближуваної цілі. Далека повільна ціль дає Observe, далека швидка — Track, а критична або тактична швидка — Engage.
2. TrackingControl — швидкість наведення¶
Система обирає швидкість сервоприводу. AimError — кутова помилка між віссю гармати й ціллю у градусах. Результат TrackingSpeed — множник швидкості повороту, а не кут.
| Змінна | Діапазон | Множина | Параметри | Значення |
|---|---|---|---|---|
TargetDistance |
0…3200 | Near |
Trapezoid: 0 / 0 / 650 / 1450 | близька ціль |
Medium |
Triangle: 800 / 1650 / 2500 | середня дальність | ||
Far |
Trapezoid: 1900 / 2700 / 3200 / 3200 | далека ціль | ||
AimError |
0…180° | Aligned |
Trapezoid: 0 / 0 / 3 / 13 | гармату наведено: повна відповідність до 3°, спад до 13° |
Tracking |
Triangle: 5 / 35 / 85 | ціль у процесі наведення | ||
Lost |
Ramp: 45 → 150 | велика помилка: ціль майже або повністю втрачена | ||
TrackingSpeed |
0.8…7.5 | Precise |
Triangle: 0.8 / 1.5 / 3.2 | повільне точне доведення |
Responsive |
Triangle: 2.2 / 4.2 / 6.1 | звичайне стеження | ||
Rapid |
Triangle: 4.8 / 7.0 / 7.5 | швидкий пошук або перехоплення |
Головне правило тут просте: Lost дає Rapid, Tracking — Responsive, Aligned — Precise. Додаткове правило гарантує Rapid, якщо ціль одночасно далека і втрачена.
3. FireControl — дозвіл на вогонь¶
Система поєднує точність, пріоритет загрози та тепловий стан. Її вихід FireAuthorization — плавний показник дозволу на постріл від 0 до 1. Він не замінює механічні обмеження: Blueprint також перевіряє перезаряджання.
| Змінна | Діапазон | Множина | Параметри | Значення |
|---|---|---|---|---|
AimError |
0…180° | Locked |
Trapezoid: 0 / 0 / 2.5 / 9 | надійне захоплення; повна відповідність до 2.5°, зникає до 9° |
Marginal |
Triangle: 3 / 14 / 34 | допустима, але неточна наводка | ||
Unsafe |
Ramp: 14 → 75 | небезпечна помилка; повна належність від 75° | ||
ThreatPriority |
0…1 | Low |
Ramp: 0.70 → 0.05 | низький пріоритет; повна належність біля 0.05 і нижче |
High |
Ramp: 0.35 → 0.95 | високий пріоритет; повна належність біля 0.95 | ||
WeaponHeat |
0…1 | Safe |
Ramp: 0.82 → 0.05 | безпечна температура; повна належність біля 0.05 |
Hot |
Ramp: 0.58 → 0.98 | перегрів; повна належність біля 0.98 | ||
FireAuthorization |
0…1 | Inhibit |
Triangle: 0 / 0.08 / 0.42 | заборона вогню; найсильніша біля 0.08 |
Standby |
Triangle: 0.30 / 0.55 / 0.78 | супроводжувати й чекати кращої умови; максимум біля 0.55 | ||
Authorize |
Triangle: 0.68 / 0.94 / 1 | дозвіл на вогонь; найсильніший біля 0.94 |
Що означають значення FireAuthorization¶
0…0.42: активна множинаInhibit; стріляти не можна.- приблизно
0.30…0.78: областьStandby; система ще може супроводжувати ціль, але умови недостатні для пострілу. 0.68…1: активнаAuthorize; що ближче результат до0.94, то сильніша сукупна підстава для пострілу.
У демонстраційному Blueprint постріл фактично дозволяє перевірка FireAuthorization > 0.64 разом із нульовим FireCooldown. Поріг нижчий за початок Authorize (0.68), щоб у зоні переходу не виникало різкого перемикання, але низькі й невизначені результати все одно не могли запустити снаряд.
Правила безпеки мають пріоритет: Unsafe, Low або Hot ведуть до Inhibit. Лише поєднання Locked, High і Safe дає Authorize; Marginal, High, Safe дає проміжний Standby.
Роль JSON¶
DA_RadarAssessment, DA_TrackingControl і DA_FireControl побудовано з відповідних JSON-файлів (RadarAssessment.json, TrackingControl.json, FireControl.json) через FuzzyLogicStatics.load_fuzzy_system_from_json. Під час виконання BP_FuzzyTurret читає ці три Data Asset напряму; жоден JSON не парситься під час виконання й не потрібен запакованій збірці.
Можна також відкрити будь-який із трьох Data Asset, змінити систему в редакторі та натиснути Save To JSON, щоб синхронізувати зовнішній пресет вручну.
Що спробувати¶
- знизьте поріг
FireAuthorization > 0.64у Blueprint і подивіться, як турель починає стріляти раніше, з меншою впевненістю; - розширте
AimError.Lockedу FireControl і перевірте, наскільки неточнішу наводку турель терпітиме, перш ніж перестане стріляти; - змініть
WeaponHeat.Hot, щоб турелі доводилося охолоджуватися раніше; - додайте четверту множину
ThreatPriority(наприклад,Critical) і відповідне правило у FireControl; - перемкніть дефазифікацію
FireControlзCentroidнаMean of Maximaі порівняйте, наскільки рішучіше система переходить доAuthorize.
Демо-класи живуть у власному модулі плагіна FuzzyLogicDemo (Plugins/FuzzyLogic/Source/FuzzyLogicDemo) — вони постачаються з плагіном за замовчуванням, але можуть бути повністю виключені зі збірки; див. 16 — Демонстраційний контент.
Значення DefaultValue¶
DefaultValue в input — початкове значення до першого Set Input. Наприклад, AimError: 90 означає, що до отримання телеметрії система вважає вісь гармати помилковою на 90°.
DefaultValue в output не бере участі у висновку. Це лише значення за замовчуванням у структурі змінної; результат завжди обчислюється з правил і функцій належності. Для FireAuthorization: 0 воно також є безпечним початковим станом до першого обчислення.