ROS学习笔记#基础篇#(二)——ROS文件系统与创建/编译软件包

一、文件系统的命令行操作

rosbash包中包含了一些有用的bash命令,可以有效提高开发效率。以下为常用的命令:

  • roscd - 更改目录(以软件包,堆栈或位置名称开头)
  • rospd - 相当于roscd
  • rosd - 列出目录堆栈中的目录
  • rosls - 列出ros软件包的文件
  • rosed - 编辑包中的文件
  • roscp - 从包中复制文件
  • rosrun - 运行ros包中的可执行文件(重要
  • rospack - 获取软件包的有关信息

详细说明见helpROS官方教程 | ROS文件系统介绍

二、创建ROS软件包

以下内容主要参考ROS官方教程 | 创建ROS程序包《机器人操作系统入门》课程讲义

2.1、catkin软件包的组成

首先你已经根据 搭建ROS开发环境教程 创建catkin_ws工作空间。
使用catkin_create_pkg命令来创建一个新的catkin软件包:

$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

安装tree并查看catkin_ws文件树结构,如下:

$ sudo apt-get install tree
$ tree -F ~/catkin_ws/

主要结构如下:

catkin_ws/
└── src/
    └── beginner_tutorials/
        ├── CMakeLists.txt
        ├── include/
        │   └── beginner_tutorials/
        ├── package.xml
        └── src/

可见src文件夹下生成了beginner_tutorials软件包,其中以下2个文件为不可缺少的基本文件:

  • package.xml — 包含对软件包的描述信息
  • CMakeLists.txt — 用于生成make所需要的makefile文件

一个简单的工作空间的文件结构如下:

workspace_folder/              -- WORKSPACE
└── src/                       -- SOURCE SPACE
    ├── CMakeLists.txt         -- 'Toplevel' CMake file, provided by catkin
    ├── package_1/
    │   ├── CMakeLists.txt     -- CMakeLists.txt file for package_1
    │   └── package.xml        -- Package manifest for package_1
    ...
    └── package_n/
        ├── CMakeLists.txt     -- CMakeLists.txt file for package_n
        └── package.xml        -- Package manifest for package_n

每个目录下只能有一个软件包,这意味着在同一个目录下不能有嵌套的或者多个软件包存在。

2.2、软件包依赖关系

上文中使用catkin_create_pkg创建了软件包beginner_tutorials,其语法为:

$ catkin_create_pkg package_name [dependencies [dependencies ...]]

其中dependencies即指定软件包package_name依赖的功能包。catkin_create_pkg 帮你完成了软件包的初始化,填充好了 CMakeLists.txtpackage.xml,并且将依赖项填进了这两个文件中。
由上文可知,创建软件包beginner_tutorials时已经指定其依赖的功能包有std_msgsrospyroscpp

2.2.1、一级依赖

现在我们可以使用rospack命令工具来查看软件包beginner_tutorials的一级依赖关系,如下:

$ rospack depends1 beginner_tutorials

终端返回beginner_tutorials的一级依赖包:

roscpp
rospy
std_msgs

这些依赖关系记录在package.xml文件中,查看package.xml文件:

$ roscd beginner_tutorials
$ cat package.xml

关键内容如下:

<package>
...
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
...
</package>

后期如果要增加依赖项,可以直接修改package.xml文件。

2.2.2、间接依赖

在很多情况中,一个依赖包还会有它自己的依赖包,比如,rospy还有其它依赖包。
查看rospy的一级依赖关系:

$ rospack depends1 rospy

终端返回rospy的一级依赖包:

genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs

通过使用rospack可以递归检测出所有的依赖包:

$ rospack depends beginner_tutorials

终端返回软件包beginner_tutorials依赖的所有功能包:

cpp_common
rostime
roscpp_traits
roscpp_serialization
catkin
genmsg
genpy
message_runtime
gencpp
geneus
gennodejs
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
ros_environment
rospack
roslib
rospy

三、自定义ROS软件包

自定义软件包主要涉及 package.xmlCMakeLists.txt文件的修改。
以下内容主要参考ROS官方教程 | 创建ROS程序包《机器人操作系统入门》课程讲义

3.1、package.xml

该文件使用的是XML标记语言,具体语法可见菜鸟教程 | XML教程W3school | XML教程。但是无需深究,只需了解基本语法即可。

3.1.1、版本格式差异

由于版本更迭的原因,现在package.xml有两种格式并存(Format1Format2),见ROS官方教程 | package.xml

  • Format1
<pacakge> 				根标记文件
<name> 					包名
<version> 				版本号
<description> 			内容描述
<maintainer> 			维护者
<license> 				软件许可证
<buildtool_depend> 		编译构建工具,通常为catkin
<build_depend> 			编译依赖项
<run_depend> 			运行依赖项
  • Format2
<pacakge> 				根标记文件
<name> 					包名
<version> 				版本号
<description> 			内容描述
<maintainer> 			维护者
<license> 				软件许可证
<buildtool_depend> 		编译构建工具,通常为catkin
<depend> 				指定依赖项为编译、导出、运行需要的依赖,最常用
<build_depend> 			编译依赖项
<build_export_depend> 	导出依赖项
<exec_depend> 			运行依赖项
<test_depend> 			测试用例依赖项
<doc_depend> 			文档依赖项

可见新版本的 pacakge.xml 格式上增加了 <depend><build_export_depend><exec_depend><test_depend><doc_depend>,相当于将之前的buildrun依赖项描述进行了细分。

3.1.2、主要标签的说明

默认生成的package.xml使用的是Format2,下文以Format2为例。
查看beginner_tutorials软件包的 pacakge.xml文件:

$ roscd beginner_tutorials
$ cat package.xml
  • 描述信息标签
<description>The beginner_tutorials package</description>

创建软件包时已经初始化成软件包名称,一般用于描述该软件包的作用并尽量简洁。

  • 维护者标签
<maintainer email="you@yourdomain.tld">Your Name</maintainer>

至少需要填写一个维护者名称与邮箱,但如果有需要的话你可以添加多个。

  • 许可证标签
<license>BSD</license>

你应该选择一种许可协议并将它填写到这里。一些常见的开源许可协议有BSDMITBoost Software LicenseGPLv2GPLv3LGPLv2.1LGPLv3。对于本教程我们将使用BSD协议,因为ROS核心组件的剩余部分已经使用了该协议。

  • 依赖项标签

用来描述程序包的各种依赖项,这些依赖项分为<build_depend><buildtool_depend><exec_depend><test_depend>
在之前的操作中,因为我们将 std_msgsroscpp、 和 rospy作为catkin_create_pkg命令的参数,所以生成的依赖项看起来如下:

<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>

后期如果要增加依赖项,可以直接修改依赖项标签。其中也可使用<depend>标签,相当于<build_depend><exec_depend>的结合。

3.2、CMakeLists.txt

CMakeLists.txt 原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了CMake的编译风格,只是针对ROS工程添加了一些宏定义。所以在写法上,catkinCMakeLists.txtCMake的基本一致。这个文件直接规定了这个package要依赖哪些package,要编译生成哪些目标,如何编译等等流程。所以 CMakeLists.txt 非常重要,它指定了由源码到目标文件的规则,catkin编译系统在工作时首先会找到每个package下的 CMakeLists.txt ,然后按照规则来编译构建。
如果你从未接触过CMake的语法,请阅读《CMake实践》,另外可参考ROS官方教程 | CMakeLists.txt

3.2.1、文件格式

CMakeLists.txt 的基本语法都还是按照CMake,而catkin在其中加入了少量的宏,总体的结构如下:

cmake_minimum_required() 	#CMake的版本号
project() 					#项目名称
find_package() 				#找到编译需要的其他CMake/catkin package
catkin_python_setup() 		#catkin新加宏,打开catkin的Python Module的支持
add_message_files() 		#catkin新加宏,添加自定义Message/Service/Action文件
add_service_files()
add_action_files()
generate_message() 			#catkin新加宏,生成不同语言版本的msg/srv/action接口
catkin_package() 			#catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用
add_library() 				#生成库
add_executable() 			#生成可执行二进制文件
add_dependencies() 			#定义目标文件依赖于其他目标文件,确保其他目标已被构建
target_link_libraries() 	#链接
catkin_add_gtest() 			#catkin新加宏,生成测试
install() 					#安装至本机

3.2.2、主要函数的说明

查看beginner_tutorials软件包的 CMakeLists.txt文件:

$ roscd beginner_tutorials
$ cat CMakeLists.txt
  • cmake_minimum_required(VERSION 2.8.3)
    每个catkin CMakeLists.txt文件必须以所需的CMake版本开头。catkin需要版本2.8.3或更高版本。
  • project(beginner_tutorials)
    Cmake项目的package名称为beginner_tutorials,在后续文件中可使用变量${PROJECT_NAME}来引用项目名称beginner_tutorials
  • find_package(catkin REQUIRED COMPONENTS roscpprospy std_msgs)
    指定依赖的其他pacakge,可以联想到package.xml中的depend
    作用:如果CMake通过find_package找到了一个软件包,它将创建如下几个CMake环境变量,这些变量提供有关找到的包的信息。
    <NAME> _FOUND – 如果找到该库,则设置为true,否则为false。
    <NAME> _INCLUDE_DIRS<NAME> _INCLUDES – 包导出的包含路径
    <NAME> _LIBRARIES<NAME> _LIBS – 软件包导出的库
    <NAME> _DEFINITIONS – ?(官方教程未给出说明)
  • add_message_files(FILES Message1.msg Message2.msg)
    自定义Message
  • add_service_files(FILES Service1.srv Service2.srv)
    自定义Service
  • add_action_files(FILES Action1.action Action2.action)
    自定义Action
  • generate_messages(DEPENDENCIES std_msgs)
    add_message_files()add_service_files()之后必须加上这句话,用于生成srvmsg头文件/module,生成的文件位于devel/include
  • catkin_package(INCLUDE_DIRS include LIBRARIES beginner_tutorials CATKIN_DEPENDS roscpp rospy std_msgs DEPENDS system_lib)
    用于配置ROS的package配置文件和CMake文件,这个命令必须add_library()或者add_executable()之前调用。
  • include_directories(${catkin_INCLUDE_DIRS})
    指定头文件路径
  • add_library(${PROJECT_NAME} src/${PROJECT_NAME}/beginner_tutorials.cpp)
    指定源文件路径
  • add_executable(${PROJECT_NAME}_node src/beginner_tutorials_node.cpp)
    指定可执行文件目标${PROJECT_NAME}_node,本例即为beginner_tutorials_node
  • add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
    指定依赖
  • target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES})
    指定链接可执行文件
  • install(TARGETS ${PROJECT_NAME}_node RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
    安装目标文件到本地系统

四、编译ROS软件包

记得事先source你的环境配置(setup.bash)文件,在Ubuntu中的操作指令如下:

$ source /opt/ros/kinetic/setup.bash

如果你是按照 搭建ROS开发环境教程 创建catkin工作空间的,只需再打开一个新的终端即可。

  • 编译工作空间所有的软件包
$ cd ~/catkin_ws
$ catkin_make
  • 编译某一个或多个特定的软件包
$ cd ~/catkin_ws
$ catkin_make -DCATKIN_WHITELIST_PACKAGES="package1;package2"

如果要还原为编译所有软件包,请执行以下操作:

$ catkin_make -DCATKIN_WHITELIST_PACKAGES=""
  • 清除编译输出文件
$ cd ~/catkin_ws
$ catkin_make clean
  • 安装编译好的软件包
$ cd ~/catkin_ws
$ catkin_make install

也可以通过参数-DCMAKE_INSTALL_PREFIX来指定安装位置:

$ cd ~/catkin_ws
$ catkin_make -DCMAKE_INSTALL_PREFIX=/opt/ros/kinetic install

详细信息见ROS官方教程 | catkin_make


ROS学习资源推荐:
[1] ROS Wiki
[2] 古月居博客 推荐阅读ROS探索总结专栏
[3] 机器人操作系统入门(MOOC课程)


记录学习所得,如有错误,欢迎指正。
如有侵权,联系删除。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值