Mỗi cảm biến có độ chính xác hạn chế. Khi robot chạy liên tục, sai số quãng đường (odometry error) cộng dồn từng chút một. Sau vài chục mét, bản đồ bắt đầu bị méo. Sau vài trăm mét, robot có thể tưởng mình ở chỗ khác hoàn toàn. Loop closure giải quyết vấn đề này bằng cách phát hiện khi nào robot quay lại gần một vị trí đã từng ghé, rồi dùng thông tin đó để sửa lại toàn bộ bản đồ và quỹ đạo. Đây là chìa khoá để robot có thể hoạt động trong thời gian dài mà vẫn giữ bản đồ chính xác.
Tại sao sai số tích lũy lại là vấn đề
Odometry drift là gốc rễ. Khi robot dựa vào encoder bánh xe hay IMU để ước lượng chuyển động, mỗi lần đo đều có sai số nhỏ. Khi cộng dồn hàng trăm hay hàng nghìn lần đo, sai số không phải cộng tuyến tính mà tích lũy lũy thừa.
Bản đồ bắt đầu bị xoắn. Nếu robot đi vòng một căn phòng hình vuông, sau khi quay về điểm xuất phát, nó sẽ không khép được vòng. Bản đồ sẽ có dạng hình thoi hay tứ giác bị lệch, không còn là hình vuông nữa.
Các phương pháp SLAM thông thường không tự sửa. Một số hệ thống SLAM chỉ tối ưu quỹ đạo gần đây (sliding window). Chúng không biết rằng robot đã quay lại chỗ cũ, nên không có cơ hội để sửa sai lịch sử.
Sensor fusion cũng có giới hạn. Ngay cả khi kết hợp camera, lidar, IMU, độ chính xác vẫn không thể tốt hơn chính xác của các cảm biến riêng lẻ trong thời gian dài.
Loop closure là cách tự động phát hiện và sửa. Thay vì chỉ dựa vào sensor, robot cần phát hiện: "Tôi đã ở nơi này trước đây rồi", rồi dùng ràng buộc này để tối ưu lại toàn bộ đồ thị.
Không phải mọi SLAM đều có loop closure. Những hệ thống chỉ chạy trong thời gian ngắn (vài phút) có thể không cần. Nhưng với robot hoạt động trong vài giờ hay vài ngày, loop closure là bắt buộc.
Loop closure không phải là chỉnh sửa thủ công. Nó là một phần của thuật toán, tự động phát hiện và tính toán lại.
Sai số có thể làm robot mất kịp việc. Nếu bản đồ sai quá, robot không thể định vị được vị trí hiện tại, khiến nó không biết phải đi đâu tiếp theo.
Loop closure giải quyết bài toán toàn cục. Không chỉ sửa bản đồ, nó còn giúp robot hiểu cấu trúc toàn bộ môi trường.
Độ phức tạp tính toán tăng khi có nhiều loop. Mỗi khi phát hiện loop closure mới, hệ thống phải tối ưu lại đồ thị toàn bộ, điều này có thể mất thời gian.
Cách phát hiện loop closure — Khớp ảnh và place recognition
Ý tưởng cơ bản: so sánh ảnh hiện tại với ảnh quá khứ. Nếu hai ảnh giống nhau, robot có thể đang ở cùng một chỗ hoặc chỗ rất gần. Từ đó, ta có thể tính toán quan hệ hình học giữa hai vị trí đó.
Bag-of-Words cho khớp ảnh nhanh. Thay vì so sánh từng pixel, ta trích xuất các đặc trưng (feature) như SIFT, SURF, ORB, rồi gộp chúng lại thành một "túi từ". So sánh hai túi từ sẽ nhanh hơn nhiều so sánh ảnh nguyên bản.
Locality Sensitive Hashing tăng tốc độ tìm kiếm. Thay vì so sánh ảnh hiện tại với từng ảnh trong lịch sử (O(n)), ta dùng hash để tìm các ảnh "gần" trong không gian đặc trưng (O(log n) hoặc hằng số).
Geometric verification kiểm tra xem khớp có thực sự đúng không. Sau khi tìm ra hai ảnh giống nhau, ta tính toán phép biến đổi (transform) giữa chúng. Nếu phép biến đổi hợp lý (ví dụ: không quay 180 độ bất thường), ta xác nhận đây là loop closure thực sự.
Deep learning dần thay thế hand-crafted features. Các mạng neural có thể học trực tiếp đặc trưng hình ảnh tốt cho khớp, đặc biệt trong điều kiện ánh sáng thay đổi hoặc góc nhìn khác nhau.
Epipolar geometry giúp xác định vị trí chính xác giữa hai camera. Khi biết hai ảnh khớp với nhau, ta dùng các điểm tương ứng để tính toán ma trận cơ bản (fundamental matrix), từ đó suy ra vị trí tương đối.
RANSAC loại bỏ những khớp sai lệch. Không phải mọi điểm tương ứng giữa hai ảnh đều đúng. RANSAC tìm ra nhóm các điểm tương ứng lớn nhất và phù hợp nhất với một mô hình hình học.
Temporal consistency — loop closure không nên quá gần về thời gian. Nếu ảnh hiện tại khớp với ảnh chỉ 1 giây trước, đó có thể là sai dương (false positive) từ chuyển động nhỏ. Thường ta chỉ xem xét ảnh cách xa hơn 10-30 giây.
Multi-hypothesis loop closure cho phép xem xét nhiều ứng cử viên. Thay vì chỉ chấp nhận khớp đầu tiên, ta có thể xem xét vài khớp tốt nhất, rồi để cho bộ tối ưu pose graph quyết định cái nào thực sự đúng.
Pose graph optimization — Sửa lại toàn bộ bản đồ
Pose graph là biểu diễn toán học của quỹ đạo và ràng buộc. Mỗi nút đại diện cho một vị trí của robot (pose). Mỗi cạnh đại diện cho một ràng buộc: từ vị trí A tới vị trí B, robot di chuyển bao nhiêu (từ odometry hay khớp ảnh).
Trước khi loop closure, đồ thị là một chuỗi tuyến tính. Nút 1 nối tới nút 2, nút 2 nối tới nút 3, v.v. Nếu có sai số tích lũy, các nút cuối cùng sẽ bị lệch khỏi vị trí thực tế.
Loop closure thêm một cạnh mới nối nút cuối cùng về nút đầu tiên. Cạnh này nói: "Từ vị trí cuối cùng quay trở lại vị trí đầu tiên, khoảng cách là bao nhiêu". Nhưng nếu tổng tất cả các chuyển động trước đó không khớp với cạnh này, đồ thị sẽ "hỏng".
Tối ưu hóa giải quyết mâu thuẫn bằng cách điều chỉnh tất cả các nút. Thay vì tin tuyệt đối vào một ràng buộc nào đó, ta tìm một bộ vị trí sao cho tất cả các ràng buộc được thỏa mãn tốt nhất có thể (least squares).
Levenberg-Marquardt là một thuật toán tối ưu phổ biến. Nó kết hợp ưu điểm của gradient descent (nhanh, đơn giản) và Newton's method (hội tụ nhanh gần nghiệm).
g2o là thư viện phổ biến để tối ưu pose graph. Nó hỗ trợ 2D, 3D, các loại cảm biến khác nhau, và có thể chạy tương đối nhanh.
Incremental optimization chỉ tối ưu phần mới. Thay vì tối ưu lại toàn bộ đồ thị mỗi khi có loop closure mới (chậm), ta chỉ tối ưu lại các nút và cạnh bị ảnh hưởng.
Kích thước đồ thị ảnh hưởng tới tốc độ tính toán. Với bản đồ rộng lớn (hàng triệu nút), tối ưu hóa có thể mất nhiều giây hoặc phút, không phù hợp cho robot cần quyết định nhanh.
Submapping chia nhỏ bài toán tối ưu. Thay vì một đồ thị toàn cục, ta chia bản đồ thành các submaps nhỏ, tối ưu từng cái riêng, rồi nối chúng lại. Cách này vừa nhanh vừa chính xác.
Những thách thức khi triển khai loop closure
False positives — nhận dạng nhầm hai chỗ khác nhau. Một phòng trống với tường trắng có thể trông giống một phòng trống khác. Nếu robot nhầm lẫn, bản đồ sẽ bị xoắn khôi phục không được.
Thay đổi ánh sáng và mùa làm khó khớp ảnh. Một hành lang vào buổi sáng và buổi tối trông rất khác nhau. Mùa xuân và mùa thu, cây cối thay đổi, khiến khớp ảnh gặp khó khăn.
Vật thể động (người, xe) làm bừa bộ ảnh. Nếu người đứng trong hành lang, ảnh lần đầu có người, lần sau không. Khớp ảnh sẽ bị ảnh hưởng bởi những thay đổi tạm thời này.
Độ trễ thời gian — loop closure không phải lúc nào cũng được phát hiện ngay. Nếu robot quay lại một nơi sau vài giờ, hệ thống cần lưu trữ đủ ảnh cũ và tính toán đủ nhanh để phát hiện.
Điều chỉnh tham số khó khăn. Ngưỡng khớp ảnh, khoảng cách thời gian tối thiểu, trọng số của các ràng buộc — tất cả đều ảnh hưởng tới kết quả. Không có cài đặt chung cho mọi tình huống.
Bộ nhớ và tính toán hạn chế trên robot nhỏ. Một robot có khả năng tính toán yếu không thể chạy deep learning hoặc tối ưu hóa phức tạp. Phải cân bằng giữa độ chính xác và tốc độ.
Loop closure trong 3D phức tạp hơn 2D. Trong 3D, robot có thể quay lại một nơi từ góc độ hoàn toàn khác. Khớp ảnh và tính toán hình học trở nên khó hơn.
Sai lệch hệ thống trong cảm biến có thể không được loop closure sửa. Nếu camera bị lệch trục hay IMU bị drift hệ thống, loop closure chỉ giúp tối ưu hóa quỹ đạo, không sửa được sai lệch cảm biến.
Xác nhận loop closure thủ công là cách cuối cùng nhưng chậm. Nếu thuật toán không chắc chắn, người dùng có thể phải xác nhận bằng tay. Điều này không khả thi cho robot hoạt động tự động lâu dài.
Các phương pháp hiện đại và xu hướng
Học sâu cho descriptor — thay thế hand-crafted features. Các mạng như NetVLAD, SuperPoint, hay D2-Net học trực tiếp các đặc trưng tốt cho loop closure, đặc biệt bền vững với thay đổi ánh sáng và góc nhìn.
Multi-sensor loop closure kết hợp camera, lidar, và IMU. Thay vì chỉ dựa vào ảnh RGB, ta có thể dùng lidar pointcloud để khớp, hoặc dùng IMU để loại bỏ những ứng cử viên vô lý (ví dụ: một phép quay 180 độ bất thường).
Semantic segmentation cải thiện độ tin cậy khớp ảnh. Thay vì khớp toàn bộ ảnh, ta chỉ khớp những phần có ý nghĩa (bức tường, cửa, bàn), bỏ qua những vật thể động.
Hierarchical loop closure tìm kiếm từ toàn cục xuống chi tiết. Đầu tiên, ta tìm ra vùng tương tự trên bản đồ toàn cục (ví dụ: cùng một tầng trong tòa nhà). Rồi mới tìm khớp chi tiết.
Real-time loop closure trên robot nhỏ còn là thách thức. Hầu hết các phương pháp hiện đại vẫn cần máy tính desktop để chạy nhanh. Tối ưu hóa cho robot nhỏ (ARM, NVIDIA Jetson) là một hướng nghiên cứu.
Active loop closure — robot chủ động tìm kiếm loop. Thay vì chờ phát hiện tự động, ta có thể hướng robot quay lại những vùng có khả năng cao sẽ tạo loop closure.
Incremental SLAM + loop closure cho phép cập nhật liên tục. Bản đồ không phải chờ cho tới khi robot quay lại, mà được cập nhật từng chút một, và sửa chữa khi loop closure được phát hiện.
Certifiable algorithms đảm bảo kết quả tối ưu toàn cục. Các phương pháp truyền thống chỉ tìm cực tiểu cục bộ. Certifiable algorithms có thể xác nhận liệu kết quả có phải tối ưu toàn cục hay không.
Distributed SLAM cho nhiều robot cần chia sẻ loop closures. Khi nhiều robot cùng hoạt động, chúng có thể chia sẻ thông tin loop closure để xây dựng bản đồ chung chính xác hơn.
Câu hỏi thường gặp
Loop closure có phải bắt buộc trong mọi hệ thống SLAM không?
Không. Nếu robot chỉ hoạt động trong thời gian ngắn (vài phút) hoặc môi trường rất nhỏ (vài mét), sai số tích lũy có thể chấp nhận được. Nhưng với bất kỳ ứng dụng nào yêu cầu robot hoạt động lâu dài hoặc trong không gian rộng (robot hút bụi, robot giao hàng), loop closure là cần thiết để giữ bản đồ chính xác.
Tại sao loop closure phát hiện được nhưng bản đồ vẫn sai?
Có vài lý do: (1) Loop closure được phát hiện nhưng khớp yếu, không đủ chính xác để sửa toàn bộ bản đồ. (2) Có quá nhiều sai lệch tích lũy trước đó, một loop closure không đủ để sửa. (3) Có nhiều false positives (loop closures sai) khiến bộ tối ưu hóa bị nhầm lẫn. (4) Sai lệch hệ thống trong cảm biến (ví dụ: camera bị lệch trục) không thể được sửa bằng loop closure.
Bag-of-Words có nhanh hơn Deep Learning cho khớp ảnh không?
Bag-of-Words thường nhanh hơn Deep Learning khi chạy trên CPU thường. Nhưng Deep Learning có thể chính xác hơn, đặc biệt trong điều kiện ánh sáng thay đổi hoặc góc nhìn khác nhau. Hiện nay, xu hướng là dùng Deep Learning trên GPU (có trong robot hiện đại) vì chúng nhanh và chính xác hơn.
Làm sao giảm false positives trong loop closure?
Có vài cách: (1) Tăng ngưỡng khớp ảnh (chỉ chấp nhận khớp rất tốt). (2) Yêu cầu khoảng cách thời gian tối thiểu lớn hơn (không khớp với ảnh quá gần về thời gian). (3) Dùng geometric verification chặt chẽ (RANSAC với ngưỡng cao). (4) Kết hợp nhiều cảm biến (camera + lidar) để xác nhận loop closure. (5) Dùng semantic segmentation để chỉ khớp những phần có ý nghĩa, bỏ qua vật thể động.
Đọc thêm trong Học tăng cường cho robot và Điều khiển & lý thuyết.