ROS2入门教程—创建一个动作消息(action)
我们在 ROS2入门教程—理解动作(Action)一文中已经了解了ROS2中的动作(action),与其他通信类型及其各自的接口(
topics/msg
和
services/srv
)一样,您也可以在包中自定义动作。本教程将向您展示如何定义和构建一个动作,该动作可与将在下一教程中编写的动作服务器和动作客户端一起使用。
1 创建功能包
开启一个新终端,设置好环境变量,然后进入到dev_ws/src
目录下,使用以下命令创建新的功能包action_tutorials_interfaces
:
ros2 pkg create action_tutorials_interfaces
2 定义一个动作消息类型
按照以下格式定义.action
文件:
# Request
---
# Result
---
# Feedback
一个动作由三个消息定义组成,三个消息定义之间用---
分隔。
∙
\bullet
∙ Request
:请求消息从动作客户端发送到动作服务器,初始化一个新目标。
∙
\bullet
∙ Result
:当目标完成时,结果消息从动作服务器发送到动作客户端。
∙
\bullet
∙ Feedback
:反馈消息定期从动作服务器发送到动作客户端,其中包含关于目标的更新。
一个动作的实例通常被称为目标(goal)。
假设想要定义一个新的动作“Fibonacci”来计算 Fibonacci sequence。首先,在功能包action_tutorials_interfaces
下创建一个文件夹action
:
cd action_tutorials_interfaces
mkdir action
在action
目录中,创建一个名为Fibonacci.action
的文件,内容如下:
int32 order
---
int32[] sequence
---
int32[] partial_sequence
目标请求是我们要计算的斐波那契序列的序号(order
),结果是最终序列(sequence
),反馈是迄今为止计算的部分序列(partial_sequence
)。
3 编译动作
在代码中使用新的Fibonacci
动作类型之前,必须将该动作定义传递给rosidl
从而建立链接。这是通过在功能包action_tutorials_interfaces
的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>
<depend>action_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group>
注意,我们需要依赖于action_msgs
,因为action定义包括额外的元数据(例如目标ID)。
现在可以编译包含Fibonacci
动作定义的包:
colcon build --packages-select action_tutorials_interfaces
按照约定,动作类型将以它们的包名和单词action
作为前缀。因此,当想引用新动作时,它的全名将是action_tutorials_interfaces/action/Fibonacci
。
可以用以下命令检查动作文件是否成功构建:
# Source our workspace
. install/setup.bash
# Check that our action definition exists
ros2 interface show action_tutorials_interfaces/action/Fibonacci
此时,可以看到终端中输出斐波那契动作的定义。
在本教程中,我们学习了动作消息类型的结构以及创建。还学习了如何使用CMakeLists.txt
和package.xml
正确构建新的动作接口,以及如何验证是否成功编译。