Ebook Robotics · RL–UAV
Lecture 3 — Feedback Control
Chương A** · chữa open-loop mong manh của Lec 2 — đo sai số, chỉnh liên tục
Chế độ Slide · phím ← → · F toàn màn · Esc về đọc · S mở slide
Chương A** · chữa open-loop mong manh của Lec 2 — đo sai số, chỉnh liên tục
Chương A · chữa open-loop mong manh của Lec 2 — đo sai số, chỉnh liên tục
| # | Câu hỏi | Trả lời ngắn |
|---|---|---|
| 1 | Tại sao cần? | Model lệch, gió, nhiễu — open-loop (Lec 2) vỡ. Cần đo sai số và chỉnh liên tục. |
| 2 | So với cái khác? | Vs open-loop: có vòng đo. Vs LQR (Lec 5): P đơn giản hơn, chưa tối ưu đa kênh. Vs RL: P là policy tuyến tính tay; RL học policy φ tuyến từ dữ liệu. |
| 3 | Giải quyết gì & thế nào? | \(u=k_p e\), \(e=x_{des}-x\). Đóng vòng plant–controller–sensor. |
| 4 | Kết quả ra sao? | Hệ chống được nhiễu ở mức cơ bản; nhưng P thuần vẫn dao động + lệch tĩnh → cần D/I (Lec 4). |
| 5 | Nên dùng khi nào? | Sanity check 1D; baseline cực tối thiểu; hiểu reward \(-\|e\|^2\). |
| 6 | Không nên khi nào? | Đừng kỳ vọng P đủ cho quadrotor nhiều kênh; đừng train/deploy không nhiễu rồi claim robust. |
🖼️ Hình nhanh: Rót nước không nhìn cốc (open-loop) vs vừa rót vừa nhìn (feedback).
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.
Open-loop: kế hoạch ──► u ──► plant ──► x (không nhìn lại)
gió (~) ──┘ ★ dễ tràn / trôi
Feedback: x_des ──►(+) e ──► [P] ──► u ──► plant ──► x
▲ – │
└──────── đo lường ◄─────────┘
Open-loop = “tính trước rồi nhắm mắt chạy”. Như rót nước không nhìn cốc: kế hoạch đúng đến mấy, chỉ cần gió thổi hoặc bàn xê là tràn — trên đồi chè thì “cốc” chính là luống bạn định bám.
Feedback = “vừa rót vừa nhìn”: đo sai số giữa muốn và có, rồi hành động theo sai số. Cái hay: bạn không cần model hoàn hảo — sai số tự nói phải kéo hướng nào.
Demo Lec 2 đã cho thấy hover open-loop chết vì lệch 1%. Feedback là thuốc chữa — nhưng P thuần chưa đủ “phanh” (Lec 4).
🇻🇳 Chuyện thật (sân A): Chiều trên đồi chè Bảo Lộc / Mộc Châu, gió sườn đổi hướng từng phút — đúng lúc bạn đang quét luống.
File lệnh open-loop tối qua (hover + dịch ngang cố định) sáng nay bay lệch khỏi hàng chè như người đi theo chỉ đường cũ khi đường đã sửa.
Chỉ cần đóng vòng: đo lệch so với luống / waypoint → kéo lại; model không cần hoàn hảo, sai số đủ để cứu chuyến.
Chốt: feedback \(u=k_p e\) = trên chuyến bay, máy sống nhờ nhìn lại thế giới, không nhờ kịch bản offline. Chi tiết sân:../00C.
\[ e = x_{des} - x, \qquad u = k_p\, e \]
Lệch nhiều kéo mạnh, lệch ít kéo nhẹ.
Với \(\ddot{p}=u\) và \(u=k_p(p_{des}-p)\):
\[ \ddot{p} + k_p\, p = k_p\, p_{des} \]
Dao động điều hòa không ma sát — lắc quanh đích mãi. Kéo về mà không phanh → quá đà → kéo ngược → lại quá đà.
vị trí
│ ╭─╮ ╭─╮ ╭─╮
p*┤─────╱───╲───╱───╲───╱───╲── ← P thuần: không tắt
│ ╱ ╲_╱ ╲_╱ ╲
└──┴──────────────────────────► t
Gió = nhiễu gia tốc hằng. Ở cân bằng, cần \(u\neq 0\) để chống gió; với P thuần \(u=k_p e\) ⇒ phải giữ \(e\neq 0\). Đó là lệch tĩnh — khâu I (Lec 4) chữa.
x_des ──►(+)──── e ────►┌────────────┐── u ──►┌───────────┐──┬──► x
▲ – │ CONTROLLER │ │ PLANT f │ │
│ └────────────┘ └───────────┘ │
└───────────────────── sensor ◄────────────────────┘
"""
So sánh:
- open-loop u=0: trôi theo gió
- P-control: bám quanh target nhưng lắc + lệch tĩnh
Đây là lý do cần khâu D (Lec 4) và/hoặc I.
"""
import numpy as np
dt, T = 0.01, 8.0
target = 1.0 # muốn đưa khối lượng (double integrator) tới p=1
wind = 0.3 # nhiễu gia tốc hằng — mô phỏng gió
def simulate(controller):
"""controller(p, v) -> u (gia tốc lệnh)."""
p, v = 0.0, 0.0
hist = []
for _ in range(int(T / dt)):
u = controller(p, v)
v = v + (u + wind) * dt
p = p + v * dt
hist.append(p)
return np.asarray(hist)
traj_ol = simulate(lambda p, v: 0.0)
traj_p = simulate(lambda p, v: 4.0 * (target - p)) # kp=4
print("Open-loop p(T) =", round(traj_ol[-1], 3),
" → trôi xa target vì gió, không ai sửa")
print("P-control p(T) =", round(traj_p[-1], 3),
" → gần target hơn nhưng lệch tĩnh + đã lắc")
print("P max (overshoot gần đúng) =", round(traj_p.max(), 3))
🧪 Kỳ vọng demo:
- Open-loop: \(p(T)\) lớn (trôi theo gió).
- P: \(p(T)\) gần 1 nhưng không đúng 1 (lệch tĩnh ~ \(wind/k_p\) nếu đơn giản hóa), vàmax> target (overshoot/lắc).
★ Cần D (phanh) và I (khử lệch) — Lec 4.
| Phương án | ✅ Ưu | ❌ Nhược | Gió / năng lượng |
|---|---|---|---|
| Open-loop | Đơn giản | Chết khi model/gió lệch | Path “đẹp giấy” vỡ ngoài trời |
| P | Rẻ, dễ hiểu | Dao động, lệch tĩnh | Phạt \(\|e\|^2\) dễ tái tạo lắc |
| PD/PID/LQR | Xử lý tốt hơn | Phức tạp hơn — Lec 4–5 | Baseline trước RL |
| RL policy | Linh hoạt phi tuyến | Cần data; vẫn là feedback | Phải có nhiễu gió trong train |
⚡ Nhớ một câu: Feedback đo sai số để sống sót khi model/gió lệch — nhưng P thuần vẫn lắc và lệch tĩnh.
🔗 Sang bài sau mang theo: Hai bệnh của P (dao động + lệch tĩnh) → Lec 4 thêm D (phanh) + ngôn ngữ ổn định eigenvalue / \(\zeta\).
Trước: Lec02 · Sau: Lec04 — Stability & PD