How to compile a node file?如何编译一个节点文件?
Ubuntu16.04,ros Kinetic
最近几次遇到的问题都是,给你一个写好的ros node文件,没有给你其他的东西,你如何编译它?
以从ros中提取rgb图像和深度图像为例,示例源代码extract_images.cpp如下:
/* Este es un nodo de ROS Indigo para guardar imagenes de /camera/depth_registered/image_rect_raw* y de /camera/rgb/color/image_rect_raw de un Turtlebot1 para luego procesarlas con otro programa. * Las de profundidad se guardan como unsigned int de 16 bits * y 1 canal, las de color se guardan como unsigned int de 8 bits en 3 canales.* Se utiliza un suscriptor sincronizado para guardar el par de imagenes que estén más* cercanas en el tiempo.* LAS IMAGENES SE GUARDAN ADONDE SE EJECUTE EL NODO.* ---------------------------------------------------------* Creado por Fabricio Emder y Pablo Aguado en el 2016 *//* This is a ROS Indigo node for saving Turtlebot images from the /camera/depth_registered/image_rect_raw* and /camera/rgb/color/image_rect_raw topics, for further processing outside of the program. * Depth images are saved as 1 channel 16 bit unsigned int PNGs (CV_16UC1), and * RGB images are saved as 3 channel 8 bit unsigned int PNGs (CV_8UC3).* A synchronized subscriber is used, for saving the pair of images that are most closer in time.* THE IMAGES ARE SAVED WHEREVER THE NODE IS RUN.* Created by Fabricio Emder and Pablo Aguado - 2016* */#include <ros/ros.h> #include <cv_bridge/cv_bridge.h> // OpenCV #include <sensor_msgs/Image.h> #include <sensor_msgs/image_encodings.h> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp>#include <message_filters/subscriber.h> #include <message_filters/synchronizer.h>/* La política de sincronización exacta NO FUNCIONA para los topics seleccionados, ya * que la Kinect o sus drivers no los están publicando con la misma marca temporal.* Ver más en http://wiki.ros.org/message_filters * * Exact sychronization policy IS NOT WORKING for the topics used, because the kinect* is not publishing them with the same timestamp. * See more in http://wiki.ros.org/message_filters *///#define EXACT #define APPROXIMATE#ifdef EXACT #include <message_filters/sync_policies/exact_time.h> #endif #ifdef APPROXIMATE #include <message_filters/sync_policies/approximate_time.h> #endifusing namespace std; //using namespace sensor_msgs; using namespace message_filters;// Contador para la numeración de los archivos. // Counter for filenames. unsigned int cnt = 1;// Handler / callback void callback( const sensor_msgs::ImageConstPtr& msg_rgb , const sensor_msgs::ImageConstPtr& msg_depth ) {//ROS_INFO_STREAM("Adentro del callback\n"); cv_bridge::CvImagePtr img_ptr_rgb;cv_bridge::CvImagePtr img_ptr_depth;try{img_ptr_depth = cv_bridge::toCvCopy(*msg_depth, sensor_msgs::image_encodings::TYPE_16UC1);}catch (cv_bridge::Exception& e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}try{img_ptr_rgb = cv_bridge::toCvCopy(*msg_rgb, sensor_msgs::image_encodings::TYPE_8UC3);}catch (cv_bridge::Exception& e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}cv::Mat& mat_depth = img_ptr_depth->image;cv::Mat& mat_rgb = img_ptr_rgb->image;char file_rgb[100];char file_depth[100];sprintf( file_rgb, "%04d_rgb.png", cnt );sprintf( file_depth, "%04d_depth.png", cnt );vector<int> png_parameters;png_parameters.push_back( CV_IMWRITE_PNG_COMPRESSION );/* We save with no compression for faster processing.* Guardamos PNG sin compresión para menor retardo. */png_parameters.push_back( 9 ); cv::imwrite( file_rgb , mat_rgb, png_parameters );cv::imwrite( file_depth, mat_depth, png_parameters );ROS_INFO_STREAM(cnt << "\n");ROS_INFO_STREAM("Imágenes guardadas - ""Images saved\n");cnt++;}int main(int argc, char** argv) {// Initialize the ROS system and become a node.ros::init(argc, argv, "guardar_imagenes");ros::NodeHandle nh;message_filters::Subscriber<sensor_msgs::Image> subscriber_depth( nh , "/camera/depth_registered/hw_registered/image_rect_raw" , 1 );message_filters::Subscriber<sensor_msgs::Image> subscriber_rgb( nh , "/camera/rgb/image_rect_color" , 1 );#ifdef EXACTtypedef sync_policies::ExactTime<sensor_msgs::Image, sensor_msgs::Image> MySyncPolicy; #endif #ifdef APPROXIMATEtypedef sync_policies::ApproximateTime<sensor_msgs::Image, sensor_msgs::Image> MySyncPolicy; #endif// ExactTime or ApproximateTime take a queue size as its constructor argument, hence MySyncPolicy(10)Synchronizer<MySyncPolicy> sync(MySyncPolicy(10), subscriber_rgb, subscriber_depth );sync.registerCallback(boost::bind(&callback, _1, _2));while(ros::ok()){char c;ROS_INFO_STREAM("\nIngrese 'a' para guardar un par de imágenes o 'b' para guardar 300 imágenes\n""Enter 'a' to save a pair of images or 'b' to automatically save 300 images\n");cin.get(c);cin.ignore();c = tolower(c);ROS_INFO_STREAM("You entered " << c << "\n");if( c == 'a' ){/* Le damos el control a la función callback cuando haya imágenes.* We give control to the callback function.*/ros::spinOnce(); }else if( c == 'b' ){unsigned int cnt_init = cnt;while( cnt - cnt_init < 300 ){ros::spinOnce();}}else break;}ROS_INFO_STREAM("Cerrando nodo\nClosing node\n");return 0; }
——————现在开始我们的ros编译之旅——————
主要分为几大步:
1. 确认头文件,观察.cpp文件中,哪些属于ros内部库,哪些是外部库。示例中,除了opencv2的库是外部库,其余是内部库
2. 在工作空间中(如果没有,请按照ros tutorial新建)test_ws/src并source后,新建package,将所有内部库添加到依赖中(若此时遗漏,仍可通过修改package.xml来添加。实际效果是一样的)
$ cd ~/test/ws/src $ catkin_create_pkg extract_images roscpp cv_bridge sensor_msgs message_filters
$ catkin_make $ . ~/test_ws/devel/setup.bash
可查看依赖项
$ rospack depend1 extrac_images
此时只有OpenCV2的库文件没有链接
修改CMakeLists.txt
加入搜索库文件
find_package( OpenCV REQUIRED )include_directoties( ${OpenCV_INCLUDE_DIRS} )
添加可执行文件,链接cpp文件和库,以及最重要的一点是,将可执行文件与ROS库链接,不然会出现一大堆ROS的报错
add_executable( extract_images src/extrac_iamges.cpp )target_link_libraries( extract_images ${OpenCV_DIRS} ${catkin_LIBRARIES} )
最后再回到工作空间test_ws,catkin_make即可。
课后作业——根据这个方法,推广为将node文件加入已有的项目中,应该怎么写呢?请读者自行解决!
参考文献:
How to extract depth data from rosbags(contains depth and RGB data) as picture frames
Installing and Configuring Your ROS Environment
Creating a ROS Package
转载于:https://www.cnblogs.com/williamc17/p/9626386.html
How to compile a node file?如何编译一个节点文件?相关推荐
- RT-Thread中如何预编译一个.c文件
本文介绍在RT-Thread系统,使用scons,如何预编译一个.c文件 首先新建一个测试文件test.c #include "rtthread.h"void test(void) ...
- jcreator把class字节码文件转成.java源文件_如何将.JAVA文件编译成.CLASS文件.说明方法和工具,或用JCreator如何操作?...
http://www.newiter.com/showart.asp?id=33 由于比较长,建议点击上面链接进入继续浏览 对于很多应用系统,常常需要动态装载和执行类和代码片断,这有利于部署的简易性和 ...
- One solution to error: “Failed to compile generated C file xsim.dir/ ... /xsim_1.c“
在使用vivado进行post timing simulation时,会出现如下报错: ERROR: [XSIM 43-3409] Failed to compile generated C file ...
- 【CLion】如何编译运行单个文件 (C/C++ Single File Execution插件的使用)
如果你知道如何使用 C/C++ Single File Execution 插件但仍然无法找到运行按钮 请直接看第五张图片 一. 这里我首先新建了一个项目,名为Demo 又在项目文件夹内新建了一个代码 ...
- 以太坊源码linux下如何编译,以太坊教程:搭建环境、编写编译一个智能合约
本以太坊教程主要是介绍:搭建一个开发环境.编写编译一个智能合约. 以太坊是什么 以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台.通过其专用加密货币以太币(Ether)提供去中心化 ...
- android编译终止,android - Android NDK-没有此类文件或目录编译终止-头文件导出问题 - 堆栈内存溢出...
我正在尝试使用NDK将TagLib C ++库( http://taglib.github.io/ )导入Android. 通过按如下所示将所有源代码放在/jni/taglibroot/下,我能够成功 ...
- windows下编译c语言文件路径,解决JNI在Windows环境下因长路径导致编译失败问题
之前听一个朋友反馈LuaScriptoCore在Windows下编译会报错,今天特意跑到Windows环境下测试了一番,果然是存在问题.得到了下面的编译报错信息: Build command fail ...
- 第48章 MDK的编译过程及文件类型全解
Frm: http://www.cnblogs.com/firege/p/5806134.html 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教 ...
- 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列
第48章 MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...
- exe反编译为.py文件
介绍公司以前的一个exe包,我们需要查看里面python源码,但是以前的py源码文件找不到,所以只能反编译,介绍一下反编译的过程. 首先准备: pyinstxtractor.py这个文件,网上很多,自 ...
最新文章
- springcloud系列九 整合Hystrix Dashboard
- NeHe OpenGL教程 第四十七课:CG顶点脚本
- 互联网经济与实体经济
- FileReader上传图片
- 滴滴为啥值3600亿?看它的数据中台就知道了
- 分享:session定义使用和丢失问题小结
- 展示Java开发人员课程包
- 关情纸尾-----Quartz2D-绘制富文本,绘制图片.
- php-fpm进程利用CPU不均问题的优化过程
- java语言发展历程
- 框架封装_重大突破,欧菲光成功研发半导体封装用高端引线框架
- java位图去重_Redis系列(3) Bloom/BitMap/Geo
- CSDN博客下载器v2.4发布
- PLC可编程控制器的应用
- java程序员必备快捷键
- 神经网络训练用什么软件,神经网络训练ai玩游戏
- Linux Debian11 Podman容器常用命令
- OceanBase数据库大赛
- 从0开始的OpenGL学习(八)-显示3D立方体
- 03.mysql调优--索引基本实现
热门文章
- 机器人学编程简介~2019~
- QOS中 PQ,CQ.RR,WFQ,CBWFQ,LLQ区分(下)
- c++编写乘法口诀表
- php 实现人脸识别功能
- PyQt5 关于消息盒子QMessageBox 不显示消息盒子且出现内存不足的问题
- python简单爬虫,获取豆瓣top250书单(datawhale组队学习task4)
- android怎么用apk,手机如何安装APK应用教程 小白操作安卓系统教程 (全文)
- java提取富文本文字_富文本中文字部分提取
- 浅谈Anchor free与Anchor based
- linux路由表命令,在linux下永久保存路由表的写法(转)