文档章节

ROS学习笔记(3)--ROS中的cmake

caoyuanfeng
 caoyuanfeng
发布于 2015/05/03 19:55
字数 907
阅读 627
收藏 0

在上一篇文章里,简单了解了些cmake的基础,并且可以上手利用cmake来编译cpp代码,这一次讨论ROS中的cmake和ROS代码编译过程。参考ROS wiki

1. 基础准备

首先开始创建基础工作空间,新建一个ROS项目,名字为catkin_ws,并在里面建立 src 文件夹

$ mkdir ~/catkin_ws
$ cd ~/catkin_ws
$ mkdir src
$ cd src

然后在src文件加下利用ROS包工具,catkin_create_pkg,新建一个包名为“test”,依赖于"std_msgs, rospy, roscpp"

$ catkin_create_pkg test std_msgs rospy roscpp tf sensor_msgs image_transport cv_bridge

然后在test文件夹下的src里面新建test.cpp文件,这个文件是源代码的标准放置位置。此时的文件结构如下

.
└── src
    └── test
        ├── CMakeLists.txt
        ├── include
        │   └── test
        ├── package.xml
        └── src
            └── test.cpp

这种文件结构是一种标准的ROS项目和包的结构。如果需要增加新的node包,我们只需要在src下增加一个和test文件夹结构类似的文件夹,例如test2,文件结构变为如下。

.
└── src
    ├── test
    │   ├── CMakeLists.txt
    │   ├── include
    │   │   └── test
    │   ├── package.xml
    │   ├── package.xml~
    │   └── src
    │       └── test.cpp
    └── test2
        ├── CMakeLists.txt
        ├── include
        │   └── test2
        ├── package.xml
        └── src
            └── test2.cpp

2. 文件结构准备好后,需要配置CMakeLists.txt和package.xml

这里针对具体的例子来配置。这个例子是OpenCV的例子,纯C++代码,不涉及具体的ROS函数。例子的功能是读取摄像头的输入,并展示出来。(Ubuntu 14.04 上面测试通过,注意其中的OpenCV库的引用,请用自己的具体OpenCV库头文件路径包含,具体配置还需自行google)

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdio.h>

//#include "ros/ros.h"
//#include "std_msgs/String.h"

using namespace cv;  
using namespace std; 
int main(int argc, char** argv)  
{  
    
  
   //ros::init(argc, argv, "test");  
  
    Mat image;  
	int cam_idx = 0;

    if (argc == 2) {
        cam_idx = atoi(argv[1]);
    }

    VideoCapture cap(cam_idx);
    if (!cap.isOpened()) {
        cerr << "Could not open camera." << endl;
        exit(EXIT_FAILURE);
    }
    namedWindow("Display Image"); 
    
	for(;;){
	  cap >> image; 
	  imshow("Display Image", image);  
          waitKey(5);
	}
	 

	//ros::spin();
    return 0;  
}

首先配置CMakeLists.txt,添加这里的例子 test.cpp ,配置后的文件为,(更具体的参数解释可以参考 wiki

cmake_policy(SET CMP0012 NEW)
cmake_minimum_required(VERSION 2.8.3)
project(test)
#
find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  image_transport
  roscpp
  rospy
  sensor_msgs
  std_msgs
  tf
)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(
  ${catkin_INCLUDE_DIRS}
)
#add our own node src
add_executable(test_node src/test.cpp)
target_link_libraries(test_node ${OpenCV_LIBS} ${catkin_LIBRARIES})

接着配置下package.xml(更具体的每项解释参考ROS,wiki

<?xml version="1.0"?>
<package>
  <name>test</name>
  <version>0.0.0</version>
  <description>The test package</description>

  <maintainer email="caoyuanfenglv@163.com">caoyuanfeng</maintainer>
  <license>TODO</license>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>cv_bridge</build_depend>
  <build_depend>image_transport</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>sensor_msgs</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_depend>tf</build_depend>
  <build_depend>opencv</build_depend>
  
  <run_depend>cv_bridge</run_depend>
  <run_depend>image_transport</run_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>rospy</run_depend>
  <run_depend>sensor_msgs</run_depend>
  <run_depend>std_msgs</run_depend>
  <run_depend>tf</run_depend>
  <run_depend>opencv</run_depend>
  <export>
  </export>
</package>

注意里面多加了OpenCV的以来和图像相关的依赖。

3.编译运行

在配置好两个文件以后,一般的新增ROS项目和node需要修改的都是这两个文件,或者只有CMakelists.txt一个文件,如果依赖相同的。

回到项目的根目录,也就是catkin_ws文件夹,然后用catkin_make编译

$ cd  ~/catkin_make
$ ls 
src
$ catkin_make

接着,运行得到的node

$ source devel/setup.bash
$ rosrun test  test_node

将会看到打开摄像头,弹出来摄像头的画面。表示这个node编译运行成功。

4. 总结

回头看去,总结了下整个ROS项目的过程就是这样的

  • 新建固定的文件结构

  • copy标准的CMakeLists.txt和package.xml文件

  • 分析自己的项目依赖,配置上面的两个配置文件

  • 编写自己的src代码,在CMakeLists.txt里面添加源代码路径

  • 编译运行,出错返回3,成功则 good job。

整个项目的代码都在git@osc上面,可以查看这里



© 著作权归作者所有

上一篇: Markdown学习模版
下一篇: SICP
caoyuanfeng
粉丝 4
博文 12
码字总数 3954
作品 0
徐汇
程序员
私信 提问
加载中

评论(1)

itfanr
itfanr
谢谢分享
ROS-Jade版在UbuntuKylin15.04上的源码安装

ROS-Installing from source Install from source requires that you download and compile the source code on your own. ROS Jade supports Trusty, Utopic, and Vivid. Other platforms a......

openthings
2015/07/20
716
0
qt creator 编译版本太高

qt creator 在编译到时候,出现错误,提示版本太高: CMake Error at /usr/share/cmake-2.8/Modules/FindQt4.cmake:1193 (MESSAGE): Found unsuitable Qt version "5.3.2" from /home/stark......

Stark_ZC
2014/11/01
733
3
在pcDuino上学习ROS系统初级开发(四)编译ROS软件包

这一节的教程教你使用编译工具编译package,在编译之前先初始化一下环境 1,使用catkin_make catkin_make是一个命令行工具可以很方便的添加一些其他的make。 用法: 如果你不熟悉标准的 CMak...

雨后的彩虹桥
2014/03/09
694
0
ROS零门槛学渣教程系列——前言

ROS在产品化还面临重重困难,但对机器人学习者而言,ROS是绝对的选择。理由有三: 1、ROS是开源的,在该平台上可以找到非常很多免费开源的代码包,并且这些例程还带wiki说明文档; 2、机器人...

Baron-Lu
03/17
0
0
ROS-Jade版在UbuntuKylin15.04上的安装和源码编译完整脚本

ROS(http://www.ros.org/about-ros/)是一个机器人操作系统,源于斯坦福,现在由开源机器人基金会(http://www.osrfoundation.org/)进行发展。目前最新的版本是Jade。ROS并不是完整的操作系...

openthings
2015/07/20
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部