创建 action

目标: 在 ROS 2 包中定义 action .

教程等级: 中级

预计时长: 5 分钟

背景

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

前提条件

你需要已经安装了 ROS 2colcon

配置一个 工作空间 并创建一个名为 action_tutorials_interfaces 的包:

(记得先 source ROS 2 安装环境。)

mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention
cd ros2_ws/src
ros2 pkg create action_tutorials_interfaces

任务

1 定义 action

Action 是在 .action 文件中以这种形式定义的:

# Request 请求
---
# Result 结果
---
# Feedback 反馈

一个 action 定义由三部份消息定义组成,用 --- 分隔。

  • 从 action 客户端发送到 action 服务器的 请求 消息,初始化一个新的目标。

  • 当目标完成时,从 action 服务器发送到 action 客户端的 结果 消息。

  • 反馈 消息是周期性地从 action 服务器发送到 action 客户端的消息,用于更新目标。

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

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

在 ROS 2 包 action_tutorials_interfaces 中创建一个 action 目录:

cd action_tutorials_interfaces
mkdir action

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

int32 order
---
int32[] sequence
---
int32[] partial_sequence

目标请求是我们要计算的斐波那契数列的项数 order,结果是最终算出来的数列 sequence,反馈是到目前为止计算出来的数列 partial_sequence

2 构建 action

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

这可以通过在我们的 CMakeLists.txt 文件中添加以下行来完成,这些行应该在 action_tutorials_interfaces 中的 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>

<depend>action_msgs</depend>

<member_of_group>rosidl_interface_packages</member_of_group>

请注意,我们需要依赖于 action_msgs,因为 action 定义依赖了一些额外的元数据(例如目标 ID)。

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

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

很好!我们完成了!

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

我们可以使用命令行工具检查 action 是否构建成功:

# Source our workspace
# On Windows: call install/setup.bat
. install/setup.bash
# Check that our action definition exists
ros2 interface show action_tutorials_interfaces/action/Fibonacci

应该能看到 Fibonacci action 的定义打印到屏幕上。

总结

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

下一步

接下来,让我们使用你新定义的 action 接口创建一个 action 服务和客户端(在 PythonC++ 中)。

相关内容

更多关于 ROS action 的详细信息,请参考 设计文档