# Параметры ноды FlyGuard. # Меняются при запуске: ros2 launch flyguard detect.launch.py fov_deg:=35.0 flyguard: ros__parameters: # --- вход ------------------------------------------------------------- # В предоставленных записях встречаются оба имени топика, поэтому нода # подписывается и на основной, и на запасные: какой появится, с тем и работает. input_topic: /lidar_points fallback_topics: - /sensing/lidar/hesai128/pointcloud - /points_raw # Кадр лидара весит до 24 МБ и уходит по UDP десятками тысяч фрагментов. # При BEST_EFFORT потеря одного фрагмента отбрасывает всё сообщение целиком, # поэтому по умолчанию надёжная доставка. best_effort: false queue_depth: 10 # Сырые байты CDR вместо сборки Python-объекта sensor_msgs: на 24 МБ она # стоит дороже всей обработки. Разбор идёт своим парсером, без копирования. raw_subscription: true # Обработка в колбэке, а не в отдельном потоке: поток боролся за GIL # с приёмом и ронял выработку с 10 до 2 Гц при такте конвейера 32 мс. async_worker: false frame_id: "" # пусто — берётся из заголовка сообщения # --- габарит и зона поиска ------------------------------------------- # Полуширина габарита: так его задают организаторы в синтетике 24.09 # («у края» — до 1.13 м от оси, «вне, но близко» — с 1.14). Было 1.6: # ложная тревога на предмете вне габарита. EXPERIMENTS п. 18.4. half_width: 1.2 # полуширина габарита приближения, м h_lo: 0.28 # нижняя граница над головкой рельса, м h_hi: 2.3 # верхняя граница, м # Верхняя секция: от h_hi до h_top, но уже, |u| < half_width_top, и не # дальше top_d_max — то, что свисает со свода в путь вагона. У стен на этой # высоте кабели и светильники, поэтому основной ширины там нет. 0 — выкл. h_top: 3.3 half_width_top: 1.0 top_d_max: 90.0 # Пол между рельсами (|u| <= 0.85 м) опущен, но только дальше core_from: # лежащий человек высотой 0.30 м при поле 0.28 м виден верхушкой в два # сантиметра. Ближе пол прежний — там в полосу 0.16…0.28 м попадают # головки рельсов, рельс собирается в одну компоненту от кабины, и # предмет выбрасывается вместе с ней. EXPERIMENTS п. 16.3. h_lo_core: 0.16 # пол в колее, м core_from: 30.0 # с какой дальности он опускается, м # Кластеризация ведётся по области выше габарита, чтобы увидеть, что колонна # или рама крепи продолжается до свода: без этого срез конструкции по верхней # границе сам выглядит компактным предметом ростом с габарит. ctx_up: 4.0 # насколько контекст поднимается выше h_hi, м # Разделение фигуры и фона по скорости сближения вдоль луча. Стена, # параллельная движению, вдоль луча не приближается; предмет приближается # ровно на пройденный путь. Поднимает рабочую дальность с 62 до 80 м, но # вчетверо увеличивает ложные тревоги — в тоннеле много поверхностей, # обращённых к поезду. 0 — выключено, рабочее значение 0.6. split_adv: 0.0 # Разделение фигуры и фона по контрасту ламины. Гладкая стена даёт нулевой # центр-окружение по построению, предмет на стене — ступеньку. Разрезаются # только компоненты, растёкшиеся вдоль стены (глубже max_depth), и только # по лучам, торчащим из своего окружения дальше этого порога, м. # 0 — выключено. split_gap: 6.0 split_near: 55.0 # ближе этого не резать: там предмет виден и так, м # Сколько фигур выносить из одной компоненты. Разрез отрезает фон, и # протяжённость кандидата вдоль пути падает с 6.9 до 0.8 м — вместе с ней # пропадает множитель компактности, давивший конструкции вдесятеро. Поэтому # каждая лишняя фигура дорога: без ограничения 9.4 ложных трека на км, при # двух 7.4, при одной 6.4 — и дальность обнаружения при этом одна и та же. split_top: 1 # --- привыкание внутри проезда (кратковременная память) ------------- # Замысел: гасить формы, встретившиеся в нескольких разных точках пути, без # единого прошлого проезда. ВЫКЛЮЧЕНО: измерено, что избирательности нет — # при неснасыщающейся ёмкости механизм не меняет ничего (7.5 против 7.5 # ложных треков на км), а видимый эффект маленькой популяции был насыщением, # которое давит предмет сильнее обстановки. EXPERIMENTS п. 10. enable_habituation: false hab_rate: 0.25 # депрессия KC→MBON за одно новое место hab_place_m: 5.0 # разнос, с которого место считается другим, м hab_recover_m: 800.0 # путь, за который привыкание сходит наполовину, м # --- накопление слабых улик (веерное тело) -------------------------- # Предмет неподвижен в мире, тоннель проплывает мимо: лучи из габарита # складываются в сетку, привязанную к пути. На дальностях, где локальный # контраст структурно равен нулю (кольцо окружения упирается в стену той # же дальности), это единственная доступная улика. Удваивает рабочую # дальность ценой роста ложных треков с 5.2 до 9.1 на километр. enable_accumulator: true acc_near: 55.0 # ближе этого покадровый тракт справляется сам, м acc_gain: 1.5 # опора, засчитываемая за полный контраст # --- обученное считывание MBON --------------------------------------- # Те же слои грибовидного тела, другой учитель: веса KC→MBON обучены # различать предмет и обстановку на метках, изготовленных физикой # (tools/make_training_set.py). Заменяет ручную формулу веса улики. # Путь подставляется launch-файлом (artifacts/mbon_readout.npz в пакете); # пустой — работает прежняя ручная формула. mbon_path: "" enable_mbon: true # Резкость вероятности: вес наблюдения p**1.5. Ложных на незнакомой линии # 23.5 → 14.7 на км почти без потери дальности (EXPERIMENTS п. 17.4). mbon_power: 1.5 mbon_blend: 1.0 # 1 — только модель, 0 — только ручная формула # --- вычисления ---------------------------------------------------------- # Сетчатка, ламина и кластеризация — на видеокарте, если PyTorch её видит # (контейнер с --gpus all), иначе и при любом сбое — на процессоре. # Результат одинаков: те же операции в тех же типах (EXPERIMENTS п. 21). # Видеокарта поднимается в фоне: пока греются ядра CUDA, кадры считает процессор. device: auto # auto | cuda | cpu d_min: 4.0 # ближе этого не смотрим, м d_max: 220.0 # дальше физического предела прибора смысла нет, м fov_deg: 30.0 # полусектор обработки по азимуту, ° min_rays: 4 # минимум лучей на кандидата # --- память тоннеля --------------------------------------------------- # Без неё штатные конструкции тоннеля не подавляются и ложных тревог заметно больше. memory_path: "" # путь подставляется launch-файлом # --- вывод ------------------------------------------------------------ publish_markers: true publish_debug_cloud: false brain_view: false # вид мозга: для демонстрации, не для замеров задержки # scheme — нарисованная схема нейропилей; # cloud — 139 255 нейронов коннектома FlyWire на своих местах; # hybrid — панели решётки сверху и облако нейронов снизу (по умолчанию). brain_style: hybrid brain_period: 0.2 brain_scale: 1 # масштаб вида мозга: 2–3 — картинка для 2K/4K (атласы x2, x3)