USB Camera trong robot: UVC là gì và vì sao dễ dùng nhất
Atlasbot · 18/8/2026 · 11 phút đọc
Muốn robot "nhìn thấy" thay vì chỉ đo khoảng cách như LiDAR (đã học ở chuyên mục LiDAR), camera là cảm biến rẻ và linh hoạt nhất — nhận diện màu sắc, vật thể, mã vạch, hay chạy các mô hình AI thị giác. Loại camera dễ dùng nhất trên Linux/ROS2 là USB Camera chuẩn UVC.
Khái niệm chính
UVC (USB Video Class) là một chuẩn giao tiếp USB chung cho thiết bị video — webcam, camera công nghiệp giá rẻ — được Linux hỗ trợ sẵn trong nhân hệ điều hành (kernel) thông qua driver uvcvideo. Nhờ vậy, hầu hết camera USB "cắm là chạy" trên Ubuntu mà không cần cài thêm driver riêng như nhiều thiết bị nhúng khác.
Nguyên lý hoạt động
Khi cắm một camera UVC vào máy chạy Linux, hệ thống tự tạo ra thiết bị dạng /dev/video0 (hoặc /dev/video1, /dev/video2... nếu có nhiều camera) — đây chính là điểm vào (interface) chuẩn mà cả công cụ dòng lệnh, OpenCV, lẫn gói ROS2 camera đều dùng để đọc khung hình.
ls /dev/video* # liệt kê các thiết bị camera đang có
v4l2-ctl --list-devices # xem tên thiết bị ứng với từng /dev/videoN
Kiến thức kỹ thuật
Công thức
Băng thông USB cần thiết để truyền video thô (chưa nén) tăng nhanh theo độ phân giải và tần số khung hình — yếu tố quyết định camera có "cắm là chạy mượt" hay không:
Băng_thông (byte/s) = Chiều_rộng × Chiều_cao × Số_byte_mỗi_pixel × FPS
VD: 640×480, định dạng YUYV (2 byte/pixel), 30 FPS
Băng_thông ≈ 640 × 480 × 2 × 30 ≈ 18.4 MB/s
USB 2.0 (băng thông lý thuyết ~35-40MB/s thực tế) vẫn đủ cho cấu hình này,
nhưng độ phân giải cao hơn (1920×1080) ở cùng FPS có thể vượt khả năng
USB 2.0, cần chuyển sang định dạng nén (MJPG) hoặc USB 3.0
Thông số
| Lý do chọn USB Camera | Chi tiết |
|---|---|
| Không cần driver riêng | Dùng driver uvcvideo có sẵn trong kernel Linux |
| Giá rẻ, đa dạng lựa chọn | Từ webcam phổ thông tới camera công nghiệp UVC độ phân giải cao |
| Tương thích sẵn ROS2 | Gói usb_cam/v4l2_camera đọc thẳng /dev/videoN, publish topic chuẩn |
Ứng dụng thực tế
Gói usb_cam hoặc v4l2_camera đọc thẳng từ /dev/videoN và publish ra topic ROS2 chuẩn (sensor_msgs/Image), sẵn sàng cho OpenCV hoặc các mô hình AI thị giác xử lý tiếp — đây chính là loại camera dùng trong dự án Atlas A2 ở phần showcase của trang này, kết hợp với YOLOv8 để nhận diện vật thể thời gian thực. Giữa hai gói phổ biến, v4l2_camera gọi thẳng API V4L2 (bài tiếp theo) nên nhẹ và ít phụ thuộc hơn, trong khi usb_cam có thêm vài tuỳ chọn tiện lợi (tự động publish camera_info cho hiệu chuẩn) — với robot DIY mới bắt đầu, v4l2_camera thường là lựa chọn đơn giản để khởi động nhanh.
Ví dụ thực tế
# Kiểm tra camera đã nhận, xem định dạng/độ phân giải hỗ trợ
v4l2-ctl --list-devices
v4l2-ctl -d /dev/video0 --list-formats-ext
# Chạy node ROS2 publish ảnh từ camera
ros2 run v4l2_camera v4l2_camera_node --ros-args -p video_device:=/dev/video0
ros2 topic echo /image_raw --once
Output điển hình từ --list-formats-ext:
[0]: 'YUYV' (YUYV 4:2:2)
Size: 640x480 Interval: 1/30 (30.000 fps)
Size: 1280x720 Interval: 1/15 (15.000 fps)
[1]: 'MJPG' (Motion-JPEG, compressed)
Size: 1920x1080 Interval: 1/30 (30.000 fps)
Ghi chú: MJPG (đã nén sẵn trong camera) thường hỗ trợ độ phân giải/FPS cao hơn YUYV thô ở cùng băng thông USB — đúng nguyên lý đã tính ở mục Công thức.
Lỗi thường gặp
-
Chọn nhầm gói ROS2 cho nhu cầu thực tế — dùng
usb_camcho một pipeline không cầncamera_infokhiến cấu hình dư thừa không cần thiết, hoặc ngược lại thiếucamera_infokhi thực sự cần hiệu chuẩn (bài Hiệu chuẩn Camera). -
Yêu cầu độ phân giải/FPS vượt băng thông USB thực tế — như tính ở mục Công thức, gây lỗi node hoặc hình bị giật; kiểm tra
--list-formats-exttrước để biết tổ hợp camera thực sự hỗ trợ. -
Nhầm định dạng YUYV thô với MJPG đã nén khi ước lượng băng thông — hai định dạng có yêu cầu băng thông khác biệt lớn ở cùng độ phân giải/FPS.
-
Không kiểm tra
/dev/videoNđã đúng camera mong muốn khi có nhiều camera cắm cùng lúc — số thứ tự/dev/videoNcó thể thay đổi giữa các lần khởi động, cần xác nhận bằngv4l2-ctl --list-devicesthay vì giả định cố định. -
Chọn camera công nghiệp độ phân giải rất cao cho ứng dụng chỉ cần nhận diện cơ bản — lãng phí băng thông và tài nguyên xử lý không cần thiết nếu ứng dụng thực tế không yêu cầu độ chi tiết đó.
Kết luận
USB Camera chuẩn UVC là điểm khởi đầu đơn giản nhất để thêm thị giác cho robot ROS2 — không tốn công cài driver, chi phí thấp, và có cả hệ sinh thái công cụ/gói ROS2 hỗ trợ sẵn. Hiểu đúng giới hạn băng thông USB giúp chọn đúng độ phân giải/FPS/định dạng nén ngay từ đầu, tránh lỗi khó chẩn đoán sau này. Bài tiếp theo đi sâu vào V4L2 — lớp giao tiếp phía dưới UVC mà Linux dùng để điều khiển camera.