Skip to content

创建一个 Action

目标: 在 ROS 2 包中定义一个 action。

教程级别: 中级

预计用时: 5 分钟

你在之前的 理解 ROS 2 Action 教程中已经了解了动作(action)。与其他通信类型及其接口(话题/msg 和服务/srv)一样,你也可以在自己的包中自定义动作。本教程将向你展示如何定义和构建一个动作,供你在下一个教程中编写的 Action 服务端和 Action 客户端使用。

你应该已经安装了 ROS 2 和 colcon。

你应该知道如何设置一个 workspace 并创建包。

请记住先 source 你的 ROS 2 安装环境。

Linux / macOS:

Terminal window
$ mkdir -p ~/ros2_ws/src # you can reuse an existing workspace with this naming convention
$ cd ~/ros2_ws/src
$ ros2 pkg create --build-type ament_cmake --license Apache-2.0 custom_action_interfaces

Windows:

Terminal window
$ md \ros2_ws\src
$ cd \ros2_ws\src
$ ros2 pkg create --build-type ament_cmake --license Apache-2.0 custom_action_interfaces

custom_action_interfaces 是新包的名称。注意,它是一个 CMake 包,也只能是 CMake 包,但这并不会限制你在哪种类型的包中使用该动作。--build-type ament_cmake 标志在创建新的 ROS 2 包时基本上是可选的,但为完整起见,我们在这里包含了它。你可以在 CMake 包中创建自定义接口,然后在 C++ 或 Python 节点中使用它。

注意:将 .msg、.srv 和 .action 文件与使用它们的节点放在不同的包中是一个好习惯。这样跨不同包重用接口定义就更容易了。

Action 在 .action 文件中定义,格式如下:

Terminal window
# Request
---
# Result
---
# Feedback

一个 action 定义由三个消息定义组成,它们之间用 --- 分隔。

  • request 消息从 Action 客户端发送到 Action 服务端,用于发起新的目标(goal)。
  • result 消息在目标完成时从 Action 服务端发送到 Action 客户端。
  • feedback(反馈)消息会定期从 Action 服务端发送到 Action 客户端,提供关于目标的更新信息。

一个 action 的实例通常被称为一个 goal(目标)。

假设我们想定义一个新的 action “Fibonacci”,用于计算 斐波那契数列。

在我们的 ROS 2 包 custom_action_interfaces 中创建一个 action 目录:

Linux / macOS:

Terminal window
$ cd custom_action_interfaces
$ mkdir action

Windows:

Terminal window
$ cd custom_action_interfaces
$ md action

在 action 目录中,创建一个名为 Fibonacci.action 的文件,内容如下:

Terminal window
int32 order
---
int32[] sequence
---
int32[] sequence

目标请求(goal request)是我们要计算的 Fibonacci 序列的 order(阶数),结果(result)是最终的 sequence,反馈(feedback)是到目前为止计算出的 sequence。

在代码中使用新的 Fibonacci action 类型之前,必须将定义传递给 rosidl 代码生成流水线。

这可以通过在 CMakeLists.txt 中的 ament_package() 行之前添加以下内容来实现:

find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"action/Fibonacci.action"
)

我们还应该在 package.xml 中添加所需的依赖:

<buildtool_depend>rosidl_default_generators</buildtool_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

现在我们就可以构建包含 Fibonacci action 定义的包了:

Terminal window
$ cd ~/ros2_ws # Change to the root of the workspace
$ colcon build # Build

完成了!

按照惯例,action 类型会以其包名和 action 一词作为前缀。因此,当我们想要引用我们的新 action 时,它的完整名称将是 custom_action_interfaces/action/Fibonacci。

我们可以使用命令行工具来验证 action 是否成功构建。首先 source 我们的工作空间:

Linux:

Terminal window
$ source install/local_setup.bash

macOS:

Terminal window
$ source install/local_setup.console

Windows:

Terminal window
$ call install\local_setup.bat

现在检查我们的 action 定义是否存在:

Terminal window
$ ros2 interface show custom_action_interfaces/action/Fibonacci

你应该会看到 Fibonacci action 定义被打印到屏幕上。

在本教程中,你学习了 action 定义的结构。你还学习了如何使用 CMakeLists.txt 和 package.xml 正确构建新的 action 接口,以及如何验证构建是否成功。

接下来,通过创建一个 Action 服务端和客户端(使用 Python 或 C++)来使用你新定义的动作接口。

有关 ROS 动作的更多详细信息,请参阅 设计文章。