创建操作

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

教程级别: 中级

时间: 5 分钟

背景

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

先决条件

您应该已安装 ROS 2colcon

您应该知道如何设置 workspace 并创建包。

记得先 source your ROS 2 installation

任务

1 创建接口包

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

2 定义动作

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

# Request
---
# Result
---
# Feedback

动作定义由三个消息定义组成,以“—”分隔。

  • 动作客户端向动作服务器发送“请求”消息,以启动新目标。

  • 目标完成后,动作服务器向动作客户端发送“结果”消息。

  • 动作服务器定期向动作客户端发送“反馈”消息,其中包含有关目标的更新。

动作实例通常称为“目标”

假设我们想要定义一个新的动作“斐波那契”来计算“斐波那契数列<https://en.wikipedia.org/wiki/Fibonacci_number>”

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

cd custom_action_interfaces
mkdir action

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

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

目标请求是我们要计算的斐波那契数列的“顺序”,结果是最终的“序列”,反馈是迄今为止计算的“partial_sequence”。

3 构建动作

在我们可以在代码中使用新的斐波那契动作类型之前,我们必须将定义传递给 rosidl 代码生成管道。

这是通过在“ament_package()”行之前将以下几行添加到我们的“CMakeLists.txt”中来实现的:

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>

我们现在应该能够构建包含“斐波那契”动作定义的包:

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

我们完成了!

按照惯例,操作类型将以其包名称和单词“action”作为前缀。 因此,当我们想要引用我们的新操作时,它将具有全名“custom_action_interfaces/action/Fibonacci”。

我们可以使用命令行工具检查我们的操作是否成功构建。 首先获取我们的工作区:

source install/local_setup.bash

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

ros2 interface show custom_action_interfaces/action/Fibonacci

您应该会看到屏幕上打印的斐波那契动作定义。

摘要

在本教程中,您学习了动作定义的结构。

您还学习了如何使用 CMakeLists.txtpackage.xml 正确构建新的动作接口, 以及如何验证构建是否成功。

后续步骤

接下来,让我们通过创建动作服务和客户端(在 PythonC++ 中)来利用您新定义的动作接口。

相关内容

有关 ROS 动作的更多详细信息,请参阅`设计文章 <http://design.ros2.org/articles/actions.html>`__。