目录
一、文件系统的命令行操作
rosbash包中包含了一些有用的bash命令,可以有效提高开发效率。以下为常用的命令:
roscd
- 更改目录(以软件包,堆栈或位置名称开头)rospd
- 相当于roscdrosd
- 列出目录堆栈中的目录rosls
- 列出ros软件包的文件rosed
- 编辑包中的文件roscp
- 从包中复制文件rosrun
- 运行ros包中的可执行文件(重要)rospack
- 获取软件包的有关信息
详细说明见help
或ROS官方教程 | 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.txt
和 package.xml
,并且将依赖项填进了这两个文件中。
由上文可知,创建软件包beginner_tutorials
时已经指定其依赖的功能包有std_msgs
、rospy
、roscpp
。
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.xml
和CMakeLists.txt
文件的修改。
以下内容主要参考ROS官方教程 | 创建ROS程序包 与 《机器人操作系统入门》课程讲义。
3.1、package.xml
该文件使用的是XML
标记语言,具体语法可见菜鸟教程 | XML教程 或 W3school | XML教程。但是无需深究,只需了解基本语法即可。
3.1.1、版本格式差异
由于版本更迭的原因,现在package.xml
有两种格式并存(Format1
与Format2
),见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>
,相当于将之前的build
和run
依赖项描述进行了细分。
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>
你应该选择一种许可协议并将它填写到这里。一些常见的开源许可协议有BSD
、MIT
、Boost Software License
、GPLv2
、GPLv3
、LGPLv2.1
和LGPLv3
。对于本教程我们将使用BSD
协议,因为ROS核心组件的剩余部分已经使用了该协议。
- 依赖项标签
用来描述程序包的各种依赖项,这些依赖项分为<build_depend>
、<buildtool_depend>
、<exec_depend>
、 <test_depend>
。
在之前的操作中,因为我们将 std_msgs
、 roscpp
、 和 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工程添加了一些宏定义。所以在写法上,catkin
的 CMakeLists.txt
与CMake
的基本一致。这个文件直接规定了这个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()
之后必须加上这句话,用于生成srv
、msg
头文件/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课程)
记录学习所得,如有错误,欢迎指正。
如有侵权,联系删除。