0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在代码中配置DDS编程示例

麦辣鸡腿堡 来源:古月居 作者:古月 2023-11-24 18:08 次阅读

DDS编程示例
我们尝试在代码中配置DDS,以之前Hello World话题通信为例。

图片

运行效果

启动两个终端,分别运行发布者和订阅者节点:

$ ros2 run learning_qos qos_helloworld_pub
$ ros2 run learning_qos qos_helloworld_sub

可以看到两个终端中的通信效果如下,和之前貌似并没有太大区别。

图片

图片

看效果确实差不多,不过底层通信机理上可是有所不同的。

发布者代码解析

我们看下在代码中,如果加入QoS的配置。

learning_qos/qos_helloworld_pub.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.com)@说明: ROS2 QoS示例-发布“Hello World”话题"""import rclpy                     # ROS2 Python接口库from rclpy.node import Node      # ROS2 节点类from std_msgs.msg import String  # 字符串消息类型from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy # ROS2 QoS类"""创建一个发布者节点"""class PublisherNode(Node):    def __init__(self, name):        super().__init__(name)        # ROS2节点父类初始化        qos_profile = QoSProfile(     # 创建一个QoS原则            # reliability=QoSReliabilityPolicy.BEST_EFFORT,            reliability=QoSReliabilityPolicy.RELIABLE,            history=QoSHistoryPolicy.KEEP_LAST,            depth=1        )        self.pub = self.create_publisher(String, "chatter", qos_profile) # 创建发布者对象(消息类型、话题名、QoS原则)        self.timer = self.create_timer(0.5, self.timer_callback)         # 创建一个定时器(单位为秒的周期,定时执行的回调函数)    def timer_callback(self):                                # 创建定时器周期执行的回调函数        msg = String()                                       # 创建一个String类型的消息对象        msg.data = 'Hello World'                             # 填充消息对象中的消息数据        self.pub.publish(msg)                                # 发布话题消息        self.get_logger().info('Publishing: "%s"' % msg.data)# 输出日志信息,提示已经完成话题发布def main(args=None):                           # ROS2节点主入口main函数    rclpy.init(args=args)                      # ROS2 Python接口初始化    node = PublisherNode("qos_helloworld_pub") # 创建ROS2节点对象并进行初始化    rclpy.spin(node)                           # 循环等待ROS2退出    node.destroy_node()                        # 销毁节点对象    rclpy.shutdown()                           # 关闭ROS2 Python接口

完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:

entry_points={    'console_scripts': [     'qos_helloworld_pub  = learning_qos.qos_helloworld_pub:main',},

订阅者代码解析

订阅者中的QoS配置和发布者类似。

learning_qos/qos_helloworld_sub.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居@说明: ROS2 QoS示例-订阅“Hello World”话题消息"""import rclpy                                     # ROS2 Python接口库
from rclpy.node   import Node                    # ROS2 节点类
from std_msgs.msg import String                  # ROS2标准定义的String消息from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy  # ROS2 QoS类"""创建一个订阅者节点"""class SubscriberNode(Node):    def __init__(self, name):        super().__init__(name)         # ROS2节点父类初始化        qos_profile = QoSProfile(      # 创建一个QoS原则            # reliability=QoSReliabilityPolicy.BEST_EFFORT,            reliability=QoSReliabilityPolicy.RELIABLE,            
history=QoSHistoryPolicy.KEEP_LAST,            depth=1        )        self.sub = self.create_subscription(            String, "chatter", self.listener_callback, qos_profile) # 创建订阅者对象(消息类型、话题名、订阅者回调函数、QoS原则)    
def listener_callback(self, msg):                      # 创建回调函数,执行收到话题消息后对数据的处理        self.get_logger().info('I heard: "%s"' % msg.data) # 输出日志信息,提示订阅收到的话题消息def main(args=None):                               # ROS2节点主入口main函数    rclpy.init(args=args)                          # ROS2 Python接口初始化    node = SubscriberNode("qos_helloworld_sub")    # 创建ROS2节点对象并进行初始化    rclpy.spin(node)                               # 循环等待ROS2退出    
node.destroy_node()                            # 销毁节点对象    rclpy.shutdown()                               # 关闭ROS2 Python接口

完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:

entry_points={    'console_scripts': [     'qos_helloworld_pub  = learning_qos
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    206

    文章

    27033

    浏览量

    201404
  • 通信
    +关注

    关注

    18

    文章

    5706

    浏览量

    134391
  • DDS
    DDS
    +关注

    关注

    21

    文章

    614

    浏览量

    151731
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66767
收藏 人收藏

    评论

    相关推荐

    何在mplab查找bootloader的示例代码

    大家好,我在mplab查找bootloader的示例代码。我在网上找到了控制器pic18f26k22的引导加载器代码。但是如果我试图在mplab上编译相同的
    发表于 05-05 10:23

    何在多维数据集示例中使用NDEF?

    (x-cube 示例的 ndef_t2t.c 具有一些功能)。我用SPI研究了linux demo,看了cube-x的代码和rfal.chm。我知道如果我在 platform.h 中提供一些功能并
    发表于 12-28 08:23

    我如何在LWIP HTTP服务器的示例更改电源配置呢?

    PWR_SMPS_DIRECT_SUPPLY,但我没有重新配置电路板的工具。有人可以解释我如何在示例更改此选项吗?我尝试直接这样做,但它在其他地方有更多的依赖关系,并且没有 .io
    发表于 01-03 08:22

    何在MCUxpresso IDE的外设配置USB?

    我必须在 MCUxpresso IDE 中使用 LPC54113 实现 USB 协议代码。请提供以下详细信息,1. 如何在 MCUxpresso IDE 的外设配置 USB。2.US
    发表于 04-04 06:22

    仿射变换综合示例_《OpenCV3编程入门》书本配套源代码

    《OpenCV3编程入门》书本配套源代码:仿射变换综合示例
    发表于 06-06 15:39 5次下载

    漫水填充算法综合示例_《OpenCV3编程入门》书本配套源代码

    《OpenCV3编程入门》书本配套源代码:漫水填充算法综合示例
    发表于 06-06 15:39 2次下载

    形态学图像处理综合示例_《OpenCV3编程入门》书本配套源代码

    《OpenCV3编程入门》书本配套源代码:形态学图像处理综合示例
    发表于 06-06 15:52 8次下载

    图像滤波综合示例_《OpenCV3编程入门》书本配套源代码

    《OpenCV3编程入门》书本配套源代码:图像滤波综合示例
    发表于 06-06 15:52 6次下载

    华为游戏服务示例代码教程案例

    概述 游戏服务kit安卓示例代码集成了华为游戏服务的众多API,提供了示例代码程序供您参考和使用,下面是对示例
    发表于 04-11 11:09 4次下载

    Megawin 8051 MCU的IAP(应用程序编程示例代码

    Megawin 8051 MCU的IAP(应用程序编程示例代码分享
    发表于 07-01 10:36 3次下载
    Megawin 8051 MCU的IAP(应用程序<b class='flag-5'>编程</b>)<b class='flag-5'>示例</b><b class='flag-5'>代码</b>

    何在易e语言代码中使用HTTP代理IP

    何在易e语言代码中使用HTTP代理IP,示例代码demo直接可用(步骤注释清晰)
    的头像 发表于 08-05 16:29 6131次阅读

    何在c语言代码中使用HTTP代理IP

    何在c语言代码中使用HTTP代理IP,示例代码demo直接可用(步骤注释清晰)
    的头像 发表于 08-05 16:31 2028次阅读

    何在c#语言代码中使用HTTP代理IP

    何在c#语言代码中使用HTTP代理IP,示例代码demo直接可用(步骤注释清晰)
    的头像 发表于 08-05 16:33 2197次阅读

    何在代码V中使用示例模型

    CODE V 示例模型可以在 SolvNetPlus 知识库中找到。每个示例模型都包含一个 PDF 文档,其中解释了您将学习的功能、描述示例模型,并提供了使用示例模型的分步说明。
    的头像 发表于 05-24 14:47 416次阅读
    如<b class='flag-5'>何在</b><b class='flag-5'>代码</b>V中使用<b class='flag-5'>示例</b>模型

    何在命令行中配置DDS

    DDS这么好,那该如何配置和使用呢?我们先带大家入个门。 案例一:在命令行中配置DDS 我们先来试一试在命令行中配置
    的头像 发表于 11-24 18:03 376次阅读
    如<b class='flag-5'>何在</b>命令行中<b class='flag-5'>配置</b><b class='flag-5'>DDS</b>