본문으로 건너뛰기

USB 카메라

usb_cam 드라이버로 USB 카메라 영상을 ROS 2 토픽으로 발행하고 RViz에서 확인합니다.

참고 자료

이 실습은 ROS Drivers usb_cam을 사용합니다.

준비물

  • Ubuntu 24.04와 ROS 2 Jazzy가 설치된 PC
  • UVC 또는 V4L2 호환 USB 카메라

드라이버 설치

Jazzy용 바이너리 패키지를 설치합니다.

$ sudo apt update
$ sudo apt install -y ros-jazzy-usb-cam

카메라 장치 확인

정보

이 과정은 노트북 PC와 같이 이미 웹캠이 있는 환경에서 USB 웹캠을 추가로 연결했을 때 연결한 카메라를 찾는 과정입니다. 만약 컴퓨터에 웹캠이 하나만 있다면 이 과정을 생략하고 아래의 카메라 실행 과정으로 넘어갑니다.

카메라의 이름과 장치 경로를 찾습니다.

$ v4l2-ctl --list-devices
HD Pro Webcam C920 (usb-0000:00:02.0-1):
/dev/video2
/dev/video3
/dev/media1

C270 HD WEBCAM (usb-0000:00:02.0-14):
/dev/video0
/dev/video1
/dev/media0

위 예시와 같이 카메라의 이름(HD Pro Webcam C920)과 장치(/dev/video2, /dev/video3 등)가 표시됩니다. 보통 각 카메라마다 가장 위에 있는 장치가 실제 카메라입니다. 예를 들어 C920 카메라를 사용한다면 가장 위의 /dev/video2가 카메라 장치입니다.

보다 정확히 확인하기 위해 지원하는 포맷을 확인합니다. v4l2-ctl -d {장치 경로} --list-formats-ext에서 {장치 경로}를 앞에서 확인한 경로로 입력합니다.

v4l2-ctl 명령어가 없다면 다음 패키지를 설치합니다.

$ sudo apt install -y v4l-utils
$ v4l2-ctl -d /dev/video3 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture

$ v4l2-ctl -d /dev/video2 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture

[0]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 640x480
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 160x90
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.042s (24.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.133s (7.500 fps)
Interval: Discrete 0.200s (5.000 fps)
# (생략)

/dev/video2와 같이 지원하는 포맷 목록이 출력된다면 카메라 장치로 사용할 수 있습니다. 반면, /dev/video3과 같이 아무 내용이 출력되지 않는다면 카메라 장치로 사용할 수 없습니다.

Screenshot from 2026-07-13 14-28-32

C920 웹캠을 사용하는 경우 올바른 장치인 `/dev/video2`를 찾는 과정

찾은 카메라 장치 경로를 메모합니다. 이후 아래의 카메라 실행 단계에서 메모한 장치 경로를 사용합니다.

카메라 실행

  • 기본 설정으로 드라이버 실행
    $ ros2 run usb_cam usb_cam_node_exe
  • 카메라 장치를 지정해 드라이버 실행 (위 카메라 장치 확인 과정 참고)
    $ ros2 run usb_cam usb_cam_node_exe --ros-args -p video_device:="/dev/video2"

새 터미널에서 이미지 토픽을 확인합니다.

$ ros2 topic list
/camera_info
/image_raw
/image_raw/compressed
/image_raw/compressedDepth
/image_raw/theora
/image_raw/zstd
/parameter_events
/rosout

카메라 데이터는 양이 크기 때문에 원본 데이터(image_raw)와 압축 데이터(image_raw/compressed)를 용도에 맞게 사용합니다.

  • 원본 데이터 image_raw: 로컬 RViz 시각화용으로 사용; 원격 전송하지 않음
  • 압축 데이터 image_raw/compressed: 원격 전송용으로 사용; RViz에서 바로 시각화할 수 없음

원본 데이터인 image_raw는 용량이 크기 때문에 Wi-Fi를 통해 다른 PC로 전송해 시각화했을 때 네트워크가 불안정해지거나 연결이 끊어질 수 있습니다. 따라서 원본 이미지는 카메라가 연결된 컴퓨터에서 시각화하거나 인공지능 연산 용도로 사용합니다.

반면, 압축 데이터는 용량이 상대적으로 적어 Wi-Fi를 통한 원격 전송에 용이합니다. 하지만 RViz에서 바로 모니터링할 수 없기 때문에 image_transport_plugins와 같은 변환 노드가 필요합니다.

RViz에서 시각화

경고

앞에서 언급한 내용과 같이 image_raw는 원격 전송에 적합하지 않습니다. 다른 컴퓨터에서 image_raw를 발행 중이라면 구독하지 않도록 합니다. 실습이 꼭 필요한 경우 ROS_DOMAIN_ID 설정을 변경해 서로 분리된 환경에서 진행합니다.

새 터미널에서 RViz를 실행합니다.

$ rviz2
  1. 왼쪽 아래의 Add 버튼을 누릅니다.
  2. By display type에서 Image를 추가합니다.
  3. Topic에서 /image_raw를 선택합니다.

드라이버가 네임스페이스를 사용하거나 런치파일로 실행된 경우 실제 토픽 이름이 다를 수 있습니다. ros2 topic list에서 sensor_msgs/msg/Image 타입의 토픽을 확인해 선택합니다.

Screenshot from 2026-06-29 16-23-51