手把手做ROS2机器人系统开发(六):创建自定义msg与srv接口
在上一讲的服务器/客户端示例中,我们使用的是系统自带的 `example_interfaces` 消息定义。但在实际项目中,业务数据往往各不相同,例如机器人位姿、设备状态、工艺参数等,必须自定义消息(msg)和服务(srv)接口,才能让节点间传递符合业务语义的数据。本章节将讲解如何创建用户自定义的
手把手做ROS2机器人系统开发(六):创建自定义msg与srv接口
教程背景
在上一讲的服务器/客户端示例中,我们使用的是系统自带的 example_interfaces 消息定义。但在实际项目中,业务数据往往各不相同,例如机器人位姿、设备状态、工艺参数等,必须自定义消息(msg)和服务(srv)接口,才能让节点间传递符合业务语义的数据。本章节将讲解如何创建用户自定义的 msg 和 srv 文件。
一、程序编写
1. 创建软件包
创建接口软件包 tutorial_interfaces:
ros2 pkg create --build-type ament_cmake tutorial_interfaces
2. 创建 msg 和 srv 文件夹
在软件包中创建两个文件夹,分别存放消息与服务定义:
mkdir msg srv
3. 定义 msg 消息示例
创建文件 src/tutorial_interfaces/msg/Num.msg:
int64 num
该消息定义了一个 64 位整型字段 num,可用于传递计数、数值等简单数据。
4. 定义 srv 服务示例
创建文件 src/tutorial_interfaces/srv/AddThreeInts.srv:
int64 a
int64 b
int64 c
---
int64 sum
服务定义中,--- 上方为请求(Request)字段,下方为响应(Response)字段。本示例实现三个整数相加的服务接口。
5. 修改和添加编译选项
编辑 src/tutorial_interfaces/CMakeLists.txt:
cmake_minimum_required(VERSION 3.8)
project(tutorial_interfaces)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Num.msg"
"srv/AddThreeInts.srv"
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
6. 软件包设置
编辑 src/tutorial_interfaces/package.xml:
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>tutorial_interfaces</name>
<version>0.0.0</version>
<description>defined msg and srv</description>
<maintainer email="motion_gui@126.com">gmotion</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
二、程序测试
1. 编译软件包
colcon build --packages-select tutorial_interfaces
2. 测试查询消息
. install/setup.bash
ros2 interface show tutorial_interfaces/msg/Num
输出 int64 num,说明消息定义生成成功。
3. 测试查询服务
. install/setup.bash
ros2 interface show tutorial_interfaces/srv/AddThreeInts
输出请求/响应字段定义,说明服务接口生成成功。
4. 其他软件包引用问题
其他软件包若需使用该接口,需在 package.xml 中添加依赖:
<depend>tutorial_interfaces</depend>
添加依赖并编译后,方可正常包含对应的头文件目录。
小结
消息和服务正确发布出来,说明自定义接口创建成功。本章节暂不进行接口引用编程,具体应用将在下一章节(扩展 ROS2 软件包的接口)中演示。自定义接口是 ROS2 工程化开发的关键能力,掌握后即可按业务需求灵活定义通信协议。
SEO关键词: ROS2自定义消息, ROS2 msg srv定义, rosidl_generate_interfaces, ROS2接口文件, ROS2服务接口教程
