ROS2 学习09--ros 中的基础数据类型说明以及如何创建自定义msg、srv和action文件

发布时间:2023年12月21日

一、ROS2创建自定义msg、srv和action文件的思路

ROS2通过自带rosidl_default_generators包来为自定义的msg、srv和action文件生成各个语言的头文件!

ROS2通过在CMakeLists.txt中调用新增的宏rosidl_generate_interfaces来为msg、srv和action文件生成各个语言的头文件!而这个宏的实现定义在rosidl_default_generators包。

二、基本数据类型

利用ROS2的原始基本数据类型和已有的数据类型,可以自定义需要的数据类型。

2.1 ROS2的基本原始数据类型
ROS2目前支持的内置类型:
在这里插入图片描述
每种内置类型都可以用来定义数组:

在这里插入图片描述
所有比其ROS定义更宽松的类型均由软件强制执行ROS的范围和长度约束。

使用数组和有界类型的消息定义示例:

int32[] unbounded_integer_array
int32[5] five_integers_array
int32[<=5] up_to_five_integers_array

string string_of_unbounded_size
string<=10 up_to_ten_characters_string

string[<=5] up_to_five_unbounded_strings
string<=10[] unbounded_array_of_string_up_to_ten_characters each
string<=10[<=5] up_to_five_strings_up_to_ten_characters_each

三、创建自定义的msg、srv和action

3.1 创建功能包

在本文中,将在自己的包中创建自定义的.msg、.srv和.action文件,然后在另外的包中使用它们,这两个包应该在同一个工作空间dev_ws/src目录中,然后运行以下命令创建一个新包。

ros2 pkg create --build-type ament_cmake learning_inteface

tutorial_interfaces是新包的名称。注意,它是一个CMake包,目前还没有办法在纯Python包中生成.msg、.srv和.action文件。但是,可以在CMake包中创建自定义接口,然后在Python节点中使用它。

将.msg、.srv和.action文件保存在自己的包中是一种很好的做法。在dev_ws/src/learning_inteface 目录下创建:

mkdir msg srv action

3.2 创建自定义接口文件

3.2.1 自定义msg文件
在learning_inteface/msg文件夹下,创建一个名为Num.msg的新文件,用一行代码声明它的数据结构:

int64 num

这是自定义的消息,它传输一个名称为num的64位整数。

3.2.2 自定义srv文件

srv文件和msg文件相似,除了它包含两个部分:请求和响应。这两部分用“—”线分隔。

在learning_inteface/srv文件夹下,创建一个名为AddThreeInts.srv的新文件,并声明他的请求和响应结构:

int64 a
int64 b

---
int64 sum

这是自定义的服务,它请求三个名为a、b 的整数,并以一个名为sum的整数进行响应。

3.2.3 自定义action文件
按照以下格式定义.action文件:

Request
---
Result
---
Feedback

动作定义由三个消息定义组成,它们之间用–分隔。

  • 请求(request)消息从动作客户端发送到动作服务器,初始化一个新目标。

  • 当目标完成时,结果(result)消息从动作服务器发送到动作客户端。

  • 反馈(feedback)消息定期从动作服务器发送到动作客户端,其中包含关于目标的更新。

一个动作的实例通常被称为目标(goal)。

假设想要定义一个新的动作“Fibonacci”来计算Fibonacci序列。

在learning_inteface/action目录中,创建一个名为Fibonacci.action的文件,内容如下:

int32 order
---
int32[] sequence
---
int32[] partial_sequence

目标请求是想要计算的斐波那契数列的order,结果是最终的sequence,而反馈是到目前为止计算的partial_sequence。

3.3 编译生成

3.3.1 CMakeLists.txt

要将自定义的接口(interface)转换成基于语言的代码(如C++和Python),以便它们可以在这些语言中使用,请将以下代码添加到CMakeLists.txt中:

find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Num.msg"
  "srv/AddThreeInts.srv"
  "action/Fibonacci.action"
 )

注意:需要依赖于action_msgs,因为动作定义包括额外的元数据(例如目标id)。

3.3.2 package.xml

因为接口依赖于rosidl_default_generators来生成基于语言的代码,所以需要声明对它的依赖关系。提供其他包使用,将以下行添加到package.xml中:

<depend>action_msgs</depend>

<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

3.3.3 编译
在工作空间的根目录(~/dev_ws)中,运行以下命令:

colcon build --packages-select learning_inteface
source install/setup.bash

现在接口将被其他ROS 2包发现。

文章来源:https://blog.csdn.net/hai411741962/article/details/135127241
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。