第3章 编写ROS程序-1
1、创建工作区和功能包
在我们写任何程序之前,第一步是创建一个容纳我们的功能包的工作区,然后再创建功能包本身。
创建工作区 使用标准的mkdir命令行去创建一个目录,我们将把这个新的目录称作工作区目录。
创建工作区还需要最后一步,即在工作区目录中创建一个叫做src的子目录,该子目录用于存放功能包的源代码。
创建功能包 创建一个新ROS功能包的命令应该在你工作区中的src目录下运行,如下所示:
catkin_create_pkg package-name
这个命令主要是创建了一个存放这个功能包的目录,并在那个目录下生成了两个配置文件。
第一个配置文件,叫做package.xml,它是一个清单文件。
第二个文件,叫做CMakeLists.txt,是一个Cmake的脚本文件。
所以要修改上面的包,修改如下
编辑清单文件 创建包后,你可能希望编辑其 package.xml 文件,其中包含一些描述这个包的元数据。请注意,无论是在编译时还是在运行时,其中的大部分信息 ROS 并没有使用,这些信息只有在你公开发布代码时才变得重要。本着保持文档与实际功能同步的精神,至少填写
description 和 maintainer 两部分可能是比较合理的。
2、你好,ROS!
现在已经创建好了包,可以开始编写ROS程序了。
1)一个简单的程序
新建一个名字为hello.cpp的源文件与package.xml,CMakeLists.txt同目录。
解释:
---头文件 ros/ros.h 包含了标准 ROS 类的声明,你将会在每一个你写的 ROS 程序中包含它。
---ros::init函数初始化ROS客户端库。请在你程序的起始处调用一次该函数。 函数最后的参数是一个包含节点默认名的字符串。这个默认名可以通过启动文件或者通过rosrun 命令行参数覆盖。
---ros::NodeHandle(节点句柄)对象是你的程序用于和ROS系统交互的主要机制。创建此对象会将你的程序注册为ROS节点管理器的节点。最简单的方法就是在整个程序中只创建一个NodeHandle对象。
---ROS_INFO_STREAM 宏将生成一条消息,且这一消息被发送到不同的位置,包括控制台窗口。
2)编译Hello程序
我们该如何编译和运行这个程序呢?这些交给ROS的catkin编译系统来处理。一共有四个步骤:
声明依赖库 首先,我们需要声明程序所依赖的其他功能包。对于 c++程序而言,此步骤是必要的,以确保 catkin 能够向 c++编译器提供合适的标记来定位编译功能包所需的头文件和链接库。
为了给出依赖库,编辑包目录下的 CMakeLists.txt 文件,该文件的默认版本含有如下行:
find_package(catkin REQUIRED)
所依赖的其他catkin包可以添加到这一行的COMPONENTS关键字后面,如下所示:
find_package(catkin REQUIRED COMPONENTS package-names)
对于 hello 例程,我们需要添加名为 roscpp 的依赖库,它提供了 ROS 的 C++客户端库。因此,修改后的 find_package 行如下所示:
find_package(catkin REQUIRED COMPONENTS roscpp)
以上是在CMakeLists.txt文件中进行修改,下面我们将在清单文件package.xml中进行修改:
我们同样需要在包的清单文件中列出依赖库,通过使用build_depend (编译依赖)和 run_depend(运行依赖)两个关键字实现:
<build_depend>package-name</build_depend>
<run_depend>package-name</run_depend>
在我们的例程中,hello 程序在编译时和运行时都需要 roscpp 库,因此清单文件需要包括:
<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend>
声明可执行文件 接下来,需要在CMakeLists.txt中添加两行,来声明我们需要创建的可执行文件。其一般形式是:
add_executable(executable-name source-files)
target_link_libraries(executable-name ${catkin_LIBRARIES})
第一行声明了我们想要的可执行文件的文件名,以及生成此可执行文件所需的源文件列表。如果你有多个源文件,把它们列在此处,并用空格将其区分开。
第二行告诉 Cmake 当链接此可执行文件时需要链接哪些库(在上面的 find_package 中定义) 。如果你的包中包括多个可执行文件,为每一个可执行文件复制和修改上述两行代码。
在我们的例程中,我们需要一个名为 hello 的可执行文件,它通过名为 hello.cpp 的源文件编译而来。 所以我们需要添加如下几行代码到 CMakeLists.txt 中:
add_executable(hello hello.cpp)
target_link_libraries(hello ${catkin_LIBRARIES})
编译工作区 一旦你的CMakeLists.txt文件设置好,你就可以编译你的工作区,使用如下命令来编译所有包中的所有可执行文件:
catkin_make
因为被设计成编译你的工作区中的所有包,这个命令必须从你的工作区目录运行。它将会完成一些配置步骤(尤其是你第一次运行此命令时) ,并且在你的工作区中创建 devel 和 build 两个子目录。这两个新目录用于存放和编译相关的文件,例如自动生成的编译脚本、目标代码和可执行文件。如果你喜欢,当完成功能包的相关工作后(译者注:即完成了编写、调试、测试等一系列工作后,此时代码基本定型) ,可以放心地删除 devel 和 build两个子目录。
Sourcing setup.bash 最后的步骤是执行名为 setup.bash 的脚本文件,它是 catkin_make 在你工作区的 devel 子目录下生成的。
source devel/setup.bash
这个自动生成的脚本文件设置了若干环境变量,从而使 ROS 能够找到你创建的功能包和新生成的可执行文件。它类似于 2.2 节介绍的全局 setup.bash,但是是专门为你的工作区量身定做的。除非目录结构发生变化,否则你只需要在每个终端执行此命令一次,即使你修改了代码并且用 catkin_make 执行了重编译。
3)执行hello程序
当所有这些编译步骤完成后,新的 ROS 程序就可以使用rosrun来执行,命令是:
rosrun new_1 hello
第3章 编写ROS程序-1的更多相关文章
- 第3章 编写ROS程序-3
1.订阅者程序 我们继续使用 turtlesim 作为测试平台,订阅 turtlesim_node发布的/turtle1/pose 话题. 这一话题的消息描述了海龟的位姿 (位置和朝向) .尽管目前你 ...
- 第3章 编写ROS程序-2
1.发布者程序 在本节中,我们将看到如何发送随机生成的速度指令到一个turtlesim海龟,使它漫无目的地巡游.这个程序的源文件称为pubvel,这个程序展示了从代码中发布消息涉及的所有要素. 其代码 ...
- C#入门到精通系列课程——第2章编写C#程序
◆本章内容 (1)熟悉Visual Studio 2017开发环境 (2)编写第一个C#程序 (3)C#程序结构预览 (4)程序编写规范 (5)难点解答 ◆本章简述 要学习C#编程,必然要熟悉C#程序 ...
- 编写ROS程序--HelloROS
<机器人操作系统浅析>ch3学习记录 A Gentle Introduction to ROS 3.1 创建工作区(工作空间)和功能包 创建工作空间 ~/ros 我们称之为工作区目录 在工 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- 第 3 章 编写 PAM 应用程序和服务
Solaris 开发者安全性指南 Previous: 第 2 章 开发特权应用程序 Next: 第 4 章 编写使用 GSS-API 的应用程序 第 3 章 编写 PAM 应用程序和服务 可插拔验证模 ...
- ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)
ROS Indigo beginner_Tutorials-12 编写ROS服务版的Hello World程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的 ...
- ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)
ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 ...
- [Hadoop in Action] 第4章 编写MapReduce基础程序
基于hadoop的专利数据处理示例 MapReduce程序框架 用于计数统计的MapReduce基础程序 支持用脚本语言编写MapReduce程序的hadoop流式API 用于提升性能的Combine ...
随机推荐
- smarty静态缓存
缓存能让程序访问起来更加快速,调数据库的数量变少,不能实时的跟数据库同步, 一般缓存文件都放在smarty文件下cach文件夹中: 建立缓存的PHP和HTML文件: 先编辑PHP文件来查询显示数据库当 ...
- 【BZOJ1018】[SHOI2008]堵塞的交通traffic 线段树
[BZOJ1018][SHOI2008]堵塞的交通traffic Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个 ...
- ES中DSL查询相关
elasticsearch中的API:http://www.cnblogs.com/yjf512/p/4862992.html elasticsearch查询系列:http://blog.csdn.n ...
- HTML 学习笔记 JQuery(animation)
动画效果也是JQuery库吸引人的地方,通过JQuery的动画方法,能够轻松的为网页天假非常紧菜的视觉效果. show()方法和hide()方法 show()方法和hide()方法是JQuery中最基 ...
- 【iOS开发-63】Unknown type name "CGRect",did you mean "Rect"?的解决方式
出现这个问题的童鞋,差点儿都是由于用了Xcode6. 原因:在Xcode6之前,创建的文件系统会自己主动为用户导入Foundation.h和UIKit.h文件,可是最新的Xcode6仅仅为用户导入了F ...
- JSP&Servlet(转)
第一篇:Web应用基础1.概念: 1.1应用程序分类 a.桌面应用程序:一般是指采用client/server即客户机/服务器结构的应用程序. b.web应用程序:一般是指采用Bro ...
- java基础之容器、集合、集合常用方法
一.容器(Collection):数组是一种容器,集合也是一种容器 java编程中,装其他各种各样的对象(引用类型)的一种东西,叫容器 注意: 1.数组的长度是固定的 2.集合:长度不固定, 可以随时 ...
- Java for LeetCode 080 Remove Duplicates from Sorted Array II
Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For examp ...
- perl之创建临时文件夹遇到同名文件该咋办
当你在目录下进行一系列操作时,若要创建许多文件或者修改文件,可能会遇到许多麻烦的事.所以呢,新建一个文件夹,然后在这个文件夹下新建文件或者修改文件.假设,你的代码要在一个目录下新建一个文件夹,名为Tm ...
- hibernate 一对多 级联 保存修改 删除
一对多,一端设置: <set name="TWorkorderHistories" inverse="true" cascade="all&qu ...