# Fly Drone Эксперимент: может ли **симуляция связей мозга дрозофилы** выбирать направление поворота виртуального дрона к цели? Используется опубликованный MaleCNS v1.0 через [`flybrain` 0.1.0](https://github.com/alextitonis/fly.ai). Физического дрона и команд для него здесь нет. **Текущая сводка исследований:** [результаты, контроли и открытые вопросы](docs/research-results.md). **План следующих проверок:** [GitHub Issues](https://github.com/hldrnwnv/fly-drone/issues). Каждый вопрос содержит исходное наблюдение, контрольные условия и ожидаемые записи опыта. **Текущий простой сценарий:** FPV-камера измеряет направление движущейся цели, коннектом выбирает сторону поворота, а обычный стабилизатор удерживает квадрик и управляет четырьмя винтами. Запуск: `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase`. [Видео и результаты первого этапа](runs/chase/report.md); [тот же сценарий с картами глубины и оптического потока](runs/chase-depth-flow/report.md). Прямое управление винтами через нервную систему крыльев описано ниже как отдельный исследовательский опыт. ## Запуск Нужны Python 3.10+ и около 1 ГБ места под окружение и данные. При первом запуске библиотека скачает подготовленные файлы коннектома (~260 МБ). На macOS удобно использовать Python из Homebrew: ```bash python3 -m venv .venv .venv/bin/python -m pip install -e . FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-drone ``` Откройте `runs/demo/replay.html` в браузере. Метрики, входные углы, активности DNa02, предсказания, полные траектории и обученный декодер сохраняются рядом (`results.json`, `readout.npz`). Для быстрого пробного запуска: `--train-samples 48 --validation-samples 16`. CPU симуляция полного коннектома может занять несколько минут. ## Что именно обучается Симулятор знает положение цели и вычисляет её направление относительно дрона. Адаптер подаёт искусственный сигнал на левые или правые LC10a нейроны, связанные с отслеживанием визуальной цели. Модель `flybrain` проводит сигнал по фиксированному графу MaleCNS. Линейный декодер обучается по активности левого и правого нисходящих DNa02 нейронов определять знак поворота. Величина поворота дополнительно ограничивается по углу на цель. Дрон летит на постоянной высоте и скорости; модель управляет только рысканием. В `results.json` есть точность направления на отложенных примерах и повторные полёты — к цели слева и справа (по умолчанию пять случайных зерен для каждой). Для каждой цели сохранены также геометрический контроллер и полёт без поворота. В `replay.html` показан первый полёт каждой серии. Это позволяет увидеть результат и пределы модели, а не приписывать любое движение нейросети. ## Ограничения и происхождение данных MaleCNS — [опубликованная карта нервной системы самца дрозофилы](https://male-cns.janelia.org/), а не запись динамики живого мозга. Используемая библиотека моделирует нейроны упрощённым leaky integrate-and-fire способом. Сенсорный вход здесь сконструирован вручную; связи мозга не меняются при обучении. Успешный полёт показывает работоспособность этого интерфейса и декодера, но сам по себе не доказывает, что структура коннектома улучшает управление по сравнению с простой сетью или геометрическим контроллером. ## Проверка ```bash .venv/bin/python -m unittest discover -s tests -v ``` Тесты проверяют геометрию и движение симулятора. Реальный запуск `fly-drone` нужен для проверки интеграции с коннектомом и создаёт файл воспроизведения. ## FPV-квадрик в MuJoCo Дополнительный эксперимент использует **физический 3D симулятор MuJoCo** и [модель квадрокоптера](assets/fpv_quad.xml) класса FPV с четырьмя отдельными входами тяги. Параметры модели ориентировочные: масса 0,75 кг, четыре мотора, инерция корпуса и реактивный момент винтов. Есть камера от первого лица, внешний ракурс и две цветные рамки. Успех означает пересечение плоскости рамки внутри проёма. ```bash .venv/bin/python -m pip install -e '.[fpv]' FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv simulate ``` Команда создаёт `runs/fpv/results.json`, два MP4 с кадрами FPV и внешней камеры, а также `readout.npz`. Для MP4 нужен `ffmpeg`; без видео используйте `--no-video`. На macOS можно открыть интерактивное 3D окно и воспроизвести записанный полёт: ```bash .venv/bin/mjpython -m fly_drone.fpv_cli replay --run brain_left ``` Нейронный выход определяет **только поворот вокруг вертикальной оси**. Внутренний стабилизатор регулирует четыре тяги для удержания высоты, наклона и скорости вперёд. Модель пока не включает задержку моторов, аэродинамику пропеллеров и калибровку по конкретному реальному квадрику; запись FPV здесь является видом из виртуальной камеры, а не подачей изображения в мозг дрозофилы. ## Сравнение по FPV-камере ```bash FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv benchmark ``` Команда сравнивает геометрическое управление, исходный коннектом и три независимо перемешанных графа с теми же числами входящих/исходящих связей. Все получают направление рамки из одной виртуальной FPV-камеры 320×180 и принимают решение каждые 0,4 с. Проверяются обе рамки, обычное изображение и случайное отключение 30% кадров, по пять запусков на условие. Стартовая позиция и курс немного варьируются между повторами, но совпадают для всех контроллеров в одном повторе. Для каждого варианта нейросети одинаковы обучающие углы, число шагов симуляции, два нейрона считывания и метод обучения декодера. Камера, стабилизатор и геометрия трассы одинаковы. Разные траектории в замкнутом контуре дают разные кадры; дополнительная проверка `open_loop` проигрывает всем контроллерам **точно одни и те же** измеренные углы и хеши кадров геометрического полёта. В `runs/vision-benchmark/results.json` записаны исходные измерения, хеши изображений, команды, траектории, точность направления, пересечения рамок, ошибка по центру рамки, задержки решения и пропуски срока 400 мс. Нейросети и геометрический алгоритм имеют один срок принятия решения, но затрачивают разное число операций. Срок проверяется по времени, хотя офлайн-симулятор не задерживает команду при его превышении. **Цвет рамки выделяется вручную**: коннектом получает готовый угол, не сырой видеопоток. Это проверка управления при пропусках измерений, а не доказательство преимущества в обработке сложного зрения. ## Полёт за движущейся целью ```bash FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase ``` В сцене движется простая 3D-модель коровы по плавной извилистой траектории. FPV-камера дрона ищет яркую метку на её задней стороне. Угол метки поступает в тот же адаптер LC10a → MaleCNS → DNa02, который выбирает поворот. Видимый размер метки даёт грубую оценку расстояния; отдельный регулятор меняет скорость вперёд, чтобы оставаться позади. Стабилизатор удерживает высоту и управляет четырьмя тягами. Координаты коровы используются для анимации и оценки результата, но не передаются контроллеру. Команда записывает три нейронных повтора, обычное геометрическое наведение, полные трассы в `runs/chase/results.json`, а также видео `follow_demo.mp4` и `geometric.mp4` с FPV и внешним ракурсом. Для видео выбирается первый успешный нейронный повтор; результаты всех повторов остаются в JSON. Отслеживание считается успешным, когда после первых 4 с дрон проводит не менее 70% времени на расстоянии 1,4–3,5 м позади цели с боковой ошибкой меньше 1 м. Яркая метка распознаётся простым алгоритмом: это демонстрация слежения, а не самостоятельного распознавания коровы мозгом дрозофилы. Для проверки **обоняния** запустите `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase-odor --output runs/chase-odor`. Виртуальный пищевой запах движется вместе с коровой по упрощённому шлейфу; две антенны передают концентрации в левые/правые `ORN_DM1/ORN_VA2`. Сравниваются метка без запаха, метка с запахом и запах без зрительного наведения. В трёх парных стартах критерий слежения выполнили соответственно 2/3, 1/3 и 0/3: обонятельный вход менял нейронные команды, но полезного наведения пока не дал. [Протокол, трассы и три видео](runs/chase-odor/report.md). Это модель пищевого запаха, не измеренный запах коровы; декодер `DNa02` обучен на зрительном угле. Следующий опыт исправляет это несоответствие: `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase-odor-nav --output runs/chase-odor-navigation` отдельно обучает считывание разницы запаха по спайкам левых/правых ORN и добавляет датчик направления ветра. На восьми новых положениях неподвижного источника нейронный вариант приблизился ближе 0,75 м в 4/8 случаях, один ветер — 0/8, прямые концентрации — 6/8, обмен сторон — 0/8. Движущуюся корову он пока не сопровождает: 0/3. [Метод, контрольные полёты и видео](runs/chase-odor-navigation/report.md). Это сенсорный адаптер с внешним правилом навигации, а не восстановленный моторный рефлекс мухи. Совмещение со зрением проверено командой `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase-odor-fusion --output runs/chase-odor-fusion`: цветная метка скрывается **от контроллера** в трёх заданных окнах полёта. Без помощи все 3 старта теряют критерий слежения; с ветром 1/3, с ветром и ORN 0/3. Перестановка запаховых сторон даёт 2/3 — явный признак, что прямое правило поворота по мгновенному градиенту плохо подходит к движущемуся шлейфу. [Парные результаты и видео](runs/chase-odor-fusion/report.md). Следующий опыт `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase-odor-history --output runs/chase-odor-history` проверяет поворот по истории концентраций и изменению запаха относительно ветра на новых сценах. Движущаяся цель сопровождалась в 0/4 с историей идеальных концентраций и в 1/4 с историей ORN; прежнее мгновенное правило на тех же сценах дало по 3/4. Отдельно проверен виртуальный источник запаха в предсказанной фильтром Калмана позиции цели. [Протокол, отрицательные результаты и полные трассы](runs/chase-odor-history/report.md). Чтобы увидеть на **том же движущемся полёте** оценку глубины и оптический поток, установите `.[fpv,perception]` и запустите `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase --depth-flow-video --output runs/chase-depth-flow`. Дополнительное видео `follow_depth_flow.mp4` показывает FPV, неподвижную камеру мира с координатами коровы и дрона, относительную обратную глубину Depth Anything V2 и поток RAFT Small. Корова движется по траектории, хотя её упрощённая модель не анимирует ноги. `sensory_maps.npz` сохраняет точные кадры камеры и выходы моделей в моменты принятия решений. Карты здесь только отображаются; поворот по прежнему определяется меткой и нейронным считыванием. Первый кадр не имеет потока, затем карты обновляются раз в 0,4 с и удерживаются между решениями. Живая дрозофила обрабатывает движение изображения: [нейроны T4/T5 участвуют в анализе оптического потока](https://www.nature.com/articles/s41586-025-09276-5), а [оценку относительного расстояния по параллаксу](https://pmc.ncbi.nlm.nih.gov/articles/PMC12652897/) проверяли в задаче пересечения щели. Нейросетевые карты на нашем видео не являются восстановлением этих вычислений в коннектоме; их использование для управления требуется проверять отдельным опытом. Такой опыт запускается командой `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase-vision --output runs/chase-neural-vision` после установки `.[fpv,perception]`. Он сравнивает одинаковые начальные условия и вычислительный бюджет для трёх входов: только направление метки, плюс поток в `T4/T5`, затем относительное движение ближнего и дальнего в `LC15` и приближение в `LPLC2`. Считывание `DNa02` и стабилизатор фиксированы. В первом опыте все три варианта выполнили критерий слежения в 2/3 полётов; поток изменил величину многих команд, но пока не показал преимущества. [Метод, видео и полные парные результаты](runs/chase-neural-vision/report.md). Для проверки более раннего зрительного пути запустите `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv chase-retina --output runs/chase-retina`. Камера сохраняет кадры каждые 40 мс; последовательности их яркости подаются через `eye_drive` на 6006 фоторецепторов MaleCNS. Сравниваются тот же угол метки, внешний поток RAFT и угол метки вместе с сырыми кадрами на рецепторах. Граф, считывание `DNa02`, стабилизатор и вычисление моделей на кадрах решения одинаковы. Контрольный повтор точно тех же кадров в прямом, обратном и неподвижном порядке проверяет, вызвано ли изменение активности временной структурой, а не одной яркостью. Это только одномерная проекция по горизонтальной координате рецепторов: вертикальной карты и точной модели глаза в этих данных нет. Карты глубины и потока на видео для ретинального варианта показаны лишь для сравнения, в его нейронный вход они не поступают. Первые три парных полёта дали 2/3 успешных слежения во всех вариантах; отдельная проба с движущейся полосой пока не выявила устойчивой избирательности к направлению в этой реализации. [Протокол, видео и результаты](runs/chase-retina/report.md). **Что означает `photoreceptor input`.** Это один массив из 6006 значений яркости от 0 до 1, по одному на размеченный фоторецептор левого или правого глаза модели. Оба глаза получают соответствующие горизонтальные участки **одного** кадра FPV: отдельных левой и правой камер, стереозрения и вертикальных координат рецепторов здесь нет. Из RGB-кадра берётся яркость центральной половины по высоте, усредняется для каждого столбца и выбирается по примерному азимуту рецептора. `eye_drive` добавляет этот сигнал к возбуждению клеток; спайки затем рассчитывает сама модель. Зелёная линия *Photoreceptor input* на видео показывает усреднённую по горизонтальным секторам **поданную яркость**, а не измеренные спайки или активность настоящей сетчатки. В `chase-retina` распознанный угол цветной метки дополнительно поступает в `LC10a`; `wing-direct --retina` использует рецепторный вход вместо этой искусственной подачи угла. ### Текущее объединение зрения и движения RGB — единственный источник визуальных данных: Depth Anything оценивает по нему **относительную** глубину, а RAFT по паре RGB-кадров — оптический поток в пикселях между кадрами. Поток показывает движение **изображения**, вызванное и поворотом дрона, и перемещением коровы; это не собственная скорость дрона в м/с. Собственная **угловая** скорость берётся отдельно из состояния MuJoCo в рад/с. В `chase-vision` поток условно возбуждает `T4/T5`, а совместные признаки потока и глубины — `LC15/LPLC2`; в **ретинальном варианте** `chase-retina` эти карты в мозг не подаются, подаётся последовательность яркостей. В обоих режимах угловую скорость использует обычный стабилизатор, но MaleCNS её не получает. Отдельный `wing-direct --gyro-3d --neural-vision` подаёт угловую скорость в выбранные клетки `SApp08` вместе с искусственными зрительными признаками. Это совместная стимуляция, а не откалиброванная сенсорная интеграция: поправки оптического потока на собственное вращение и обученного считывания всех каналов пока нет. [Подробная схема текущих входов](docs/research-models.md#current-sensor-fusion-state). ## Прямое управление винтами моторными нейронами крыльев ```bash FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv wing-direct ``` Этот отдельный опыт считывает спайки размеченных в MaleCNS нейронов DLM/DVM и b1/b2. Активность левого и правого крыла переводится в тягу соответствующих пар моторов, b1/b2 добавляют боковую и передне-заднюю разность тяг. Перед полётом фоновая активность DLM/DVM калибруется на тягу зависания квадрокоптера массой 0,75 кг. Четыре тяги подаются непосредственно в MuJoCo: стабилизатор и обученный декодер отключены. Камера по прежнему вручную выделяет метку и подаёт её угол в LC10a. Это **экспериментальная передаточная функция**, а не известная биологическая связь «нейрон → винт». Файл `runs/wing-direct/results.json` хранит каждый измеренный угол, спайки именованных клеток, силы четырёх моторов и траекторию. `wing_direct.mp4` показывает FPV и внешний ракурс. На первом проверенном запуске с `seed=7` дрон упал через 1,23 с; b1/b2 за полёт не дали спайков. Это отрицательный результат для данного входа и модели, а не вывод о возможностях живой мухи. Вариант `wing-direct --wing-wrench --output runs/wing-wrench` проверяет перевод **активность → намерение движения крыльев → сила и моменты корпуса → тяги четырёх винтов**. Фоновая активность DLM/DVM задаёт относительную мощность; нейтральная суммарная сила равна `масса × 9,81` Н. Отклонения b1/b2/b3/i1/i2 от собственного фона формируют условные разности амплитуды и угла атаки левого и правого крыла. Эти разности создают команды рыскания и крена; матрица квадрокоптера переводит их в ньютоны для каждого винта. Связь конкретных спайков с кинематикой крыла и коэффициенты моментов здесь **гипотезы**, а не измеренная биомеханика. Продольный момент пока равен нулю. Без обратной связи по ориентации вариант `seed=7` упал через 2,43 с (`runs/wing-wrench/results.json`); это не самостоятельное слежение за коровой. ## Гироскоп, оптический поток и глубина ```bash .venv/bin/python -m pip install -e '.[fpv,perception]' FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv wing-direct --wing-wrench --gyro-3d --neural-vision --output runs/wing-multisensory ``` `--gyro-3d` кодирует три компонента угловой скорости из MuJoCo в отдельные части популяций SApp08 слева и справа. `--neural-vision` запускает предобученные **RAFT Small** и **Depth Anything V2 Small** на кадрах той же FPV-камеры. Направления потока подаются в T4/T5, а расширение изображения, взвешенное относительной обратной глубиной, — в LPLC2. Это проверяемый сенсорный адаптер; его соответствие реальным рецептивным полям и масштабам сигналов не установлено. Глубина относительная, не в метрах. Первый кадр не имеет оптического потока. В `results.json` записаны значения сенсорных каналов, спайки и задержки. `sensory_maps.npz` содержит точные RGB-кадры и выходы двух сетей. `wing_direct.mp4` показывает FPV, внешний вид, карту глубины, поток и три оси гироскопа. Панели показывают последнее сенсорное обновление; между обновлениями изображение удерживается. Модели зрения запускаются каждые 0,4 с, поэтому время решения нужно сравнивать с этим сроком; запись видео производится после симуляции. Проверенный повтор `seed=7` с тремя входами упал через 2,15 с; среднее время решения составило 404 мс, один из шести шагов превысил интервал 400 мс. Это подтверждает работу передачи и отрисовки сигналов, но не устойчивое управление. Запуск только с новым переводом крыльев (`runs/wing-wrench`) продержался 2,43 с, а с прежним одноканальным гироскопом (`runs/wing-wrench-gyro`) — 3,54 с; по одному повтору нельзя оценить преимущество сенсоров. Для проверки обратной связи по вращению запустите `wing-direct --haltere-feedback --output runs/wing-haltere`. В этом варианте угловая скорость крена подаётся как искусственный стимул в группу `SApp08`, связанную с сенсорными клетками жужжалец. В первом повторе дрон также упал, через 0,8 с. У текущей модели нет потока оптического движения и полного сенсорного кодирования жужжалец; один скаляр угловой скорости их не заменяет. Флаг `--retina --output runs/wing-retina` подаёт усреднённую по высоте яркость кадра FPV на размеченные фоторецепторы вместо искусственной стимуляции LC10a. Это упрощённая одномерная проекция, которая не восстанавливает зрение или оптический поток мухи; с `seed=7` дрон упал через 1,16 с из-за крена. Флаг `--altitude-assist --output runs/wing-altitude` добавляет внешний регулятор только общей тяги. Он удержал высоту дольше, но крен привёл к падению через 1,41 с. Оба флага являются диагностикой, а не достигнутым нейронным управлением высотой. Исследовательская [модель Shiu](https://github.com/philshiu/Drosophila_brain_model) и [бенчмарк Eon](https://github.com/eonsystemspbc/fly-brain) используют FlyWire коннектом **головного мозга**, без грудного нервного центра с моторными нейронами крыльев. Поэтому их нельзя просто подключить к этим выходам. Для эксперимента с крыльями здесь использован MaleCNS, включающий головной мозг и вентральный нервный центр, но динамика пока остаётся реализацией `flybrain`, а не воспроизведением Shiu/Eon. См. [границы моделей](docs/research-models.md). Оригинальную модель Shiu можно отдельно проверить после установки `.venv/bin/python -m pip install -e '.[research]'` и клонирования её репозитория: `.venv/bin/python scripts/shiu_smoke.py --source /path/to/Drosophila_brain_model`. Проба на оригинальных данных FlyWire сохраняет число нейронов, связей и спайков в `runs/shiu-smoke/results.json`; дрон в ней не участвует. ## Подбор сенсорно-моторного интерфейса ```bash FLY_DATA="$PWD/data/flybrain" .venv/bin/python scripts/evolve_wing_interface.py ``` Генетический алгоритм меняет только пять чисел интерфейса: масштаб тяги, сглаживание спайков, боковое и продольное действие крыльевых моторных нейронов, а также усиление сигнала жужжалец. Связи и динамика `flybrain` зафиксированы. Быстрый опыт проверяет **выравнивание после заданной угловой скорости крена**; это ещё не слежение за целью. Два начальных возмущения используются при отборе, четыре других оставлены для проверки. Все кандидаты и оценки записываются в `runs/wing-evolution/results.json`. В первом опыте (5 поколений × 8 кандидатов) лучший вариант не удержался ни на одном из четырёх новых возмущений и проиграл исходному интерфейсу по средней оценке. Обычный регулятор крена и высоты на тех же четырёх начальных состояниях удержался все 3 секунды в каждом случае (`runs/wing-evolution/classical_pd.json`). Он обновляет тяги каждые 5 мс, нейронный интерфейс — каждые 100 мс: это проверка управляемости модели, а не равнобюджетное сравнение. Результат не доказывает невозможности нейронного управления: поиск мал, а кодирование сенсоров и моторное считывание остаются гипотезами. Проверка левой и правой реакции `SApp08 → b1/b2` доступна через `scripts/wing_reflex_probe.py`; на 12 зернах согласованной корректирующей реакции не получилось. ## Поиск премоторного пути выравнивания `scripts/probe_wing_premotor.py` сравнивает парную стимуляцию сенсорных и премоторных групп с фоном на одинаковых зернах. У `IN08B051_d` обнаружилась воспроизводимая асимметрия выходов i1/i2; группу можно проверить в полёте командой `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv wing-direct --wing-wrench --premotor-roll --decision-interval 0.1 --output runs/wing-premotor-flight`. Это **прямая стимуляция нейронов в грудном нервном центре по знаку гироскопа**, а не уже восстановленный путь от жужжалец. На восьми новых возмущениях с одинаковой внешней коррекцией высоты выбранное направление стимуляции выдержало 4 с в 7 случаях; без стимуляции и при перестановке сторон — 0 из 8. В полном полёте без внешней коррекции высоты дрон всё ещё падает. Точные связи, дозы, ответы нейронов и ограничения описаны в [исследовательской заметке](docs/research-models.md). Совместная стимуляция `SNpp26/27/37/38/06`, связанных с этим премоторным нейроном и напрямую с i2, выдержала все 8 из 8 изолированных испытаний крена, но в погоне без коррекции высоты дрон упал через 3,03 с. Запуск: `FLY_DATA="$PWD/data/flybrain" .venv/bin/fly-fpv wing-direct --wing-wrench --sensory-roll --decision-interval 0.1 --output runs/wing-sensory-flight`. Вариант `--sensory-triplet` оставляет только `SNpp37/38/06`. Направление стимуляции всё ещё задаёт внешний гироскоп и написанное нами правило; отдельные сенсорные группы не показали устойчивой реакции. Полные парные пробы и блокировка `IN08B051_d` находятся в `runs/wing-premotor-probe/`. Согласно [анатомической таблице](https://elifesciences.org/articles/107867/figures), `SNpp37/38` и `SNpp06/26` относятся к рецепторам крыла; происхождение `SNpp27` там не установлено. Поэтому режим `--sensory-roll` проверяет искусственную передачу гироскопа в крыльевые сенсорные клетки, а не воспроизводит жужжальца. Прямой вход из головного мозга пока не найден: пробная стимуляция четырёх нисходящих групп не дала повторяемой нужной реакции i1/i2. Эти отрицательные пробы не исчерпывают все нейроны и дозы. Подробности и границы вывода — в [исследовательской заметке](docs/research-models.md). ## Автоматический эволюционный поиск стимуляции ```bash FLY_DATA="$PWD/data/flybrain" .venv/bin/python scripts/evolve_stimulation.py --output runs/neural-stimulation-search ``` Поиск `rand/1/bin` меняет группу клеток, возбуждение или торможение, правило выбора стороны по гироскопу, усиление и длительность импульса. Популяция по умолчанию — 24 варианта, 10 поколений, четыре одинаковых обучающих зерна на вариант. После каждого кандидата обновляется `checkpoint.json`; для продолжения используйте ту же команду с `--resume`. Финалисты проверяются на новых нейронных зернах, затем на отдельных физических возмущениях; лучший переносится в полную сцену погони без внешней коррекции высоты. `results.json` хранит пробы и траектории, `report.md` — краткую сводку. Каждый запуск использует одну и ту же анатомическую матрицу MaleCNS с новым стохастическим зерном: это повторы модели, а не разные оцифрованные мухи. Первый автоматический прогон: 264 оценки и 2112 нейронных запусков. Лучший физический вариант с сенсорным пакетом `SNpp26/27/37/38/06` выдержал 8/8 новых испытаний крена с внешней коррекцией высоты; исходный пакет также выдержал 8/8, поэтому уверенного преимущества эволюции пока нет. Без коррекции высоты в погоне дрон упал через 3,06 с. См. [отчёт](runs/neural-stimulation-search/report.md). ## Прицельная проверка известных нейронных групп ```bash FLY_DATA="$PWD/data/flybrain" .venv/bin/python scripts/probe_known_flight_circuits.py ``` Эта проба измеряет отдельно активность моторных нейронов силы взмаха (`DLM/DVM`), руления (`b1/b3`, `i1/i2`) и промежуточных `w-cHIN`. На шести отложенных зернах возбуждение `DNg02` увеличило число спайков `DLM/DVM` в среднем на 90,7 за 0,6 с; старая оценка только по `i1/i2` этот эффект пропускала. `SApp08` сильно активировал `w-cHIN`, но не дал соответствующего выхода на `b1/b3`. Для `DNa04/05` устойчивого изменения `b1/b3` тоже не вышло. Запрос `SApp08` охватывает 47 клеток, так что определить работающий отдельный нейрон по этой пробе нельзя. Это ответы упрощённой модели при искусственном постоянном входе, а не проверенный рефлекс или полёт. [Метод, парные данные и ограничения](runs/directed-flight-circuits/report.md).