ROS2 学习09--ros 中的基础数据类型说明以及如何创建自定义msg、srv和action文件
一、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包发现。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!