본문 바로가기

IT/ROS

[ROS] 6. ROS + OPENCV (cv_bridge) 실시간 스트리밍

반응형

☞ 메인보드 : Jetson Nano Developer Kit

운영 체제 : Ubuntu 18.04 - JetPack 4.3

☞ ROS 버전 : Melodic

☞ 언어 : C++

 

 

 

 

<이전 포스트>

 

5. 예제를 통한 ROS 실행 : 퍼블리셔-서브스크라이버 메세지 통신 코드 분석

메인보드 : Jetson Nano Developer Kit 이미지 파일 버전 : JetPack 4.3 ROS 버전 : Ubuntu 18.04 LTS bionic > ROS Melodic 언어 : C++ <이전 포스트> 4. 예제를 통한 ROS 실행 : 패키지 생성 메인보드 : Jetson..

95mkr.tistory.com

 

 

 

 


목차

1. 패키지 생성

2. 실시간 영상 스트리밍 코드 [video.cpp]

3. XML과 CMAKE 파일 작성

4. 실행 결과

 

 

 


 

 

 

 

이전 포스트에서는 퍼블리셔와 서브스크라이버 노드를 생성하여 간단한 메시지 통신을 하는 예제를 해보았다. 

이번 포스트에서는 시각 데이터 분석을 위한 라이브러리 opencv를 사용하여 실시간으로 스트리밍 해보려 한다.

 

 

 

 

① 패키지 생성

 

먼저 작업장의 소스 디렉터리로 이동하여 패키지를 생성한다.

 

cd ~/catkin_ws/src
catkin_create_pkg camera_test roscpp cv_bridge

 

 

의존성으로 등록할 것은 c++ 사용을 위해 roscpp를 추가해야 하며 ROS, opencv 사이의 다리(인터페이스) 역할을 할 cv_bridge를 추가하면 된다.

 

 

 

위와 같이 폴더가 정상적으로 생성되었다면 소스 폴더에 코드를 넣어주자.

 

roscd camera_test/src
[편집기] video.cpp

 

 

 


② 실시간 영상 스트리밍 코드 [video.cpp]

 

 

#include <ros/ros.h>
#include <opencv2/opencv.hpp>
#include <cv_bridge/cv_bridge.h>
#include <iostream>

int main (int argc, char** argv){
	ros::init(argc, argv, "cv_bridge_test");
	
	cv::VideoCapture cap(0);	
	cv::Mat frame;
	
	if(cap.isOpened()){
		while(1){
			cap >> frame;
			
			cv::imshow("streaming video", frame);
			if(cv::waitKey(1) == 27) break;	
		}
	}
	
	else{
		std::cout << "NO FRAME, CHECK YOUR CAMERA!" << std::endl;
	}	
	
	cv::destroyAllWindows();
	
	return 0;
}

 

 


 XML과 CMAKE 파일 작성

 

복사해서 붙여 넣기를 못하도록 캡처를 해서 올렸다.

귀찮아하지 말고 아래 내용을 포함하여 적절하게 작성해보도록 하자 ㅎ.ㅎ [순서가 바뀌면  에러가 발생한다.]

 

 

CMakeLists.txt

 

 

※ CMakeLists.txt 작성할 때 주의할 점

 

☞ find_package

 

☞ include_directories

 

☞ target_link_libraries

 

 

opencv 라이브러리 사용을 위해 OpenCV REQUIRED와 ${OpenCV_INCLUDE_DIRS}를 꼭 추가해주기 바란다.

 

 

 

package.xml

package.xml 파일은 건드릴 게 없다. 중간에 주석이 매우 많은데 보기 불편하다고 생각하면 지워줘도 문제는 없다. 위 작업을 완료하면 터미널 창에 입력하자. 

 

 

catkin_make

 

 

 

 

.bashrc 파일에 catkin_make를 alias 등록해놓았다면 그에 맞는 명령어로 진행해도 좋다. 위와 같이 출력되면 catkin_make가 완료됐다는게 된다.

 

 

 

 

  cv_bridge 에러

 

cv_bridge를 처음 사용하게되면 아래와 같은 에러가 나올 확률이 높다. 일단 ros-${ROS_VERSION}-cv-brdige 패키지가 제대로 설치됐는지 확인부터 한다.

 

${ROS_VERSION} 자리에 본인의 ROS 버전을 입력하자.
sudo apt install ros-melodic-cv-bridge

 

 

 

 

패키지를 설치했는데도 cv_bridge가 어딨는지 모르겠다는 에러가 나온다면 먼저 opencv 의 위치부터 찾는다.

 

 

 

 

내가 설치한 opencv는 4 버전임을 알 수 있고, --cflags 명령어로 /usr/include 디렉터리에 opencv4가 있음을 알 수 있다.

이 디렉토리 위치를 /opt/ros/melodic/opt/ros/melodic/share/cv_bridge/cmake 에 있는 cv_bridgeConfig.cmake 에 입력해줘야 에러를 해결할 수 있다.

 

 

cd /opt/ros/melodic/share/cv_bridge/cmake
sudo gedit cv_bridgeConfig.cmake

 

 

편집기를 열어 cv_bridgeConfig.cmake 파일을 수정하자.

 

 

 

아주 잘 찾아보면 이러한 부분이 있다. if 조건문 안의 _include_dirs에 본인의 opencv 디렉터리 위치를 입력해주고 저장하면 된다. 대체로 해결이 될 것이라 생각하지만 그래도 에러가 발생한다면 아래와 같이 심볼릭 링크를 만들어주어야 한다.

 

 

sudo ln -s /usr/include/opencv4 /usr/include/opencv
sudo ldconfig

 

 

여기까지 진행했다면 에러는 발생하지 않을 것이라 생각한다.

 

 

 


④ 실행 결과

 

터미널을 두 개 실행한다.

 

roscore

rosrun camera_test cv_bridge_test

 

두 터미널에 각각 입력하자. 적절히 tab을 써가며 입력하자 바보같이 다 치지 말고

 

 

 

아주아주 잘 나온다.

 

 

<잡소리>

이 포스트는 ROS 파트에 작성했고, 카메라를 다루며 OPENCV를 중점적으로 하는 포스트는 OPENCV 에 작성하려고 한다.

엔비디아 보드를 샀으니 CUDA라는 것을 해봐야지 하고 호환되는 OPENCV 4 이상의 버전을 설치했는데 사실 ROS는 OPENCV 3.2.0 버전으로 하드 코딩되었다고 한다.

 

매번 OPENCV 4 버전을 깔고 나서 버전을 확인했을 때 3 버전은 지워지고 4 버전만 있었는데 ROS만 설치하면 3 버전이 부활해서 어이가 없었다.  (알아서 링크되겠거니 무시하고 코딩했더니 3,4 버전 사이의 충돌이 있어 사용할 수 없었다.)

 

@ ROS를 설치할 때 OPENCV 3.2.0 버전이 함께 설치되고, JETSON NANO 보드에는 OPENCV 3이 기본 탑재되어있다.

 

해피해피 삽질이었다.

 

 

★ 2021.07.30 ★

첫 catkin_make 에 3, 4 버전의 충돌 warning이 발생하지만, 사용하는데 문제는 없었다. 잘 작동한다.

 

 

 

 

 

 

반응형