Bỏ qua

Cảm biến

Cảm biến là cách các hệ thống tự động nhận thức và diễn giải thế giới vật lý. File này bao quát các loại cảm biến, hiệu chuẩn, hợp nhất cảm biến, phát hiện đối tượng 3D, ước lượng độ sâu, mạng chiếm dụng không gian, phát hiện làn đường và bản đồ ngữ nghĩa — nền tảng cảm quan mà mọi robot, drone và xe tự lái đều xây dựng trên đó.

  • Với con người, việc nhận thức thế giới là việc quá dễ dàng: bạn thấy một chiếc xe đang lao tới, nghe tiếng động cơ của nó, cảm nhận mặt đất dưới chân, và ngay lập tức xây dựng trong đầu một mô hình về môi trường xung quanh. Một hệ thống tự động phải làm điều tương tự, nhưng bằng các cảm biến điện tử và thuật toán thay vì mắt và tai.

  • Thách thức cơ bản ở đây là: cảm biến chỉ cho ta những con số thô (cường độ điểm ảnh, đám mây điểm, phản xạ tín hiệu), và hệ thống phải biến những con số đó thành một sự hiểu biết có cấu trúc: "có một người đi bộ cách 12 mét phía trước, đang di chuyển sang trái với vận tốc 1,5 m/s". Đó chính là bài toán cảm biến.

  • Mọi thứ phía sau (dự đoán, lập kế hoạch, điều khiển) đều phụ thuộc vào cảm biến. Một chiếc xe tự lái có bộ lập kế hoạch hoàn hảo nhưng cảm biến tồi vẫn sẽ đâm. Cảm biến là nút thắt cổ chai.

Các loại cảm biến

  • Hệ thống tự động sử dụng nhiều loại cảm biến, mỗi loại có ưu điểm và cách thức hỏng hóc khác nhau. Không một cảm biến đơn lẻ nào là đủ.

So sánh cảm biến: camera, LiDAR, radar và IMU được đánh giá trên độ phân giải, độ sâu, độ bền thời tiết, đo vận tốc và chi phí

  • Camera ghi lại thông tin màu sắc dày đặc với độ phân giải cao. Một bức ảnh đơn chứa hàng triệu điểm ảnh, mỗi điểm lưu giá trị RGB (như ta đã thấy ở chương 8). Camera rẻ, nhẹ và cung cấp thông tin kết cấu, màu sắc phong phú — rất cần thiết để đọc biển báo, phát hiện đèn giao thông và nhận dạng vật thể.

  • Các loại camera gồm đơn tiêu (monocular, một ống kính, không có độ sâu gốc), lưỡng tiêu (stereo, hai ống kính tách nhau bởi một đường cơ sở, cho độ sâu qua sự chênh lệch thị sai như đã nói ở chương 8), và mắt cá (fisheye, góc nhìn cực rộng, 180°+, với độ méo xuyến tính lớn, dùng cho hệ thống camera toàn cảnh đỗ xe).

  • Điểm yếu lớn nhất của camera là mất thông tin độ sâu trong quá trình phép chiếu. Một cảnh 3D được ánh xạ lên mặt phẳng ảnh 2D qua mô hình camera lỗ kim (nhắc lại ma trận nội tại \(K\) từ chương 8):

\[\\begin{bmatrix} u \\\\ v \\\\ 1 \\end{bmatrix} = \\frac{1}{Z} K \\begin{bmatrix} X \\\\ Y \\\\ Z \\end{bmatrix}\]
  • Phép chia cho \(Z\) đã loại bỏ độ sâu tuyệt đối. Hai vật thể kích thước khác nhau ở khoảng cách khác nhau có thể cho cùng một phép chiếu. Khôi phục độ sâu từ một bức ảnh đơn là một bài toán không xác định (ill-posed), đó là lý do ta cần camera stereo hoặc các mô hình độ sâu đơn tiêu học được.

  • Camera cũng gặp khó khăn trong điều kiện bất lợi: ánh nắng trực tiếp gây lóa, bóng tối làm yếu tín hiệu, mưa hoặc sương mù làm tán xạ ánh sáng.

  • LiDAR (Light Detection and Ranging — Đo khoảng cách bằng ánh sáng) bắn các xung tia laser và đo thời gian cho mỗi xung bật lại. Vì ánh sáng truyền với tốc độ đã biết (\(c \approx 3 \times 10^8\) m/s), khoảng cách đến mỗi điểm phản xạ là:

\[d = \\frac{c \\cdot \\Delta t}{2}\]

Thời gian bay của LiDAR: một xung laser bật khỏi vật thể, khoảng cách được tính từ thời gian đi khứ hồi

  • Hệ số 2 là để tính cho lượt đi và về. Bằng cách quét tia laser khắp cảnh, LiDAR xây dựng một đám mây điểm: một tập hợp các tọa độ 3D \((x, y, z)\), thường kèm theo giá trị cường độ (độ phản xạ).

  • LiDAR quay (ví dụ Velodyne) quay một mảng laser 360° để tạo góc nhìn bao quát toàn cảnh. Các thiết bị điển hình sinh ra hơn 300.000 điểm mỗi giây trên 64–128 kênh dọc. Kết quả là một biểu diễn 3D thưa nhưng chính xác về mặt hình học của cảnh.

  • LiDAR thể rắn (solid-state) không có bộ phận chuyển động, dùng mảng pha quang học hoặc gương MEMS thay thế. Điều này khiến chúng rẻ hơn, nhỏ gọn hơn và đáng tin cậy hơn, nhưng thường có góc nhìn hẹp hơn (120° so với 360°).

  • LiDAR cho độ sâu chính xác nhưng sinh dữ liệu thưa (ít "điểm ảnh" hơn nhiều so với camera), không có thông tin màu sắc, và đắt tiền. Nó cũng suy giảm trong mưa to, tuyết hoặc bụi, khi các hạt làm tán xạ xung laser.

  • Radar (Radio Detection and Ranging — Đo khoảng cách bằng sóng vô tuyến) hoạt động theo cùng nguyên lý thời gian bay như LiDAR nhưng dùng sóng vô tuyến (sóng milimet, thường là 77 GHz cho ô tô). Sóng vô tuyến xuyên qua mưa, sương mù, bụi và tuyết tốt hơn ánh sáng rất nhiều, khiến radar là cảm biến bền bỉ nhất trước thời tiết.

  • Radar cũng đo trực tiếp vận tốc qua hiệu ứng Doppler. Khi một vật thể di chuyển về phía cảm biến, sóng phản xạ bị nén lại (tần số cao hơn); khi di chuyển ra xa, nó bị kéo giãn (tần số thấp hơn). Vận tốc là:

\[v = \\frac{\\Delta f \\cdot c}{2 f_0}\]
  • với \(\\Delta f\) là độ dịch tần và \(f_0\) là tần số phát. Điều này cho vận tốc xuyên tâm tức thời mà không cần bất kỳ bước theo dõi hay tính toán khung-hình-này-qua-khung-hình nào.

  • Sự đánh đổi nằm ở độ phân giải: radar có độ phân giải góc thô hơn nhiều so với camera hay LiDAR, khiến nó kém trong việc phân biệt các vật thể gần nhau hoặc phát hiện chi tiết nhỏ. Nó xuất sắc trong việc phát hiện xe ở tầm xa (200+ mét) trong mọi thời tiết.

  • Cảm biến siêu âm phát các xung âm tần số cao (40–70 kHz) và đo thời gian echo trả về. Chúng hoạt động ở tầm rất ngắn (0,2–5 mét) và chủ yếu dùng cho hỗ trợ đỗ xe. Vật lý của chúng giống hệt LiDAR nhưng dùng âm thanh thay vì ánh sáng, nên \(d = \\frac{v_{\\text{sound}} \\cdot \\Delta t}{2}\) với \(v_{\\text{sound}} \approx 343\) m/s.

  • IMU (Inertial Measurement Unit — Bộ đo quán tính) chứa các gia tốc kế và con quay hồi chuyển đo tương ứng gia tốc tuyến tính và vận tốc góc. IMU cung cấp dữ liệu chuyển động tần số cao (thường 200–1000 Hz) lấp đầy các khoảng trống giữa các cập nhật cảm biến chậm hơn. Nó không cảm nhận môi trường trực tiếp mà theo dõi chuyển động của chính robot, trở nên thiết yếu cho việc ước lượng trạng thái và xác định vị trí bằng quán tính (dead-reckoning).

  • IMU chịu trôi (drift): các lỗi đo nhỏ tích lũy theo thời gian, khiến vị trí ước lượng lệch dần khỏi thực tế. Đó là lý do IMU hầu như luôn được hợp nhất với các cảm biến khác (camera, GPS, LiDAR) thay vì dùng một mình.

  • GNSS (Hệ thống vệ tinh định vị toàn cầu, gồm cả GPS) cung cấp vị trí tuyệt đối trên bề mặt Trái Đất bằng cách tam giác hóa tín hiệu từ nhiều vệ tinh. Độ chính xác GPS tiêu chuẩn là 2–5 mét, không đủ cho việc lái xe theo làn. RTK-GPS (Real-Time Kinematic — Định vị động thời gian thực) dùng một trạm gốc cố định để hiệu chỉnh lỗi, đạt độ chính xác đến từng centimet, nhưng đòi hỏi tầm nhìn trời quang và hạ tầng trạm gốc.

Hiệu chuẩn cảm biến

  • Trước khi các cảm biến có thể hoạt động cùng nhau, chúng phải được hiệu chuẩn: phép đo của mỗi cảm biến phải được quy về một hệ tọa độ chung.

  • Hiệu chuẩn nội tại (intrinsic) xác định các tham số bên trong của cảm biến. Với camera, điều này nghĩa là tiêu cự, điểm chính và các hệ số méo (như đã nói ở chương 8). Với LiDAR, nó là độ lệch góc chính xác giữa các chùm tia laser. Một phương pháp phổ biến là hiệu chuẩn bảng ca-rô của Zhang, trong đó một mẫu mặt phẳng đã biết được quan sát từ nhiều góc để giải ma trận nội tại.

  • Hiệu chuẩn ngoại tại (extrinsic) xác định phép biến đổi cứng (xoay \(R\) và tịnh tiến \(\\mathbf{t}\)) giữa hai cảm biến. Nếu một camera và LiDAR gắn trên cùng một xe, hiệu chuẩn ngoại tại tìm ra ma trận biến đổi \(4 \\times 4\) ánh xạ các điểm từ tọa độ LiDAR sang tọa độ camera:

\[\\mathbf{p}_{\\text{cam}} = \\begin{bmatrix} R & \\mathbf{t} \\\\ \\mathbf{0}^T & 1 \\end{bmatrix} \\mathbf{p}_{\\text{lidar}}\]
  • Đây là một phép biến đổi affine trong tọa độ thuận nhất, đúng như loại ta đã học ở chương 2 (các phép biến đổi tuyến tính). Tính sai ma trận này nghĩa là các điểm LiDAR sẽ chiếu nhầm vào các điểm ảnh, và toàn bộ quy trình hợp nhất sẽ vỡ.

  • Hiệu chuẩn thời gian đồng bộ các đồng hồ cảm biến. Một camera chụp ở 30 Hz và một LiDAR ở 10 Hz sinh dữ liệu tại các dấu thời gian khác nhau. Nếu một chiếc xe đang chạy 30 m/s (tốc độ cao tốc), một lỗi thời gian 10 ms tương ứng với một sai số không gian 30 cm. Kích hoạt phần cứng (một xung đồng hồ chung) hoặc đồng bộ phần mềm (nội suy giữa các dấu thời gian) là điều thiết yếu.

Hợp nhất cảm biến

  • Không một cảm biến đơn lẻ nào bao quát được mọi điều kiện. Camera thấy màu sắc và kết cấu nhưng mất độ sâu. LiDAR đo độ sâu chính xác nhưng thưa và "mù màu". Radar hoạt động mọi thời tiết nhưng độ phân giải kém. Hợp nhất cảm biến kết hợp điểm mạnh của chúng và bù đắp điểm yếu riêng biệt.

  • Hợp nhất sớm (early fusion, hay hợp nhất mức dữ liệu) kết hợp dữ liệu thô của cảm biến trước bất kỳ xử lý nào. Ví dụ, chiếu các điểm LiDAR lên ảnh camera để tạo một biểu diễn RGBD (màu + độ sâu mỗi điểm ảnh), hoặc tô mỗi điểm LiDAR bằng màu của điểm ảnh camera mà nó chiếu lên. Cách này giữ lại nhiều thông tin nhất nhưng đòi hỏi hiệu chuẩn chính xác và nhạy với sự lệch căn chỉnh.

  • Hợp nhất muộn (late fusion, hay hợp nhất mức quyết định) xử lý mỗi cảm biến độc lập qua đường ống phát hiện riêng, rồi gộp các đầu ra cuối (hộp bao, nhãn lớp, điểm tin cậy). Mỗi cảm biến "bỏ phiếu", và một mô-đun hợp nhất hòa giải các bất đồng. Cách này đơn giản và mô-đun hơn, nhưng mỗi đường ống không thể tận dụng dữ liệu thô của cảm biến kia.

  • Hợp nhất trung cấp (mid-level fusion) hoạt động trên các biểu diễn đặc trưng trung gian. Dữ liệu thô của mỗi cảm biến được mã hóa vào một không gian đặc trưng học được (dùng CNN hoặc transformer), rồi các đặc trưng được kết hợp. Đây là cách tiếp cận chủ đạo trong các hệ thống hiện đại vì nó cho mạng học được nên trích xuất gì từ mỗi phương thức.

Quy trình hợp nhất BEV: camera và LiDAR được mã hóa độc lập rồi chiếu vào một lưới nhìn từ trên xuống chung

  • BEVFusion là một kiến trúc hợp nhất trung cấp tiêu biểu. Nó chiếu cả đặc trưng camera và đặc trưng LiDAR vào một biểu diễn chung nhìn từ trên xuống (bird's-eye-view, BEV) — một lưới top-down của cảnh. Các đặc trưng camera được "nâng" lên 3D dùng các phân bố độ sâu dự đoán, rồi dội (splatter) lên lưới BEV. Các đặc trưng LiDAR vốn đã 3D nên được trực tiếp voxel hóa lên cùng lưới. Các đặc trưng BEV đã hợp nhất sau đó được xử lý bởi một đầu phát hiện.

  • Biểu diễn BEV mạnh mẽ vì nó cung cấp một khung tọa độ thống nhất, có tỷ lệ theo metric, nơi lập luận không gian (khoảng cách, kích thước, chồng lấp) trở nên đơn giản. Trong ảnh camera, một chiếc xe đạp gần và một chiếc xe tải xa có thể chiếm cùng số điểm ảnh. Trong BEV, kích thước và vị trí thực của chúng là rõ ràng.

Phát hiện đối tượng 3D

  • Nhiệm vụ cốt lõi của cảm biến là phát hiện các vật thể trong 3D: chúng ở đâu, lớn thế nào, là cái gì, và hướng về đâu? Mỗi phát hiện là một hộp bao 3D với vị trí \((x, y, z)\), kích thước \((l, w, h)\), góc hướng \(\\theta\), nhãn lớp và điểm tin cậy.

  • Phát hiện dựa trên LiDAR hoạt động trực tiếp trên đám mây điểm. Thách thức là đám mây điểm không có thứ tự, không đều và thay đổi mật độ (vật gần có hàng nghìn điểm, vật xa chỉ vài điểm). Nhắc lại từ chương 8 rằng PointNet xử lý việc này bằng các MLP chia sẻ và một phép gộp bất biến hoán vị (max pooling).

  • PointPillars chuyển đám mây điểm thành một biểu diễn có cấu trúc bằng cách rời rạc hóa mặt phẳng mặt đất thành một lưới các cột dọc ("pillars"). Mọi điểm trong mỗi cột được mã hóa bởi một PointNet nhỏ thành một vector đặc trưng kích thước cố định. Kết quả là một ảnh giả 2D có thể xử lý bằng một backbone CNN 2D chuẩn, theo sau là một đầu phát hiện (như kiến trúc SSD từ chương 8). Cách này nhanh và hiệu quả.

  • CenterPoint phát hiện vật thể dưới dạng các điểm thay vì hộp. Nó dự đoán một heatmap các tâm vật thể trong BEV, rồi hồi quy các thuộc tính hộp (kích thước, độ cao, hướng, vận tốc) tại mỗi đỉnh. Đây là phiên bản 3D của CenterNet (chương 8): không cần neo (anchor-free), không cần NMS trong huấn luyện, và tự nhiên mở rộng sang theo dõi bằng cách liên kết các điểm tâm qua các khung hình.

  • Phát hiện 3D chỉ dùng camera phải suy luận độ sâu từ ảnh 2D, vốn khó hơn nhiều. Các cách tiếp cận hiện đại như BEVDetBEVFormer dùng các kiến trúc transformer để "nâng" đặc trưng ảnh 2D lên 3D. BEVFormer dùng sự chú ý chéo không gian (spatial cross-attention): các truy vấn BEV chú ý đến các điểm tham chiếu 3D cụ thể được chiếu lên ảnh của mỗi camera, kéo các đặc trưng từ các vị trí tương ứng.

  • Khoảng cách độ chính xác giữa phát hiện 3D dựa trên LiDAR và dựa trên camera đang thu hẹp nhanh chóng, nhờ ước lượng độ sâu tốt hơn, mô hình lớn hơn và hợp nhất theo thời gian (dùng nhiều khung hình để tích lũy manh mối độ sâu, giống như cách khớp stereo hoạt động nhưng xuyên suốt thời gian).

Ước lượng độ sâu

  • Ước lượng độ sâu là bài toán gán một giá trị khoảng cách cho mỗi điểm ảnh hoặc mỗi điểm.

  • Khớp stereo dùng hai camera tách nhau bởi một đường cơ sở \(b\) đã biết. Cùng một điểm 3D xuất hiện ở các vị trí ngang hơi khác nhau trong hai ảnh (sự chênh lệch \(d\)). Độ sâu được tính bằng (từ chương 8):

\[Z = \\frac{f \\cdot b}{d}\]
  • với \(f\) là tiêu cự. Thách thức là tìm sự tương ứng đúng giữa hai ảnh, đặc biệt ở các vùng không có kết cấu, bị che khuất và có họa tiết lặp. Các mạng stereo hiện đại (ví dụ RAFT-Stereo) dùng tinh chỉnh lặp với các thể tích tương quan.

  • Ước lượng độ sâu đơn tiêu dự đoán độ sâu từ một ảnh đơn. Vì đây là bài toán không xác định (vô số cảnh 3D có thể sinh ra cùng một bức ảnh), mạng phải học các tiên nghiệm thống kê: "sàn thì phẳng", "vật thể thu nhỏ dần theo khoảng cách", "độ dốc kết cấu chỉ ra các bề mặt lùi dần".

  • Depth Anything (đã nói ở chương 8) đạt độ sâu đơn tiêu mạnh bằng cách huấn luyện trên các tập dữ liệu khổng lồ chưa có nhãn với tự giám sát, rồi tinh chỉnh trên dữ liệu có nhãn. Ý kiến then chốt là các hàm mất mát bất biến tỷ lệ xử lý được sự mơ hồ vốn có: mô hình dự đoán độ sâu tương đối (thứ tự) thay vì mét tuyệt đối.

  • Hợp nhất độ sâu LiDAR-camera chiếu các phép đo độ sâu thưa của LiDAR lên ảnh camera làm nhãn giám sát. Mạng học cách "lấp đầy" các khoảng trống giữa các điểm thưa, sinh ra các bản đồ độ sâu dày đặc kết hợp độ chính xác của LiDAR với độ phân giải của camera.

Mạng chiếm dụng không gian

  • Cảm biến truyền thống xuất ra một danh sách các hộp bao, mỗi hộp cho một vật thể được phát hiện. Nhưng thế giới thực chứa nhiều thứ không vừa vặn gọn gàng vào các hộp: mảnh vụn có hình thù kỳ dị, rào chắn công trình, cành cây vươn ra, một bức tường sập một phần.

Hộp bao lãng phí không gian trên các hình dạng không đều; lưới chiếm dụng tuân theo hình học thực

  • Mạng chiếm dụng không gian (occupancy networks) biểu diễn cảnh dưới dạng một lưới voxel 3D dày đặc. Mỗi voxel (một khối nhỏ của không gian, ví dụ 0,2m × 0,2m × 0,2m) được phân loại là tự do, bị chiếm dụng, hoặc chưa biết, và tùy chọn gán một nhãn ngữ nghĩa (đường, vỉa hè, xe, thảm thực vật, v.v.).

  • Đây là sự chuyển dịch từ cảm biến lấy đối tượng làm trung tâm ("phát hiện chiếc xe") sang cảm biến lấy cảnh làm trung tâm ("những phần nào của không gian 3D bị chiếm dụng?"). Ưu điểm là tính tổng quát: hệ thống không cần một danh sách các lớp vật thể định sẵn để tránh va chạm với các chướng ngại vật tùy ý.

  • Về kiến trúc, mạng chiếm dụng không gian nhận đầu vào cảm biến (camera, LiDAR, hoặc cả hai), mã hóa chúng thành một thể tích đặc trưng 3D, và dự đoán nhãn cho từng voxel. Thể tích đặc trưng 3D thường được xây dựng bằng cách nâng các đặc trưng 2D lên 3D (tương tự xây dựng BEV nhưng mở rộng theo chiều dọc) và xử lý bằng các phép tích chập 3D hoặc tích chập thưa.

  • TPVFormer (Tri-Perspective View — Góc nhìn ba phối cảnh) tránh chi phí lập phương của sự chú ý 3D đầy đủ bằng cách phân rã thể tích 3D thành ba mặt phẳng trực giao (từ trên xuống, từ trước, từ bên). Mỗi mặt phẳng dùng sự chú ý 2D, và các đặc trưng của chúng được kết hợp tại mỗi voxel. Điều này gợi nhớ cách SVD phân rã một ma trận thành các thừa số đơn giản hơn (chương 2): chia một bài toán 3D khó thành các mảnh 2D dễ quản lý.

  • Lưới voxel đầu ra trực tiếp cho biết bộ lập kế hoạch vùng không gian nào an toàn để chiếm dụng và vùng nào không, khiến nó trở thành một giao diện tự nhiên giữa cảm biến và lập kế hoạch.

Phát hiện làn đường và cấu trúc đường

  • Với các phương tiện trên đường có kết cấu, việc hiểu hình học làn đường là cực kỳ quan trọng. Hệ thống phải biết làn nằm ở đâu, chúng cong thế nào, chúng hợp và tách ở đâu, và xe đang ở làn nào.

  • Các cách tiếp cận cổ điển khớp các đường cong tham số vào các vạch làn được phát hiện. Một mô hình phổ biến là đa thức bậc ba:

\[x(y) = a_0 + a_1 y + a_2 y^2 + a_3 y^3\]
  • với \(y\) là khoảng cách dọc phía trước và \(x\) là độ lệch ngang. Đây là một xấp xỉ đa thức (nhắc lại chuỗi Taylor từ chương 3), được chọn vì đường đi là những đường cong mượt mà được các đa thức bậc thấp mô tả tốt. Các hệ số được ước lượng qua hồi quy bình phương nhỏ nhất trên các điểm làn đã phát hiện.

  • Các cách tiếp cận hiện đại dùng mạng nơ-ron để phát hiện làn trực tiếp. LaneNet coi mỗi làn như một thực thể (instance) và dùng một nhánh embedding để gộp các điểm ảnh thuộc cùng một làn, theo sau là khớp đường cong. GANet dùng cách tiếp cận dựa trên đồ thị, biểu diễn cấu trúc làn như một đồ thị có hướng, trong đó các nút là các điểm làn và các cạnh mã hóa tính kết nối (những làn nào hợp, tách, hoặc nối tại giao lộ).

  • Cấu trúc đường đi xa hơn các đường cong làn đơn lẻ để nắm bắt toàn bộ cấu trúc: các làn nối với nhau thế nào, làn nào cho phép rẽ trái, nơi một đường ramp cao tốc nhập vào. Điều này được mô hình hóa như một đồ thị có hướng, trong đó các giao lộ là nút và các đoạn làn là cạnh với các thuộc tính (giới hạn tốc độ, loại làn, hạn chế rẽ).

  • Cấu trúc đồ thị là thiết yếu cho việc lập kế hoạch tuyến đường: bộ lập kế hoạch cần biết không chỉ "các làn ở đâu" mà còn "chuỗi làn nào dẫn đến đích".

Bản đồ ngữ nghĩa

  • Cảm biến không kết thúc ở việc phát hiện vật thể trong một khung hình đơn lẻ. Theo thời gian, một hệ thống tự động xây dựng một bản đồ ngữ nghĩa: một biểu diễn có cấu trúc, bền vững của môi trường xung quanh, tích lũy thông tin qua nhiều lần quan sát.

  • Đơn giản nhất, một bản đồ ngữ nghĩa là một lưới 2D (một lưới chiếm dụng), trong đó mỗi ô lưu xác suất bị chiếm dụng. Khi robot di chuyển và quét bằng cảm biến, nó cập nhật các xác suất này dùng các cập nhật Bayes:

\[P(\\text{occupied} \\mid z_{1:t}) = \\frac{P(z_t \\mid \\text{occupied}) \\cdot P(\\text{occupied} \\mid z_{1:t-1})}{P(z_t)}\]
  • Đây là định lý Bayes đang hoạt động (từ chương 5): mỗi phép đo mới \(z_t\) cập nhật niềm tin tiên nghiệm về mỗi ô. Biểu diễn log-odds (log của tỷ lệ) thường được dùng để tránh các vấn đề số học khi nhân nhiều xác suất nhỏ:
\[l_t = l_{t-1} + \\log \\frac{P(z_t \\mid \\text{occupied})}{P(z_t \\mid \\text{free})}\]
  • Cộng log-odds tương đương với nhân các xác suất (nhắc lại rằng \(\\log(ab) = \\log a + \\log b\)), và tổng chạy tự nhiên tích lũy bằng chứng theo thời gian.

  • Các bản đồ giàu hơn gán nhãn ngữ nghĩa cho mỗi ô (đường, vỉa hè, tòa nhà, thảm thực vật) và có thể mở rộng sang 3D. Chúng có liên hệ chặt chẽ với mạng chiếm dụng không gian nhưng nhấn mạnh tính bền vững và tổng hợp theo thời gian thay vì dự đoán một khung hình đơn.

  • SLAM (Định vị và Lập bản đồ đồng thời), đã nói ở chương 8, là thuật toán xây dựng bản đồ đồng thời với việc theo dõi vị trí của robot bên trong nó. SLAM thị giác-quán tính hợp nhất dữ liệu camera và IMU; SLAM LiDAR dùng đăng ký đám mây điểm. Quy trình cảm biến cung cấp các phát hiện và ước lượng độ sâu vào hệ thống SLAM, thứ duy trì bản đồ toàn cục.

  • Các cách tiếp cận hiện đại ngày càng dùng các biểu diễn ngầm thần kinh (như NeRF từ chương 8) để xây dựng các bản đồ dày đặc, giống ảnh thật, có thể truy vấn tại bất kỳ điểm 3D nào. Các bản đồ thần kinh này lưu một biểu diễn nén của toàn bộ cảnh trong các trọng số mạng, cho phép các tác vụ như tổng hợp góc nhìn mới và truy vấn không gian chi tiết.

Bài tập lập trình (dùng CoLab hoặc notebook)

  1. Chiếu các điểm LiDAR 3D lên một ảnh camera 2D dùng một ma trận chiếu. Trực quan hóa những điểm nào rơi trong giới hạn ảnh.

    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    # Simulated LiDAR points in 3D (x=forward, y=left, z=up)
    rng = jax.random.PRNGKey(0)
    points_3d = jax.random.uniform(rng, (200, 3), minval=jnp.array([5, -10, -2]),
                                    maxval=jnp.array([50, 10, 3]))
    
    # Camera intrinsic matrix (focal length 500, image centre 320x240)
    K = jnp.array([[500, 0, 320],
                   [0, 500, 240],
                   [0,   0,   1.0]])
    
    # Extrinsic: LiDAR to camera (identity rotation, small translation)
    R = jnp.eye(3)
    t = jnp.array([0.0, 0.0, -0.5])
    
    # Project: p_cam = K @ (R @ p_lidar + t)
    p_cam = (R @ points_3d.T).T + t
    p_img = (K @ p_cam.T).T
    p_img = p_img[:, :2] / p_img[:, 2:3]  # divide by Z
    
    # Filter points in front of camera and within image
    mask = (p_cam[:, 2] > 0) & (p_img[:, 0] > 0) & (p_img[:, 0] < 640) & \
           (p_img[:, 1] > 0) & (p_img[:, 1] < 480)
    depth = p_cam[mask, 2]
    
    plt.figure(figsize=(8, 5))
    plt.scatter(p_img[mask, 0], p_img[mask, 1], c=depth, cmap="viridis", s=5)
    plt.colorbar(label="Depth (m)")
    plt.xlim(0, 640); plt.ylim(480, 0)
    plt.title("LiDAR points projected onto camera image")
    plt.xlabel("u (pixels)"); plt.ylabel("v (pixels)")
    plt.show()
    

  2. Xây dựng một lưới chiếm dụng 2D đơn giản dùng các cập nhật log-odds Bayes. Mô phỏng một cảm biến tầm quét một môi trường và xem bản đồ dần hiện ra.

    import jax
    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    # Grid setup: 50x50 cells, each 0.2m
    grid_size = 50
    log_odds = jnp.zeros((grid_size, grid_size))
    
    # Sensor model: log-odds update values
    l_occ = 0.85   # confidence that a hit means occupied
    l_free = -0.4  # confidence that a pass-through means free
    
    # Simulated obstacle: a wall from (5,20) to (5,30) in grid coords
    wall_y = jnp.arange(20, 30)
    
    # Robot at (25, 25), scanning outward
    robot = jnp.array([25, 25])
    
    for angle_deg in range(0, 360, 5):
        angle = jnp.radians(angle_deg)
        direction = jnp.array([jnp.cos(angle), jnp.sin(angle)])
    
        for step in range(1, 25):
            cell = (robot + direction * step).astype(int)
            r, c = int(cell[0]), int(cell[1])
            if r < 0 or r >= grid_size or c < 0 or c >= grid_size:
                break
    
            # Check if this cell is the wall
            is_wall = (r == 5) and (c >= 20) and (c < 30)
            if is_wall:
                log_odds = log_odds.at[r, c].add(l_occ)
                break
            else:
                log_odds = log_odds.at[r, c].add(l_free)
    
    # Convert log-odds to probability
    prob = 1.0 / (1.0 + jnp.exp(-log_odds))
    
    plt.figure(figsize=(6, 6))
    plt.imshow(prob.T, origin="lower", cmap="RdYlGn_r", vmin=0, vmax=1)
    plt.colorbar(label="P(occupied)")
    plt.plot(25, 25, "b*", markersize=10, label="Robot")
    plt.legend()
    plt.title("2D Occupancy Grid from Bayesian Updates")
    plt.show()
    

  3. Tính độ sâu từ một cặp ảnh stereo dùng sự chênh lệch thị sai. Mô phỏng hai góc nhìn camera của các điểm 3D, tính sự chênh lệch, và khôi phục độ sâu.

    import jax
    import jax.numpy as jnp
    
    # Camera parameters
    f = 500.0     # focal length in pixels
    b = 0.12      # baseline in metres (12 cm)
    
    # 3D points at known depths
    depths_true = jnp.array([5.0, 10.0, 20.0, 50.0, 100.0])
    
    # Disparity = f * b / Z
    disparities = f * b / depths_true
    
    # Recover depth from disparity
    depths_recovered = f * b / disparities
    
    for z, d, z_r in zip(depths_true, disparities, depths_recovered):
        print(f"True depth: {z:6.1f}m  Disparity: {d:6.2f}px  Recovered: {z_r:6.1f}m")
    
    # Notice: disparity is inversely proportional to depth
    # Close objects have large disparity, far objects have tiny disparity
    # This is why stereo is most accurate at short range