惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
Recorded Future
Recorded Future
T
Tenable Blog
S
Securelist
C
CERT Recently Published Vulnerability Notes
T
Threatpost
S
Schneier on Security
A
Arctic Wolf
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Register - Security
The Register - Security
Cisco Talos Blog
Cisco Talos Blog
AWS News Blog
AWS News Blog
K
Kaspersky official blog
T
True Tiger Recordings
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
T
The Exploit Database - CXSecurity.com
小众软件
小众软件
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Azure Blog
Microsoft Azure Blog
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tor Project blog
Spread Privacy
Spread Privacy
Malwarebytes
Malwarebytes
P
Proofpoint News Feed
F
Fox-IT International blog
F
Fortinet All Blogs
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
量子位
Latest news
Latest news
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
Project Zero
Project Zero
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
Martin Fowler
Martin Fowler
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
I
Intezer
博客园_首页
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security

Все публикации подряд на Хабре

Менеджер ресурсов ЯНДЕКС 360 (YANDEX 360) промокоды июнь 2026: промокод Yandex 360 скидка 40% на годовые тарифы Open-Source инструмент для автоматического перевода книг Ищу ранних тестировщиков для Android-версии agent harnesses Не используйте LLM для текста Увеличиваем продажи без слез аналитика Оптимизация запросов к PostgreSQL: 5 неочевидных настроек для продакшена 45 лет тюрьмы за DROP TABLE и переход Карпатого в Anthropic Революция в изучении языков Java — быстрая. Ваш код может таким не быть Как я опоздал на конкурс OpenAi с новой архитектурой нейросети Быстрые интеграции в 1С: прощайте, бесконечные переделки Как получить субсидию 300 миллионов от Минпромторга? preIPO Anthropic, OpenAI, SpaceX. Разбираемся — стоит ли участвовать? Entaxy ION + OPC UA: два способа получить данные с промышленного оборудования Память на миллион, а толку ноль: как мы спасали ИИ-агента от «тупости» РСЯ, AdSense или myTarget: что на самом деле в 2026 приносит больше денег сайту и причем тут монетизаторы Практическое построение сервисов на Go под реальный трафик PostgreSQL и аналитика: что меняется, когда хранилище становится общим Codex за 5 месяцев 2026: мой топ-5 релизов, что не зашло и где OpenAI обогнал Anthropic Как создать короткое видео с помощью нейросетей: Полный гайд по Veo 3.1, Kling 3.0 и Happy Horse 1.0 Алгоритм проверок физлиц от экс сотрудника ФНС Как ИИ портит резюме студентам Системные вызовы в сфере ИТ в 2026: стратегический взгляд для ИТ-руководителей Вайбкодинг заканчивается на localhost: как я строю SaaS для цифровизации коттеджных поселков с Codex Производственные риски в небольшом кастомном производстве. С чем я сталкивалась и как научилась это учитывать Подключаем ИИ органы чувств: bash-демон, пайка и самосознание на Raspberry Pi Я хотел повторить Growing Neural CA за вечер. Ушёл месяц Промт для генерации текста без ИИ следа — как писать уникальные тексты через нейросеть От capabilities к AppArmor: что реально остановит атакующего в контейнере CactOS Вектора интересов: как находить настоящую мотивацию и усиливать команды Цена безопасности [Перевод] Цена безопасности “Рубик” от пет-проекта до прода или ITIL 4 для строительно-торговых центров Чего ждать (и не ждать) от ремейка AC4 Black Flag Архитектурный тупик корпоративного хранения: почему смена модели не снимает ограничений и что с этим делать Атаки через подрядчиков, дефицит кадров и квест с импортозамещением: главные вызовы ИБ в 2026 году Я не оставлю детям наследства Почему порты стали «дверями» в сервер, и кто решил, что SSH будет 22 Почему зарубежные разработчики чипов возвращаются на китайские фабрики Как у меня НЕ получился торговый бот на Polymarket Проектирование архитектуры в нотации ArchiMate с использованием ИИ. Часть 2 Как превратить домашнюю файлопомойку в умную AI-галерею на основе сборки из x99+Xeon и видеокарты за 2 тыс рублей Перспективы заселения нашей галактики Кризис менеджмент в ИТ Reactive Programming не спасёт вас. Если вы не решили эти 5 проблем — у вас просто медленный монолит с Flux Как я делаю DIY-контроллер для ПК: громкость, приложения, MIDI, OBS Миграция микросервисов на Python с помощью LLM: экономим месяцы для разработчиков Программирование микросхем GAL и им подобных Почему таск-трекер не заменяет ИСУП: из чего состоит полноценный контур управления проектами Всё об информационной безопасности. Кибербезопасность. DevOps, CI/CD. Хакеры. Алексей Федулаев Как импортировать базу клиентов в amoCRM и навести порядок в контактах Как мы четыре раза переписали Outbox Google предлагает единый «водяной знак» для изображений, видео и текста, созданных ИИ Сексизм в IT: данные вместо домыслов Один фронтенд, чтоб править всеми, один фронтенд, чтоб всех найти: 1 точка входа, разные BI ИИ в тестировании: зачем мы пошли в пилот и почему начали с чата, а не с агентов Как я научила Telegram-бота наводить порядок в чате с мемами: пересылка по хештегам в соответствующую тему Как мы сделали внутреннюю CRM для управления студией – опыт Doubletapp Десятипальцевый метод — как печатать цифру " Шесть "? Партнерская программа по нейросетям: зарабатывай на ИИ, приводя клиентов в AI-сервис Как я сделал «клик по элементу → открыть в VS Code» за один вечер Эволюция Telegram‑бота на C++: от «лапши» в main() до ООП, in‑memory кэша и мутов по Фибоначчи Как я (внезапно) стал адвокатом вайб‑кодинга в корпорации Дизайн за 5 минут. Дайджест мая 2026 Только 17% всех 64-битных целых чисел можно разложить на два 32-битных 0,000000001% × ∞ = 100%. Вы осознаёте что любое событие неизбежно? «Вы либо трусы наденьте, либо крестик снимите». Как мы выиграли еще один суд против PR-агентства PRslon Почему вы тратите время не на переговоры, а на чужую внутреннюю драму. Как проходят переговоры с крупными компаниями Как приоритизировать регрессионные проверки, когда сжаты сроки релиза Электронные транспортные накладные: технический разбор нововведений 2026 года для логистов, разработчиков и бизнеса Как определить LLM под капотом чат-бота: учебный эксперимент по black-box fingerprinting Хабру 20 лет — зовём вас отметить это к нам Домой iPad как инструмент разработчика в эпоху агентного программирования Inspector v3: как я сделал свой центр управления Kubernetes на старом ноутбуке Как мы осваивали производство гибко-жёстких печатных плат: от проб и ошибок к рабочей технологии 30 лет мы внедряли в России Ansys. А потом он ушёл — и пришлось садиться писать собственный CAE для аддитивной печати Цифровой рубль и цифровой чек Облако под защитой от DDoS: чем On-Demand отличается от Always-On Распродажа в издательстве «Питер» Почему современный стадион больше похож на ЦОД, чем на арену Машина, которая учится думать Запихнули игровую приставку в короб и в первый же месяц продали на 3 млн Игровой ноутбук vs игровой ПК за те же деньги: что изменилось в 2026 году ГИС для Minecraft. Часть 1 Смена старого оборудования на новое убирает огромные затраты на его эксплуатацию — но куда девать всё это старое? Project Manager 2026: как AI-инструменты меняют профессию SLA как инструмент, а не отчёт. Часть 1. Как подружить бизнес и инженеров через общие цифры Послания от ангелов и первый шаг к компьютерам: стеганография Средневековья и Ренессанса Что новенького есть в CSS в 2026 году? Хватит мучить ChatGPT. Почему ваш промпт не сработает Как и зачем мы писали семантический слой для ИИ аналитики – SLayer Маленькая EVPN/VXLAN-фабрика без тупика: как мы запускали площадку в Амстердаме Репликация по DDIA: что я понял, только когда сам сломал прод RAG без downtime: настраиваем инкрементальное обновление документов на Qdrant и LangChain Тени истории: война машин. Как «Энигма» и «Фиалка» определили исход Второй мировой войны Как ускорить распознавание объектов нейросетями среди множества классов, не жертвуя памятью и точностью Как я хотел две странички для SAMBA и NFS, а сделал полноценную панель управления NAS на 20+ страницах Kubernetes для баз данных? CloudNativePG делает PostgreSQL по-настоящему Cloud-Native
Планирование движения для ровера на ходовой Ackerman'а
Sencis · 2026-05-27 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение11 мин

Охват и читатели7.3K

Обзор

Несмотря на прогресс в технологиях и развитие микроэлектроники, задача поиска оптимального пути по-прежнему является весьма тяжёлой для современных вычислителей — будь то CPU или GPU. Горизонт планирования у многих локальных алгоритмов (например, DWA, TEB, MPPI на CPU) как правило не превышает нескольких метров, а иногда и дециметров. Однако планирование на большой временной интервал и дистанцию позволяет алгоритмам лучше находить пути в насыщенных препятствиями средах и является важным элементом системы уклонения от движущихся, динамических препятствий. Для решения задачи создания модуля поиска пути с дальним горизонтом планирования в этой статье будет рассмотрен пакет локального планировщика MPPI-Generic, работающий на GPU. Он может работать в связке с планировщиком State Lattice Planner из ROS NAV2, но в этой демонстрации будет использоваться отдельно от него — как «универсальный планер». Тесты работы обоих пакетов планирования будут проводиться в самодельном Qt-OpenGL симуляторе автомобиля (пикапа), выполненном на C++ для более плотной интеграции с симулятором и удобного обращения к CUDA-ядрам MPPI-Generic.

Стоит начать с того, что в идеальной системе планирования разделение на глобальный и локальный планер должно отсутствовать. Планер должен быть универсальным: сразу рассчитывать при планировании все состояния системы и находить оптимальный путь. Такие системы встречаются на беспилотных машинах, ездящих по дорогам, — как правило, это либо массово-параллельный планер, либо нейросетевой.

Связка «глобальный + локальный планер» — вынужденная мера из-за ограничения вычислительной мощности современных компьютеров и сложности создания массово-параллельного глобального планера. У слова «глобальный» тоже есть оговорки. Настоящий глобальный планер предполагает планирование из вашего текущего местоположения до пункта назначения. В терминах робототехники и ROS глобальный планер — это планер, способный проложить путь от одной точки до другой на складе, в офисе или у вас дома, то есть с горизонтом планирования в десятки метров. Иначе время планирования начинает выходить за рамки realtime и достигать десятков секунд или даже минут.

Однако в outdoor-робототехнике планирования на несколько метров часто бывает недостаточно из-за большой скорости движения транспорта на улице. Чтобы вовремя распознать опасное столкновение, нужно предсказывать траекторию всех видимых ровером машин хотя бы линейно (по текущему вектору скорости), а также знать свою траекторию на несколько десятков секунд вперёд. При этом успевать её пересчитывать на частоте поступления данных с главного источника информации о препятствиях — лидара, а это, как правило, 10–20 Гц, чтобы успеть отреагировать.

К сожалению, многие алгоритмы в открытом доступе не вписываются в такие жёсткие рамки. Например, время работы алгоритмов гибридного A* из случайных репозиториев GitHub на десктопе:

Примерно аналогичные результаты получились и у меня при попытке сделать своё решение. Более быстрым оно было лишь на короткой дистанции:

Простые наивные подходы, опирающиеся на вычислительную мощь компьютера и решающие задачу так называемым «брутфорсом», здесь не работают. Требуются сложные оптимизации — предполагающие чем-то жертвовать ради скорости, но так, чтобы это не сильно отразилось на качестве траекторий. Нужны эвристические алгоритмы перебора, отсекающие заведомо плохие варианты и выбирающие из нескольких наиболее вероятных, а не перебирающие всё подряд. А это совсем нетривиальная задача.

На время поиска пути влияет всё: длина маршрута, количество препятствий, целевая ориентация (носом или кормой относительно стартовой), дистанция от целевой позиции до препятствий, форма препятствий и т.д. Это увеличивает время планирования и делает его порой непредсказуемым.

Однако именно глобальный планер может найти на карте кратчайший и кинематически выполнимый путь гарантированно (если он существует для вашего робота), перебрав все варианты траекторий. В ROS NAV2 самым быстрым глобальным планером является State Lattice (решётка состояний). Это алгоритм семейства A*, который перебирает готовый набор примитивов из заранее сгенерированных скриптом. Примитивы это дуги, повороты, которые как-бы накладываются на карту проходимости, идущие из клетки с текущим положением ровера в соседние клетки а иногда и через 1-2 клетки впереди:

Комбинируя их с проверкой на кинематическую выполнимость хода (чтобы меньше поворачивать кузов), глобальный планер строит путь по карте проходимости (costmap). Глобальный планер по итогу работы возвращает кратчайший путь — траекторию, двигаться по которой должен контроллер. Задача контроллера преобразовать путь в понятные команды управления для моторов или другому более низкоуровневому контроллеру, таким образом контроллер может быть любым, например по типу простого, геометрического вычисления направления на точку (расчёта азимута) расчитвающего курс для рулевой сервомашинки, более сложных алгоритмов следования пути LOS/PLOS (LOS с марковокой, аналог Pure Pursuit и Vector Pursuit в ROS NAV2 ) или его роль может играть локальный планер.

Локальный планер, в отличие от глобального, работает очень быстро:

Он обсчитывает параллельно тысячи траекторий на GPU, вычисляет управляющий сигнал для двигателей либо для более низкоуровневого (реактивного) контроллера, но далеко не всегда может найти путь к цели:

локальный планер не может найти путь к целевой позиции (обозначеной таким-же пикапом) через запретную (пурпурную) зону на карте проходимости и стоит в ловушке.

В особенности MPPI-Generic благодаря массовому параллелизму на GPU в отличие от CPU реализации MPPI ROS NAV2 позволяет быстро работать даже с тяжёлыми нейросетевыми моделями движения машины такими как autorally, балансирующим на пределе возможности сцепления шины с грунтом:

Конкретно для такой быстрой и агрессивной езды требуется дообучение на треке и составление карт сцепления шин с дорогой, что требует многократного его прохождения. Строить такие карты отдельная сложная задача, для их построения на лету нужно обучать нейросетевую модель либо составлять её по мере движения и многократного прохождения одного маршрута сохраняя и накапливая текущие состания из модели. Для outdoor такое сложное решение сделать быстро и надёжно будет очень трудно. Поэтому я решил сделать контроллер, который стабилизирует угловую скорость по гироскопу. Он не сможет разогнать ровер до экстремальных скоростей и балансировать на пределе сцепления. Но за счёт быстрой реакции гироскопа в экстренной ситуации поможет поймать машину и позволит ехать достаточно быстро даже с невысокой частотой обновления уставки.

Также я решил испытать MPPI-Generic не объединяя оба подхода к планированию (глобальный + локальный планер) как это обычно принято. Т.к. у такого решения есть и минусы оно увеличивает время планирования создовая задержку в управлении и нагружает CPU у которого и так много задач. Чтобы глобальный планер (например State Lattice) быстрее нашёл путь, он сначала строит простой грубый путь с помощью A* 2D, затем, используя этот путь как эвристику расстояния (чтобы перебирать меньше примитивов и делать меньше шагов по карте), а потом уже строит кинематически выполнимый путь. Локальный планер будет уже третьим по счёту перепланированием одного и того же маршрута, всё это время суммируется в общую задержку:

Как пример — время планирования случайного маршрута в State Lattice Planner:

На этом снимке зелёным цветом обозначен найденный кратчайший путь к цели (красная точка) через препятствия (чёрным и безопасная зона/инфляционный слой вокруг них голубым), фиолетовым экспансии т.е. проверенные алгоритмом ячейки и варианты пути

Потому возникает желание использовать всего один универсальный контроллер — максимально быстрый.

Что-бы проверить MPPI-Generic в роли универсального планера я решил провести тесты в самодельном симуляторе, создающем среду, похожую на outdoor с большими открытыми пространствами:

Для начала — о том, как работает планирование в симуляторе. Здесь есть два планера: State Lattice Planner и MPPI-Generic. В данный момент они работают параллельно, то есть оба получают координаты цели и ищут к ней путь.

Машина управляется через низкоуровневый (реактивный) контроллер, принимающий уставки угловой и линейной скорости (w_cmd и v_cmd). Такое управление вполне можно реализовать на реальном ровере, имея на борту микроконтроллер, гироскоп и энкодеры приводных колёс.

Контроллер снабжён предохранителями, ограничивающими угол поворота колёс на большой скорости в зависимости от центробежной силы. Если центробежная сила превышает порог, контроллер уменьшает уставку линейной скорости так, чтобы угловая скорость корпуса чётко соответствовала уставке. Иными словами, в контроллере задан приоритет угловой скорости над линейной.

Это необходимое ограничение: если его не ввести и ничего не делать всё будет наоборот приоритет линейной скорости над угловой и тогда машина либо не сможет вписаться в траекторию (и врежется, но зато на полном ходу!), либо просто перевернётся от резкого поворота рулевых колёс на скорости. Подобный контроллер реализован в ROS NAV2 Regulated Pure Pursuit (RPP) — но ему нужна одометрия и траектория от глобального планировщика, а также в Ardupilot (acro mode / turn rate mode для роверов) — там это обычно работает через GPS.

В моей реализации контроллера управление строится через энкодеры приводных колёс. Это позволяет в прошивке МК обойтись без сложного фильтра EKF — достаточно простого фильтра Махони для получения данных об угловой скорости корпуса (рысканье) с гироскопа и компенсации наклона, а также данных о скорости приводных колёс от энкодеров. Даже если колёса сорвутся в пробуксовку, это не приведёт к расходимости алгоритма. Наоборот, из-за завышенной скорости угол поворота рулевых колёс будет ограничен сильнее. При резком возвращении сцепления это позволит не перевернуться, в остальных случаях пробуксовку компенсирует инерция корпуса.

При этом, кроме ограничения по срыву колёс (центробежной силой), контроллер больше ничего не ограничивает. Если локальный планер будет подавать команды (w_cmd и v_cmd) в МК согласованно этому простому правилу, ограничения вообще никогда не применятся и не будут мешать управлять ровером, разве что в случае ошибки.

Такая схема управления немного напоминает ESP/ESC (Electronic Stability Program) но управляющего не тормозами а рулём. Локальный планер/контроллер работающий на Jetson/miniPC рулит скоростью поворота корпуса машины через уставку w_cmd и v_cmd, что как-бы скрывет шасси под слоем абстракции, все несовершенства геометрии корпуса и дороги контроллер берёт на себя, а также отрабатывает (одноразово, в отличие от контроллера по угловому положению) резкие броски от ударов колёс при наезде на небольшие препятствия — сразу на МК.

Контроллер может работать на высокой частоте (100 - 400 Гц) с минимально возможными задержками (по прерываниям IMU и DMA), не требует построения сложных карт сцепления колёс с грунтом на ходу, позволяет локальному и глобальному планеру работать на низкой частоте лидара (10-20 Гц). Что также даёт бóльшие интервалы времени для долгосрочного планирования. Для большей реалистичности в симуляции измерения контроллера текущая угловая скорость и скорость от энкодера зашумлены (случайное блуждание + белый шум + дрейф, энкодеры белый шум), что больше соответствует требованиям outdoor.

Глобальный планер State Lattice в симуляторе в данный момент работает в связке с State Lattice + Regulated Pure Pursuit Controller это простой геометрический контроллер, что позволяет State Lattice следовать по маршруту бегая за марковкой расположенной на пути вперёд для выравнивания вдоль линии маршрута. Напоминает PLOS в частности как мне показалось унаследовал его собенность чуствительность к шуму и даже не большим перестройкам маршрута от State Lattice, но свою работу выполняет.

траектория глобального планера обозначена зелёным и синими линиями обозначены проверенные ячейки (экспансии) их направление соответствует направлению примитивов

Локальный планер в симуляторе также выводит траекторию, а точнее целый набор траекторий: синим обозначена оптимальная траектория с нулевым шумом, красными — рандомная выборка из 1024 возмущений вокруг текущего оптимального управления (синяя траектория). MPPI генерирует шум с нулевым средним относительно предыдущего решения, поэтому все траектории “крутятся” вокруг синей. Это свойство локального оптимизатора: планер предполагает, что предыдущее решение было хорошим, и ищет улучшения поблизости. В этом есть и минус, если робот застрял, красные траектории не выведут его из ловушки — нужен глобальный планер или дополнительная эвристика:

В отличие от глобального, локальный планер может управлять машиной через контроллер, выдавая ему уставки w_cmd и v_cmd в реальном времени.

Что-бы продемонстрировать работу всех 3х контроллеров наглядно я сделал видео где показано всё как есть, задача просто проехать маршрут без аварий, застреваний в сложных местах в общем показать надёжную и стабильную работу на всём маршруте.

В 1м видео “эталонное” прохождение трассы в ручном режиме через задавание уставки низкоуровневому контроллеру с клавиатуры, это также демострирует возможности управления машиной через низкоуровневый контроллер на МК:

Маршрут пройден на полном ходу без особых проблем несмотря на то, что рулевые колёса в машине крутятся довольно медленно + уставка для большей точности плавно меняется интегратором не позволяет её выставить единомоментно в нужное положение, что создаёт лаг для управления + в целом низкую частоту ввода данных но управление через контроллер это прощает.

В 2м видео маршрут проходит связка, State Lattice + Regulated Pure Pursuit Controller с вдвое меньшей скоростью для большей управляемости как я уже писал цель убедится, что контроллеры работают стабильно:

Из-за вдвое меньшей скорости в уставке контроллер не смог подняться в крутую горку. Однако в остальном маршрут пройден хорошо. Из недочётов стоит отметить, что маршрут State Lattice не всегда оптимален для машины. Иногда планер идёт своим путём, пока не упирается в препятствие, а потом резко изгибается. При заходе на цель он не строит маршрут заранее, а в последний момент делает резкие изгибы. Это провоцирует RPP на рывки и создаёт колебания, что заставляет State Lattice перестраивать маршрут — возникает своеобразный резонанс. В моменты когда маршрут идёт ровно без лишних изгибов RPP минимально корректирует уставку.

В этом видео MPPI-Generic проходит маршрут с простой моделью (не на нейросетях как у autorally а скорее аналог MPPI ROS NAV2 с не большими доработками) и функции стоимости ведущей его к целевой позиции (не по маршруту глобального планера как MPPI из ROS NAV2) т.е. локальный планировщик используется как универсальный планер, видео ускорено примерно в 2 раза:

Скорость MPPI тут меньше, потому что, в отличие от RPP, он настраивает её сам. Добиться баланса, чтобы MPPI везде ехал быстро, довольно сложно, и с первого знакомства с этой библиотекой у меня этого не получилось. Вообще “настраивать” MPPI-Generic если этот процесс можно так назвать (приходится постоянно что-то изобредать в модели, программировать а не просто крутить ручки параметров) сложно и алгоритм очень капризный, но порой в различных комбинация (в том числе и не правильных) он творит с моделью машины довольно интересные вещи.

В одном из тестов я оставил симуляцию на 2 часа включённой и ушёл на обед. За это время неисправная модель (со смещениями системы координат) с помощью множества микроповоротов на месте идеально совпала со своей целью. Казалось, что машина адаптируется к своим ошибкам — в отличие от простых контроллеров, MPPI справляется с некоторыми проблемами и тем самым маскирует их. В отличие от простых контроллеров, что своим видом сразу показываю, если что-то идёт не так. В этом тесте MPPI пару раз задел, несмотря на инфляционный слой, препятствия и в конце плохо припарковал машину почему-то вообще не используя задний ход предпочитая ездить кругами, хотя он это умеет, от запуска к запуску симуляции MPPI ведёт себя немного по-разному). Тем не менее он прошёл весь маршрут сам без глобального планера в равных с ним условиях и справился почти со всем, кроме случая заезда на горку где и связка State Lattice + Regulated Pure Pursuit Controller не справилась хотя ехала быстрее, что на мой взгляд делает MPPI-Generic ближайшим кандидатом на роль универсально массово параллельного планера.

В дальнейшем я не планирую улучшать MPPI-Generic в сторону универсального планера — настраивать его очень сложно. Я хочу просто добавить ему 10 критиков от mppi_nav2 и сделать связку State Lattice + MPPI-Generic, возможно сравнить их с State Lattice + mppi_nav2. Посмотрим, что в итоге будет работать лучше. Однако уже сейчас MPPI-Generic быстро работает с большим горизонтом планирования и 1024 сэмплами (хотя это далеко не предел) на GPU разгружая тем самым CPU для более приоритетных задач т.к. почти весь ROS/ROS2 работает на CPU нодах и ROS NAV2 состоит из кода на CPU. Код контроллеров из симулятора в дальнейшем планирую перенести на самодельный ровер сделанный из квадроцикла ATW-800:

UPD: Пока статья проходила модерацию, проблему с парковкой MPPI (ошибку в модели продольной динамики) удалось устранить:

Итоги тестов показывают, что использование низкоуровневого контроллера с MPPI — это тупиковая ветвь развития. Низкоуровневый контроллер конфликтует с моделью динамики (например, если MPPI закладывает занос в поворот, контроллер пытается с ним бороться). Кроме того, с более сложными моделями движения MPPI становится трудно предсказывать поведение машины, когда контроллер вносит свою задержку и исправляет траекторию по своему усмотрению. Моделировать его ограничения в модели MPPI, имхо не имеет смысла.

Поэтому с переходом на более сложные модели (чем простая кинематика Аккермана из mppi_nav2) от контроллера придётся отказаться, чтобы MPPI управлял тормозами, рулевой сервой и мотором напрямую на высокой частоте (≈50 Гц).