创建一个 Action
目标: 在 ROS 2 包中定义一个 action。
教程级别: 中级
预计用时: 5 分钟
你在之前的 理解 ROS 2 Action 教程中已经了解了动作(action)。与其他通信类型及其接口(话题/msg 和服务/srv)一样,你也可以在自己的包中自定义动作。本教程将向你展示如何定义和构建一个动作,供你在下一个教程中编写的 Action 服务端和 Action 客户端使用。
你应该知道如何设置一个 workspace 并创建包。
请记住先 source 你的 ROS 2 安装环境。
1 创建一个接口包
Section titled “1 创建一个接口包”Linux / macOS:
$ 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_interfacesWindows:
$ md \ros2_ws\src$ cd \ros2_ws\src$ ros2 pkg create --build-type ament_cmake --license Apache-2.0 custom_action_interfacescustom_action_interfaces 是新包的名称。注意,它是一个 CMake 包,也只能是 CMake 包,但这并不会限制你在哪种类型的包中使用该动作。--build-type ament_cmake 标志在创建新的 ROS 2 包时基本上是可选的,但为完整起见,我们在这里包含了它。你可以在 CMake 包中创建自定义接口,然后在 C++ 或 Python 节点中使用它。
注意:将
.msg、.srv和.action文件与使用它们的节点放在不同的包中是一个好习惯。这样跨不同包重用接口定义就更容易了。
2 定义一个 action
Section titled “2 定义一个 action”Action 在 .action 文件中定义,格式如下:
# Request---# Result---# Feedback一个 action 定义由三个消息定义组成,它们之间用 --- 分隔。
- request 消息从 Action 客户端发送到 Action 服务端,用于发起新的目标(goal)。
- result 消息在目标完成时从 Action 服务端发送到 Action 客户端。
- feedback(反馈)消息会定期从 Action 服务端发送到 Action 客户端,提供关于目标的更新信息。
一个 action 的实例通常被称为一个 goal(目标)。
假设我们想定义一个新的 action “Fibonacci”,用于计算 斐波那契数列。
在我们的 ROS 2 包 custom_action_interfaces 中创建一个 action 目录:
Linux / macOS:
$ cd custom_action_interfaces$ mkdir actionWindows:
$ cd custom_action_interfaces$ md action在 action 目录中,创建一个名为 Fibonacci.action 的文件,内容如下:
int32 order---int32[] sequence---int32[] sequence目标请求(goal request)是我们要计算的 Fibonacci 序列的 order(阶数),结果(result)是最终的 sequence,反馈(feedback)是到目前为止计算出的 sequence。
3 构建 action
Section titled “3 构建 action”在代码中使用新的 Fibonacci action 类型之前,必须将定义传递给 rosidl 代码生成流水线。
这可以通过在 CMakeLists.txt 中的 ament_package() 行之前添加以下内容来实现:
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 action 定义的包了:
$ cd ~/ros2_ws # Change to the root of the workspace$ colcon build # Build完成了!
按照惯例,action 类型会以其包名和 action 一词作为前缀。因此,当我们想要引用我们的新 action 时,它的完整名称将是 custom_action_interfaces/action/Fibonacci。
我们可以使用命令行工具来验证 action 是否成功构建。首先 source 我们的工作空间:
Linux:
$ source install/local_setup.bashmacOS:
$ source install/local_setup.consoleWindows:
$ call install\local_setup.bat现在检查我们的 action 定义是否存在:
$ ros2 interface show custom_action_interfaces/action/Fibonacci你应该会看到 Fibonacci action 定义被打印到屏幕上。
在本教程中,你学习了 action 定义的结构。你还学习了如何使用 CMakeLists.txt 和 package.xml 正确构建新的 action 接口,以及如何验证构建是否成功。
接下来,通过创建一个 Action 服务端和客户端(使用 Python 或 C++)来使用你新定义的动作接口。
有关 ROS 动作的更多详细信息,请参阅 设计文章。