ZeroOne AI
← 返回文章列表

手把手做ROS2机器人系统开发(六):创建自定义msg与srv接口

👁 0

在上一讲的服务器/客户端示例中,我们使用的是系统自带的 `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服务接口教程

评论(0