Ebook Robotics · RL–UAV
Lecture 2 — Dynamics (Động lực học)
Chương A** · máy đổi state theo luật nào khi nhận \(u\)? — xương sống mọi controller & env RL
Chế độ Slide · phím ← → · F toàn màn · Esc về đọc · S mở slide
Chương A** · máy đổi state theo luật nào khi nhận \(u\)? — xương sống mọi controller & env RL
Chương A · máy đổi state theo luật nào khi nhận \(u\)? — xương sống mọi controller & env RL
| # | Câu hỏi | Trả lời ngắn |
|---|---|---|
| 1 | Tại sao cần? | Không biết \(f\) thì không thiết kế controller, không đặt action bound thật, không hiểu vì sao drone phải nghiêng mới bay ngang. |
| 2 | So với cái khác? | Khác “black-box \(P(s'|s,a)\)” thuần RL: ở đây \(f\) có cấu trúc vật lý (underactuation, tích phân kép). Khác kinematic thuần (chỉ hình học, bỏ quán tính). |
| 3 | Giải quyết gì & thế nào? | Viết \(\dot{x}=f(x,u)\); với quadrotor phẳng suy 3 PT lực/mô-men; tuyến tính hóa quanh hover → \(Ax+Bu\). |
| 4 | Kết quả ra sao? | Có mô hình để sim, linearize, đặt bound; mở đường Lec 3–5 (feedback/LQR) và env RL tối thiểu. |
| 5 | Nên dùng khi nào? | Mọi bài UAV; khi chọn action space; khi domain-randomize tham số vật lý. |
| 6 | Không nên lạm dụng khi nào? | Đừng dùng xấp xỉ hover tuyến tính để giải thích flip/agile cực mạnh; đừng cho action vượt giới hạn motor thật trong sim. |
🖼️ Hình nhanh: Tăng ga không “nhảy” vị trí — phải qua gia tốc → vận tốc → vị trí (trễ hai tầng).
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.
u (lực) ──► a = F/m ──► v = ∫a ──► p = ∫v
▲
│ muốn dịch ngang?
│ quadrotor: phải nghiêng θ trước
★ underactuated: không có lực ngang trực tiếp
Đẩy xe hàng trên đường đồi chè: xe không dịch tức thì theo tay bạn — có quán tính, có ma sát. Drone cũng vậy: tăng ga không làm nó đứng ở chỗ cao hơn ngay, mà tạo gia tốc, gia tốc tích thành vận tốc, vận tốc tích thành vị trí.
Chuỗi “tích phân hai lần” là lý do điều khiển / RL trên vị trí khó hơn game state tức thì: tác động của bạn đến vị trí bị trễ hai tầng. Muốn dịch ngang giữa hai hàng chè? Quadrotor không có “động cơ đẩy ngang” — phải nghiêng rồi mới bay ngang; đó là underactuation, không phải bug phần mềm.
🇻🇳 Chuyện thật (sân A): Buổi sớm trên sườn chè Thái Nguyên / Mộc Châu, bạn muốn máy trượt ngang dọc luống để phủ ảnh.
Tăng lực tổng không giúp nó “trượt sang trái” — phải nghiêng \(\theta\) trước, lực đẩy nghiêng mới sinh gia tốc ngang; trong lúc nghiêng, độ cao cũng muốn tụt nếu không bù ga.
Gió sườn buổi chiều làm chuỗi tích phân hai lần càng “nhão”: lệnh \(u\) hôm qua không còn đúng hôm nay.
Chốt: underactuation + \(\ddot{p}=f(u,\theta)\) = trên chuyến bay, mọi path “chỉ waypoint” phải qua động lực nghiêng–trượt, không nhảy vị trí tức thì. Chi tiết sân:../00C.
\[ \dot{x} = f(x,u), \qquad x \in \mathbb{R}^n,\ u \in \mathbb{R}^m \]
Mẹo: hệ bậc hai (Newton \(F=ma\)) → đặt \(x = [\text{vị trí}; \text{vận tốc}]\).
Double integrator (xương sống vòng position):
\[ \dot{p}=v, \qquad \dot{v}=u/m \]
F1 F2
▲ ▲
│ │
┌───┴───────────────┴───┐
│ thân drone │ ← nghiêng góc θ
└───────────┬───────────┘
│
▼ mg
F = F1 + F2 (đẩy dọc thân)
M = (F2 − F1)·d (mô-men)
\[ \ddot{y}=-\frac{F}{m}\sin\theta,\quad \ddot{z}=\frac{F}{m}\cos\theta-g,\quad \ddot{\theta}=\frac{M}{I} \]
Đọc chậm ba dòng — “tính cách” của drone:
| Hiện tượng | Ý nghĩa kỹ thuật | Với path / gió |
|---|---|---|
| Muốn \(\ddot{y}\neq0\) → phải nghiêng | Underactuated (6 DoF, 4 input ở 3D) | Không action “lực ngang thế giới” tùy ý |
| Nghiêng → \(\cos\theta\) giảm | Phải tăng tổng \(F\) để giữ độ cao | Năng lượng tăng khi manoeuvre ngang nhiều |
| \(M\to\theta\to\ddot{y}\to y\) | Bốn lần tích phân → trễ sâu | Reward chỉ phạt vị trí dễ dao động |
Quanh \(\theta\approx 0\), \(F\approx mg\): \(\sin\theta\approx\theta\), \(\cos\theta\approx 1\)
\[ \ddot{y}\approx -g\,\theta, \qquad \ddot{z}\approx \frac{\Delta F}{m}, \qquad \ddot{\theta}=\frac{M}{I} \]
f(x,u) phi tuyến ──► ≈ ──► Ax + Bu (hover)
│ │
│ θ lớn, flip ▼
≠ hết hiệu lực Lec 3–5: P / PD / LQR
"""
Mục tiêu demo:
So sánh 3 chính sách open-loop trên quadrotor phẳng:
(1) tắt máy (2) hover đúng lực (3) lệch 1% giữa hai cánh.
Kết luận mang sang Lec 3: cần feedback.
"""
import numpy as np
# --- Tham số cỡ Crazyflie (SI) ---
m, I, g, d = 0.03, 1.4e-5, 9.81, 0.046
dt = 0.001 # bước Euler; nhỏ để bớt lỗi số
def f(x, u):
"""Động lực học liên tục.
x = [y, z, theta, vy, vz, omega]
u = [F1, F2] lực từng phía (đơn giản hóa 2 rotor)
"""
y, z, th, vy, vz, om = x
F = u[0] + u[1] # tổng lực đẩy dọc thân
M = (u[1] - u[0]) * d # mô-men do lệch lực
return np.array([
vy,
vz,
om,
-F / m * np.sin(th),
F / m * np.cos(th) - g,
M / I,
])
def rollout(u_fn, T=2.0):
"""Mô phỏng T giây, trả về state cuối."""
x = np.zeros(6) # gốc, đứng yên, theta=0
for _ in range(int(T / dt)):
u = u_fn(x)
x = x + dt * f(x, u) # Euler: x_{k+1} = x_k + dt * f
return x
u_hover = np.array([m * g / 2, m * g / 2])
x_off = rollout(lambda x: np.zeros(2))
x_ok = rollout(lambda x: u_hover)
x_bad = rollout(lambda x: u_hover * np.array([1.01, 0.99]))
print("Tắt máy [y,z,th] =", np.round(x_off[:3], 3), " → rơi theo g")
print("Hover OK [y,z,th] =", np.round(x_ok[:3], 3), " → gần 0 nếu model khớp")
print("Lệch 1% [y,z,th] =", np.round(x_bad[:3], 3), " → xoay + trôi: open-loop mong manh")
🧪 Kỳ vọng demo:
- Tắt máy: \(z\) âm mạnh (~ rơi \(\frac12 g T^2\)).
- Hover OK: \([y,z,\theta]\approx 0\).
- Lệch 1%: \(\theta\) và \(y\) lệch rõ — cùng “cố hover” nhưng không đo sai số thì không sửa. → Lec 3 đóng vòng.
| ✅ Nên | ❌ Không | |
|---|---|---|
| Env RL | Planar 6-state sanity + bound motor thật | Action gia tốc thế giới tự do bỏ underactuation |
| Model | Linearize hover cho LQR/PD gần điểm làm việc | Tin linearization cho toàn bộ agile / flip |
| Đa mục tiêu | Cost năng lượng gắn \(F,\|u\|\) từ \(f\) | Chỉ tối ưu độ dài hình học quên động lực |
| Gió | Thêm nhiễu vào \(\dot{v}\) khi sim | Claim robust khi train không gió |
⚡ Nhớ một câu: Dynamics = vật lý của robot; quadrotor underactuated — muốn ngang phải nghiêng, và open-loop lệch 1% là đủ chết.
🔗 Sang bài sau mang theo: \(f\) + underactuation + chứng cứ “hover open-loop mong manh” → Lec 3 chữa bằng feedback \(u = k_p e\).
Trước: Lec01 · Sau: Lec03 — Feedback Control