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查看效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具