创建一个动作 [5358]

目标: 在ROS 2软件包中定义一个动作。 [5359]

教程级别: 中级 [16770]

时间: 5分钟 [16459]

背景 [16410]

在之前的 理解行为 [4113] 教程中,你学习了关于动作的内容。和其他通信类型及其相应的接口(topics/msg 和 services/srv)一样,你也可以在你的包中自定义定义动作。本教程将向你展示如何定义和构建一个动作,你可以在下一个教程中使用该动作服务器和动作客户端进行编写。 [5360]

先决条件 [16411]

你应该已经安装了 ROS 2colcon[5361]

设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包: [5362]

(记得首先 source your ROS 2 installation。) [5363]

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

任务 [16427]

1 定义一个动作 [5364]

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

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

一个动作定义由三个消息定义组成,用 --- 分隔。 [5366]

  • 一个 请求 消息是从动作客户端发送到动作服务器,用于启动一个新的目标。 [5367]

  • 一个 结果 消息是从动作服务器发送到动作客户端,表示一个目标已完成。 [5368]

  • Feedback messages are periodically sent from an action server to an action client with updates about a goal.

一个动作的实例通常被称为一个 目标[5370]

假设我们想要定义一个用于计算 斐波那契数列 的新动作 "Fibonacci"。 [5371]

在我们的ROS 2包`action_tutorials_interfaces`中创建一个名为`action`的目录: [5372]

cd action_tutorials_interfaces
mkdir action

在`action`目录中创建一个名为`Fibonacci.action`的文件,并包含以下内容: [5373]

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

目标请求是我们想要计算的斐波那契序列的`order`,结果是最终的`sequence`,反馈是到目前为止计算出的`partial_sequence`。 [5374]

2 构建一个action [5375]

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

这可以通过在`action_tutorials_interfaces`的`CMakeLists.txt`文件中在`ament_package()`之前添加以下行来实现: [5377]

find_package(rosidl_default_generators REQUIRED)

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

我们还需要将所需的依赖项添加到我们的 package.xml 文件中: [5378]

<buildtool_depend>rosidl_default_generators</buildtool_depend>

<depend>action_msgs</depend>

<member_of_group>rosidl_interface_packages</member_of_group>

注意,我们需要依赖于 action_msgs,因为动作定义包括附加元数据(例如目标 ID)。 [5379]

现在,我们应该能够构建包含 Fibonacci 动作定义的软件包: [5380]

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

我们完成了! [5381]

按照惯例,动作类型将以其包名称和单词 action 作为前缀。因此,当我们想引用我们的新动作时,它将具有完整的名称 action_tutorials_interfaces/action/Fibonacci[5382]

我们可以使用命令行工具检查我们的动作是否成功构建: [5383]

# 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

你应该在屏幕上看到打印出的斐波那契动作定义。 [5384]

总结 [16454]

在本教程中,你学会了动作定义的结构。你还学会了如何正确构建一个新的动作接口,使用 CMakeLists.txtpackage.xml,以及如何验证构建的成功。 [5385]

下一步 [16493]

接下来,让我们利用你新定义的动作接口来创建一个动作服务和客户端(在 PythonC++ 中)。 [5386]