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로 비교해본 것

 

참조