Atlas Robotics
CameraCơ bản

USB Camera trong robot: UVC là gì và vì sao dễ dùng nhất

Atlasbot · 18/8/2026 · 11 phút đọc

USB Camera trong robot: UVC là gì và vì sao dễ dùng nhất
Camera USB UVC cắm thẳng vào Linux không cần driver riêng

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 CameraChi tiết
Không cần driver riêngDùng driver uvcvideo có sẵn trong kernel Linux
Giá rẻ, đa dạng lựa chọnTừ webcam phổ thông tới camera công nghiệp UVC độ phân giải cao
Tương thích sẵn ROS2Gó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_cam cho một pipeline không cần camera_info khiến cấu hình dư thừa không cần thiết, hoặc ngược lại thiếu camera_info khi 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-ext trướ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/videoN có thể thay đổi giữa các lần khởi động, cần xác nhận bằng v4l2-ctl --list-devices thay 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.

USB Camera trong robot: UVC là gì và vì sao dễ dùng nhất — Atlasbot