创建操作

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

教程级别: 中级

时间: 5 分钟

背景

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

先决条件

您应该已安装 ROS 2colcon

设置 workspace 并创建名为 action_tutorials_interfaces 的包:

(请记住先 source your ROS 2 installation。)

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 文件中定义,格式如下:

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

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

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

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

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

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

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

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

cd action_tutorials_interfaces
mkdir action

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

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

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

2 构建动作

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

这是通过在“action_tutorials_interfaces”中的“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>

<depend>action_msgs</depend>

<member_of_group>rosidl_interface_packages</member_of_group>

请注意,我们需要依赖“action_msgs”,因为动作定义包含额外的元数据(例如目标 ID)。

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

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

我们完成了!

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

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

# 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

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

摘要

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

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

后续步骤

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

相关内容

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