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

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


Khung 6 câu hỏi

# 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 minh họa (seminar-ready)

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.

Từ Q,R qua Riccati tới u=−Kx.
Từ Q,R qua Riccati tới u=−Kx.HiếuTC · gốc
   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

0. Mục tiêu học

  1. Viết hàm cost LQR \(J\) và nêu vai trò \(Q,R\).
  2. Nhớ chuỗi: linearize → ARE → \(K\) → \(u=-Kx\).
  3. Chỉ ra cầu nối LQR ↔ RL: \(P\leftrightarrow V^\star\), \(-Kx\leftrightarrow\pi^\star\), ARE ↔ Bellman.
  4. Chạy demo scipy CARE trên quadrotor phẳng; thấy eig Re\(<0\) và state về 0.

1. Trực giác — nói bằng lời thường

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:

  • \(Q\): lệch state nào “đắt”? (độ cao vs yaw)
  • \(R\): tốn lực/action mạnh “đắt” cỡ nào? (pin, bão hòa motor)

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.


2. Cốt lõi kỹ thuật

2.1 Bài toán

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 \]

2.2 Nghiệm Riccati → feedback

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ớ:

  1. Vẫn họ hàng PD, nhưng gain tối ưu và tự phối hợp kênh chéo.
  2. \(x^\top P x\) = cost-to-go tối ưu = value function.
  3. Hệ kín \(\dot{x}=(A-BK)x\) ổn định nếu \((A,B)\) controllable.

2.3 Cầu nối LQR ↔ RL (bảng vàng)

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.

2.4 Trade-off Q vs R (Sơ đồ)

  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}²

2.5 Giới hạn

  • Chỉ tối ưu quanh điểm linearize.
  • Không xử lý ràng buộc cứng thrust tốt → MPC.
  • Model sai nhiều → “tối ưu trên giấy”.

3. Demo — LQR quadrotor phẳng (scipy)

"""
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.


4. Gắn RL–UAV / path-planning đa mục tiêu của bạn

  • Baseline bắt buộc paper hover/tracking — reviewer robotics sẽ hỏi.
  • \(Q,R\) = ngôn ngữ reward shaping có nguyên tắc (Bryson), tránh hệ số “bốc thuốc”.
  • Residual RL: \(u=-Kx+\pi_\theta(x)\) — LQR gánh ổn định, policy học phần phi tuyến / gió / phủ còn thiếu.
  • Năng lượng: tăng \(R\) ≈ bay êm hơn, ít giật motor; đối chiếu metric pin trên cùng task phủ.
  • Gió / trajectory: LQR quanh hover không đủ agile xa miền — hybrid với planner (Ch.B) + residual.

5. Ưu / nhược (câu 5–6)

✅ 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

6. Lỗi thường gặp

  • ⚠️ Coi LQR là “đã giải xong điều khiển UAV” — quên miền tuyến tính và ràng buộc thrust.
  • ⚠️ Chọn \(Q,R\) không gắn giới hạn vật lý (bỏ Bryson).
  • ⚠️ Không đặt LQR làm baseline khi viết paper RL hover/tracking.

7. Checklist

  1. Vai trò \(Q\) và \(R\)? Quy tắc Bryson nói gì?
  2. Ba tương ứng LQR ↔ RL (value, policy, Bellman)?
  3. Vì sao đây là baseline paper hover?
  4. Ba giới hạn LQR và hướng vá (gain scheduling, MPC, residual RL)?

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