<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Universal Autonomy Initiative</title><subtitle>Memetic robotics research</subtitle><author><name>Universal Autonomy Initiative</name></author><id>https://teletype.in/atom/robotsilike</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/robotsilike?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@robotsilike?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=robotsilike"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/robotsilike?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-08-14T16:27:49.084Z</updated><entry><id>robotsilike:OgAd2_rLEZu</id><link rel="alternate" type="text/html" href="https://teletype.in/@robotsilike/OgAd2_rLEZu?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=robotsilike"></link><title>Введение в Model Predictive Control</title><published>2025-04-03T17:37:25.854Z</published><updated>2025-04-03T17:37:25.854Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/ef/52/ef521e07-cde0-43c0-8bfc-6652fa690468.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/03/4e/034eb200-bb92-465d-bb5f-7f6ba2274664.png&quot;&gt;Итак, ребятки-зайчики-котики, сегодня мы немного расскажем вам про большое семейство методов управления, известных как Model Predictive Control, они же MPC, они же управления с прогнозирующими моделями. Сам по себе метод уже давно является индустриальным стандартом, однако, я замечаю, что в окружающем меня роботикс-комьюнити, да и во многих образовательных программах, его часто обходят стороной. Помимо этого, MPC постепенно обретает новую жизнь в эпоху всевозможного дип лернинга, так что понимать эту идею особенно полезно тем, кто хочет заниматься robot learning.</summary><content type="html">
  &lt;p id=&quot;lcsW&quot;&gt;Итак, ребятки-зайчики-котики, сегодня мы немного расскажем вам про большое семейство методов управления, известных как &lt;em&gt;Model Predictive Control&lt;/em&gt;, они же &lt;em&gt;MPC&lt;/em&gt;, они же &lt;em&gt;управления с прогнозирующими моделями&lt;/em&gt;. Сам по себе метод уже давно является индустриальным стандартом, однако, я замечаю, что в окружающем меня роботикс-комьюнити, да и во многих образовательных программах, его часто обходят стороной. Помимо этого, MPC постепенно обретает новую жизнь в эпоху всевозможного дип лернинга, так что понимать эту идею особенно полезно тем, кто хочет заниматься robot learning.&lt;/p&gt;
  &lt;p id=&quot;BAq7&quot;&gt;Сразу скажу, что я не являюсь специалистом по этой теме. Просто поработал с ней немного, мне зашло, решил поделиться, сделать entry point для более компетентных людей, так сказать.&lt;/p&gt;
  &lt;p id=&quot;Iv9J&quot;&gt;Для базового ознакомления достаточно посетить разделы &lt;em&gt;Level 0 &lt;/em&gt;и &lt;em&gt;MPC+DL&lt;/em&gt;, для желающих посмотреть под капот есть разделы &lt;em&gt;Level 1&lt;/em&gt; и &lt;em&gt;Прикладное&lt;/em&gt;.&lt;/p&gt;
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#XP7I&quot;&gt;Level 0: Для самых маленьких&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#ZHDn&quot;&gt;Миленький примерчик&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#Teyx&quot;&gt;Level 1: Для подростков с матешей&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#mL5J&quot;&gt;Honorable mentions: DDP/iLQR и MPPI&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#9hnl&quot;&gt;Прикладное: фреймворки и пакеты&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#OGH5&quot;&gt;do-mpc&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#z0e1&quot;&gt;ForcesPro&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#X5CG&quot;&gt;ACADO&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#l1sK&quot;&gt;acado&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#B1Qu&quot;&gt;cvxpy&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#Ao4M&quot;&gt;MPC в эпоху Deep Learning&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#V6ca&quot;&gt;А мы что?&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;yqXd&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;XP7I&quot;&gt;Level 0: Для самых маленьких&lt;/h2&gt;
  &lt;p id=&quot;VSKv&quot;&gt;Давайте начнём с простого анализа тайтла и поймём, какую задачу мы решаем. &lt;/p&gt;
  &lt;p id=&quot;SdMB&quot;&gt;Предположим, что у нас есть какая-то &lt;em&gt;система&lt;/em&gt;, которой мы хотим &lt;em&gt;управлять&lt;/em&gt;. Этой системой может быть что угодно: от машин, роботов, до, в теории, государства. Под управлением понимают генерацию последовательности &lt;em&gt;управляющих сигналов&lt;/em&gt; (они же &lt;em&gt;controls&lt;/em&gt;, &lt;em&gt;actions&lt;/em&gt;, &lt;em&gt;управления&lt;/em&gt; и &lt;em&gt;экшены&lt;/em&gt;), которые приводят к решению какой-либо поставленной задачи. В случае машины или робота этими сигналами могут быть, например, скорости или ускорения, которые привезут нас в целевую точку; в случае государства — придумайте сами (&lt;s&gt;ребята, записываем домашнее задание&lt;/s&gt;). &lt;/p&gt;
  &lt;p id=&quot;NnSJ&quot;&gt;Слово &lt;em&gt;Model&lt;/em&gt; в MPC предполагает наличие (математической) модели нашей системы. Эта модель позволяет просчитать поведение системы в будущем — отсюда и слово &lt;em&gt;predictive&lt;/em&gt;. &lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;hw3v&quot;&gt;Идея MPC заключается в нахождении управлений, которые приведут к решению задачи в течение какого-то времени — &lt;em&gt;горизонта&lt;/em&gt; — &lt;em&gt;T&lt;/em&gt; в будущем, используя модель для предсказания состояния системы.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;VBfQ&quot;&gt;Хорошо, предсказывать мы умеем, как найти-то управления? За это отвечает компонент, которого хоть и нет в тайтле, несмотря на ключевую роль — это &lt;em&gt;функция стоимости&lt;/em&gt; (&lt;em&gt;cost function&lt;/em&gt;, &lt;em&gt;cost&lt;/em&gt;, &lt;em&gt;кост&lt;/em&gt;). Стоимость говорит нам о том, насколько состояние системы (и в общем случае управляющий сигнал), плохи в контексте поставленной задачи. Тут RL-щики должны напрячься и словить флешбеки от понятия &lt;em&gt;награды&lt;/em&gt; (&lt;em&gt;reward&lt;/em&gt;): в общем случае cost и reward — понятия довольно взаимозаменяемые, просто reward говорит нам, насколько состояние, наоборот, хорошее (но заранее скажу, что между MPC и RL идейно очень большая разница, хоть и с первого взгляда может показаться обратное).&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;GhHA&quot;&gt;MPC приводит к решению поставленной задачи за счет нахождения управлений, которые минимизируют суммарную стоимость в будущем.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;ZHDn&quot;&gt;Миленький примерчик&lt;/h3&gt;
  &lt;figure id=&quot;KPYd&quot; class=&quot;m_original&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3a/c9/3ac95271-7692-497f-af8e-3f0946722910.png&quot; width=&quot;375&quot; /&gt;
    &lt;figcaption&gt;Милая иллюстрация, честно украденная &lt;a href=&quot;https://www.colorado.edu/faculty/nicotra/research/model-predictive-control&quot; target=&quot;_blank&quot;&gt;отсюда&lt;/a&gt;.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;9f6x&quot;&gt;Давно нашёл эту картинку на сайте &lt;a href=&quot;https://www.colorado.edu/faculty/nicotra/research/model-predictive-control&quot; target=&quot;_blank&quot;&gt;одной лабы из Колорадо&lt;/a&gt; (кста, челики вроде прикольный рисерч делают, мне зашло). В общем, у зайца-гонщика из команды MPC поставлена &lt;em&gt;задача&lt;/em&gt;: достичь финиша как можно быстрее. У него в голове есть какая-то интуитивная &lt;em&gt;модель&lt;/em&gt; динамики мотоцикла: он понимает, как будет вести себя мотоцикл в зависимости от того, как жать на педали и поворачивать руль (ого, получается в этом случае модель — это биологическая нейронная сеть!!!). Эта модель позволяет ему примерно спроецировать будущую траекторию на трек — что и изображено в облачке.&lt;/p&gt;
  &lt;p id=&quot;9qsW&quot;&gt;Далее, посмотрим на жёлтую и зелёную траекторию. Жёлтая траектория в целом,решает поставленную задачу, но не является оптимальной, т.к. слишком длинная. Поэтому и её стоимость выше. Зелёная же решает задачу и является более короткой, поэтому её стоимость ниже, можно сказать, минимальная из всех возможных — она является оптимальным решением в контексте поставленной задачи.&lt;/p&gt;
  &lt;p id=&quot;OVRm&quot;&gt;Также одно из важных преимуществ MPC, не упомянутых выше —  возможность введения &lt;em&gt;ограничений,&lt;/em&gt; т. е. определения множества состояний, в которых система не должна находиться ни при каких условиях. Посмотрим на красные траектории у зайчика. Они нарушают ограничения — ими в нашем случае являются границы трека — а значит, никак не могут быть решениями поставленной задачи, даже если бы они приводили меньшей стоимости. Иначе зайчика в лучшем случае ждёт дисквалификация, а в худшем — GGWP 😥.&lt;/p&gt;
  &lt;p id=&quot;fg3l&quot;&gt;С Level 0 всё, дальше пойдёт уже полноценный рассказ для взрослых с математикой. Кому хочется ещё интуитивных объяснений — могу порекомендовать &lt;a href=&quot;https://www.youtube.com/watch?v=8U0xiOkDcmw&quot; target=&quot;_blank&quot;&gt;серию видосов от доброй тётеньки из Matlab&lt;/a&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;uEbL&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Teyx&quot;&gt;Level 1: Для подростков с матешей&lt;/h2&gt;
  &lt;p id=&quot;9QHp&quot;&gt;Теперь давайте рассмотрим уже более строгую математическую постановку задачи.&lt;/p&gt;
  &lt;p id=&quot;htwZ&quot;&gt;В дискретном случае нашу задачу можно записать в следующем общем виде (для непрерывного случая, по классике, сумма заменяется на интеграл, а модель динамики определяет производную состояния):&lt;/p&gt;
  &lt;figure id=&quot;8Bcw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/51/fb/51fbcda1-fb1e-4bf3-94de-d7191c85ae27.png&quot; width=&quot;2588&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0bTN&quot;&gt;Решив данную оптимизационную задачу, мы получим последовательность управлений на наш горизонт. На практике, обычно на вход системе подают &lt;em&gt;только первое управление&lt;/em&gt; из последовательности, а на следующем шаге решают задачу заново. Зачем так, почему бы тогда не решать задачу только для одного шага? Ну, тут у нас, можно сказать, классическая проблема жадных алгоритмов vs. динамическое программирование. &lt;em&gt;Решая задачу на горизонт, мы можем получить более оптимальное решение для будущего&lt;/em&gt;. Конечно, в идеале тогда горизонт должен быть бесконечным, что невозможно на практике, поэтому ограничиваемся &lt;em&gt;H&lt;/em&gt; шагами. А перепланирование после первого шага нужно для быстрой реакции на изменения в наблюдаемой среде (например, на резкие манёвры машин и людей). Хотя никто не запрещает использовать все управления или часть из них.&lt;/p&gt;
  &lt;p id=&quot;J9aj&quot;&gt;Для лучшего понимания всех ингредиентов давайте сразу рассмотрим простую прикладную задачу. Предположим, что у нас есть робот, представляемый кругом, для которого можно задавать вектор скорости в произвольном направлении. Наша цель — переместить робота из точки A в точку B, минуя круговые препятствия.&lt;/p&gt;
  &lt;figure id=&quot;feaq&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f4/1d/f41dffce-9b03-4c27-82f9-fe003997938e.png&quot; width=&quot;1684&quot; /&gt;
    &lt;figcaption&gt;Игрушечный пример&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;kxxH&quot;&gt;Интуитивно, имеем слеудующую обстановку:&lt;/p&gt;
  &lt;ul id=&quot;10O5&quot;&gt;
    &lt;li id=&quot;vXGh&quot;&gt;Мы хотим минимизировать расстояние между роботом и целью;&lt;/li&gt;
    &lt;li id=&quot;ftTL&quot;&gt;При этом робот не должен столкнуться с препятствиями (это и есть наши ограничения) — для наших простых репрезентаций это означает, что расстояние до препятствия должно превышать сумму радиусов препятствия и робота;&lt;/li&gt;
    &lt;li id=&quot;EXBe&quot;&gt;Движение робота в нашем случае можно описать простой кинематикой.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Ai60&quot;&gt;Исходя из этого, можно предложить следующую постановку задачи для MPC:&lt;/p&gt;
  &lt;figure id=&quot;gSIm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9a/f0/9af06042-22b1-47af-8d51-162757a83f1c.png&quot; width=&quot;1340&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FlOa&quot;&gt;Здесь мы предполагаем, что наша система — дискретная, и шаг дискретизации равен \Delta t. Состояние робота — декартовы координаты в 2D. В стоимости на этапе, равно как и в финальной, мы напрямую минимизируем расстояние между роботом и целью. На практике в стоимость на этапе также добавляют штрафы на большие величины управлений, поскольку в реальных системах это может привести к нестабильности. Поскольку ограничения у нас заданы в виде неравенств со знаком &amp;gt;=, то и функция записывается по принципу расстояния минус суммарный радиус.&lt;/p&gt;
  &lt;p id=&quot;p56q&quot;&gt;Для реальных систем, конечно, постановка задачи может быть намного сложнее: динамику могут задавать в виде системы диффуров, а ограничений может быть в разы больше.&lt;/p&gt;
  &lt;p id=&quot;txsO&quot;&gt;Ок, с постановкой задачи мы разобрались, а как её решать-то?&lt;/p&gt;
  &lt;p id=&quot;lmQG&quot;&gt;Ха-ха. Вопрос не простой и заслуживает отдельного поста, если наша организация, конечно, более глубоко разберётся в сабже. Но если дать хоть какой-то ответ, то можно выделить следующие методы. В первую очередь, это выпуклая оптимизация, или лучше даже сказать, выпуклое программирование (линейное программирование сюда же, вполне его юзают для MPC, если получается нормально линеаризовать проблему). Даже у легенды &lt;a href=&quot;https://en.wikipedia.org/wiki/Stephen_P._Boyd&quot; target=&quot;_blank&quot;&gt;Stephen P. Boyd&lt;/a&gt; &lt;s&gt;Rice&lt;/s&gt; (кто не слышал, чекайте его книгу &lt;em&gt;Convex Optimization&lt;/em&gt; и пакеты &lt;em&gt;CVX/CVXPY&lt;/em&gt;) есть много работ про решение задачи MPC. Из методов, которые точно юзаются для MPC, хочется отметить &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Quadratically_constrained_quadratic_program&quot; target=&quot;_blank&quot;&gt;Quadratically Constrained Quadratic Program (QCQP)&lt;/a&gt;&lt;/em&gt; и &lt;em&gt;&lt;a href=&quot;http://Second-order%20cone%20programming&quot; target=&quot;_blank&quot;&gt;Second-Order Cone Programming (SOCP)&lt;/a&gt;&lt;/em&gt; — их точно можно найти в разных солверах и прикладных публикациях.&lt;/p&gt;
  &lt;p id=&quot;erZV&quot;&gt;В общем случае для нелинейных задач применимы любые методы из &lt;a href=&quot;https://en.wikipedia.org/wiki/Nonlinear_programming&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;нелинейного программирования&lt;/em&gt;&lt;/a&gt;. Выпуклое программирование, в общем-то, является частным случаем. Из всего этого разнообразия, особенно в контексте невыпуклых задач, важно отметить &lt;a href=&quot;https://en.wikipedia.org/wiki/Interior-point_method&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;Interior-point Methods&lt;/em&gt;&lt;/a&gt;, в частности, солвер &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/IPOPT&quot; target=&quot;_blank&quot;&gt;IPOPT&lt;/a&gt;&lt;/em&gt;, и &lt;em&gt;&lt;a href=&quot;http://Sequential%20quadratic%20programming&quot; target=&quot;_blank&quot;&gt;Sequential Quadratic Programming (SQP)&lt;/a&gt;&lt;/em&gt;. Из исследователей в области нелинейного программирования, помимо упомянутого выше Бойда, хочется выделить господина &lt;a href=&quot;https://en.wikipedia.org/wiki/Dimitri_Bertsekas&quot; target=&quot;_blank&quot;&gt;Dimitri Bertsekas&lt;/a&gt; (RL-щикам, знакомым с понятием &lt;em&gt;approximate dynamic programming&lt;/em&gt;, он может быть уже знаком) — у него есть целая книжка по нелинейному программированию.&lt;/p&gt;
  &lt;p id=&quot;ZpBh&quot;&gt;В целом, конечно, ограничений на методы нет, можно выбрать абсолютно любой метод оптимизации, который сможете прикрутить сюда. Далее вопрос только в качестве и скорости работы.&lt;/p&gt;
  &lt;h3 id=&quot;mL5J&quot;&gt;Honorable mentions: DDP/iLQR и MPPI&lt;/h3&gt;
  &lt;p id=&quot;0lpf&quot;&gt;Из альтернативных методов решения задачи MPC важно упомянуть две группы: DDP/iLQG и MPPI.&lt;/p&gt;
  &lt;p id=&quot;SHG6&quot;&gt;&lt;em&gt;Differential Dynamic Programming&lt;/em&gt; (&lt;em&gt;DDP&lt;/em&gt;, не путать с Distributed Data Parallel!) и очень близкий к нему &lt;em&gt;Iterative Linear-Quadratic Gaussian&lt;/em&gt; (&lt;em&gt;iLQG&lt;/em&gt;) основаны на использовании &lt;a href=&quot;https://en.wikipedia.org/wiki/Bellman_equation&quot; target=&quot;_blank&quot;&gt;принципа оптимальности Беллмана&lt;/a&gt; и аппроксимации value-функции (да, здесь понятие value такое же, как в RL-е, только замените reward на cost) второго порядка. Очень хороший обзор с выводами можно найти в &lt;a href=&quot;https://citeseerx.ist.psu.edu/document?repid=rep1&amp;type=pdf&amp;doi=71b552b2e058d5a6a760ba203f10f13be759edd3&quot; target=&quot;_blank&quot;&gt;этой статье&lt;/a&gt;. Такие трюк позволяют нам получить решение на нашей проблемы в явном виде. Главный недостаток здесь — это отсутствие поддержки ограничений. Расширения DDP, поддерживающие ограничения, конечно, есть, но в их случаях уже редко можно получить решения в явном виде, насколько нам известно. Тем не менее, методы довольно широко используются, например, в свое время их любили использовать для походки робо-собак и робо-гуманоидов.&lt;/p&gt;
  &lt;p id=&quot;yhCG&quot;&gt;А вот про &lt;em&gt;Model Predictive Path Integral&lt;/em&gt; (&lt;em&gt;MPPI&lt;/em&gt;) у нас точно будет отдельный пост. Во-первых, нам он видится как один из самых перспективных алгоритмов будущего, во-вторых, это просто очень красивая математическая идея. MPPI относится к &lt;em&gt;sampling-based&lt;/em&gt; подходам — он позволяет решить задачу оптимизации вообще без градиентов, только за счёт хитрых манипуляций над рандомными сэмплами управлений!!!! И нет, это даже не простой перебор рандомных сэмплов!!! Главное преимущество здесь в том, что теперь у нас нет ограничений на форму динамики и стоимости (хоть фидбек из онлайн API чатгпт используй как стоимость), а также эта штука, по крайней мере, в исходном виде, позволяет эффективно использовать многопоточные вычисления. Один из самых более-менее доступных выводов MPPI можно найти в &lt;a href=&quot;https://homes.cs.washington.edu/~bboots/files/InformationTheoreticMPC.pdf&quot; target=&quot;_blank&quot;&gt;этой статье&lt;/a&gt;, но опять же, ждём отдельного поста на эту тему.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;cZeo&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;9hnl&quot;&gt;Прикладное: фреймворки и пакеты&lt;/h2&gt;
  &lt;p id=&quot;VBKf&quot;&gt;Захотелось потрогать MPC? &lt;s&gt;Чел харош! А слабо потрогать траву?&lt;/s&gt; Тогда вот подборка библиотек и фреймворков, с которых можно начать. По факту, их, конечно, больше, но здесь мы укажем только то, с чем работали или имеем хоть какое-то представление.&lt;/p&gt;
  &lt;h3 id=&quot;OGH5&quot;&gt;&lt;a href=&quot;https://github.com/do-mpc/do-mpc&quot; target=&quot;_blank&quot;&gt;do-mpc&lt;/a&gt;&lt;/h3&gt;
  &lt;p id=&quot;clqo&quot;&gt;Языки: Python&lt;/p&gt;
  &lt;p id=&quot;Kjh1&quot;&gt;Пожалуй, лучший entry point из всех возможных вариантов. Отличается от остальных относительно подробной документацией, покрывающей в том числе теоретические аспекты, в наличии также информативные примеры. Если начинать погружаться в тему MPC, я бы рекомендовал начать именно с него.&lt;/p&gt;
  &lt;p id=&quot;YgjJ&quot;&gt;&lt;em&gt;&lt;u&gt;Nota bene&lt;/u&gt;&lt;/em&gt;: do-mpc, и многие другие либы используют фреймворк &lt;em&gt;&lt;a href=&quot;https://web.casadi.org/&quot; target=&quot;_blank&quot;&gt;Casadi&lt;/a&gt; --&lt;/em&gt; это такой инструмент для автоматического дифференцирования. По сути, задавая динамики и стоимости в do-mpc, вы создаёте выражения на &lt;em&gt;Casadi&lt;/em&gt;, по которым потом явно находятся выражения для градиентов по принципу графа вычислений. Это очень похоже на то, как в своё время работал старый товарищ &lt;em&gt;TensorFlow&lt;/em&gt;, с, имхо, главной вытекающей проблемой: фиг получится увидеть какие-либо промежуточные значения для выражений (в отличие от &lt;em&gt;PyTorch&lt;/em&gt;). Также &lt;em&gt;Casadi&lt;/em&gt; использует column-major репрезентацию для матриц, в отличие от row-major в &lt;em&gt;NumPy&lt;/em&gt;, к которому, скорее всего, привыкло большинство читателей. Так что поначалу работать с этой штукой будет больно, но такова жизнь. Мы вообще пришли к юнит-тестам для &lt;em&gt;Casadi&lt;/em&gt;-выражений, втупую сравнивая их конечные результаты с более понятными аналогами на &lt;em&gt;NumPy&lt;/em&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;z0e1&quot;&gt;&lt;a href=&quot;https://www.embotech.com/softwareproducts/forcespro/overview/&quot; target=&quot;_blank&quot;&gt;ForcesPro&lt;/a&gt;&lt;/h3&gt;
  &lt;p id=&quot;YuBG&quot;&gt;Языки: C++, Python&lt;/p&gt;
  &lt;p id=&quot;hhcI&quot;&gt;Коммерческий фреймворк от выходцев из ETH Zurich, хотя студенческие лицензии выдают без проблем, даже в наше непростое время. Позиционируется как решение с фокусом на продакшн, хотя и в рисерческих статях его можно встретить довольно часто. Разработчики утверждают, что их солверы самые быстрые на рынке. Документация есть, но, скажем так, порог вхождения в этой штуке очень высокий. Так что новичкам я бы не рекомендовал ForcesPro. А вот если нужно добиться максимальной производительности или в целом хочется потыкать индустриальные решения — то велком.&lt;/p&gt;
  &lt;h3 id=&quot;X5CG&quot;&gt;&lt;a href=&quot;https://acado.github.io/&quot; target=&quot;_blank&quot;&gt;ACADO&lt;/a&gt;&lt;/h3&gt;
  &lt;p id=&quot;Rhmz&quot;&gt;Языки: C++, Matlab&lt;/p&gt;
  &lt;p id=&quot;gK45&quot;&gt;Довольно старый оптимизационный тулкит, из всего рассмотренного, наверное, лежит ближе к ForcesPro, но с открытым кодом. Не могу особо много что-то про него сказать, видел, что его юзали в статьях от топ лаб из ETH Zurich, но по сайту и документации не понятно, жив он вообще или нет. Но решили на всякий случай добавить его в наш список.&lt;/p&gt;
  &lt;h3 id=&quot;l1sK&quot;&gt;&lt;a href=&quot;https://github.com/acados/acados&quot; target=&quot;_blank&quot;&gt;acado&lt;/a&gt;&lt;/h3&gt;
  &lt;p id=&quot;cCGA&quot;&gt;Языки: C, Python, Matlab, Octave&lt;/p&gt;
  &lt;p id=&quot;EsS8&quot;&gt;Наследник ACADO, но, в отличие от него, жив и развивается. Есть документация, примеров в репозитории много. Сами с ним не работали, но слышали о нем хорошие отзывы от коллег. В списке кандидатов на потыкать, наверное, на втором месте после do-mpc.&lt;/p&gt;
  &lt;h3 id=&quot;B1Qu&quot;&gt;&lt;a href=&quot;https://www.cvxpy.org/&quot; target=&quot;_blank&quot;&gt;cvxpy&lt;/a&gt;&lt;/h3&gt;
  &lt;p id=&quot;YAjt&quot;&gt;Языки: Python&lt;/p&gt;
  &lt;p id=&quot;066k&quot;&gt;Известная среди оптимизаторов библиотека от лабы упомянутого выше С. Бойда. Это инструмент для выпуклой оптимизации общего назначения, поэтому к MPC-фреймворкам она относится постольку-поскольку, однако, видел не одно её применение к MPC и управлению в целом, например, &lt;a href=&quot;https://github.com/AtsushiSakai/PythonRobotics&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;BYUM&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Ao4M&quot;&gt;MPC в эпоху Deep Learning&lt;/h2&gt;
  &lt;figure id=&quot;lZjJ&quot; class=&quot;m_custom&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/11/5c/115c5ef3-16b3-4b66-924d-f27ba05332d5.png&quot; width=&quot;520&quot; /&gt;
    &lt;figcaption&gt;Некто Yann Lecun популяризирует MPC&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;64ee&quot;&gt;Прошаренные читатели могли подумать, что динамика в MPC очень похожа на... те самые &lt;a href=&quot;https://arxiv.org/abs/1803.10122&quot; target=&quot;_blank&quot;&gt;World Models&lt;/a&gt; от Шмидхубера! Ну или правильнее сказать, что world models похожи на динамику.&lt;/p&gt;
  &lt;p id=&quot;rixH&quot;&gt;Действительно, обучаемые модели динамики, да и обучаемые стоимости — идея не новая. Даже &lt;a href=&quot;https://homes.cs.washington.edu/~bboots/files/InformationTheoreticMPC.pdf&quot; target=&quot;_blank&quot;&gt;в статье про MPPI&lt;/a&gt;, о которой я упоминал выше, и, по факту, довольно старой, контрибушн заключался в использовании нейросети в качестве модели динамики. В наши дни эти идеи обрели новую жизнь, в первую очередь благодаря появлению разных foundation-моделей и больших world models (из недавнего, взять те же &lt;a href=&quot;https://arxiv.org/abs/2309.17080&quot; target=&quot;_blank&quot;&gt;GAIA-1&lt;/a&gt; и &lt;a href=&quot;https://www.nvidia.com/en-us/ai/cosmos/&quot; target=&quot;_blank&quot;&gt;Nvidia Cosmos&lt;/a&gt;, хоть и их практическое использование из-за большого размера и ограниченных condition-ов на управления остается под вопросом).&lt;/p&gt;
  &lt;p id=&quot;rUmE&quot;&gt;За идею MPC с обучаемой моделью динамики активно топит Ян Лекун. Из его недавних работ по сабжу стоит отметить &lt;a href=&quot;https://dino-wm.github.io/&quot; target=&quot;_blank&quot;&gt;DINO-WM&lt;/a&gt; и &lt;a href=&quot;https://arxiv.org/abs/2412.03572&quot; target=&quot;_blank&quot;&gt;Navigation World Models&lt;/a&gt;. Из менее известных исследователей в этой области хотелось бы отметить господина  &lt;a href=&quot;https://scholar.google.com/citations?user=r4hMllQAAAAJ&amp;hl=en&quot; target=&quot;_blank&quot;&gt;Tim Salzmann&lt;/a&gt;, в частности, его проект &lt;a href=&quot;https://github.com/Tim-Salzmann/l4casadi&quot; target=&quot;_blank&quot;&gt;l4casadi&lt;/a&gt;, посвящённый женитьбе &lt;em&gt;PyTorch&lt;/em&gt;-моделей и солверов на основе упомянутого выше &lt;em&gt;Casadi&lt;/em&gt;. Также очень важные работы, на которые стоит обратить внимание — &lt;a href=&quot;https://www.nicklashansen.com/td-mpc/&quot; target=&quot;_blank&quot;&gt;TD-MPC&lt;/a&gt; и &lt;a href=&quot;https://www.tdmpc2.com/&quot; target=&quot;_blank&quot;&gt;TD-MPC2&lt;/a&gt; от челиков из UC San Diego. Они предложили подход на основе model-based planning в в стиле MPC для решения онлайн и офлайн RL-ных задач и достигли в них очень крутых метрик.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;7sMH&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;V6ca&quot;&gt;А мы что?&lt;/h2&gt;
  &lt;figure id=&quot;AhZ8&quot; class=&quot;m_column&quot; data-caption-align=&quot;center&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/78/6d/786de8cd-df67-4c40-9d83-def87a427950.png&quot; width=&quot;1267&quot; /&gt;
    &lt;figcaption&gt;Робот, который смог. Смотрим &lt;a href=&quot;https://www.youtube.com/watch?v=bx0N9UuKlb4&quot; target=&quot;_blank&quot;&gt;оригинальное видео&lt;/a&gt;.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;RUMH&quot;&gt;Мы пришли к MPC, решая задачу &lt;em&gt;социальной навигации робота с учётом неопределённости&lt;/em&gt;. Роботу нужно доехать из точки A в точку B в среде, где ходят люди, чьё движение мы можем предсказать и получить оценку неопределённости этого предсказания в виде матрицы ковариации. Рисёрч посвящён дизайну MPC, позволяющему эффективно учесть эту неопределённость. С подробностями можно ознакомиться &lt;a href=&quot;https://sites.skoltech.ru/app/data/uploads/sites/50/2024/11/2024-ras-socnav-extended.pdf&quot; target=&quot;_blank&quot;&gt;в нашей публикации&lt;/a&gt;. В общем, что-то сделали, что-то получилось.&lt;/p&gt;
  &lt;p id=&quot;dAr1&quot;&gt;Сейчас нас сильно интересует свадьба learnable-моделей и sampling-based подходов для MPC, в частности, свзяь диффузионных моделей и MPPI. Работа идёт, так что stay tuned!&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;tof1&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;fmdz&quot;&gt;А на этом всё. Подписывайтесь, ставьте лайки, пишите комментарии, делайте рисёрч, и до новых встреч!&lt;/p&gt;

</content></entry></feed>