Sensor Fusion là gì? Kết hợp nhiều cảm biến không hoàn hảo thành một ước lượng tốt hơn
Atlasbot · 17/8/2026 · 11 phút đọc
Hai bài trước đã đặt ra vấn đề: Odometry trôi khi bánh trượt, IMU trôi theo tích phân riêng của nó — không nguồn nào một mình đáng tin cậy hoàn toàn. Sensor Fusion là kỹ thuật kết hợp nhiều nguồn dữ liệu không hoàn hảo này thành một ước lượng tốt hơn từng nguồn riêng lẻ.
Khái niệm chính
Ý tưởng cốt lõi: mỗi cảm biến đáng tin cậy ở một khía cạnh khác nhau, sensor fusion là cách tự động cân trọng số giữa các nguồn đó theo tình huống:
Khi robot đi thẳng, tốc độ ổn định trên sàn phẳng:
→ tin odometry nhiều hơn (encoder chính xác, ít nhiễu trong điều kiện lý tưởng)
Khi robot vừa tăng tốc gấp hoặc đi qua sàn trơn (nghi ngờ trượt bánh):
→ tin gyroscope (IMU) nhiều hơn cho phần góc xoay
Vấn đề khó không phải "kết hợp hai con số" (trung bình cộng đơn giản), mà là biết khi nào nên tin nguồn nào hơn — đây chính xác là bài toán mà bộ lọc Kalman và biến thể EKF (bài tiếp theo) được thiết kế để giải.
Tóm lại: Sensor fusion không phải "cộng trung bình các cảm biến lại" — nó là quá trình ước lượng liên tục, tự điều chỉnh mức độ tin tưởng vào từng nguồn dựa trên độ không chắc chắn (uncertainty) của chính nguồn đó tại từng thời điểm.
Nguyên lý hoạt động
Package phổ biến nhất cho sensor fusion trong hệ sinh thái ROS2 là robot_localization, chạy một EKF nhận đầu vào từ nhiều nguồn cùng lúc:
ekf_filter_node:
ros__parameters:
odom0: /wheel_odometry
odom0_config: [true, true, false, # x, y, z
false, false, true, # roll, pitch, yaw
false, false, false, # vx, vy, vz
false, false, true, # vroll, vpitch, vyaw
false, false, false] # ax, ay, az
imu0: /imu/data
imu0_config: [false, false, false,
false, false, true, # chỉ tin yaw từ IMU
false, false, false,
false, false, true, # và vyaw từ gyroscope
false, false, false]
Mảng cấu hình (_config) là nơi khai báo chính xác trường dữ liệu nào tin từ nguồn nào — cấu hình mẫu trên chỉ tin x, y từ odometry bánh xe (không tin yaw, vì odometry kém chính xác về góc khi có trượt), nhưng lại tin yaw/vyaw từ IMU.
Nguyên lý không giới hạn ở odometry + IMU — có thể fusion thêm GPS, visual odometry, hoặc kết quả AMCL, mỗi nguồn đóng góp thông tin ở khía cạnh nó đáng tin nhất.
Kiến thức kỹ thuật
Công thức
Dạng đơn giản nhất của sensor fusion — kết hợp 2 ước lượng độc lập theo trọng số nghịch đảo phương sai (inverse-variance weighting) — chính là nền tảng toán học mà Kalman Filter mở rộng ra:
x_fusion = (x1/σ1² + x2/σ2²) / (1/σ1² + 1/σ2²)
VD: odometry đo được x1=10.2m (độ lệch chuẩn σ1=0.5m, kém tin cậy hơn)
IMU-derived đo được x2=10.0m (độ lệch chuẩn σ2=0.1m, đáng tin cậy hơn nhiều)
x_fusion = (10.2/0.25 + 10.0/0.01) / (1/0.25 + 1/0.01)
= (40.8 + 1000) / (4 + 100) = 1040.8/104 ≈ 10.01m
Kết quả gần với ước lượng đáng tin cậy hơn (x2) nhiều hơn hẳn — đúng nguyên tắc "nguồn nào chắc chắn hơn (σ nhỏ hơn) thì được tin nhiều hơn", tự động, không cần code if-else thủ công chọn nguồn nào.
Thông số
Giá trị hiệp phương sai (covariance) khai trong robot_localization phản ánh đúng mức độ tin cậy tương đối giữa các nguồn — số càng nhỏ nghĩa là càng tin tưởng:
| Nguồn | Độ không chắc chắn tương đối |
|---|---|
| Vị trí (x,y) từ odometry bánh xe | Trung bình, tăng dần theo quãng đường đã đi |
| Yaw từ gyroscope (IMU) ngắn hạn | Thấp (rất tin cậy trong thời gian ngắn) |
| Vị trí tuyệt đối từ AMCL (bài tiếp theo) | Thấp khi đã hội tụ tốt, cao lúc mới khởi tạo |
Ứng dụng thực tế
Với AMR hoạt động cả trong nhà lẫn ngoài trời, kiến trúc robot_localization chuẩn thường dùng 2 EKF lồng nhau: một EKF "local" chỉ fusion odometry + IMU để publish odom→base_link (mượt, tần số cao, không cần GPS); một EKF "global" fusion thêm cả GPS (khi có tín hiệu) để publish map→odom (chính xác tuyệt đối hơn nhưng cập nhật thưa hơn, và tạm ngưng đóng góp khi GPS bị che khuất gần toà nhà cao tầng) — đúng kiến trúc 2 tầng odom/map đã học ở bài Hệ toạ độ, giờ mỗi tầng còn được "nuôi" bởi chính bộ lọc sensor fusion riêng phù hợp với đặc tính từng tầng.
Ví dụ thực tế
def fusion(x1, sigma1, x2, sigma2):
w1 = 1 / sigma1**2
w2 = 1 / sigma2**2
return (x1*w1 + x2*w2) / (w1 + w2)
x_odom, sigma_odom = 10.2, 0.5
x_imu, sigma_imu = 10.0, 0.1
result = fusion(x_odom, sigma_odom, x_imu, sigma_imu)
print(f"Odometry: {x_odom}m (do lech chuan {sigma_odom}m)")
print(f"IMU-derived: {x_imu}m (do lech chuan {sigma_imu}m)")
print(f"Ket qua fusion: {result:.2f}m")
Output:
Odometry: 10.2m (do lech chuan 0.5m)
IMU-derived: 10.0m (do lech chuan 0.1m)
Ket qua fusion: 10.01m
Kết quả fusion không phải trung bình cộng đơn giản ((10.2+10.0)/2 = 10.1) mà nghiêng hẳn về phía nguồn đáng tin cậy hơn — chính xác đúng hành vi mong đợi của inverse-variance weighting.
Lỗi thường gặp
- Đếm sai vị trí trong mảng
_config15 phần tử — thứ tự cố định (x,y,z, roll,pitch,yaw, vx,vy,vz, vroll,vpitch,vyaw, ax,ay,az) rất dễ đếm nhầm vị trítrue/false— luôn đối chiếu comment rõ ràng cho từng dòng như ví dụ trên, không đếm suông. - Tin cùng 1 đại lượng vật lý từ nhiều nguồn xung đột nhau — VD: tin cả
yawtừ odometry lẫn IMU cùng lúc mà không hiểu rõ 2 nguồn này có thể mâu thuẫn nhau khi trượt bánh xảy ra — nên chọn rõ ràng 1 nguồn đáng tin nhất cho mỗi đại lượng, không tin trùng lặp không kiểm soát. - Khai covariance không thực tế — 1 nguồn cảm biến khai covariance quá nhỏ (quá tự tin) so với độ chính xác thực tế sẽ "áp đảo" các nguồn khác trong phép fusion dù bản thân nó không đáng tin đến vậy — luôn dùng giá trị covariance phản ánh đúng đặc tính thực đo được của cảm biến, không phải số mặc định tuỳ tiện.
- Fusion các nguồn có tần số cập nhật rất khác nhau mà không xử lý đúng thời gian — GPS cập nhật 1Hz trong khi odometry cập nhật 50Hz — bộ lọc cần nội suy/dự đoán đúng cách giữa các lần cập nhật GPS thưa thớt, không phải chỉ "giữ nguyên giá trị cũ" tới lần cập nhật tiếp theo.
Kết luận
Sensor fusion biến nhiều nguồn dữ liệu không hoàn hảo thành một ước lượng đáng tin cậy hơn từng nguồn riêng lẻ, dựa trên nguyên tắc cân trọng số theo độ không chắc chắn — nền tảng toán học của Kalman Filter. robot_localization là công cụ chuẩn trong ROS2 hiện thực hoá nguyên lý này qua cấu hình khai báo, không cần tự viết bộ lọc từ đầu. Bài tiếp theo trong chuyên mục nói về EKF (Extended Kalman Filter) — thuật toán cụ thể đứng sau robot_localization, mở rộng nguyên lý trọng số vừa học sang hệ phi tuyến.