目标: 在 ROS 2 包中定义一个动作。
教程级别: 中级
时间: 5 分钟
背景
您之前在“理解动作”教程中学习了动作的相关知识。与其他通信类型及其各自的接口(话题/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_interfacescustom_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 动作的更多详细信息,请参阅设计文章。
夜雨聆风