ROS使用FLIR品牌的相机

本文介绍如何将FLIR品牌的相机应用于ROS系统,将相机实时的数据以rostopic实时广播:

系统平台:Ubuntu16.04 LTS   ROS Kinetic

依赖:OpenCV(本例中所用版本为2.9), cv_bridge

硬件:FLIR Grasshopper GS3-PGE-23S6C-C

 

1.首先安装相机在Ubuntu16.04下的驱动:

本例直接安装于买设备时自带的安装盘,于官网也可以下载到相关驱动:

网址:www.flir.com/mv-techsupport/downloads

找到相同设备的下载列表,选择对应的系统版本即可

安装完成后,控制台输入flycap有软件弹出代表安装成功

 

 点击Auto Force IP,可以为设备自动分配IP,可以通过flycap看到设备

 点击确定,可以进入照相模式

2.ROS代码编写:

参考地址:https://blog.csdn.net/qq_27050183/article/details/51141998

https://blog.csdn.net/lixujie666/article/details/83303836

项目中用QT编写代码,用QMake的pro文件配置依赖目录:

 

 1 TEMPLATE = app
 2 CONFIG += console c++11
 3 
 4 QMAKE_CXXFLAGS += -std=c++11
 5 CONFIG -= app_bundle
 6 CONFIG -= qt
 7 
 8 SOURCES += \
 9         main.cpp
10 
11 12 
13 INCLUDEPATH += /usr/include/flycapture
14 
15 INCLUDEPATH += /usr/local/include/opencv2
16 
17 LIBS += /usr/local/lib/libopencv_*.so \
18 
19 LIBS += /usr/lib/libflycapture*.so
20 
21 LIBS += /usr/lib/libcv_bridge.so
22 
23 #---------------------ROS DEPENDS---------------------#
24 INCLUDEPATH += /opt/ros/kinetic/include
25 
26 DEPENDPATH += /opt/ros/kinetic/include
27 
28 LIBS += -L/opt/ros/kinetic/lib \
29         -L/usr/local/lib \
30         -lroscpp \
31         -lrospack \
32         -lpthread \
33         -lrosconsole \
34         -lrosconsole_log4cxx \
35         -lrosconsole_backend_interface \
36         -lxmlrpcpp \
37         -lroscpp_serialization \
38         -lrostime \
39         -lcpp_common \
40         -lroslib \
41         -ltf \
42 
43 LIBS += -L /usr/lib \
44         -l Ice
45 
46 LIBS += /opt/ros/kinetic/lib/libroslib.so \
47         /usr/local/lib/liblog4cplus.so
48 
49 #---------------------ROS DEPENDS---------------------#

 

编写C++通信代码:

 

 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <sensor_msgs/Image.h>
 4 #include <cv_bridge/cv_bridge.h>
 5 #include <ros/ros.h>
 6 using namespace std;
 7 
 8 #include "FLIR.h"
 9 
10 using namespace FLIR;
11 unsigned int width=640;
12 unsigned int height=480;
13 
14 int main(int argc, char ** argv)
15 {
16     if(argc==3){
17         width=atoi(argv[1]);
18         height=atoi(argv[2]);
19     }
20     GigECamera cam;
21     CameraInfo camInfo[10];
22     unsigned int numCameras;
23     FlyCapture2::Error error;
24     error = BusManager::DiscoverGigECameras(camInfo, &numCameras);
25     if (error != PGRERROR_OK)
26     {
27         PrintError(error);
28         return false;
29     }
30     IPAddress ipAddress=camInfo[camIndex-1].ipAddress;
31     sprintf(ipStr,"%d.%d.%d.%d",ipAddress.octets[0],ipAddress.octets[1],ipAddress.octets[2],ipAddress.octets[3]);
32     BusManager busMgr;
33     error=busMgr.GetCameraFromIPAddress(ipAddress,&guid);
34     if (error != PGRERROR_OK)
35     {
36         PrintError(error);
37         return false;
38     }
39     error = cam.Connect(&guid);
40     if (error != PGRERROR_OK)
41     {
42         PrintError(error);
43         return false;
44     }
45 
46     GigEImageSettingsInfo imageSettingsInfo;
47     error = cam.GetGigEImageSettingsInfo(&imageSettingsInfo);
48     if (error != PGRERROR_OK)
49     {
50         PrintError(error);
51         return false;
52     }
53     GigEImageSettings imageSettings;
54     imageSettings.offsetX = (unsigned int)(imageSettingsInfo.maxWidth-width)/2;
55     imageSettings.offsetY = (unsigned int)(imageSettingsInfo.maxHeight-height)/2;
56     imageSettings.height = height;
57     imageSettings.width = width;
58     imageSettings.pixelFormat = PIXEL_FORMAT_RGB;
59     error = cam.SetGigEImageSettings(&imageSettings);
60     if (error != PGRERROR_OK)
61     {
62         PrintError(error);
63         return false;
64     }
65     error = cam.StartCapture();
66     if (error != PGRERROR_OK)
67     {
68         PrintError(error);
69         return false;
70     }
71     cv::Mat img;
72     cam.RetrieveBGR(img);
73     ros::init(argc, argv, "camera_node");
74     ros::NodeHandle nh;
75     ros::Publisher pub_camera = nh.advertise<sensor_msgs::Image>("flir_camera", 1);
76     ros::Rate r = ros::Rate(1);
77     cv_bridge::CvImage cvi;
78     cvi.header.frame_id = "image";
79     cvi.encoding = "bgr8";
80     while (ros::ok()){
81         cam.RetrieveBGR(img);
82         sensor_msgs::Image image;
83         cvi.image = img;
84         cvi.toImageMsg(image);
85         pub_camera.publish(image);
86         r.sleep();
87     }
88     return 0;
89 }

 

编译,运行

 

 

3.完成效果:

发布消息类型为sensor_msgs::Image的话题,话题名为"flir_camera",可以用rqt_image_view查看效果:

 

posted @ 2019-03-21 20:35  Asp1rant  阅读(1535)  评论(0编辑  收藏  举报