1. 서론
ROS2를 사용하여 다양한 이미지 처리를 할 수 있는 package stack을 개발하고, 블로그에 개발 일지를 작성하고자 한다.
다양한 기능을 지원하고 CI/CD를 적용하여 비전을 사용하는 다양한 개발자들이 사용할 수 있도록 하는 것이 최종 목표이다.
우선 해당 프로젝트는 아래 깃허브 레포지토리를 통해 오픈소스로 공개해 두었다. 패키지의 사용 방법과 빌드 dependency 등은 README에 상세하게 작성해 두었으니 해당 블로그 포스트에는 개발 내용만 정리할 계획이다.
https://github.com/mjlee111/image_recognition
GitHub - mjlee111/image_recognition: ROS2 image perception & recognition package for various usage.
ROS2 image perception & recognition package for various usage. - mjlee111/image_recognition
github.com
image_recognition은 크게 세가지 분류를 통해 기능을 분리하였다. 이미지 처리를 위한 package stack 이므로 우선 projection, recognition, perception의 세가지 단계로 분류하였다.
- image_projection
다양한 센서, 카메라를 사용하여 이미지 데이터를 다양한 형식으로 변환하거나 ROS2에서 사용할 수 있는 형식으로 변환해 주는 단계이다. 또한 이미지 전처리 관련 패키지를 포함할 계획이다.
- image_recognition
전치리 과정을 거친 이미지를 분석하여 객체, 패턴 등을 인식할 때 사용할 계획이다. Yolo 등을 사용하여 객체 탐지 등의 과정을 포함한다.
- image_perception
인식된 정보를 바탕으로 더 높은 수준의 해석을 진행하는 단계이다.
2. usb_camera 패키지 소개
usb_camera 패키지는 /dev/videoX 등의 장치를 열어 ROS2 sensor_msgs/Image로 publish 하는 패키지이다. 지난번에 작성한 QT v4l2 camera 프로젝트의 연장선으로 개발하였다.
2024.10.05 - [C, C++/QT] - [QT] v4l2 camera C++ 프로젝트
[QT] v4l2 camera C++ 프로젝트
1. V4L2v4l2(Video for Linux 2)는 리눅스 운영체제에서 비디오 장치를 제어하기 위한 커널 인터페이스이다. 주로 카메라, TV 수신기 등과 상호작용할때 사용된다. V4L2는 다양한 장치화 호환되며 비디오
menggu1234.tistory.com
ros-drivers/usb_cam 패키지를 컨셉으로 하였으며 최대한 비슷하게 기능하도록 개발해 보았다.
https://github.com/ros-drivers/usb_cam
GitHub - ros-drivers/usb_cam: A ROS Driver for V4L2 USB Cameras
A ROS Driver for V4L2 USB Cameras. Contribute to ros-drivers/usb_cam development by creating an account on GitHub.
github.com
위 패키지를 모티브로 하며 추후에 개발할 360도 카메라, pan tilt를 지원하는 카메라 등의 패키지를 개발할 여지를 생각하며 개발을 진행했다.
usb_camera 패키지는 image_projection 단계의 패키지로 분류하였으며 ROS2의 장점 중 하나인 lifecycle을 적용하였다. 기본적으로 실행하였을 때는 바로 lifecycle의 config, activate를 진행하게 해 두었다. 또 v4l2 라이브러리를 사용하여 대부분의 카메라 장치를 지원하며 포맷, fps, 이미지 설정 등을 파라미터로 설정할 수 있게 하였다.
주요 기능은 아래와 같다.
- 다양한 비디오 포맷 지원 : MJPEG, YUYV, H264 등 여러 포맷 지원
- 동적 카메라 설정 : 밝기, 대비, 화이트 밸런스 등의 카메라 설정 파라미터를 통해 설정 가능
- 이미지 스트리밍 : raw 이미지, compressed 이미지 ROS topic으로 스트리밍
- 라이프사이클 관리 : 노드 활성화, 비활성화, 정리 작업을 포함.
- 시각화 노드 포함 : cv::imshow를 통해 이미지 데이터 시각화 가능
패키지는 기본적으로 config 폴더 내의 yaml 파일을 통해 파라미터를 설정한다. yaml 파일의 기본적인 내용은 아래와 같다.
/**:
ros__parameters:
topic: "/camera/image_raw"
compressed_topic: "/camera/compressed_image"
compressed_depth_topic: "/camera/compressed_depth"
device: "/dev/video0"
frame_id: "camera"
resolution: "1920x1080"
fps: 30.0
format: "MJPEG"
brightness: -1
contrast: -1
saturation: -1
hue: -1
gamma: -1
sharpness: -1
whitebalance: -1
auto_whitebalance: true
exposure: -1
auto_exposure: true
focus: -1
auto_focus: true
zoom: -1
pan: -1
tilt: -1
rotate: -1
horizontal_flip: false
vertical_flip: false
중요한 파라미터 몇가지에 대한 설명을 정리하면 아래와 같다. 모든 파라미터에 대한 설명은 git 레포지토리에서 확인할 수 있다.
- topic : sensor_msgs/Image를 퍼블리쉬 할 때 사용할 토픽의 이름
- compressed_topic : sensor_msgs/CompressedImage를 퍼블리쉬 할 때 사용할 토픽의 이름
- compressed_depth_topic : sensor_msgs/CompressedImage를 퍼블리쉬 할 때 사용할 토픽의 이름
- device : 카메라 경로
- frame_id : header frame
- resolution : 해상도
- fps : fps
- format : 포맷
나머지 장치 설정용 파라미터들은 -1일 경우 현재 장치가 설정된 값 그대로 사용하도록 하였다.
파라미터를 설정한 뒤 패키지를 실행하면 자동으로 설정한 파라미터 값의 적용이 유효한지 확인한 후 적용 여부와 해당 기능의 사용 가능 여부를 출력해 준다.
format, fps, resolution의 경우 카메라별로 지원하는 정도와 조합이 모두 다르다. 만약 yaml파일에서 설정한대로 카메라 스트리밍에 실패한다면 자동으로 설정한 format에서 최대 resolution, fps로 실행하도록 해 두었다.
제작한 usb_camera패키지의 usb_camera_node와 usb_camera_viewer를 실행한 결과이다.
아직 Camera Calibration이나 Compressed Image의 데이터를 만드는 과정, 그리고 메모리 관리 등에서 부족한 부분이 있고 추후 보완할 계획이다.
'ROS > ROS2' 카테고리의 다른 글
[ROS2] 005 : ROS2 C++ 패키지, 노드 작성 가이드 (1) | 2024.10.29 |
---|---|
[ROS2] 004 : ROS2 노드(Node)와 데이터 (0) | 2024.10.29 |
[ROS2] 002 : ROS2 예제 (demo_nodes, turtlesim) (0) | 2024.10.29 |
[ROS2] 003 : ROS2 명령어 정리 (0) | 2024.10.29 |
[ROS2] 001 : ROS2 Humble 설치 (Ubuntu 22.04) (2) | 2024.09.30 |