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

    关注

    211

    文章

    28501

    浏览量

    207484
  • 通信
    +关注

    关注

    18

    文章

    6042

    浏览量

    136138
  • DDS
    DDS
    +关注

    关注

    21

    文章

    634

    浏览量

    152728
  • 代码
    +关注

    关注

    30

    文章

    4801

    浏览量

    68735
收藏 人收藏

    评论

    相关推荐

    何在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 4次下载

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

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

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

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

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

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

    图像金字塔和resize综合示例_《OpenCV3编程入门》书本配套源代码

    《OpenCV3编程入门》书本配套源代码:图像金字塔和resize综合示例
    发表于 06-06 15:52 3次下载

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

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

    何在代码添加注释

    什么是代码注释,如何在代码添加注释,相信每一位了解编程的人并不陌生。注释里往往有很多有趣的脑洞和「真心话」
    的头像 发表于 10-17 10:53 1.1w次阅读

    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 6972次阅读

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

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

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

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

    移动数据的编程示例

    编程示例 在此编程示例,将移动在生产班次期间为示例收集的数据值以作进一步处理。收集的数据放在
    的头像 发表于 08-23 10:10 1435次阅读
    移动数据的<b class='flag-5'>编程</b><b class='flag-5'>示例</b>

    何在命令行配置DDS

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