前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在ROS 2中实现自定义主题消息

在ROS 2中实现自定义主题消息

原创
作者头像
buzzfrog
发布2024-02-06 15:52:34
1.1K1
发布2024-02-06 15:52:34
举报
文章被收录于专栏:云上修行

机器人操作系统第二版(ROS 2)作为一种领先的中间件,为机器人应用的开发提供了一系列的通信工具和标准化组件。其通信机制的核心是主题(Topics),服务(Services)和动作(Actions)。在这个生态系统中,主题(Topics)扮演了节点间通信的核心角色,而消息(Messages,简写为msg)则是信息交换的基本单元。尽管ROS 2内置了广泛的标准消息类型,某些特定情境下仍然需要开发者设计自定义消息类型以满足独特需求。接下来,我们将详细探讨在ROS 2中定义和使用自定义消息的流程。

什么是ROS 2消息?

ROS 2消息(msg)是一种简单的数据结构,用于节点之间的通信。每个消息类型都定义了一组可以序列化(转化为字节流以便传输)和反序列化(从字节流转换回原始格式)的变量。通过自定义消息,开发者可以根据需求定义数据的格式,实现高效的信息交换。

为何需要自定义消息?

在复杂的机器人项目中,对数据格式的特定需求远远超出了ROS 2标准消息类型所能提供的范围。自定义消息类型的设计旨在提升信息传递的效率和灵活性,使得消息传输过程更加精确地匹配项目的特定需求,从而最大化通信效率。

创建自定义消息步骤概述

以下是创建和使用自定义ROS 2消息的高级步骤:

  • 创建ROS2的Workspace
  • 创建一个新的ROS 2包:用于存放自定义消息定义的包。
  • 定义消息:在特定目录下创建.msg文件,并定义所需数据结构。
  • 修改CMakeLists.txt和package.xml:添加必要的依赖和配置,以确保消息可以被正确编译。
  • 构建包:使用colcon build命令构建你的ROS 2包,生成消息。
  • 使用消息:在发布者和订阅者节点中使用新的自定义消息。

步骤详解

步骤零:创建ROS2的Workspace

本文由于是在Ubuntu v20.04操作系统上实践,使用的是ROS2 galactic版本。

代码语言:bash
复制
source /opt/ros/galactic/setup.bash

mkdir -p Ros2Workspace/src
cd Ros2Workspace/src

步骤一:初始化ROS 2包

首先,确保已配置好ROS 2工作环境,随后创建一个新的包以存储自定义消息定义,命令如下:

代码语言:bash
复制
ros2 pkg create --build-type ament_python <your_package_name>

其中<your_package_name>应替换为你的包名。

步骤二:定义消息

在包目录中创建一个名为msg的新目录,并在此目录下创建.msg文件。例如,Voice.msg文件内容如下所示,定义了一个包含单个整型num的简单消息结构:

代码语言:msg
复制
int64 id
int16[] data

步骤三:配置CMakeLists.txt与package.xml

为保证ROS 2正确识别并构建你的自定义消息,必须在CMakeLists.txt和package.xml文件中声明相应的依赖和配置。

在package.xml中添加以下依赖声明:

代码语言:xml
复制
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>

而CMakeLists.txt需要包含对ROS 2消息生成工具的调用:

代码语言:CMakeLists.txt
复制
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Voice.msg"
)

步骤四:构建包

在工作区的根目录下运行以下命令,构建新的ROS 2包:

代码语言:bash
复制
colcon build --packages-select <your_package_name>

. install/setup.bash

可以在命令行中查看到此自定义消息,例如:

代码语言:bash
复制
ros2 interface show robot_interfaces/msg/Voice

int64 id
int16[] data

步骤五:应用自定义消息

创建和构建自定义消息后,就可以在发布者和订阅者节点中使用了。以下是一个发布者节点的示例代码,演示了如何发布自定义Voice消息:

代码语言:python
代码运行次数:0
复制
# publisher.py
import rclpy
from rclpy.node import Node
from <your_package_name>.msg import Voice

class MinimalPublisher(Node):
    def __init__(self):
        super().__init__('minimal_publisher')
        self.publisher_ = self.create_publisher(Voice, 'topic', 10)
        self.timer = self.create_timer(0.5, self.timer_callback)
        self.i = 0

    def timer_callback(self):
        msg = Num()
        msg.id = self.i
        msg.data = xxx
        self.publisher_.publish(msg)
        self.get_logger().info(f'Publishing: "{msg.id}"')
        self.i += 1

if __name__ == '__main__':
    rclpy.init()
    minimal_publisher = MinimalPublisher()
    rclpy.spin(minimal_publisher)
    rclpy.shutdown()

节点的订阅者部分会类似,不过是监听相同的消息类型。

结论

本文提供了一个关于如何在ROS 2中创建自定义消息的实用指南。此过程不仅增加了项目的灵活性,还深化了开发者对于ROS 2复杂通信机制的理解。自定义消息的正确实施能够显著提高消息传递的效率和项目的总体性能。

自定义消息是机器人项目成功实施的关键,为项目带来的影响远远超过了其创建和配置的初期工作量。通过本文,开发者可以充分利用ROS 2提供的强大功能,设计出既满足特定需求又高效的机器人应用程序。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是ROS 2消息?
  • 为何需要自定义消息?
  • 创建自定义消息步骤概述
  • 步骤详解
    • 步骤零:创建ROS2的Workspace
      • 步骤一:初始化ROS 2包
        • 步骤二:定义消息
          • 步骤三:配置CMakeLists.txt与package.xml
            • 步骤四:构建包
              • 步骤五:应用自定义消息
              • 结论
              相关产品与服务
              消息队列
              腾讯云消息队列 TDMQ 是分布式架构中的重要组件,提供异步通信的基础能力,通过应用解耦降低系统复杂度,提升系统可用性和可扩展性。TDMQ 产品系列提供丰富的产品形态,包含 CKafka、RocketMQ、RabbitMQ、Pulsar、CMQ 五大产品,覆盖在线和离线场景,满足金融、互联网、教育、物流、能源等不同行业和场景的需求。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档