☞ 메인보드 : 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
목차
○ 2. 실시간 영상 스트리밍 코드 [video.cpp]
○ 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 작성할 때 주의할 점
☞ find_package
☞ include_directories
☞ target_link_libraries
opencv 라이브러리 사용을 위해 OpenCV REQUIRED와 ${OpenCV_INCLUDE_DIRS}를 꼭 추가해주기 바란다.
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이 발생하지만, 사용하는데 문제는 없었다. 잘 작동한다.
'IT > ROS' 카테고리의 다른 글
[ROS] 8. ROS + Arduino 와 통신 Rosserial (8) | 2020.06.10 |
---|---|
[ROS] 7. ROS + GAZEBO 에러 해결 (0) | 2020.05.25 |
[ROS] 5. 퍼블리셔-서브스크라이버 메시지 통신 분석 (0) | 2020.01.13 |
[ROS] 4. 퍼블리셔-서브스크라이버 메시지 통신 (11) | 2020.01.10 |
[ROS] 3. ROS Melodic 설치 (4) | 2020.01.07 |