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?如何编译一个节点文件?相关推荐

  1. RT-Thread中如何预编译一个.c文件

    本文介绍在RT-Thread系统,使用scons,如何预编译一个.c文件 首先新建一个测试文件test.c #include "rtthread.h"void test(void) ...

  2. jcreator把class字节码文件转成.java源文件_如何将.JAVA文件编译成.CLASS文件.说明方法和工具,或用JCreator如何操作?...

    http://www.newiter.com/showart.asp?id=33 由于比较长,建议点击上面链接进入继续浏览 对于很多应用系统,常常需要动态装载和执行类和代码片断,这有利于部署的简易性和 ...

  3. 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 ...

  4. 【CLion】如何编译运行单个文件 (C/C++ Single File Execution插件的使用)

    如果你知道如何使用 C/C++ Single File Execution 插件但仍然无法找到运行按钮 请直接看第五张图片 一. 这里我首先新建了一个项目,名为Demo 又在项目文件夹内新建了一个代码 ...

  5. 以太坊源码linux下如何编译,以太坊教程:搭建环境、编写编译一个智能合约

    本以太坊教程主要是介绍:搭建一个开发环境.编写编译一个智能合约. 以太坊是什么 以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台.通过其专用加密货币以太币(Ether)提供去中心化 ...

  6. android编译终止,android - Android NDK-没有此类文件或目录编译终止-头文件导出问题 - 堆栈内存溢出...

    我正在尝试使用NDK将TagLib C ++库( http://taglib.github.io/ )导入Android. 通过按如下所示将所有源代码放在/jni/taglibroot/下,我能够成功 ...

  7. windows下编译c语言文件路径,解决JNI在Windows环境下因长路径导致编译失败问题

    之前听一个朋友反馈LuaScriptoCore在Windows下编译会报错,今天特意跑到Windows环境下测试了一番,果然是存在问题.得到了下面的编译报错信息: Build command fail ...

  8. 第48章 MDK的编译过程及文件类型全解

    Frm: http://www.cnblogs.com/firege/p/5806134.html 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教 ...

  9. 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列

    第48章     MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  10. exe反编译为.py文件

    介绍公司以前的一个exe包,我们需要查看里面python源码,但是以前的py源码文件找不到,所以只能反编译,介绍一下反编译的过程. 首先准备: pyinstxtractor.py这个文件,网上很多,自 ...

最新文章

  1. springcloud系列九 整合Hystrix Dashboard
  2. NeHe OpenGL教程 第四十七课:CG顶点脚本
  3. 互联网经济与实体经济
  4. FileReader上传图片
  5. 滴滴为啥值3600亿?看它的数据中台就知道了
  6. 分享:session定义使用和丢失问题小结
  7. 展示Java开发人员课程包
  8. 关情纸尾-----Quartz2D-绘制富文本,绘制图片.
  9. php-fpm进程利用CPU不均问题的优化过程
  10. java语言发展历程
  11. 框架封装_重大突破,欧菲光成功研发半导体封装用高端引线框架
  12. java位图去重_Redis系列(3) Bloom/BitMap/Geo
  13. CSDN博客下载器v2.4发布
  14. PLC可编程控制器的应用
  15. java程序员必备快捷键
  16. 神经网络训练用什么软件,神经网络训练ai玩游戏
  17. Linux Debian11 Podman容器常用命令
  18. OceanBase数据库大赛
  19. 从0开始的OpenGL学习(八)-显示3D立方体
  20. 03.mysql调优--索引基本实现

热门文章

  1. 机器人学编程简介~2019~
  2. QOS中 PQ,CQ.RR,WFQ,CBWFQ,LLQ区分(下)
  3. c++编写乘法口诀表
  4. php 实现人脸识别功能
  5. PyQt5 关于消息盒子QMessageBox 不显示消息盒子且出现内存不足的问题
  6. python简单爬虫,获取豆瓣top250书单(datawhale组队学习task4)
  7. android怎么用apk,手机如何安装APK应用教程 小白操作安卓系统教程 (全文)
  8. java提取富文本文字_富文本中文字部分提取
  9. 浅谈Anchor free与Anchor based
  10. linux路由表命令,在linux下永久保存路由表的写法(转)