Ebook Robotics · RL–UAV
Lecture 9 — Differential Flatness & Min-Snap
Chương B** · vì sao quadrotor plan được “dễ” hơn vẻ ngoài 12 chiều
Chế độ Slide · phím ← → · F toàn màn · Esc về đọc · S mở slide
Chương B** · vì sao quadrotor plan được “dễ” hơn vẻ ngoài 12 chiều
Chương B · vì sao quadrotor plan được “dễ” hơn vẻ ngoài 12 chiều
| # | Câu hỏi | Trả lời ngắn |
|---|---|---|
| 1 | Tại sao cần? | RRT (Lec 8) cho polyline gấp khúc — bay xấu, dễ vượt snap/attitude. Cần quỹ đạo mượt suy ra được attitude + thrust. |
| 2 | So với cái khác? | Vs plan 12D thô: chỉ plan 4D flat \((x,y,z,\psi)\). Vs kinodynamic RRT (Lec 10): flat+min-snap nhanh hơn khi bay không cực đoan. |
| 3 | Giải quyết gì & thế nào? | Flat output đủ mượt → đại số ra attitude/thrust; min-snap QP nối waypoint bằng spline bậc cao. |
| 4 | Kết quả ra sao? | Pipeline RRT → min-snap → LQR/PID track; action space RL (spline/flat ref) khả thi hơn. |
| 5 | Nên dùng khi nào? | Quadrotor chuẩn; cinematography/racing baseline; làm mượt path đa mục tiêu trước khi track. |
| 6 | Không nên khi nào? | Model lệch mạnh (drag lớn, hỏng cánh) mà không residual; polyline không qua lớp mượt mà vẫn claim “tôn trọng dynamics”. |
🖼️ Hình nhanh: polyline gấp khúc ≠ quỹ đạo bay được
RRT waypoints: ●────●────────●────● (gãy góc, jerk/snap nổ) Min-snap: ●⌒⌒⌒⌒●⌒⌒⌒⌒⌒⌒⌒●⌒⌒⌒● (mượt tới bậc 4) │ flatness map (đại số) ▼ θ(t), ω(t), F(t), M(t) khả thi🇻🇳 Chuyện thật (sân A): Cuối mỗi luống chè Mộc Châu / Thái Nguyên, path boustrophedon hay đòi “quẹo 90° cứng” như góc thước kẻ trên bản đồ.
Máy không phải xe trên ray: snap và attitude nổ, nghiêng quá làm GSD nhiễu, hoặc đơn giản là không bay nổi đoạn cua đó.
Differential flatness + min-snap biến polyline thành spline đủ mượt — rồi mới giao LQR/PID track.
Chốt: góc 90° trên giấy ≠ quỹ đạo khả thi; flat output \((x,y,z,\psi)\) đủ mượt mới suy ra attitude/thrust bằng đại số.../00C.
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.
Phát hiện đẹp nhất về quadrotor: chỉ cần vẽ quỹ đạo vị trí đủ mượt
\( (x(t), y(t), z(t), \psi(t)) \), thì góc nghiêng, tốc độ góc, tổng lực đẩy
suy ra bằng công thức đại số từ quỹ đạo và các đạo hàm của nó.
Ví dụ cảm nhận: drone bay vòng tròn đều — nó phải nghiêng vào tâm một góc
xác định (như xe máy ôm cua). Góc đó không phải lựa chọn tự do: quỹ đạo đã
quy định. Flatness tổng quát hóa: quỹ đạo vị trí quy định mọi thứ.
Vì sao đúng (mức trực giác):
quỹ đạo r(t) ──► ÿ, z̈ (gia tốc) ──► vector lực cần m(a+ge₃)
│
▼
hướng lực = hướng trục thân
│
▼
θ, φ suy ra; F = ‖lực‖
(jerk, snap → ω, mô-men)
| Khái niệm | Nghĩa với quadrotor |
|---|---|
| Flat output | \((x,y,z,\psi)\) — vị trí + yaw |
| Flatness | State \(x\) và input \(u\) là hàm đại số của flat output + đạo hàm hữu hạn |
| Hệ quả planning | Plan spline 4D → map ngược ra 12-state + lệnh motor/attitude |
Input mô-men dính đến đạo hàm bậc 4 của vị trí → quỹ đạo phải khả vi tới bậc 4.
Thực dụng: dùng polynomial spline bậc 7 nối qua các waypoint (đủ bậc tự do để khớp vị trí + vận tốc + gia tốc + jerk tại nút).
Tối thiểu \(\displaystyle\int \|\mathrm{snap}\|^2\,dt\) qua các waypoint — bài QP giải nhanh.
Chuẩn công nghiệp cho drone racing / cinematography.
┌─────────┐ waypoints thô ┌──────────┐ σ(t) mượt ┌─────────┐
│ RRT │ ──────────────────► │ min-snap │ ───────────────► │ tracker │
│ (Lec 8) │ │ (QP) │ │ LQR/PID │
└─────────┘ └────┬─────┘ └────┬────┘
│ flatness map │
▼ ▼
θ,ω,F,M khả thi u gửi xuống firmware
So sánh trực quan polyline vs smooth:
polyline (x,y): min-snap (x,y):
● ●
│ ╱ ╲
●───● ● ●───●
│ ╲
● ●
(góc nhọn → a vô hạn) (cong liên tục → a, jerk hữu hạn)
| Tiêu chí | Polyline waypoint | Min-snap spline |
|---|---|---|
| Va chạm hình học | Có thể OK | Cần check lại sau làm mượt |
| Attitude khả thi | ❌ thường không | ✅ nếu ràng buộc QP đúng |
| Năng lượng / rung | Cao (giật) | Thấp hơn (snap nhỏ) |
| Nghĩa với gió | Gió + giật = dễ lệch track | Quỹ đạo mượt → tracker còn “đầu” chống gió |
"""
Quỹ đạo phẳng: y(t)=sin(t), z(t)=0.5·sin(2t).
Flatness: suy góc nghiêng θ và tổng lực F từ gia tốc — không tích phân ngược.
"""
import numpy as np
m, g = 0.03, 9.81 # ~Crazyflie
print("t theta(deg) F(mN) # F≈mg khi gần hover")
for t in np.linspace(0, 3, 7):
ay = -np.sin(t) # ÿ
az = -2.0 * np.sin(2 * t) # z̈
# lực thế giới cần: m*(a + g·e_z); hướng lực = hướng thân
theta = np.arctan2(-ay, az + g)
F = m * np.hypot(ay, az + g)
print(f"{t:3.1f} {np.degrees(theta):9.2f} {F * 1e3:8.2f}")
🧪 Kỳ vọng demo: \(\theta\) đổi dấu theo gia tốc ngang; \(F\) (mN) quanh \(mg\approx 294\) khi chuyển động nhẹ, tăng khi vừa nâng vừa tạo lực ngang. Không có vòng
odeintnào — attitude “rơi ra” từ đạo hàm.
| ✅ Nên | ❌ Không / chống chỉ định | ≈ Gần đúng |
|---|---|---|
| Quadrotor chuẩn, bay hiền→trung bình | Drag lớn / hỏng cánh mà vẫn tin flat map tuyệt đối | Dùng flat ref + residual RL |
| Baseline path→traj cho paper | Polyline + claim “đã tôn trọng dynamics” | Min-snap rồi check va chạm lại |
| Action = waypoint/spline 4D | Plan 12D sampling khi chưa thử flat | Timing lại dưới gió mạnh |
Nghĩa với năng lượng / gió / độ phủ: làm mượt giảm giật (năng lượng); không tự tối ưu phủ — phủ nằm ở tầng waypoint/cost map.
⚠️ Lỗi hay gặp: Plan polyline gấp khúc rồi bảo “đã tôn trọng dynamics” — chưa, nếu chưa qua lớp làm mượt / flatness map.
⚠️ Quên ràng buộc snap → lệnh mô-men bất khả thi.
⚠️ Làm mượt xong quên collision-check lại (spline có thể “cắt góc” vào vật cản).
⚠️ Nhầm yaw \(\psi\) với attitude đầy đủ — roll/pitch suy ra, không plan tự do như \(\psi\).
⚡ Nhớ một câu: Quadrotor plan trong \((x,y,z,\psi)\) đủ mượt — phần còn lại suy ra bằng đại số (flatness), không mò 12D.
🔗 Sang bài sau mang theo: Pipeline decouple (hình học → mượt → track) chỉ đủ khi bay không quá gắt; Lec 10 hỏi đường bay được dưới ràng buộc \(f(x,u)\) và cửa sổ MPC.
★ Hình nhớ mãi:
polyline ●─●─● → min-snap ●⌒⌒●⌒⌒● → θ,F từ đạo hàm → tracker