프로그래밍/ROS1

[stereo camera] ROS에서 ELP-Stereo-camera 사용하기

Se-chan Oh 2022. 9. 25. 22:38

1. 설치

참고한 문서

ROS wiki Documentation : http://wiki.ros.org/elp_stereo_camera

Source: https://github.com/joshvillbrandt/elp-stereo-camera-ros-pkg

 

a. github에 소개되어 있는 설치 방법을 기반으로 ROS 버전에 맞게 설치한다. 필자는 ros noetic을 설치하였기 때문에 아래와 같은 코드를 터미널에 입력하였다.

sudo apt-get update
sudo apt-get install ros-noetic-ros-base ros-noetic-image-common ros-noetic-image-transport-plugins ros-noetic-image-pipeline ros-noetic-usb-cam -y

b. ~/catkin_ws/src/ 폴더에 elp_stereo_camera 패키지를 github로 부터 복제한다.

git clone https://github.com/joshvillbrandt/elp-stereo-camera-ros-pkg.git  ~/catkin_ws/src/elp_stereo_camera

c. setup udev rules

sudo cp ~/catkin_ws/src/elp_stereo_camera/debian/99-elp-stereo-camera.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo service udev restart && sudo udevadm trigger

d. catkin build를 해준다. 그리고 source ~/.bashrc는 항상 해준다.

cd ~/catkin_ws
catkin build
source ~/.bashrc

 

2. launch 파일 수정 작업

필자가 사용한 elp stereo camera는 다음과 같다 : elp_camera_url

이 모듈을 사용하려면 elp_stereo_camera 패키지의 launch 파일을 카메라 정보에 맞게 수정할 필요가 있다.

먼저 elp stereo camera의 해상도를 알아보자.

 

a. 카메라를 연결하기 전과 후에 각 1번씩 아래의 코드를 터미널에 입력한다.

ls -ltr /dev/video*

카메라를 연결하고 명령을 입력했을 때 필자는 /dev/video2와 /dev/video3가 새로 생겼다.

elp stereo camera는 이 두 포트에 연결되어 있음을 알 수 있다.

 

b. v4l-utils를 설치한다.

sudo apt-get install v4l-utils

 

c. 각 포트의 해상도 정보를 확인한다.

v4l2-ctl -d /dev/video2 --list-formats-ext
v4l2-ctl -d /dev/video3 --list-formats-ext

필자의 경우 video3의 정보는 나오지 않고 video2의 정보만 나왔다.

나중에 확인 해보니 stereo camera의 좌, 우 이미지가 video2에 합쳐져서 출력되었다.

 

d. launch 파일 수정

~/catkin_ws/src/elp_stereo_camera/launch/elp_stereo_camera.launch 파일을 수정한다.

<?xml version="1.0"?>

<launch>
  <arg name="CAMERA_NAME" default="elp" />
  <arg name="LEFT_DEVICE" default="/dev/video2" />
  <arg name="RIGHT_DEVICE" default="/dev/video3" />
  <arg name="LEFT_INFO_URL" value="package://elp_stereo_camera/calibration/elp_left.yaml" />
  <arg name="RIGHT_INFO_URL" value="package://elp_stereo_camera/calibration/elp_right.yaml" />
  <arg name="WIDTH" default="1280" />
  <arg name="HEIGHT" default="480" />
  <arg name="FRAMERATE" default="30" />

  <!-- start the left camera -->
  <node respawn="true" pkg="usb_cam" type="usb_cam_node" name="left" ns="$(arg CAMERA_NAME)">
    <param name="video_device" value="$(arg LEFT_DEVICE)" type="string"/>
    <param name="pixel_format" value="mjpeg" type="string"/>
    <param name="image_width" value="$(arg WIDTH)" type="int"/>
    <param name="image_height" value="$(arg HEIGHT)" type="int"/>
    <param name="framerate" value="$(arg FRAMERATE)" type="int"/>

    <param name="camera_name" value="$(arg CAMERA_NAME)_left" type="string"/>
    <param name="camera_frame_id" value="$(arg CAMERA_NAME)_left_optical_frame" type="string"/>
    <param name="camera_info_url" value="$(arg LEFT_INFO_URL)" />
  </node>

  <!-- start the right camera >
  <node respawn="true" pkg="usb_cam" type="usb_cam_node" name="right" ns="$(arg CAMERA_NAME)">
    <param name="video_device" value="$(arg RIGHT_DEVICE)" type="string"/>
    <param name="pixel_format" value="mjpeg" type="string"/>
    <param name="image_width" value="$(arg WIDTH)" type="int"/>
    <param name="image_height" value="$(arg HEIGHT)" type="int"/>
    <param name="framerate" value="$(arg FRAMERATE)" type="int"/>

    <param name="camera_name" value="$(arg CAMERA_NAME)_right" type="string"/>
    <param name="camera_frame_id" value="$(arg CAMERA_NAME)_right_optical_frame" type="string"/>
    <param name="camera_info_url" value="$(arg RIGHT_INFO_URL)" />
  </node-->
</launch>

video3 포트는 사용하지 않아 주석처리를 했고, video2에 좌우 이미지가 합쳐져서 송출된다.

680x480의 이미지가 좌우에서 송출되므로 video2의 해상도는 1280x480이다.

fps는 30으로 설정했다.

 

3. 실행

a. terminal #1

roslaunch elp_stereo_camera elp_stereo_camera.launch

b. terminal #2

roslaunch elp_stereo_camera stereo_image_proc.launch

c. terminal #3

roslaunch elp_stereo_camera rviz.launch

각 터미널마다 자잘한 에러가 뜨긴 하지만 아무튼 rviz에서 이미지는 잘 보인다.

단, 두 포트의 이미지가 video2에 합쳐졌으므로 point cloud를 만드는 코드는 동작하지 않는다.

합쳐진 이미지를 쪼개는 방법을 모르기 때문에 point cloud는 따로 만들어줘야 한다.

 

참고한 블로그

elp_stereo_camera 구동기 https://m.blog.naver.com/jinslove4u/220988357032

usb_cam 사용하기 https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=nswve&logNo=221483691234