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과 같이 아무 내용이 출력되지 않는다면 카메라 장치로 사용할 수 없습니다.

찾은 카메라 장치 경로를 메모합니다. 이후 아래의 카메라 실행 단계에서 메모한 장치 경로를 사용합니다.
카메라 실행
- 기본 설정으로 드라이버 실행
$ 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
- 왼쪽 아래의 Add 버튼을 누릅니다.
- By display type에서 Image를 추가합니다.
Topic에서/image_raw를 선택합니다.
드라이버가 네임스페이스를 사용하거나 런치파일로 실행된 경우 실제 토픽 이름이 다를 수 있습니다. ros2 topic list에서 sensor_msgs/msg/Image 타입의 토픽을 확인해 선택합니다.
