처음에는 이 부분을 진행할 때 전의 과정들에서 순조롭게 진행되어 약간 방심하고 있었을지도 모르겠다..
cd ~/catkin_ws/src
catkin_create_pkg camera_test roscpp cv_bridge
로 의존성등록을 한다. (c++사용을 위한 roscpp, ROS와 opencv사이의 다리 역할인 cv_bridge를 추가한다.)
roscd camera_test/src
[편집기] video.cpp
그 후 코드를 넣어주는데 전에 학원에서 해서 익숙한 opencv의 c언어 버전이다.
#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파일을 작성해준다.
cd ..
CMakeList.txt는 순서대로 작성해야 하며 저기 나와 있는 내용들 외에 다른 내용들은 건드리지 말고 겹치면 유동적으로 스킵하되 반드시 저기 있는 내용들은 순서대로 다 있어야 한다.
package.xml은 건드릴 게 없다.
다음 우리는 전에. bashrc에 cm 단축어를 alias 등록해 놨으므로 cm으로 make 하면 된다.
cm
여기서 첫 번째 에러가 뜨는데 다행히도 참고사이트에 이 오류에 관한 내용이 있었다.
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 에 입력해줘야 에러를 해결할 수 있다.(출처:https://95mkr.tistory.com/entry/ROS6?category=746766)
cd /opt/ros/melodic/share/cv_bridge/cmake
sudo gedit cv_bridgeConfig.cmake
이후 편집기를 열어 cv_bridgeConfig.cmake 파일을 수정한다.
여기서 나는 해결이 되었는데 혹시 더 오류가 난다면
sudo ln -s /usr/include/opencv4 /usr/include/opencv
sudo ldconfig
를 통해 심볼릭 링크를 만들어 주면 된다.(심볼릭 링크를 쉽게 설명하면 바로가기라 하는데 나중에 심화학습이 필요하다.)
이제 새 터미널을 두 개 열어 각각 코드를 실행하면 끝이다.
roscore
rosrun camera_test cv_bridge_test
이제 시작이다...
'embedded > ROS' 카테고리의 다른 글
7. GAZEBO (0) | 2021.09.03 |
---|---|
6. ROS & opencv (cv_bridge) 실시간 스트리밍...성공! (1) | 2021.09.01 |
4. pub & sub 메시지 통신 (0) | 2021.08.31 |
3. ROS 설치완료 (0) | 2021.08.31 |
2. ROS-Melodic 설치 (0) | 2021.08.30 |