1. 程式人生 > >AR Drone系列之:使用ROS catkin創建package並使用cv_bridge實現對ar drone攝像頭數據的處理

AR Drone系列之:使用ROS catkin創建package並使用cv_bridge實現對ar drone攝像頭數據的處理

ray 進行 mage exec source stp roc waitkey 效果

1 開發環境

Ubuntu 12.04

ROS Hydro

2 前提

可參考這篇blog:http://blog.csdn.net/yake827/article/details/44564057
blog:http://blog.csdn.net/celesius/article/details/39188119

已安裝adrone_autonomy package 而且能夠執行

https://github.com/AutonomyLab/ardrone_autonomy

文檔:http://ardrone-autonomy.readthedocs.org

已通過catkin創建一個package (方法見上一篇文章)這裏我創建的名稱為droneTest

3 欲實現效果

獲取ar drone的攝像頭實時圖像而且能夠進行處理

4 參考網頁

http://answers.ros.org/question/79306/help-with-streaming-ardrone-camera-images-to-opencv/

http://wiki.ros.org/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages

http://wiki.ros.org/vision_opencv

5 詳細實現Step-by-Step

Step 1:在~/catkin_ws/src/droneTest/src/ 中創建一個新的文件這裏命名為droneTest.cpp

Step 2: 編輯droneTest.cpp文件,代碼例如以下:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace
std; using namespace cv; static const char WINDOW[]="RGB Image"; static const char WINDOW2[]="Gray Image"; void process(const sensor_msgs::ImageConstPtr& cam_image){ cv_bridge::CvImagePtr cv_ptr; try { cv_ptr = cv_bridge::toCvCopy(cam_image,sensor_msgs::image_encodings::BGR8); } catch (cv_bridge::Exception& e) { ROS_ERROR("cv_bridge exception:%s",e.what()); return; } Mat img_rgb = cv_ptr->image; Mat img_gray; cvtColor(img_rgb,img_gray,CV_RGB2GRAY); imshow(WINDOW,img_rgb); imshow(WINDOW2,img_gray); cvWaitKey(1); } int main(int argc, char **argv){ ros::init(argc,argv,"droneTest"); ros::NodeHandle n; image_transport::ImageTransport it(n); image_transport::Subscriber image_sub = it.subscribe("/ardrone/image_raw",1,process); cv::namedWindow(WINDOW); cv::namedWindow(WINDOW2); ros::spin(); return 0; }

這裏使用cv_bridge的toCvCopy來實現格式轉換。很easy

Step 3:編輯CMakeLists.txt

主要目的是加入依賴和加入opencv庫

cmake_minimum_required(VERSION 2.8.3)
project(droneTest)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  sensor_msgs
  cv_bridge
  image_transport
)


catkin_package()

find_package(OpenCV)
include_directories(
  ${OpenCV_INCLUDE_DIRS}
)

include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(droneTest src/droneTest.cpp)
target_link_libraries(droneTest ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
add_dependencies(droneTest droneTest_generate_messages_cpp)

Step 4:編譯

編譯catkin。在terminal中輸入:

cd ~/catkin_ws
catkin_make
這裏說明一下就是package.xml這個文件改不改不影響,我發現甚至把裏面的dependency都刪掉也能夠make。

接下來是執行

這裏我為了執行方便一般把package拷貝到~/workshop下

然後把~/catkin_ws/devel/lib/droneTest 拷貝到~/workshop/droneTest下。這裏我的ROS_PACKAGE_PATH 包括~/workshop

我在bashrc中有加入例如以下代碼:

source /opt/ros/hydro/setup.bash
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/workshop
Step 6:執行

1打開一個terminal執行roscore

2 連接ar drone

3 再打開一個terminal執行rosrun ardrone_autonomy ardrone_driver

4 再打開一個terminal執行rosrun droneTest droneTest

ok了

AR Drone系列之:使用ROS catkin創建package並使用cv_bridge實現對ar drone攝像頭數據的處理