一个 ROS2 包可以看作是 ROS2 代码的容器。如果需要安装或者共享代码,那么代码应该组织在一个包中。有了软件包,就更方便的发布 ROS2 代码。

ROS2 包使用 ament 作为构建系统,colcon 作为构建工具。官方支持 CMake 和 Python 作为构建类型。

最小包要求

CMake

一个 CMake 包需要:

  • package.xml,包括包的元数据。
  • CMakeLists.txt, 包括怎么构建包的代码。
1
2
3
my_package/
  CMakeLists.txt
  package.xml

Python

一个 python 包需要:

  • package.xml, 包括包的元数据
  • setup.py, 安装包的指导
  • setup.cfg, 包中有可执行文件时需要这个文件
  • /<package_name> 一个和包名相同的目录,里面包括 __init__.py

包在 Workspace 中

一个 Workspace 下有多个包,可以包括 CMake 或者 Python

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
workspace_folder/
    src/
      package_1/
          CMakeLists.txt
          package.xml

      package_2/
          setup.py
          package.xml
          resource/package_2
      ...
      package_n/
          CMakeLists.txt
          package.xml

Workspace 工作空间

一个工作空间是一个目录,里面包括了 ROS2 的包。

下面是工作空间的例子

载入环境

source /opt/ros/dashing/setup.zsh

创建工作空间目录

mkdir StudyROS2

一般将所有的包放在 src 目录下 mkdir StudyROS2/src

下载现成的包

将包下载到 src 目录

git clone https://github.com/ros/ros_tutorials.git -b dashing-devel

ros_tutorials 目录下的 turtlesim 是实际的 package

安装依赖

在构建 Workspace 之前需要先安装依赖。

rosdep install -i --from-path src --rosdistro dashing -y

构建 Workspace

colcon build 构建整个工作空间。

colcon build --packages-up-to 构建指定的 package

colcon build --symlink-install 避免每次调整脚本时都重新生成

colcon build --event-handlers console_direct+ 构建的时候在控制台输出

构建后在工作空间目录下的目录如下:

1
build  install  log  src

加载当前 Workdspace 环境

1
source ./install/local_setup.zsh

local_setup.zshsetup.zsh 的区别:

  • local_setup.zsh 只会将当前 Workspace 的包加载到环境中。
  • setup.zsh 会将核心的 Workspace 的包加载到环境中。

包的使用

下面只会创建 CMake 包。

创建包

创建包的命令,在 src 目录中运行。

1
ros2 pkg create --build-type ament_cmake <package_name>

可以用 --node-name 创建一个简单的可执行目标。

1
ros2 pkg create --build-type ament_cmake --node-name my_node my_package

构建包

colcon build

只构建指定包 colcon build --packages-select my_package

加载当前 Workspace 环境

source ./install/local_setup.zsh

现在就可以使用我们构建的包了。

运行包

1
ros2 run my_package my_node

自定义包信息

我们可以编辑 package.xml 修改里面的字段,如:description, license 等。

创建一个简单的发布者和订阅者

https://index.ros.org/doc/ros2/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber