ROS
ROS Kinetic + OpenCV + Kinect v1
개념잡이
2021. 12. 30. 21:40
Installations
- Ubuntu 16.04
- ROS Kinetic
- OpenCV 2.4.13
- freenect
ros package.xml 파일 설정
<?xml version="1.0"?>
<package format="2">
<name>ros_cv_slam</name>
<version>0.0.1</version>
<description>The ros_cv_slam package</description>
<maintainer email="h@k.ac.kr">Hong</maintainer>
<author email="h@k.ac.kr">Hong</author>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>cv_bridge</build_depend>
<build_depend>opencv2</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<build_export_depend>cv_bridge</build_export_depend>
<build_export_depend>opencv2</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>cv_bridge</exec_depend>
<exec_depend>opencv2</exec_depend>
<export>
</export>
</package>
ROS CMakeList.txt 파일 설정
cmake_minimum_required(VERSION 2.8.3)
project(ros_cv_slam)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
cv_bridge
image_transport
)
find_package(OpenCV REQUIRED)
include_directories(include ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
catkin_package(
#LIBRARIES ros_cv_slam
#CATKIN_DEPENDS roscpp rospy std_msgs cv_bridge opencv2
#DEPENDS system_lib
)
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_tracking_sub src/Tracking.cpp)
#add_dependencies(${PROJECT_NAME}_tracking_sub ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(${PROJECT_NAME}_tracking_sub
${catkin_LIBRARIES}
${OpenCV_LIBRARIES}
)
Kinect Subscriber node 작성
ROS에서 OpenCV 연동을 위해 image_transport, cv_bridge를 사용한다.
topic으로 sensor_msgs/image 이렇게 들어오는 것을 cv_bridge의 toCvShare로 Mat 타입으로 바꾸어 줌

자세한건
#include <ros/ros.h>
#include <ros/package.h>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
using namespace std;
using namespace cv;
const string WINDOW_NAME = "window";
void imageCallback(const sensor_msgs::ImageConstPtr& msg) {
try {
imshow(WINDOW_NAME, cv_bridge::toCvShare(msg, "bgr8")->image);
waitKey(30);
} catch(cv_bridge::Exception& e) {
ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
}
}
int main(int argc, char **argv) {
ros::init(argc, argv, "ros_tracking_subscriber");
ros::NodeHandle nh;
namedWindow(WINDOW_NAME);
startWindowThread();
image_transport::ImageTransport it(nh);
image_transport::Subscriber sub = it.subscribe("camera/rgb/image_rect_color", 1, imageCallback);
ros::spin();
destroyWindow(WINDOW_NAME);
return 0;
}
freenect.launch 실행 후 키넥트 연결(연결 시켜놓고 launch 실행하면 대부분 인식 실패....)
$ roslaunch freenect_launch freenect.launch
$ rosrun ros_cv_slam ros_cv_slam_tracking_sub
패키지와 노드 이름이 이상한데, 이 프로젝트를 기반으로 CV-SLAM(Ceiling Vision based SLAM) 개발하려고 함

사진 설명을 입력하세요.
결과
왼쪽 상단에 영상이 나온다. 뒤에는 rviz로 비교해본 것

참조