Ebook Robotics · RL–UAV
MODULE 4 — Computer Vision và Learning (Lecture 17–23)
Bản ôn nhanh theo module
Chế độ Slide · phím ← → · F toàn màn · Esc về đọc · S mở slide
Bản ôn nhanh theo module
📚 Học sâu:
Lectures/Lec17–23. File này = ôn nhanh.
pixel ──► pinhole/GSD ──► flow ──► detect ──► CNN ──► RL đúng tầng ↑ độ phủ đồi chè gắn h & sidelap ở đây (Lec 17)
Mục tiêu module.
Biến lưới điểm ảnh thành tín hiệu hữu ích cho điều khiển / lập kế hoạch / RL; kết thúc bằng Lecture 23 — đặt Reinforcement Learning đúng chỗ trong stack robotics (giả định bạn đã vững RL, nên trọng tâm là cầu nối, không phải giáo trình RL từ đầu).
Luồng module:
Lec 17 Camera & hình học ảnh
Lec 18 Optical flow (tín hiệu chuyển động trên ảnh)
Lec 19 Deep learning cho vision (nhận vật / bbox)
Lec 20 SGD (tối ưu thực dụng)
Lec 21 Overfitting & regularization (+ domain gap)
Lec 22 CNN
Lec 23 RL trong ngữ cảnh robotics / UAV
Nếu bạn đã vững deep learning: đọc nhanh Lec 19–22, không bỏ Lec 17–18 và Lec 23.
Hiểu camera cho dữ liệu gì; nắm mô hình pinhole và sự mất chiều sâu; phân biệt intrinsic / extrinsic.
Camera cung cấp gì, và làm sao biến ma trận cường độ sáng thành thông tin hình học hoặc ngữ nghĩa?
Camera không trả về “ống PVC” hay “lối đi trống”. Nó chỉ trả về một bảng số — cường độ sáng từng pixel. Não người (hoặc thuật toán) phải dịch bảng số đó thành cạnh, dòng chảy, vật thể, khoảng cách gần đúng.
Với UAV: ảnh còn bị rung, đổi sáng, motion blur — khó hơn ảnh tĩnh trong ImageNet.
\[
u = f \frac{X}{Z}, \qquad v = f \frac{Y}{Z}
\]
Điểm 3D \((X,Y,Z)\) chiếu xuống ảnh \((u,v)\). Chiều sâu \(Z\) bị mất trong phép chiếu → suy 3D từ một ảnh 2D là bài ill-posed, trừ khi có thêm giả định, stereo, chuyển động, hoặc học từ dữ liệu.
Thế giới (X,Y,Z)
│ phép chiếu pinhole
▼
Ảnh (u,v)
│
├─► vision cổ điển: cạnh, flow, hình học
└─► learning: CNN → bbox / depth / semantics
│
▼
tín hiệu cho control / planning / RL policy
Hai điểm \((1,0,2)\) và \((2,0,4)\) với \(f=1\) cho cùng \(u=0.5\).
Một pixel không đủ để biết vật gần hay xa — trừ khi bạn có thêm giả định kích thước vật, stereo, hoặc parallax khi máy bay dịch chuyển.
Hiểu phương trình brightness constancy, aperture problem, ý tưởng Lucas–Kanade; biết time-to-contact dùng để tránh va chạm.
Pixel đang trôi đi đâu, nhanh bao nhiêu — và dùng tín hiệu đó thế nào để tránh đụng?
Ngồi tàu nhìn cửa sổ: cây gần xẹt rất nhanh, núi xa trôi chậm. Não dùng tốc độ trôi trên võng mạc để đoán khoảng cách và tốc độ tiếp cận.
Drone cũng có thể dùng optical flow để cảm nhận “tường phía trước đang lớn dần” — tức sắp đụng.
Giả định cường độ sáng bảo toàn theo chuyển động nhỏ:
\[
I_x u + I_y v + I_t = 0
\]
Một phương trình cho hai ẩn \((u,v)\) → aperture problem (nhìn qua lỗ nhỏ không biết vật trượt dọc cạnh hay vuông góc cạnh).
Lucas–Kanade (LK): giả định flow gần như không đổi trong một cửa sổ quanh điểm đang xét → xếp chồng nhiều phương trình → giải bình phương tối thiểu.
Time-to-contact (xấp xỉ):
\[
\tau \approx \frac{Z}{\dot{Z}} \propto \frac{1}{\text{divergence}(\text{flow})}
\]
Flow phía trước “bung ra” mạnh → \(\tau\) nhỏ → cần phanh hoặc né.
Lab 3 của khóa gốc: quay video từ Crazyflie, tính LK offline.
t t+Δt
░░██░░ → ░██░░░ mũi tên flow sang trái
tường chiếm dần khung hình → divergence tăng → tránh / giảm tốc
import numpy as np
I0 = np.array([0, 0, 1, 2, 3, 2, 1, 0, 0], dtype=float)
I1 = np.array([0, 0, 0, 1, 2, 3, 2, 1, 0], dtype=float) # dịch phải ~1 mẫu
Ix = 0.5 * (I0[2:] - I0[:-2])
It = I1[1:-1] - I0[1:-1]
u = np.zeros_like(Ix)
mask = np.abs(Ix) > 0.3
u[mask] = -It[mask] / Ix[mask]
print("flow ước lượng:", np.round(u, 2))
Nắm pipeline học có giám sát cho robot vision; hiểu visual servoing đơn giản từ bounding box (đúng tinh thần Lab 4 khóa gốc).
Thay vì viết tay quy tắc “cạnh thế này là ống”, làm sao học ánh xạ ảnh → nhãn / hộp bao từ dữ liệu?
Dạy trẻ nhận mèo bằng hàng nghìn ảnh, không bằng công thức hình học của tai mèo.
Mạng \(f_\theta(\text{ảnh})\) học biểu diễn trung gian rồi cho ra lớp, bbox, mask, hoặc depth.
ảnh ──► CNN ──► bbox (c_x, c_y, w, h)
│
├─ u_yaw ∝ (c_x - W/2) # lệch trái/phải → quay
└─ u_fwd ∝ (h_ref - h) # bbox nhỏ → tiến gần hơn
Đây chưa phải RL: chỉ là feedback trên đặc trưng thị giác. Nhưng nó dạy tích hợp perception–control theo thời gian thực.
Hai trường phái thiết kế:
| (A) Perception cố định + RL trên đặc trưng | (B) End-to-end ảnh → action | |
|---|---|---|
| Ưu | Ít sample hơn, dễ debug | Tiềm năng trần cao hơn |
| Nhược | Đặc trưng có thể không đủ cho task | Sim-to-real và sample cost nặng |
Khuyến nghị khi mới dựng nghiên cứu: bắt đầu theo (A), chỉ chuyển (B) khi baseline (A) đã rõ giới hạn.
Hiểu vì sao dùng mini-batch; vai trò learning rate; liên hệ SGD supervised với ước lượng gradient trong RL.
Tối ưu loss trên hàng triệu tham số bằng cách nào thì thực tế chạy được?
Chỉnh radio: không cần nghe cả album mới vặn nút. Nghe vài giây → vặn nhẹ → nghe tiếp.
SGD: mỗi bước chỉ dùng một mini-batch, cập nhật
\[
\theta \leftarrow \theta - \alpha \nabla_\theta \mathcal{L}_{\text{batch}}(\theta).
\]
Với RL: policy gradient / actor-critic cũng là gradient ascent trên kỳ vọng reward, nhưng ước lượng gradient ồn hơn nhiều so với supervised → cần baseline, advantage normalization, GAE, clip (PPO), v.v.
import numpy as np
rng = np.random.default_rng(0)
theta, lr = 0.0, 0.3
for i in range(25):
y = 3 + rng.normal() * 0.5 # một mẫu quanh mục tiêu 3
g = (theta - y) # grad của 0.5 (θ - y)^2
theta -= lr * g
print("θ ≈", round(theta, 3))
Sample inefficiency của RL đến một phần từ gradient ồn + dữ liệu không i.i.d.
Khi debug học không ra: kiểm tra lr, scale reward/advantage, độ dài rollout, normalize obs — trước khi đổ lỗi kiến trúc mạng.
Nhận dấu hiệu overfit; biết các kỹ thuật chống overfit; phân biệt overfit cổ điển với domain gap trong robotics.
Vì sao mô hình “thuộc lòng” tập huấn luyện rồi thất bại ở môi trường mới — và chữa bằng gì?
Học thuộc 50 câu quiz ≠ hiểu bài. Gặp đề lạ (gió mạnh, ánh sáng khác, map khác) là toang.
Overfit = khớp cả nhiễu / đặc thù tập train. Regularization = ép mô hình đơn giản hơn, mượt hơn, hoặc bất biến hơn với thay đổi không liên quan nhiệm vụ.
Loss
│ train ╲
│ ╲________
│ val ╲ ╱ vùng overfit
│ ╲___╱
└───────┼──────────► epoch
nên early stop quanh đây
Giải thích vì sao CNN phù hợp ảnh; hiểu receptive field; biết thực tế triển khai trên drone (companion computer).
Kiến trúc nào phù hợp dữ liệu ảnh và vì sao?
Nhận mặt người: trước hết thấy cạnh mắt/mũi, sau mới ghép thành “đó là An”.
CNN bắt chước sự xếp tầng đó: lọc cục bộ → khái niệm lớn dần theo độ sâu.
ảnh → [conv + ReLU] × N → pool → … → head
└─ cạnh ─┘ └─ bộ phận ─┘ └─ vật / bbox / depth
Đặt RL đúng chỗ trong stack đã học; xây pipeline RL–UAV thực dụng; biết câu hỏi “paper-ready” trước khi train lớn.
Khi không viết tay nổi controller/planner đủ tốt cho mọi tình huống — làm sao học hành vi từ tương tác và tín hiệu thưởng/phạt, mà vẫn tôn trọng vật lý và cảm biến thật?
Dạy chó ngồi: đúng được bánh, sai thì không. UAV: bay ổn / tới đích được thưởng; đụng / rơi bị phạt.
Khác supervised: không có nhãn action đúng từng bước, chỉ có tín hiệu thưa hoặc muộn.
Bạn đã vững RL — bài này không dạy lại PPO từ zero. Bài này buộc RL phải nói chuyện được với LQR, RRT, EKF, flow, reality gap.
MDP: \((S, A, P, r, \gamma)\). Policy \(\pi\), value \(V^\pi\), action-value \(Q^\pi\).
Phương trình Bellman:
\[
V^\pi(s) = \mathbb{E}\big[r + \gamma V^\pi(s') \mid s, \pi\big].
\]
Ba họ thuật toán (chỉ để định vị):
1. Value-based (DQN…): học \(Q\), lấy policy greedy.
2. Policy gradient / actor–critic (PPO, SAC…): học trực tiếp \(\pi_\theta\).
3. Model-based: học / dùng \(f\) rồi kế hoạch — họ hàng với MPC và LQR.
| Khái niệm robotics trong ebook | Khái niệm RL tương ứng |
|---|---|
| Cost LQR \(x^\top Q x + u^\top R u\) | Reward \(r = -c\); \(P\) ~ value; \(u=-Kx\) ~ \(\pi^\star\) tuyến tính |
| Heuristic \(h\) trong A* | Ước lượng cost-to-go / value |
| Belief Bayes | State cho POMDP |
| Tracking controller tầng thấp | Low-level đã ổn định; RL ở tầng nhiệm vụ |
| Reality gap (Lab LQR trên máy thật) | Sim-to-real |
[Simulator: dynamics + nhiễu cảm biến + trễ]
│
▼
obs z: x̂(EKF) hoặc ảnh / flow / depth + vector goal
│
▼
action a: velocity setpoint hoặc attitude + thrust
(tránh motor PWM ngay ngày đầu)
│
▼
reward: tiến tới goal − λ_u‖u‖² − λ_c·collision − λ_smooth·jerk
│
▼
thuật toán: PPO / SAC (+ residual trên LQR hoặc safety shield)
│
▼
deploy: domain randomization → fine-tune thật → fail-safe giám sát
import numpy as np
# s ∈ [-1, 1], mục tiêu 0; action = gia tốc nhỏ; reward = -s^2
rng = np.random.default_rng(1)
theta = 0.0 # π(a|s) = N(theta * s, 0.5)
lr = 0.05
for ep in range(80):
s, grads, rews = 0.8, [], []
for t in range(20):
mu = theta * s
a = mu + 0.5 * rng.normal()
grads.append(((a - mu) / (0.5 ** 2)) * s) # ∂ logπ / ∂θ
s = np.clip(s + 0.1 * a, -1, 1)
rews.append(-(s ** 2))
G, returns = 0.0, []
for r in reversed(rews):
G = r + 0.95 * G
returns.append(G)
returns = np.array(list(reversed(returns)))
returns = (returns - returns.mean()) / (returns.std() + 1e-8)
theta += lr * np.mean(np.array(grads) * returns)
print("theta ≈", round(theta, 3), " (thường âm: kéo s về 0)")
Vision cổ điển (hình học + optical flow) cho tín hiệu có cấu trúc.
Deep learning cho ngữ nghĩa và perception giàu hơn.
SGD / overfitting / CNN là dụng cụ triển khai.
RL (Lecture 23) là lớp quyết định đặt trên dynamics – estimation – perception — không thay thế chúng nếu mục tiêu là bay thật và viết nghiên cứu đứng vững.
Bài tiếp: 05_BroaderTopics_Capstone.md.