ROS2-005-通信机制:服务通信Extra:如何实现自定义服务通信接口消息
简介
实现自定义服务接口消息的流程与实现自定义话题接口消息的流程类似,其主要步骤如下:
- 创建并编写
.srv
文件; - 编辑配置文件;
- 编译;
- 测试。
因此,我们现在会在之前创建的接口功能包 base_interfaces_demo
里,尝试编写一个 .srv
文件。该文件中包含请求数据(两个整型字段)与响应数据(一个整型字段)。
创建并编辑 .srv 文件
在功能包 base_interfaces_demo
下新建 srv
文件夹,srv
文件夹下新建 AddInts.srv
文件,文件中输入如下内容:
int32 num1
int32 num2
---
int32 sum
编辑配置文件
1. package.xml
文件
在package.xml中需要添加一些依赖包,具体内容如下:
<!-- 编译依赖 -->
<build_depend>rosidl_default_generators</build_depend>
<!-- 执行依赖 -->
<exec_depend>rosidl_default_runtime</exec_depend>
<!-- 声明当前包所属的功能包组 -->
<member_of_group>rosidl_interface_packages</member_of_group>
看起来重复了?
srv
文件所需的依赖包与前文 实现自定义接口消息中 msg
文件所需的依赖包一致,如果是在新建的功能包中添加 srv
文件,那么直接参考定义 msg
文件时 package.xml
的配置即可。
如果你在之前实现自定义接口消息时,已经创建了 base_interfaces_demo
功能包,且已经为 msg
文件配置过了依赖包,那么这里的 package.xml
便不需要再做修改。
2. CMakeLists.txt
文件
为了将 .srv
文件转换成对应的 C++
和 Python
代码,还需要在 CMakeLists.txt
中添加如下配置:
find_package(rosidl_default_generators REQUIRED)
# 为接口文件生成源代码
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/AddInts.srv"
)
看起来又重复了?
srv
文件所需的对CMakeLists.txt
文件的新配置与前文 实现自定义接口消息中对CMakeLists.txt
文件的配置基本一致,如果是在新建的功能包中添加对CMakeLists.txt
文件的新配置,那么直接参考上述配置即可。
如果你在之前实现自定义接口消息时,已经对CMakeLists.txt
文件进行了该配置,那么这里只需要修改 rosidl_generate_interfaces
函数即可,修改后的内容如下:
# 为接口文件生成源代码
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Student.msg"
"srv/AddInts.srv"
)
编译
终端中进入当前工作空间,编译功能包:
colcon build --packages-select base_interfaces_demo
测试
编译完成之后,在工作空间下的 install
目录下将生成 AddInts.srv
文件对应的 C++
和 Python
文件,我们也可以在终端下进入工作空间,通过如下命令查看文件定义以及编译是否正常:
. install/setup.bash
ros2 interface show base_interfaces_demo/srv/AddInts
到此,创建工作结束。
包含自定义接口文件时可能会报错
创建工作结束后,你会需要在 C++
文件中包含自定义消息相关头文件。在那时,VSCode可能会抛出异常。你可以打开 VSCode 中的 c_cpp_properties.json
文件,在文件中的 includePath
属性下添加一行路径:
"${workspaceFolder}/install/base_interfaces_demo/include/**"
添加完毕后,包含相关头文件时,异常就不会被抛出。 其他接口文件或接口包的使用也与此同理。
Python文件导包自定义
Python文件中导入自定义消息相关的包时,为了方便使用,可以配置 VSCode
中的 settings.json
文件,在文件中的 python.autoComplete.extraPaths
和 python.analysis.extraPaths
属性下添加一行:
"${workspaceFolder}/install/base_interfaces_demo/lib/python3.12/site-packages"
添加完毕后,代码便可以高亮显示且可以自动补齐,其他接口文件或接口包的使用也与此同理.
(注意:这里所使用的 ROS2 版本为 Jazzy,Python 为 3.12,因此路径结构不一定一致,请依据文件项目树自行修改创建)
提示
如果你是从 ROS2-005-通信机制:服务通信 来的, 可以从这里导航回去。