目标:在 ROS 2 包中定义一个action。
教程级别:中级
时间: 5分钟
背景
您之前在了解 ROS 2 操作教程中了解了操作。与其他通信类型及其各自的接口(topics/msg 和 services/srv)一样,您也可以在包中自定义操作。本教程向您展示如何定义和构建可与您将在下一个教程中编写的action服务器和动作客户端一起使用的动作。
先决条件
您应该安装ROS 2(Dashing 或更高版本)和colcon。
设置一个工作区并创建一个名为的包action_tutorials_interfaces
:
mkdir -p action_ws/src
cd action_ws/src
ros2 pkg create action_tutorials_interfaces
一个action定义由三个分隔的消息定义组成---
。
-
请求消息从动作客户端发送到动作服务器以启动新目标。
-
当目标完成时,结果消息从动作服务器发送到动作客户端。
-
反馈消息会定期从动作服务器发送到动作客户端,其中包含有关目标的更新。
一个action的实例通常被称为一个目标。
假设我们要定义一个新动作“Fibonacci”来计算Fibonacci 数列。
action
在我们的 ROS 2 包中创建一个目录action_tutorials_interfaces
:
cd action_tutorials_interfaces mkdir action
在该action
目录中,创建一个名为Fibonacci.action
以下内容的文件:
int32 order --- int32[] sequence --- int32[] partial_sequence
目标请求是order
我们要计算的斐波那契数列的 ,结果是最终的sequence
,反馈是partial_sequence
到目前为止的计算结果。
2 构建一个动作
在我们可以在代码中使用新的 Fibonacci 操作类型之前,我们必须将定义传递给 rosidl 代码生成管道。
这是通过在我们的行CMakeLists.txt
之前添加以下行来完成的:ament_package()
action_tutorials_interfaces
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 ~/action_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 action show action_tutorials_interfaces/action/Fibonacci
您应该看到 Fibonacci 动作定义打印到屏幕上。
概括
在本教程中,您了解了操作定义的结构。您还学习了如何使用CMakeLists.txt
和正确构建新的操作界面package.xml
,以及如何验证构建是否成功。
下一步
接下来,让我们通过创建一个动作服务和客户端(在Python或C++中)来利用您新定义的动作接口。