乐于分享
好东西不私藏

机器人系统——ROS2文档(进阶)—创建动作

机器人系统——ROS2文档(进阶)—创建动作

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

教程级别: 中级
时间: 5 分钟

目录
背景
前置条件
任务
o1 创建接口包
o2 定义动作
o3 构建动作
总结
后续步骤
相关资料

背景

您之前在“理解动作”教程中学习了动作的相关知识。与其他通信类型及其各自的接口(话题/msg 和服务/srv)一样,您也可以在包中自定义动作。本教程向您展示如何定义和构建一个动作,以便您在下一个教程中编写的动作服务器和动作客户端中使用它。

前置条件

您应该已安装 ROS 2 和 colcon。您应该知道如何设置工作空间和创建包。

请记住先加载您的 ROS 2 安装。

任务

1 创建接口包

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

custom_action_interfaces 是新包的名称。请注意,它本身是且只能是 CMake 包,但这并不限制您可以在哪种类型的包中使用您的动作。--build-type ament_cmake 标志在创建新的 ROS 2 包时很大程度上是可选的,但我们在这里包含它是为了完整性。您可以在 CMake 包中创建自己的自定义接口,然后在 C++ 或 Python 节点中使用它。

注意: 将 .msg.srv 和 .action 文件与使用它们的节点放在不同的包中是一种良好的实践。这使得在不同包之间重用接口定义更加容易。

2 定义动作

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

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

一个动作定义由三个用 --- 分隔的消息定义组成:

  • 请求消息从动作客户端发送到动作服务器,用于启动一个新目标。
  • 结果消息在目标完成时从动作服务器发送到动作客户端。
  • 反馈消息定期从动作服务器发送到动作客户端,提供目标的更新信息。

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

假设我们要定义一个名为“Fibonacci”的新动作,用于计算斐波那契数列。

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

cd custom_action_interfaces
mkdir action

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

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

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

3 构建动作

在我们将新的 Fibonacci 动作类型用于代码之前,必须将定义传递给 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>

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

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

我们完成了!

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

我们可以使用命令行工具检查我们的动作是否成功构建。首先加载我们的工作空间:

source install/local_setup.bash

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

ros2 interface show custom_action_interfaces/action/Fibonacci

您应该会看到 Fibonacci 动作定义打印在屏幕上。

总结

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

后续步骤

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

相关资料

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

本文档完整翻译自 ROS 2 Lyrical 官方文档,仅用于学习交流。