MỞ ĐẦU — Nghiên cứu của tôi vs. Khóa học này

00A · Nghiên cứu ↔ khóa

MỞ ĐẦU — Nghiên cứu của tôi vs. Khóa học này

Đọc file này trước tiên. Nó trả lời: tôi đang làm gì, khóa này dạy gì, hai bên khớp ở đâu, hở ở đâu, và tôi làm gì tiếp.

Hồ sơ người học giả định (điều chỉnh nếu khác):
- NCS năm 1.
- Đã có paper về path planning cho UAV trong đô thịđồi chè.
- Bài toán: tối ưu đa mục tiêu — năng lượng, độ phủ (coverage), chất lượng quỹ đạo, ảnh hưởng gió.
- Trạng thái: chưa mô phỏng động lực học, chưa build UAV thật.

Neo ý nghĩa / địa chỉ thực tế: đọc kèm 00C_CaseStudy_VietNam_ThoiSu.md
(đồi chè VN · phố đặc HN/HCM · ĐBSCL · sau bão · thời sự logistics/y tế/dual-use).

🖼️ Hình nhanh — hai câu hỏi nằm cạnh nhau:
BẠN HỎI KHÓA HỎI THÊM "Đường nào tốt nhất "Đường đó bay được không? theo nhiều tiêu chí?" Robot biết mình ở đâu không? │ Ai bám theo nó?" │ │ └────────── GHÉP LẠI ────────────────┘ = đóng góp luận án khả thi

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.

Nghiên cứu đa mục tiêu trên địa hình thật.
Nghiên cứu đa mục tiêu trên địa hình thật.Generated for ebook · seminar OK
Khóa học vá stack dưới path planning.
Khóa học vá stack dưới path planning.HiếuTC · gốc
Path giấy → quỹ đạo bay được.
Path giấy → quỹ đạo bay được.HiếuTC · gốc
                 PARETO CỦA BẠN (trên giấy)
          năng lượng  ←—— × ——→  độ phủ
               ↑                    ↑
            gió / leo          footprint / GSD
               │                    │
               └────────┬───────────┘
                        ▼
              ┌─────────────────────┐
              │ Path / waypoint MOO │  ← bạn đang ở đây
              └──────────┬──────────┘
                         │ còn thiếu vòng kín
              ┌──────────▼──────────┐
              │ Dynamics → Control  │  Lec 2–5
              │ Plan khả thi / MPC  │  Lec 9–10
              │ Pose tin cậy (z≠x)  │  Lec 11–16
              │ Camera cho độ phủ   │  Lec 17
              └─────────────────────┘

PHẦN 1 — Nghiên cứu của tôi đang là gì (tóm gọn trung thực)

1.1. Lớp bài toán

Bạn đang ở lớp path / trajectory planning + tối ưu đa mục tiêu (multi-objective optimization, MOO), tầng ra quyết định hình học – chiến lược, thường trên:

  • bản đồ rời rạc (grid / graph / cell decomposition), hoặc
  • tập waypoint được sinh và tối ưu bằng metaheuristic (GA/NSGA-II, PSO, ACO…).

Hai môi trường:

Môi trường Đặc trưng chi phối
Đô thị vật cản 3D dày, no-fly zone, hẻm gió giữa tòa nhà (urban canyon), GPS multipath / mất tín hiệu
Đồi chè địa hình dốc, luống chè theo đường đồng mức, cần độ phủ ảnh đồng đều, gió sườn đồi, chiều bay lên/xuống dốc tốn khác nhau

1.2. Các mục tiêu bạn đang tối ưu (và ý nghĩa vật lý cần chuẩn hóa)

Mục tiêu Bạn thường viết là Điều cần siết cho luận án
Năng lượng tổng chiều dài × hệ số, hoặc hàm chi phí tự đặt Phải nói rõ mô hình công suất: hover + cruise + leo cao + tăng/giảm tốc
Độ phủ % vùng được quét Phải gắn với footprint camera, GSD, sidelap/frontlap, chiều luống
Quỹ đạo độ dài, số lần rẽ, độ trơn Phải gắn với khả thi động lực học (gia tốc, bán kính cua, snap)
Gió hệ số phạt theo hướng gió Phải phân biệt ground speed vs airspeed: năng lượng phụ thuộc airspeed
An toàn / khoảng cách vật cản clearance Phải nhất quán với kích thước UAV (C-space)

1.3. Điểm yếu điển hình của giai đoạn “chỉ thuật toán, chưa mô phỏng”

Đây là những chỗ reviewer robotics hay chất vấn:

  1. Đường đi có thể bay được không? Path tối ưu trên grid thường có góc rẽ 90°, đôi khi vượt gia tốc / tốc độ góc khả thi.
  2. Năng lượng có thật là năng lượng không? Nếu \(E \propto\) chiều dài đường, thì mô hình đã bỏ hover, leo cao, gia/giảm tốc, và ảnh hưởng gió — vốn là phần lớn tiêu thụ thật.
  3. Gió được mô hình thế nào? Gió đều hằng số là điểm khởi đầu; nhưng bài toán đúng là điều hướng trong dòng chảy (Zermelo) và/hoặc gió biến thiên theo địa hình.
  4. Robot có biết mình đang ở đâu? Path planning giả định pose chính xác. Đô thị GPS-denied / multipath làm giả định này sụp.
  5. So sánh với ai? Nếu chỉ so GA vs PSO của chính mình, thiếu baseline planning kinh điển (A*, RRT*, boustrophedon CPP) và thiếu bộ điều khiển bám quỹ đạo.

Khóa học này chính là để vá 1, 3(một phần), 4, 5 — và cho bạn ngôn ngữ để nói chuyện với cộng đồng robotics.


PHẦN 2 — Khóa học này là gì (và không là gì)

2.1. Khóa này là gì

Introduction to Robotics (Princeton) = dựng stack tự chủ tối thiểu cho một quadrotor thật, gồm 5 khối:

Dynamics & Control  →  Planning  →  Estimation/SLAM  →  Vision & Learning  →  Ethics/Safety
   (Lec 1–5)          (Lec 6–10)     (Lec 11–16)          (Lec 17–23)         (Lec 24)

Tinh thần: mọi thuật toán phải sống được trên máy có quán tính, nhiễu, trễ, tài nguyên hạn chế (lab dùng Crazyflie).

2.2. Khóa này không dạy (phần bạn phải tự bù)

Nói thẳng để bạn không mất thời gian tìm sai chỗ:

Chủ đề bạn cần Khóa có dạy? Bù ở đâu
Tối ưu đa mục tiêu, Pareto front, NSGA-II/MOEA-D Không Deb (NSGA-II), sách MOO; metric: hypervolume, IGD
Coverage Path Planning (boustrophedon, cell decomposition) Gần như không Choset (coverage survey), LaValle ch. planning
Mô hình năng lượng UAV (rotary-wing power) Không Zeng & Zhang (energy model UAV), tài liệu propulsion
Trường gió / điều hướng trong dòng chảy (Zermelo, Dubins-in-wind) Không Zermelo navigation, trochoidal paths
Metaheuristic (GA/PSO/ACO) Không Tài liệu tối ưu riêng
Photogrammetry / GSD / overlap ảnh Không Tài liệu UAV mapping / Pix4D-DJI docs
Chủ đề khóa dạy mà bạn đang thiếu Vì sao cần
Dynamics & underactuation (Lec 2) Biết đường nào bay được
PD/LQR (Lec 3–5) Có bộ bám quỹ đạo → mới đo được năng lượng thật
A*/RRT (Lec 6–8) Baseline chuẩn để so với GA/PSO của bạn
Differential flatness / min-snap (Lec 9) Biến polyline thành quỹ đạo mượt khả thi
Kinodynamic / MPC (Lec 10) Ràng buộc khả thi + re-plan khi gió đổi
Bayes/EKF/VIO (Lec 11–16) Đô thị GPS kém: pose không hoàn hảo
Vision (Lec 17–22) Độ phủ thực chất là bài toán camera
RL (Lec 23) Nếu muốn chuyển từ “giải từng map” sang “policy tổng quát”

2.3. Một câu phân định

Nghiên cứu của bạn: “đường nào tốt nhất theo nhiều tiêu chí?”
Khóa học này: “đường đó có bay được không, robot có biết mình ở đâu không, và ai bám theo nó?”

Ghép hai câu lại chính là đóng góp khả thi cho luận án.

   [MOO path của bạn] ──┐
                        ├──► [sim bám quỹ đạo + metric trung thực] ──► paper vững hơn
   [stack khóa này]  ───┘

PHẦN 3 — Bảng đối chiếu: từng phần của tôi ↔ lecture nào

Thành phần trong nghiên cứu của bạn Lecture liên quan Bạn lấy được gì cụ thể
Grid/graph + tìm đường Lec 6, 7 C-space (phồng vật cản theo kích thước UAV), Dijkstra/A*, cost map = ngôn ngữ chuẩn cho “đa mục tiêu dạng weighted-sum”
Metaheuristic sinh waypoint Lec 8 RRT/RRT* làm baseline sampling; so completeness/optimality
“Quỹ đạo trơn” Lec 9 min-snap + flatness: biến waypoint thành quỹ đạo có \(\theta, F\) khả thi
Ràng buộc động lực học Lec 2, 10 giới hạn gia tốc/bán kính cua; kinodynamic; MPC re-plan
Năng lượng Lec 2, 5, 9 năng lượng = tích phân theo thời gian của công suất, cần \(u(t)\) từ controller → cần LQR/PID
Gió Lec 3, 4, 10 gió = nhiễu; feedback khử nhiễu; MPC/replan khi gió đổi
Độ phủ Lec 17, 19 footprint camera từ pinhole; detect/segment để xác nhận vùng đã phủ
Đô thị GPS kém Lec 11–16 \(z \neq x\); EKF/VIO; hệ quả lên planning
Muốn học policy tổng quát Lec 23 RL đặt đúng tầng + baseline công bằng
Viết limitation/safety Lec 24 phạm vi claim, fail-safe

PHẦN 4 — Ba khoảng trống lớn do “chưa sim, chưa build”

🖼️ Ba gap nhìn một lần:
Gap1 NĂNG LƯỢNG Gap2 GIÓ Gap3 POSE path → ??? → E cost = d×hệ số clearance cố định thiếu controller thiếu v_air/v_gnd thiếu bất định │ │ │ ▼ ▼ ▼ cần LQR + tích phân P cần airspeed trong cost cần belief / clear động (Lec 2,5,9) (Lec 3–4,7,10) (Lec 11–13,16)

Gap 1 — Không có vòng kín ⇒ không có năng lượng đáng tin

Năng lượng thật là
\[ E=\int_0^T P\big(v_{air}(t),\ \dot z(t),\ a(t)\big)\,dt \]
Muốn có \(v_{air}, a\) thì phải có quỹ đạo theo thời gianbộ điều khiển bám. Không có controller → chỉ có “chiều dài đường × hằng số”.

Cách vá tối thiểu (2–3 tuần): Lec 2 (env) + Lec 5 (LQR) + Lec 9 (min-snap) → mô phỏng bay theo path → tích phân công suất.

Gap 2 — Gió chỉ là hệ số phạt, chưa là dòng chảy

Quan hệ cần dùng:
\[ \mathbf{v}_{ground}=\mathbf{v}_{air}+\mathbf{w} \]
Năng lượng/công suất phụ thuộc \(\|\mathbf{v}_{air}\|\), còn tiến độ theo bản đồ phụ thuộc \(\mathbf{v}_{ground}\). Do đó cùng một đoạn đường, đi ngược gió và xuôi gió khác nhau về cả thời gian và năng lượng — và hướng bay tối ưu bị “lệch” so với hướng nối hai điểm (bài toán Zermelo).

Cách vá: đưa \(\mathbf{w}\) vào cost cạnh (Lec 7) và vào sim (Lec 3–4 để thấy feedback khử nhiễu), rồi MPC/replan (Lec 10) nếu gió biến thiên.

Gap 3 — Pose được giả định hoàn hảo

Đô thị: multipath, che chắn; đồi chè: có thể mất RTK, texture lặp (khó VIO).
Nếu path yêu cầu clearance 0.5 m nhưng sai số định vị 1.5 m → kế hoạch vô nghĩa.

Cách vá: Lec 11–13 (thêm nhiễu pose vào sim, clearance phải ≥ hàm của độ bất định), Lec 16 (drift/VIO).


PHẦN 5 — Ví dụ cụ thể cho đúng trường hợp của bạn

Mỗi ví dụ theo khuôn: đang có → thiếu gì → dùng lecture nào → làm gì (2–4 tuần) → deliverable → trục R & level L (theo framework 06).


Ví dụ 1 — Nâng paper cũ: “A*/NSGA-II đa mục tiêu trên grid đô thị” → có kiểm chứng khả thi

Đang có: path Pareto-optimal trên grid 2D/2.5D, mục tiêu {chiều dài, clearance, số lần rẽ}.

Thiếu: đường có bay được không; năng lượng chưa vật lý.

Lecture: 2 (dynamics), 9 (min-snap/flatness), 10 (kinodynamic), 5 (LQR bám).

Làm:
1. Giữ nguyên planner cũ, xuất waypoint.
2. Làm mượt bằng min-snap (hoặc spline bậc 5–7) với ràng buộc \(v_{max}, a_{max}\).
3. Mô phỏng bám quỹ đạo bằng LQR/PID trên mô hình quadrotor.
4. Báo cáo: tỉ lệ path “khả thi” trước/sau khi thêm ràng buộc, sai số bám (RMS), năng lượng tích phân.

Deliverable: bảng “Pareto trên giấy” vs “Pareto sau khi lọc khả thi” — thường Pareto co lại rõ rệt. Đây là kết quả đăng được và rất dễ bảo vệ.

R: R3 (hybrid plan↔thực thi) · L: L1.


Ví dụ 2 — Coverage đồi chè: hướng luống, sườn dốc và gió

Đang có: phủ theo boustrophedon/zigzag, chọn hướng quét theo cạnh dài của thửa.

Thiếu: ba yếu tố vật lý cùng lúc — (a) chiều luống/đường đồng mức, (b) leo/xuống dốc, (c) gió sườn.

Lecture: 6–7 (cost map có hướng), 2 (năng lượng leo cao), 9 (mượt ở đầu luống), 17 (footprint camera cho độ phủ).

Làm:
1. Rời rạc hóa thửa chè kèm DEM (bản đồ độ cao); cost cạnh gồm: quãng đường, \(\Delta h\) (leo tốn hơn), thành phần gió chiếu lên hướng đi.
2. So 3 chiến lược quét: dọc đường đồng mức, vuông góc đồng mức, theo hướng gió.
3. Ràng buộc độ phủ: footprint từ pinhole (Lec 17) + sidelap/frontlap mục tiêu.
4. Đo: năng lượng, thời gian, % phủ, số lần quay đầu.

Deliverable: kết luận định lượng “quét dọc đồng mức tiết kiệm X% năng lượng ở độ dốc ≥ Y°, nhưng tăng số lần quay đầu Z%”. Rất thực tế cho nông nghiệp.

R: R5 (generalization theo địa hình/gió) hoặc R3 · L: L1.


Ví dụ 3 — Đưa gió vào đúng chỗ: từ “hệ số phạt” sang “dòng chảy”

Đang có: cost cạnh \(= d \times (1+\alpha\cos\phi)\) với \(\phi\) là góc lệch gió.

Thiếu: tách airspeed/ground speed; do đó thời gian và năng lượng không nhất quán.

Lecture: 7 (cost cạnh), 3–4 (feedback dưới nhiễu), 10 (re-plan khi gió đổi).

Làm:
1. Với mỗi cạnh, giải \(v_{air}\) cần thiết để đạt ground speed mong muốn dưới \(\mathbf{w}\).
2. Cost cạnh = \(\int P(v_{air})\,dt\) trên cạnh đó (dùng mô hình công suất, xem Phần 6).
3. So sánh: cost heuristic cũ vs cost dựa airspeed — xem thứ tự Pareto có đổi không.
4. (Mở rộng) gió biến thiên theo ô ⇒ replan kiểu MPC.

Deliverable: hình minh họa đường đi “lệch hướng để lợi gió” (dấu hiệu Zermelo) + bảng sai lệch giữa hai mô hình cost.

R: R3/R5 · L: L1→L2.


Ví dụ 4 — Đô thị GPS kém: clearance phải phụ thuộc độ bất định

Đang có: clearance cố định (ví dụ 1 m) trong hẻm giữa tòa nhà.

Thiếu: pose có sai số; sai số lớn hơn clearance là kế hoạch vô nghĩa.

Lecture: 11–13 (belief, KF), 16 (drift), 6 (C-space).

Làm:
1. Thêm mô hình nhiễu pose vào sim (bias + noise + mất tín hiệu từng đoạn).
2. Đặt clearance động: \(c(t) = c_0 + k\sqrt{\lambda_{\max}(P(t))}\) (nới ra khi bất định lớn).
3. So: clearance cố định vs clearance theo bất định — đo va chạm/near-miss.

Deliverable: “uncertainty-aware path planning” — bài toán rất phù hợp NCS năm 1, ít cần phần cứng, dễ ra số.

R: R2 (obs trung thực) · L: L2.


Ví dụ 5 — Baseline công bằng: GA/PSO của tôi so với gì?

Đang có: so sánh giữa các metaheuristic.

Thiếu: baseline kinh điển của cộng đồng robotics.

Lecture: 6–8, 10.

Làm: thêm cột A* (weighted cost), RRT* (cùng số lần collision check), và (nếu được) MPC ngắn hạn. Cố định cùng cost functioncùng ngân sách tính toán.

Deliverable: bảng so sánh có kèm thời gian tính toán — nhiều paper metaheuristic bị hỏi đúng chỗ này.

R: R3 · L: L1.


Ví dụ 6 — Bước đầu tiên hợp lý nhất nếu chưa có gì (tuần 1–2)

Không dựng Gazebo/PX4 ngay. Làm nhỏ:

  1. Viết env quadrotor phẳng 6-state (Lec 2, ~40 dòng numpy).
  2. LQR hover + bám waypoint (Lec 5).
  3. Cho nó bay theo một path cũ của bạn.
  4. Tính: sai số bám, năng lượng tích phân, có vi phạm \(a_{max}\) không.

Chỉ bấy nhiêu đã đủ đổi chất một paper planning “thuần thuật toán”.

R: R1 · L: L0→L1.


Ví dụ 7 — Khi nào mới nên chạm RL (Lec 23)

Chỉ nên khi bạn đã có: env + controller + baseline planner + metric. Khi đó câu hỏi RL hợp lý cho hướng của bạn là:

“Thay vì giải lại bài đa mục tiêu cho từng thửa chè / từng khu phố, học một policy sinh hành vi phủ/né tốt trên phân phối bản đồ và phân phối gió.”

Đó là bước từ tối ưu từng trường hợp sang amortized policy — đóng góp rõ ràng, và chính là thông điệp Lec 8 & 23.

R: R3 → R5 · L: L3.


PHẦN 6 — Bộ công cụ định lượng tối thiểu (để số liệu có thể bảo vệ)

6.1. Mô hình công suất (chọn 1 và khai báo rõ)

Rotary-wing (nhiều tầng, đầy đủ hơn): dạng thường dùng gồm 3 thành phần — blade profile, induced, parasite:
\[ P(V)=P_0\Big(1+\frac{3V^2}{U_{tip}^2}\Big) +P_i\Big(\sqrt{1+\frac{V^4}{4v_0^4}}-\frac{V^2}{2v_0^2}\Big)^{1/2} +\tfrac12 d_0\rho s A V^3 \]
(\(V\) là airspeed.) Nếu không có tham số khí động, hãy dùng bản đơn giản và nói rõ là xấp xỉ:

Xấp xỉ thực dụng:
\[ P \approx P_{hover} + k_1\|v_{air}\|^2 + k_2\max(0,\dot z) + k_3\|a\|^2 \]

Leo cao: cộng \(mg\dot z\) (công cơ học chống trọng lực) chia hiệu suất.

6.2. Độ phủ gắn với camera (Lec 17)

  • Footprint mặt đất \(\approx\) độ cao \(h\) × (kích thước cảm biến / tiêu cự).
  • GSD \(\propto h/f\).
  • Khoảng cách luống bay \(=\) footprint ngang \(\times (1-\text{sidelap})\).

Kết luận thực dụng: độ phủ và năng lượng bị nối với nhau qua độ cao \(h\) — bay cao phủ nhanh nhưng GSD tệ. Đây là một trục Pareto rất “vật lý” cho luận án.

6.3. Demo — cost cạnh có gió, năng lượng và độ phủ

"""
Mục tiêu: cho thấy cost cạnh đổi thứ tự khi tính theo AIRSPEED thay vì chiều dài.
Bối cảnh: một cạnh đi từ p0 -> p1, gió w không đổi, muốn ground speed |vg| = vg_set.
"""
import numpy as np

# --- tham số mô hình công suất xấp xỉ (khai báo rõ trong paper!) ---
P_hover = 120.0     # W, công suất treo (ví dụ)
k1      = 3.0       # W/(m/s)^2, thành phần theo airspeed^2
eta     = 0.6       # hiệu suất chuyển đổi cho leo cao
m, g    = 2.0, 9.81 # kg, m/s^2

def edge_cost(p0, p1, wind, vg_set=6.0):
    """Trả về (thời gian, năng lượng) của một cạnh dưới gió.

    Ý tưởng:
      1. hướng đi trên mặt đất do bản đồ quyết định
      2. ground velocity = airspeed vector + wind  =>  v_air = v_ground - wind
      3. công suất phụ thuộc |v_air| (KHÔNG phải |v_ground|)
    """
    p0, p1, wind = map(np.asarray, (p0, p1, wind))
    d_vec = p1 - p0
    dist_h = np.linalg.norm(d_vec[:2])          # cự ly ngang
    dz = d_vec[2] if len(d_vec) > 2 else 0.0    # thay đổi độ cao

    if dist_h < 1e-9:
        return 0.0, 0.0

    dir_g = d_vec[:2] / dist_h                  # hướng ground mong muốn
    v_ground = vg_set * dir_g
    v_air = v_ground - wind[:2]                 # quan hệ then chốt
    t = dist_h / vg_set                         # thời gian đi cạnh

    P_cruise = P_hover + k1 * np.dot(v_air, v_air)
    P_climb = max(0.0, dz / max(t, 1e-9)) * m * g / eta
    E = (P_cruise + P_climb) * t
    return t, E

# So sánh 3 cạnh cùng chiều dài 100 m nhưng khác hướng so với gió 5 m/s theo +x
wind = np.array([5.0, 0.0, 0.0])
cases = {
    "xuôi gió (+x)":  ([0,0,0], [100,0,0]),
    "ngược gió (-x)": ([100,0,0], [0,0,0]),
    "ngang gió (+y)": ([0,0,0], [0,100,0]),
    "xuôi gió + leo 20m": ([0,0,0], [100,0,20]),
}
print(f"{'case':22s} {'time(s)':>8s} {'E(kJ)':>8s}")
for name, (a, b) in cases.items():
    t, E = edge_cost(a, b, wind)
    print(f"{name:22s} {t:8.1f} {E/1000:8.2f}")

print("\nNhận xét: cùng 100 m, năng lượng khác nhau rõ theo hướng gió và độ leo.")
print("=> cost = chiều dài × hằng số là mô hình quá thô cho claim 'tối ưu năng lượng'.")

Kết quả kỳ vọng khi chạy (gió 5 m/s theo +x, ground speed 6 m/s):

case                    time(s)    E(kJ)
xuôi gió (+x)              16.7     2.05
ngược gió (-x)             16.7     8.05     ← gần 4× xuôi gió
ngang gió (+y)             16.7     5.05
xuôi gió + leo 20m         16.7     2.70

Cách dùng kết quả: đưa hàm edge_cost này vào A*/NSGA-II của bạn thay cho cost chiều dài, rồi báo cáo thứ tự Pareto có đổi hay không. Đó là một đóng góp nhỏ nhưng sạch.

Chú ý con số quan trọng: cùng 100 m và cùng thời gian, ngược gió tốn ~4× năng lượng so với xuôi gió. Một mô hình cost = chiều dài gán cho cả bốn trường hợp cùng một giá — đó chính là lỗ hổng của claim “tối ưu năng lượng” khi chưa có airspeed.

6.4. Demo — chọn hướng quét cho thửa chè dốc + gió

"""So sánh hướng quét coverage: dọc đồng mức vs vuông góc vs theo gió."""
import numpy as np

def coverage_cost(field_w, field_h, swath, heading_deg, slope_deg, wind, vg=5.0):
    """Xấp xỉ: tổng chiều dài luống + chi phí quay đầu + leo dốc + gió.
    heading_deg: hướng bay của luống (0 = trục x)
    slope_deg  : độ dốc địa hình theo trục y (giả định)
    """
    th = np.radians(heading_deg)
    dir_g = np.array([np.cos(th), np.sin(th)])

    # số luống ~ bề rộng vuông góc hướng bay / swath
    width_perp = abs(field_w * np.sin(th)) + abs(field_h * np.cos(th))
    n_lines = max(1, int(np.ceil(width_perp / swath)))
    line_len = abs(field_w * np.cos(th)) + abs(field_h * np.sin(th))

    # thành phần leo: nếu bay lệch khỏi đường đồng mức thì phải lên/xuống dốc
    climb_frac = abs(np.sin(th))                 # 0 nếu dọc đồng mức (giả định)
    climb_per_line = line_len * np.tan(np.radians(slope_deg)) * climb_frac

    # gió: airspeed cần lớn hơn khi ngược gió (lấy trung bình 2 chiều đi-về)
    v_air_1 = np.linalg.norm(vg * dir_g - wind)
    v_air_2 = np.linalg.norm(-vg * dir_g - wind)
    wind_penalty = 0.5 * (v_air_1**2 + v_air_2**2) / vg**2

    total_len = n_lines * line_len
    turn_cost = n_lines * 8.0                    # mét-tương-đương mỗi lần quay đầu
    climb_cost = n_lines * climb_per_line * 3.0  # leo đắt hơn đi ngang

    score = (total_len * wind_penalty) + turn_cost + climb_cost
    return dict(n_lines=n_lines, total_len=round(total_len),
                score=round(score), turns=n_lines)

wind = np.array([4.0, 0.0])   # gió theo +x
for hd, name in [(0, "dọc đồng mức (x)"), (90, "vuông góc (y)"), (45, "chéo 45°")]:
    r = coverage_cost(200, 120, swath=12, heading_deg=hd, slope_deg=15, wind=wind)
    print(f"{name:20s} luống={r['n_lines']:3d}  dài={r['total_len']:6d} m  score={r['score']}")

print("\nĐọc kết quả: đổi slope_deg và wind để thấy hướng quét tối ưu dịch chuyển.")
print("Đây là dạng thí nghiệm 'rẻ' nhưng ra được kết luận có ích cho đồi chè.")

Kết quả kỳ vọng khi chạy (thửa 200×120 m, swath 12 m, dốc 15°, gió 4 m/s theo +x):

dọc đồng mức (x)     luống= 10  dài=  2000 m  score=3360   ← tốt nhất
vuông góc (y)        luống= 17  dài=  2040 m  score=5121
chéo 45°             luống= 19  dài=  4299 m  score=9646

Đọc kết quả: quét dọc đồng mức thắng vì (a) ít luống hơn, (b) không phải leo/xuống dốc mỗi luống, (c) gió tác động đối xứng khi đi–về. Đổi slope_deg về 0 và tăng wind để thấy phương án tối ưu dịch chuyển — đó là loại kết luận định lượng bạn có thể đưa vào bài.

Lưu ý học thuật: hai demo trên là mô hình xấp xỉ để làm thí nghiệm nội bộ, không phải mô hình đã hiệu chuẩn. Khi viết bài, hoặc dùng mô hình công suất có nguồn (rotary-wing model), hoặc hiệu chuẩn từ log bay/bench test, và ghi rõ giả định.


PHẦN 7 — Lộ trình 12 tuần dành riêng cho trạng thái “chưa sim, chưa build”

Tuần Việc Lecture Kết quả kiểm chứng được
1 Env quadrotor phẳng; hiểu underactuation 1–2 Sim rơi/hover đúng kỳ vọng
2 PD → LQR hover & bám waypoint 3–5 Sai số bám RMS; plot
3 Nạp path cũ vào sim; đo khả thi + năng lượng 2, 5, 9 Bảng feasible/infeasible
4 Min-snap / spline có ràng buộc \(v,a\) 9 Pareto trước/sau khi lọc khả thi
5 Baseline A* + RRT* cùng cost 6–8 Bảng so với GA/PSO, kèm thời gian tính
6 Cost cạnh theo airspeed + gió 7, 3–4 Đường “lệch hướng lợi gió”
7 Coverage: footprint camera, sidelap, hướng quét 17, 6–7 %phủ vs năng lượng theo độ cao
8 Nhiễu pose + clearance theo bất định 11–13 Va chạm/near-miss giảm bao nhiêu
9 Gió biến thiên + replan (MPC nhẹ hoặc replan chu kỳ) 10 Success khi gió đổi giữa chuyến
10 (Tùy chọn) sang PX4/Gazebo hoặc gym-pybullet-drones Lặp lại 1 thí nghiệm chính
11 (Tùy chọn) RL policy trên phân phối map/gió 23 So với planner làm oracle
12 Viết: stack diagram, baseline, metric, limitation 24 + 05 Draft chương/paper

Nếu chỉ có thời gian cho 4 tuần: làm tuần 1–4. Đó là phần đổi chất nhiều nhất so với hiện trạng.


PHẦN 8 — Điền sẵn T0 (ví dụ mẫu, bạn sửa lại theo mình)

Theo framework ở 06_CauChuyen_va_Framework_PhatTrien.md:

Tên task:
  Lập quỹ đạo phủ/di chuyển đa mục tiêu cho UAV cánh quay
  trong (a) hẻm đô thị và (b) thửa đồi chè dốc, có gió.

Môi trường: [x] sim thuần (giai đoạn này)  [ ] sim→lab  [ ] outdoor

Ràng buộc cứng:
  v_max, a_max, thrust-to-weight, pin/thời gian bay,
  no-fly zone, clearance tối thiểu, %phủ tối thiểu, GSD yêu cầu.

Thành công khi:
  đạt %phủ ≥ P* và tới goal, không va chạm,
  trong ngân sách năng lượng E*, dưới gió tới W* m/s.

Thất bại khi:
  va chạm / vượt E* / %phủ < P* / vi phạm a_max.

Claim MUỐN chứng minh:
  "Khi tính cost theo airspeed + ràng buộc khả thi động lực học,
   tập Pareto và thứ hạng phương án đổi đáng kể so với cost chiều dài;
   và hướng quét theo đường đồng mức tiết kiệm năng lượng ở độ dốc lớn."

Claim CỐ Ý KHÔNG chứng minh:
  không claim kết quả trên UAV thật ngoài trời;
  không claim mô hình công suất đã hiệu chuẩn phần cứng cụ thể;
  không claim an toàn khi bay gần người.

Trục chính: R3 (hybrid planning ↔ thực thi/khả thi)
Trục phụ:   R2 (observation/pose trung thực)
Level hiện tại: L0   → Mục tiêu 12 tuần: L2 (có thể chạm L3)

PHẦN 9 — Ba câu tự kiểm trước khi viết bài tiếp theo

  1. Cost “năng lượng” của tôi có phụ thuộc airspeedđộ leo không, hay chỉ chiều dài?
  2. Có bao nhiêu % path Pareto của tôi thực sự bay được dưới \(v_{max}, a_{max}\)?
  3. Nếu sai số định vị là 1–2 m (đô thị), clearance của tôi còn hợp lệ không?

Trả lời được ba câu này bằng số liệu từ sim, bạn đã ra khỏi giai đoạn “thuật toán trên giấy”.


Liên kết