1. 安装并配置ROS环境
1.1 安装ROS
见另一篇博客 Ubuntu16.04 ROS-Kinetic 安装
1.2 管理环境
通过类似apt的软件包管理器安装ROS软件包时会生成setup.*sh文件,*如果是通过 Ubuntu 上的 apt
工具来安装ROS的,那么将会在 ‘/opt/ros/<版本名>/
’ 目录中看到 setup.sh 文件。如果是kinetic版本,则执行
$ souce /opt/ros/kinetic/setup.bash
在每次打开终端时都需要先运行上面这条命令后才能运行ros相关的命令,为了避免这一繁琐过程,可以事先在 .bashrc
文件中添加这条命令。
1.3 创建ROS工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
- 对于python3用户,在一个空的catkin工作空间第一次运行
catkin_make
的命令为
$ catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
source
devel
文件夹中的setup.*sh
文件,可以将当前工作空间设置在ROS工作环境的最顶层。
$ souce devel/setup.bash
查看工作空间配置是否正确,需确保ROS_PACKAGE_PATH
环境变量包含你的工作空间目录。ROS_PACKAGE_PATH 环境变量应该包含那些保存有 ROS 软件包的路径,并且每个路径之间用冒号分隔开来。
$ echo $ROS_PACKAGE_PATH
/home/<youruser>/catkin_ws/src:/opt/ros/kinetic/share
2. ROS文件系统
2.1 文件系统概念
- Packages: 软件包,是ROS应用程序代码的组织单元,每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西。
- Manifest (package.xml): 清单,是对于’软件包’相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。
2.2 文件系统工具
- rospack 返回软件包的路径信息
$ rospack find [包名称]
$ rospack find roscpp
/opt/ros/kinetic/share/roscpp
$ roscd roscpp
$ pwd
/opt/ros/kinetic/share/roscpp
$ roscd roscpp/cmake
$ pwd
/opt/ros/kinetic/share/roscpp/cmake
- rosls 直接按软件包的名称执行ls命令
$ rosls [本地包名称[/子目录]]
3. 创建ROS程序包
3.1 一个catkin程序包由什么组成?
- 该程序包必须包含catkin compliant package.xml文件
- 这个package.xml文件提供有关程序包的元信息。
- 程序包必须包含一个catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必须包含一个对CMakeList.txt文件的引用。
- 每个目录下只能有一个程序包。
- 这意味着在同一个目录下不能有嵌套的或者多个程序包存在。
3.2 catkin工作空间结构
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
3.3 创建一个catkin程序包
- 使用
catkin_create_pkg
命令来创建一个名为beginner_tutorials
的新程序包,这个程序包依赖于std_msgs
、roscpp
和rospy
:
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
catkin_create_pkg
命令也有更多的高级功能,这些功能在catkin/commands/catkin_create_pkg中有描述
3.4 程序包依赖关系
- 使用
rospack
命令工具来查看一级依赖包
$ rospack depends1 beginner_tutorials
roscpp
rospy
std_msgs
# 依赖包被保存在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>
...
</package>
- 很多情况下一个依赖包还会有它自己的依赖包,可以依次使用
rospack depends1
查找 - 可以使用
rospack depends
递归检测所有的依赖包
3.5 自定义自己的程序包
3.5.1 自定义 package.xml
- 描述标签
<name>beginner_tutorials</name>
<version>0.0.0</version>
<description>The beginner_tutorials package</description>
- 维护者标签
<!-- One maintainer tag required, multiple allowed, one person per tag -->
<!-- Example: -->
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
<maintainer email="user@todo.todo">user</maintainer>
要求填写的标签,便于发布
- 许可标签
<!-- One license tag required, multiple allowed, one license per tag -->
<!-- Commonly used license strings: -->
<!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>BSD</license>
一些常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。你可以在Open Source Initiative中阅读其中的若干个许可协议的相关信息。对于本教程我们将使用BSD协议,因为ROS核心组件的剩余部分已经使用了该协议
- 依赖项标签
<!-- The *depend tags are used to specify dependencies -->
<!-- Dependencies can be catkin packages or system dependencies -->
<!-- Examples: -->
<!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
<!-- <depend>roscpp</depend> -->
<!-- Note that this is equivalent to the following: -->
<!-- <build_depend>roscpp</build_depend> -->
<!-- <exec_depend>roscpp</exec_depend> -->
<!-- Use build_depend for packages you need at compile time: -->
<!-- <build_depend>message_generation</build_depend> -->
<!-- Use build_export_depend for packages you need in order to build against this package: -->
<!-- <build_export_depend>message_generation</build_export_depend> -->
<!-- Use buildtool_depend for build tool packages: -->
<!-- <buildtool_depend>catkin</buildtool_depend> -->
<!-- Use exec_depend for packages you need at runtime: -->
<!-- <exec_depend>message_runtime</exec_depend> -->
<!-- Use test_depend for packages you need only for testing: -->
<!-- <test_depend>gtest</test_depend> -->
<!-- Use doc_depend for packages you need only for building documentation: -->
<!-- <doc_depend>doxygen</doc_depend> -->
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
除了catkin中默认提供的buildtool_depend
,所有我们列出的依赖包都已经被添加到build_depend
标签中。在本例中,因为在编译和运行时我们需要用到所有指定的依赖包,因此还需要将每一个依赖包分别添加到run_depend
标签中:
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
在学习了这些标签的含义后,可以对package.xml
进行剪裁整理,使其更加简洁明了!
3.5.2 自定义 CMakeLists.txt
4. 编译ROS程序包
4.1 编译程序包
catkin_make 是一个命令行工具,简化了catkin的标准工作流程。可以认为catkin_make是在CMake标准工作流程中依次调用了cmake
和 make
# In a catkin workspace ~/catkin_ws
$ catkin_make
$ catkin_make install # (可选)
catkin_make首先输出它所使用到的每个空间所在的路径, 由于这些空间存在默认配置的原因,有几个文件夹已经在catkin工作空间自动生成了,即 build
和 devel
build
目录是build space的默认所在位置同时cmake
和make
也是在这里被调用来配置并编译你的程序包。devel
目录是devel space的默认所在位置, 同时也是在你安装程序包之前存放可执行文件和库文件的地方。