loam сам выдвигает гипотезы, проверяет их собственными колёсами, учится по расходу батареи, где грунт дорогой, собирает скрытые образцы и всегда возвращается на базу.





Настоящий прогон в Gazebo, easy seed 7: робот идёт к максимуму сигнала, на карте его оценки стоимости грунта.
Нужен робот, который ведёт себя как исследователь, а не как пылесос с картой. На арене спрятаны образцы, грунт местами дорогой, батарея ограничена, а в сложном сценарии среда меняется без предупреждения: дорожает грунт, появляется опасная зона, сбоит датчик. Готового ответа нет:
- где лежат образцы, видно только по слабому сигналу датчика, который падает с расстоянием;
- сколько стоит проезд, видно только по тому, как быстро тает батарея на метр пути;
- если среда изменилась, старая модель продолжает уверенно врать, а робот об этом не знает.
loam решает это научным циклом: гипотеза → проверочное действие → независимое измерение → вывод → новое решение. Каждый прогноз записывается до поездки, каждый вывод опирается на измерения после неё, а журнал объясняет, почему робот поехал именно туда.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#ffffff","primaryTextColor":"#0d1212","primaryBorderColor":"#0d1212","secondaryColor":"#d3e4df","tertiaryColor":"#edf4f2","lineColor":"#717f80","textColor":"#0d1212","noteBkgColor":"#d3e4df","noteTextColor":"#34484a","actorBkg":"#ffffff","actorBorder":"#0d1212","fontFamily":"Inter"}}}%%
flowchart LR
S[("Сценарий<br/>скрыт от агента")] --> J["Gazebo и судья<br/>батарея · сигнал · события"]
J -- "наблюдения ROS 2" --> R["Исследование<br/>модель грунта · CUSUM<br/>гипотезы · опасности · датчик"]
R --> P{"План<br/>LLM или резерв"}
P --> V["Проверка подцелей<br/>достижимость · энергия на возврат"]
V --> N["Навигация A*<br/>по карте стоимостей"]
N --> G["Страж скорости<br/>cmd_vel_guard"]
G -- "TwistStamped" --> J
R --> L["Журнал<br/>прогноз · действие · вывод"]
V --> L
L --> U["Панель loam<br/>карта · план · аналитика"]
- LLM предлагает, код проверяет. Языковая модель по тексту миссии и состоянию предлагает последовательность подцелей. Каждую подцель код проверяет на достижимость и запас энергии на возврат, скоростью управляет алгоритм. Если модель молчит, медлит или ошибается, включается резервный планировщик, и панель показывает причину.
- Гипотезу проверяют колёсами. Перед поездкой агент записывает численный прогноз: расход на метр, сигнал в точке, интервал допустимых значений. Вывод считает алгоритм по новым измерениям: подтверждена, опровергнута или данных мало. Опровержение меняет карту стоимостей и следующий маршрут.
- Агент не видит ответов. Истина сценария есть только у судьи. Агент получает одометрию, лидар, батарею, датчик образцов и события столкновений, а изменения среды обнаруживает сам, по расхождению прогноза с измерениями.
Модель грунта — регуляризованная оценка расхода по участкам карты. Детектор CUSUM замечает, что расход
на знакомом участке перестал совпадать с прогнозом, и открывает гипотезу о смене режима. Опасные зоны
восстанавливаются из событий hazard_hit, а монитор датчика запрещает собирать образец вслепую, пока
сигнал шумит, залип или пропал. Страж скорости обнуляет команды, если процесс агента пропал или
наблюдения устарели.
Вкладка «Аналитика»: текущий эксперимент, его прогноз до поездки и динамика энергии с оценкой возврата.
| Шаг | Что сделать | Что увидите |
|---|---|---|
| 1 | Запустите стек по разделу Запуск и откройте http://localhost:8080 | Карту арены и карточку миссии со статусом среды |
| 2 | Выберите профиль easy, medium или hard, seed и нажмите «Старт» | Робот трогается, на карте появляется маршрут и цель, справа план с причиной |
| 3 | Откройте «План и исследование» | Предпосылки плана, состояние датчика, открытые гипотезы и модель грунта |
| 4 | Переключитесь на «Аналитику» | Прогноз, действие, измерение, вывод и график энергии |
| 5 | Откройте журнал и скачайте его | JSON всего прогона для разбора и воспроизведения |
Чтобы посмотреть интерфейс без симуляции, соберите панель в демо-режиме: 16 сценариев с записанными данными покрывают каждое состояние контракта, от отказа LLM до потери партнёра.
Записанный прогон: сценарий easy, seed 7, готовая карта, один робот, миссия «Собрать как можно больше образцов и вернуться на базу».
| Показатель | Значение |
|---|---|
| Итог | completed, возврат на базу |
| Собрано образцов | 3 из 3 |
| Батарея в конце | 29,61 из 60 |
| Время симуляции | 291,4 с |
| Гипотез | 34: 13 подтверждены, 8 опровергнуты, 13 с недостаточными данными |
| Проверка научной цепочки | 0 дефектов: у каждого вывода есть прогноз, действие и измерение |
Одна из опровергнутых гипотез, как её записал агент:
| Прогноз до поездки | Действие | Независимое измерение | Вывод |
|---|---|---|---|
| Сигнал в целевой области ≈ 0,608, медиана новых показаний в [0,508; 0,708] | Доехать к (1,53; 1,53) и измерить сигнал | Медиана 0,942 по 7 новым показаниям | Опровергнуто: локальная модель поиска уточняется |
| Проверка | Результат | Команда |
|---|---|---|
| Backend | 327 тестов, 3 ROS-теста пропускаются вне контейнера | cd backend && python -m pytest tests -q |
| Судья, карты, стенд | 122 теста | pytest simulation/judge/tests simulation/mapping/tests scripts/evaluation/tests -q |
| Frontend | 1020 unit-тестов, typecheck, lint, сборка | cd frontend && npm run verify |
| Браузер | Playwright: 16 сценариев × ru/en × три ширины, axe; 223 из 223 | cd frontend && npm run e2e |
Итог: три образца, возврат с запасом. Все планы в этом прогоне выдал резервный планировщик.
cp -n .env.example .env
docker compose up -d --build
docker compose --profile gui up -d guiПанель откроется на http://localhost:8080, Gazebo — на http://localhost:6080/vnc.html. Если порт
занят, задайте FRONTEND_PORT или GUI_PORT. Без ключа работает всё, кроме внешней модели: планы
выдаёт резервный планировщик. Чтобы подключить LLM, заполните в .env переменные LLM_ENDPOINT,
LLM_MODEL и LLM_API_KEY. Первая сборка образа симуляции скачивает ROS 2 Jazzy, Gazebo Harmonic и
пакеты TurtleBot3.
Прогон без браузера: python3 scripts/run_mission.py SEED, итог и журнал сохраняются в artifacts/.
backend/ агент: исследование, планировщик, навигация, HTTP API
simulation/ Gazebo, судья, сценарии, SLAM, два робота
frontend/ панель loam
contracts/ примеры ответов API
scripts/ прогон миссии, анализ, стенд оценки
artifacts/ записанные прогоны и разборы
| Документ | Что внутри |
|---|---|
| Симуляция | Gazebo, супервизор сброса, профили сценариев, SLAM, два робота |
| Судья | Батарея, сигнал образцов, collect и finish, счёт, скрытые события hard |
| Панель | Архитектура интерфейса, демо-режим, проверки и e2e |
| Примеры API | Ответы /api/v1: состояние, карта, журнал, команда, ошибки |
- Судья локальный. Расход, штрафы и формула счёта — допущения проекта по тексту ТЗ, полные правила
официального судьи не опубликованы. Интерфейс
/did/*совпадает с заданием. - Грунт замедляет программно. Дорогой участок увеличивает расход и ограничивает скорость через страж команд, а не через трение в физике Gazebo.
- Внешняя модель медленная. В записанном прогоне все планы выдал резервный планировщик: модель не укладывалась в бюджет 8 с. Путь с LLM проверен отдельными запросами, серии живых прогонов с ней нет.
- Полностью подтверждён один сценарий. easy пройден в Gazebo от начала до конца. medium и hard работают, но серия прогонов с метриками адаптации есть только на подменной среде. SLAM и два робота реализованы и проверены отдельно, в общую точку сборки ещё не включены.
- Холодный старт Gazebo бывает долгим. На медленной машине первый запуск может не уложиться в 120 с, и супервизор пометит его неуспешным; повторный сброс поднимает среду.

Команда GoatWhistle, DID Hack «Автономный ИИ-исследователь на роботе-платформе», 2026. Лицензия MIT.













