背景
在之前的教程中介绍了动作通信。与其他通信类型及其各自的接口(topics/msg和services/srv)一样,您也可以在包中自定义动作。本教程展示如何定义和构建一个动作。
准备工作
安装了ROS 2和colcon。
创建一个工作区并创建一个名为action_tutorials_interfaces的包:
(记得source)
mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention
cd ros2_ws/src
ros2 pkg create action_tutorials_interfaces
任务
1 定义动作
动作定义在.action文件中:
# Request
---
# Result
---
# Feedback
操作定义由三个用---分隔的消息定义组成。
请求消息从动作客户端发送到的操作服务端。
当目标完成时,结果消息将从动作服务端发送到动作客户端。
反馈消息定期地从动作服务端发送到动作客户端,其中包含有关目标的更新。
一个动作的实例通常被称为目标。
假设我们想要定义一个新的动作“Fibonacci”来计算斐波那契数列。
在我们的ROS 2包action_tutorials_interfaces中创建一个操作目录:
cd action_tutorials_interfaces
mkdir action
在action目录中,创建一个名为Fibonacci.action的文件。内容如下:
int32 order
---
int32[] sequence
---
int32[] partial_sequence
目标请求是我们想要计算的斐波那契序列的顺序,结果是最终序列,反馈是到目前为止计算的partial_sequence。
2 构建动作
在代码中使用新的Fibonacci操作类型之前,必须将定义传递给rosidl代码生成管道。
这可以通过在action_tutorials_interfaces中,在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>
<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 ~/ros2_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 interface show action_tutorials_interfaces/action/Fibonacci
总结
在本教程中,学习了定义动作的数据结构,如何使用CMakeLists.txt和package.xml正确构建新动作,以及如何验证构建是否成功。