Sterowanie predykcyjne i online planning
Linear MPC, NMPC, MPPI, Tube/Log/Smooth MPPI, STORM, DDP, iLQR, iLQG, Crocoddyl, CEM, real-time iteration, warm-starting.
TL;DR
Model Predictive Control (MPC) łączy planowanie i sterowanie w jednym mechanizmie: w każdym kroku sterowania rozwiązuj optimization problem dla N kroków przyszłości, zastosuj tylko pierwszy control, powtórz. Ta strategia receding horizon daje:
- Adaptacyjność — automatyczne uwzględnienie zaburzeń (każda iteracja widzi aktualny stan).
- Constraint handling — ograniczenia naturalnie wchodzą w QP/NLP.
- Prediction — system „widzi" przyszłość N kroków, reaguje zanim coś się stanie.
Rodziny MPC:
- Linear MPC — model liniowy , koszt kwadratowy. QP per krok, fast (μs).
- NMPC — model nieliniowy, NLP per krok. Wolniejsze (ms), ale obsługuje dynamiki manipulatora.
- iLQR / DDP / iLQG — wykorzystują strukturę dynamiczną (Bellman + backward pass) — szybsze niż NMPC dla długich horyzontów.
- Sampling-based MPC (MPPI, CEM) — gradient-free, K rolloutów + weighted update. Działa dla nieróżniczkowalnych kosztów.
- Tube MPC, Robust MPC — gwarantują stabilność przy bounded disturbances.
Linear MPC — fundament
Załóżmy liniowy model w postaci dyskretnej:
Problem MPC dla horyzontu i bieżącego stanu :
s.t. .
Po stackingu predykcji to standard QP:
Rozwiązuje się przez aktywne zbiory (qpOASES), interior point (OSQP) lub embedded code generation (FORCES Pro, μ-controller). Typowy czas: 1-100 μs dla N=20, n=10, m=4 → 1-100 kHz update rate na CPU.
Stabilność
Klasyczne wyniki (Mayne et al. 2000): Linear MPC z terminal cost gdzie = solution of discrete algebraic Riccati equation + terminal set constraint daje gwarantowaną stabilność asymptotyczną.
W praktyce: zaniedbywane (terminal cost = LQR P) gdy horyzont długi.
Linear MPC — point mass tracking (t = 0.00 s, N = 20)
step żeby zobaczyć jak MPC „widzi" przyszłą zmianę z wyprzedzeniem.Receding horizon — czemu zawsze re-plan
W każdym kroku MPC rozwiązuje QP dla N kroków przyszłości, ale aplikuje tylko pierwszy. To pozwala na:
- Disturbance rejection — następny krok widzi aktualny stan, nie przewidywany.
- Model mismatch correction — błędy modelu automatycznie kompensowane przez feedback.
- Adaptive reference — gdy goal się zmieni, MPC natychmiast adaptuje.
NMPC — Nonlinear MPC
Dla manipulatora Pandy model jest nieliniowy:
Dyskretyzowane (np. RK4): z nieliniowym. Problem MPC staje się NLP (Nonlinear Programming), rozwiązywany przez SQP (jak w TrajOpt, moduł 07) lub interior-point IPOPT.
Real-Time Iteration (RTI) — Diehl et al. 2002
Pełen NLP solver wymaga wielu zewnętrznych iteracji, każda z wewnętrzny QP. Za wolne dla 1 kHz. RTI: uruchamiaj tylko jedną iterację SQP per krok sterowania — QP jest liniaryzacją wokół poprzedniego rozwiązania. Sub-millisecond update rate.
Warm-starting: jako initial guess dla iteracji , weź rozwiązanie z iteracji shifted o 1 krok. Po shiftcie potrzeba tylko uzupełnić ostatni krok (typowo zerami).
Frameworki NMPC
- ACADO (Houska, Ferreau, Diehl 2011) — code generation, embedded. Dziś przemianowane na acados.
- do-mpc (Lucia, Tatulea-Codrean 2017) — Python wrapper wokół CasADi + IPOPT.
- MPC-Tools — MATLAB.
- OCS2 (ETH) — SLQ (sequential linear quadratic) dla legged robots.
iLQR / DDP — exploit struktury dynamicznej
NMPC traktuje problem jako gęsty NLP — nie wykorzystuje sequential charakteru (każdy stan zależy tylko od poprzedniego). DDP (Differential Dynamic Programming, Mayne 1966) i iLQR(Iterative LQR, Li & Todorov 2004) wykorzystują strukturę przez backward Riccati sweep:
- Forward pass: dla bieżącej trajektorii, oblicz w każdym kroku.
- Backward pass: Bellman backward — . Aprokowane przez Taylor 2-go rzędu wokół , daje feedback gains i feedforward .
- Update: . Wykonaj forward pass, powtórz.
Złożoność: per iteracja vs dla dense NLP. Dla (Panda) — DDP ~5 ms, dense IPOPT ~500 ms. Stąd DDP/iLQR dominują w real-time MPC manipulatorów.
iLQG (Iterative LQG) — DDP + stochastic noise. Crocoddyl (Mastalli et al. 2020) — najpopularniejsza biblioteka, używana w ANYmal, Cassie, dual-arm manipulation.
Demo: iLQR na 1D double-integratorze
Klasyczny pedagogiczny przykład: punkt materialny w 1D, stan , sterowanie . Dynamika liniowa:
Koszt biegnący z nieliniowym członem barierowym:
Człon bump czyni koszt nieliniowym w — gdyby go nie było, iLQR zbiegłby w jednej iteracji (czyste LQR). Z bump-em każda iteracja liniaryzuje koszt wokół bieżącej trajektorii i daje inny zestaw gainsów , .
iLQR na 1D double-integratorze — backward Riccati sweep
Co pokazuje wizualizacja
- p(t), v(t), u(t) — trajektoria po wybranej iteracji. Iteracja 0 = forward rollout z (pelna bezruchowa trajektoria).
- K_t = [K_p, K_v] — feedback gain wzdłuż horyzontu, wynik backward sweep: .
- k_t — feedforward, też z backward sweep: .
- V_xx — cost-to-go drugiego rzędu, akumuluje się cofając od końca horyzontu (terminal: ).
- J vs iter— line-search z α < 1 gwarantuje monotoniczność.
Ćwiczenie: ustaw bump = 0 → konwergencja w 1 iteracji. Stopniowo rośnij bump → liczba iteracji rośnie, bo kwadratowa aproksymacja kosztu staje się coraz mniej dokładna. Skrajnie wysokie może spowodować odrzucenie kroku przez line-search.
MPPI — Sampling-Based MPC
Wszystkie powyższe wymagają różniczkowalnego modelu i kosztu. Co gdy mamy:
- Symulator MuJoCo z kontaktem (nieróżniczkowalny przy impacts)?
- Sieć neuronową jako model dynamiki?
- Koszt z indicator function (zerojedynkowa kolizja)?
Rozwiązanie: MPPI (Model Predictive Path Integral, Williams et al. 2017) — gradient-free MPC oparty na sampling.
Per krok sterowania:
- Sample K perturbacji wzdłuż całego horyzontu.
- Wykonaj rollout dla każdego , oblicz .
- Softmax weighting: .
- Update nominalu: .
- Wykonaj , shift trajectory, powtórz.
MPPI — step 0 / 40
best cost: 14.00 · ✓ reachedWarianty MPPI
- Tube-MPPI — łączy MPPI z tube MPC dla robustness przy stochastic dynamics.
- Log-MPPI (Tao, Boots 2022) — log-likelihood weighting zamiast soft-max; lepsza zbieżność dla wąskich rozkładów.
- Smooth MPPI — dodaje smoothing po update żeby uniknąć high-frequency chattering.
- STORM (Bhardwaj et al. 2022) — STocastic Optimization for Reactive Motion. MPPI dla 7-DOF manipulatorów, ~50 Hz update na GPU.
MPPI vs CEM (Cross-Entropy Method): oba używają K rolloutów, ale CEM bierze top-N elite (np. 10%) i fits Gaussian do nich (zamiast soft-max). MPPI bardziej smooth update, CEM agresywniej fokusuje na najlepszych. Wybór: empiryczny.
CEM (Cross-Entropy Method) jako planer online
Per iteracja:
- Sample K control sequences from current Gaussian .
- Rollout + oblicz koszt każdej.
- Wybierz top najlepszych (typowo ).
- Fit Gaussian do top — nowe .
- Iteruj kilka razy, weź jako control.
CEM jest bardziej greedy niż MPPI (skupia się tylko na top), ale zbiega szybciej do lokalnego optimum. Standard w model-based RL — PETS (Chua 2018), PlaNet (Hafner 2019).
Real-time iteration i warm-starting
Wszystkie MPC mają wspólny problem: computational delay (czas między pomiarem a aplikacją). Dla 1 kHz update musi się wykonać < 1 ms.
Strategie:
- RTI (Diehl 2002) — jedna iteracja SQP per krok, używaj liniaryzacji z poprzedniego.
- Warm-start — początkowy guess = poprzednie rozwiązanie shifted o 1 krok.
- Multiple shooting + sparse Jacobian — używaj struktury problemu (moduł 07).
- Approximate solve — rozwiąż QP do tolerancji zamiast .
- Code generation (FORCES Pro, acados) — specjalizowany kod C dla konkretnego problemu.
- GPU parallelism — MPPI/CEM trivially parallel over K rolloutów.
Implementacje praktyczne
| Framework | Typ | Typowe zastosowanie |
|---|---|---|
| mujoco_mpc | iLQG + Predictive Sampling | Google's MJPC — interactive MPC w MuJoCo Studio. Bezpośrednie demo dla manipulatorów (Panda, Allegro). |
| acados | NMPC z RTI + HPIPM solver | Embedded MPC dla autonomicznych pojazdów, dronów. Code generation w C. |
| Crocoddyl | iLQR / DDP / SQP | Manipulatory + legged robots. ANYmal, Cassie, dual-arm manipulation. |
| OCS2 | SLQ (Sequential LQ) | Legged locomotion (ETH). ANYmal real-time MPC z constraintami. |
| TinyMPC | Linear MPC, ADMM | Microcontroller-class MPC dla nano-drones (Cortex-M). |
| cuRobo (NVIDIA) | MPPI + sampling-based | GPU MPC dla 7-DOF manipulatorów. K = 1000+ rolloutów per iteracja, 50+ Hz. |
| do-mpc | NMPC (CasADi + IPOPT) | Research / prototypy. Python frontend, łatwy do napisania. |
Ściąga
Receding horizon pattern
- Zmierz stan
- Rozwiąż optimization for next N steps:
- Zastosuj tylko
- Powtórz
Linear MPC = QP
MPPI update
iLQR / DDP
Bellman backward pass z aprox. 2-go rzędu wokół trajektorii. Daje feedback gains . per iteracja.
Wybór algorytmu
- Linear, fast, no contact → Linear MPC + OSQP
- Nonlinear, smooth, manipulator → iLQR / Crocoddyl
- Non-diff cost, contact, sim-in-the-loop → MPPI / mujoco_mpc
- GPU available, K=1000 rolloutów → cuRobo / STORM
- Embedded MCU → TinyMPC / FORCES Pro
Referencje
- Mayne, Rawlings, Rao & Scokaert, „Constrained model predictive control: Stability and optimality" (Automatica 2000) — fundament linear MPC + dowody stabilności.
- Mayne, „A Second-Order Gradient Method for Determining Optimal Trajectories of Non-linear Discrete-Time Systems" (Int. J. Control 1966) — DDP origin.
- Li & Todorov, „Iterative linear-quadratic regulator design for nonlinear biological movement systems" (ICINCO 2004) — iLQR.
- Diehl, Bock, Schlöder, Findeisen, Nagy, Allgöwer, „Real-time optimization and nonlinear model predictive control of processes governed by differential-algebraic equations" (J. Process Control 2002) — RTI scheme.
- Williams, Wagener, Goldfain, Drews, Rehg, Boots, Theodorou, „Information Theoretic MPC for Model-Based Reinforcement Learning" (ICRA 2017) — MPPI.
- Bhardwaj, Sundaralingam, Mousavian, Chentanez, Fox, Birchfield, Boots, Ratliff, „STORM: An Integrated Framework for Fast Joint-Space Model-Predictive Control for Reactive Manipulation" (CoRL 2022).
- Mastalli et al., „Crocoddyl: An Efficient and Versatile Framework for Multi-Contact Optimal Control" (ICRA 2020).
- Verschueren et al., „acados — a modular open-source framework for fast embedded optimal control" (Math. Prog. Comp. 2021).
- Howell, Gileadi, Tunyasuvunakool, Zakka, Erez, Tassa, „Predictive Sampling: Real-time Behaviour Synthesis with MuJoCo" (arXiv 2022) — mujoco_mpc.
- Nguyen, Schwager, et al., „TinyMPC: Model-Predictive Control on Resource-Constrained Microcontrollers" (ICRA 2024).