Ebook Robotics · RL–UAV
Lecture 5 — LQR (Linear Quadratic Regulator)
Chương A** · bài cầu nối mạnh nhất sang RL — gain tối ưu từ mô hình + Riccati–Bellman
Chế độ Slide · phím ← → · F toàn màn · Esc về đọc · S mở slide
Chương A** · bài cầu nối mạnh nhất sang RL — gain tối ưu từ mô hình + Riccati–Bellman
Chương A · bài cầu nối mạnh nhất sang RL — gain tối ưu từ mô hình + Riccati–Bellman
| # | Câu hỏi | Trả lời ngắn |
|---|---|---|
| 1 | Tại sao cần? | PD tay không scale được hệ nhiều chiều (quadrotor ~12 state). Cần gain tối ưu có nguyên tắc. |
| 2 | So với cái khác? | Vs PD: tự phối hợp kênh chéo từ \(Q,R\). Vs MPC: LQR không xử lý ràng buộc cứng tốt bằng. Vs RL: LQR = trường hợp tuyến tính+cost bậc hai có nghiệm đóng. |
| 3 | Giải quyết gì & thế nào? | Minimize \(\int(x^\top Qx+u^\top Ru)dt\) → ARE → \(u=-Kx\). |
| 4 | Kết quả ra sao? | Controller ổn định cục bộ quanh hover; baseline vàng; \(P\) = value, \(-Kx\) = policy. |
| 5 | Nên dùng khi nào? | Hover/tracking gần điểm làm việc; baseline paper; residual RL \(u=-Kx+\pi_\theta\). |
| 6 | Không nên khi nào? | Agile xa miền tuyến tính; cần ràng buộc cứng chặt (dùng MPC/shield); model quá sai mà không robustify. |
🖼️ Hình nhanh: Không chọn từng gain — chọn khẩu vị \(Q\) (state đắt) / \(R\) (lực đắt); toán trả \(K\).
Hình gốc hoặc minh họa cho ebook — không cắt từ slide Princeton. Dùng Present: bật Slide · F toàn màn.
bạn nêu: "lệch độ cao đắt, yaw rẻ, lực đắt"
│
▼
┌──────────┐
│ Q , R │
└────┬─────┘
▼
[ ARE / Riccati ] ──► P ──► K = R⁻¹ Bᵀ P
│
▼
u = −K x ★ policy tuyến tính tối ưu
PD tuning tay được với 1–2 biến. Quadrotor 12 state, 4 input — chọn tay hàng chục gain đan chéo là ác mộng (như vừa chỉnh lò xo máy trên sườn chè vừa lo hẻm phố).
LQR đổi cách hỏi: bạn không chọn gain, bạn chọn mức độ quan tâm:
rồi toán trả ma trận \(K\). Giống thuê chuyên gia tuning: bạn nêu khẩu vị, họ tính chi tiết.
Với path phủ–năng lượng: \(Q\) lớn ở vị trí/độ phủ tracking; \(R\) lớn nếu muốn bay êm, tiết pin — đó chính là baseline “bám để đo \(E\)” trước khi so RL.
🇻🇳 Chuyện thật (sân A/B): Trên đồi chè, lệch khỏi luống một mét có thể làm mất phủ / chồng ảnh — đắt hơn vài Newton·m mô-men dư. Trong hẻm Hà Nội / HCM, lệch ngang tường còn đắt hơn nữa (clearance).
Bạn ghi khẩu vị vào \(Q,R\): “lệch vị trí/độ cao đắt; yaw và mô-men thừa rẻ hơn một bậc” — LQR trả \(K\), không cần chỉnh tay chéo 12×4.
Baseline này bay bám path cũ trong sim → đo \(E\) thật, rồi mới so Pareto / RL.
Chốt: \(Q,R\) = khẩu vị chi phí trên chuyến bay; \(K\) từ Riccati là cách biến khẩu vị thành luật bám đo được. Chi tiết sân:../00C.
Hệ tuyến tính \(\dot{x}=Ax+Bu\) (linearization quanh hover). Tối thiểu:
\[ J=\int_0^\infty\big(x^\top Q x + u^\top R u\big)\,dt, \qquad Q\succeq 0,\ R\succ 0 \]
Giải phương trình Riccati đại số (ARE):
\[ A^\top P + PA - P B R^{-1} B^\top P + Q = 0 \]
\[ K = R^{-1} B^\top P, \qquad \boxed{u=-Kx} \]
Ba điều đáng nhớ:
| LQR | RL |
|---|---|
| min cost | max reward \(\approx\) −cost |
| \(x^\top P x\) | \(V^\star(x)\) |
| \(u=-Kx\) | \(\pi^\star\) tuyến tính |
| ARE (Riccati) | Bellman optimality |
Nếu thuật toán RL không tái tạo gần \(K\) trên bài LQR chuẩn → nghi ngờ implementation trước.
Q lớn, R nhỏ ──► gain lớn ──► bám sát, dữ, tốn pin, dễ bão hòa, khuếch đại nhiễu
Q nhỏ, R lớn ──► gain nhỏ ──► êm, tiết kiệm, lười, bám kém
Bryson: Q_ii ≈ 1/x_{i,max}² , R_jj ≈ 1/u_{j,max}²
"""
1) Xây A,B quanh hover (planar quadrotor đã tuyến tính hóa)
2) Chọn Q,R → giải CARE lấy P → K
3) Mô phỏng closed-loop từ lệch ban đầu, xem về 0
"""
import numpy as np
from scipy.linalg import solve_continuous_are
m, I, g = 0.03, 1.4e-5, 9.81
# State: [y, z, th, vy, vz, om]
# Input: [ΔF, M] (độ lệch lực tổng so với mg, và mô-men)
A = np.zeros((6, 6))
A[0, 3] = A[1, 4] = A[2, 5] = 1.0 # tích phân vận tốc → vị trí/góc
A[3, 2] = -g # ÿ ≈ -g * θ
B = np.zeros((6, 2))
B[4, 0] = 1 / m # z̈ ≈ ΔF / m
B[5, 1] = 1 / I # θ̈ = M / I
Q = np.diag([10.0, 10.0, 1.0, 1.0, 1.0, 0.1]) # ưu tiên bám y,z
R = np.diag([1.0, 0.1])
P = solve_continuous_are(A, B, Q, R) # Riccati đại số
K = np.linalg.solve(R, B.T @ P) # K = R^{-1} B^T P
eigs = np.linalg.eigvals(A - B @ K)
print("Mọi Re(eig)<0?", np.all(np.real(eigs) < 0))
print("K =\n", np.round(K, 3))
# Closed-loop: lệch 1m ngang, thấp 0.5m
x = np.array([1.0, -0.5, 0, 0, 0, 0.0])
dt = 0.002
for _ in range(int(4.0 / dt)):
u = -K @ x
x = x + dt * (A @ x + B @ u)
print("State sau 4s:", np.round(x, 4), " → kỳ vọng gần 0")
🧪 Kỳ vọng demo:
-Mọi Re(eig)<0? True— ổn định tuyến tính.
- \(K\) có cột mô-men “nhìn” cả \(y, v_y\) — LQR tự biết muốn sửa ngang phải nghiêng.
- State sau 4s ≈ 0 — hover-recovery trong mô hình tuyến tính hoàn thành.
★ Đây là baseline vàng trước khi so RL.
| ✅ Nên | ❌ Không | |
|---|---|---|
| Paper | Baseline LQR + metric trung thực | Chỉ RL không so cổ điển |
| Kiến trúc | Residual \(u=-Kx+\pi_\theta\) | Một mình LQR cho đua cổng / tường cứng |
| Tuning | Bryson theo \(x_{\max}, u_{\max}\) | \(Q,R\) tùy hứng không gắn đơn vị |
| Miền | Hover / tracking gần điểm làm việc | Flip / agile xa linearize |
⚡ Nhớ một câu: LQR = RL có công thức đóng khi tuyến tính + cost bậc hai: \(P\) là value, \(-Kx\) là policy, Riccati là Bellman.
🔗 Sang bài sau mang theo: Máy đã đứng/bám được (Ch.A) → Ch.B hỏi đi đường nào không đụng: C-space, BFS/DFS trên lưới.
Trước: Lec04 · Sau: Lec06 — BFS & DFS