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

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

3天内不再提示

话题通信接口的定义和运行效果

麦辣鸡腿堡 来源:古月居 作者:古月 2023-12-01 15:32 次阅读

话题接口的定义与使用

话题通信接口的定义也是类似的,继续从之前的机器视觉案例中来衍生,我们想把服务换成话题,周期发布目标识别的位置,不管有没有人需要。

图片

运行效果

现在我们会运行三个节点:

第一个节点,将驱动相机并发布图像话题,此时的话题数据使用的是ROS中标准定义的Image图像消息;

第二个节点,会运行视觉识别功能,识别目标的位置,这个位置我们希望封装成话题消息,发布出去,谁需要使用谁就来订阅;

第三个节点,订阅位置话题,打印到终端中。

启动三个终端,分别运行以上节点:

$ ros2 run usb_cam usb_cam_node_exe$ ros2 run learning_topic interface_object_pub$ ros2 run learning_topic interface_object_sub

图片

接口定义

在这个例程中,我们使用ObjectPosition.msg定义了服务通信的接口:

learning_interface/msg/ObjectPosition.msg

int32 x      # 表示目标的X坐标int32 y      # 表示目标的Y坐标

话题消息的内容是一个位置,我们使用x、y坐标值进行描述。

完成定义后,还需要在功能包的CMakeLists.txt中配置编译选项,让编译器在编译过程中,根据接口定义,自动生成不同语言的代码:

...find_package(rosidl_default_generators REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME}  "msg/ObjectPosition.msg")...

程序调用

我们在代码中再来重点看下接口的使用方法。

发布者接口调用

learning_topic/interface_object_pub.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居@说明: ROS2接口示例-发布目标位置"""import rclpy                                       # ROS2 Python接口库from rclpy.node import Node                        # ROS2 节点类from sensor_msgs.msg import Image                  # 图像消息类型from cv_bridge import CvBridge                     # ROS与OpenCV图像转换类import cv2                                         # Opencv图像处理库import numpy as np                                 # Python数值计算库from learning_interface.msg import ObjectPosition  # 自定义的目标位置消息lower_red = np.array([0, 90, 128])                 # 红色的HSV阈值下限upper_red = np.array([180, 255, 255])              # 红色的HSV阈值上限"""创建一个订阅者节点"""class ImageSubscriber(Node):    def __init__(self, name):        super().__init__(name)                                  # ROS2节点父类初始化        self.sub = self.create_subscription(            Image, 'image_raw', self.listener_callback, 10)     # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)        self.pub = self.create_publisher(            ObjectPosition, "object_position", 10)              # 创建发布者对象(消息类型、话题名、队列长度)        self.cv_bridge = CvBridge()                             # 创建一个图像转换对象,用于OpenCV图像与ROS的图像消息的互相转换        self.objectX = 0        self.objectY = 0       def object_detect(self, image):              hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)        # 图像从BGR颜色模型转换为HSV模型        mask_red = cv2.inRange(hsv_img, lower_red, upper_red)   # 图像二值化        contours, hierarchy = cv2.findContours(            mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)     # 图像中轮廓检测        for cnt in contours:                                    # 去除一些轮廓面积太小的噪声            if cnt.shape[0] < 150:                continue            (x, y, w, h) = cv2.boundingRect(cnt)                # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高            cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)  # 将苹果的轮廓勾勒出来            cv2.circle(image, (int(x+w/2), int(y+h/2)), 5,      # 将苹果的图像中心点画出来                       (0, 255, 0), -1)               self.objectX = int(x+w/2)            self.objectY = int(y+h/2)        cv2.imshow("object", image)                             # 使用OpenCV显示处理后的图像效果        cv2.waitKey(50)    def listener_callback(self, data):        self.get_logger().info('Receiving video frame')         # 输出日志信息,提示已进入回调函数        image = self.cv_bridge.imgmsg_to_cv2(data, 'bgr8')      # 将ROS的图像消息转化成OpenCV图像        position = ObjectPosition()        self.object_detect(image)                               # 苹果检测        position.x, position.y = int(self.objectX), int(self.objectY)        self.pub.publish(position)                              # 发布目标位置def main(args=None):                                        # ROS2节点主入口main函数    rclpy.init(args=args)                                   # ROS2 Python接口初始化    node = ImageSubscriber("topic_webcam_sub")              # 创建ROS2节点对象并进行初始化    rclpy.spin(node)                                        # 循环等待ROS2退出    node.destroy_node()                                     # 销毁节点对象    rclpy.shutdown()                                        # 关闭ROS2 Python接口

订阅者接口调用

learning_topic/interface_object_sub.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居@说明: ROS2接口示例-订阅目标位置"""import rclpy                                       # ROS2 Python接口库from rclpy.node   import Node                      # ROS2 节点类from std_msgs.msg import String                    # 字符串消息类型from learning_interface.msg import ObjectPosition  # 自定义的目标位置消息"""创建一个订阅者节点"""class SubscriberNode(Node):    def __init__(self, name):        super().__init__(name)                                                # ROS2节点父类初始化        self.sub = self.create_subscription(            ObjectPosition, "/object_position", self.listener_callback, 10)   # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度    def listener_callback(self, msg):                                         # 创建回调函数,执行收到话题消息后对数据的处理        self.get_logger().info('Target Position: "(%d, %d)"' % (msg.x, msg.y))# 输出日志信息,提示订阅收到的话题消息def main(args=None):                                 # ROS2节点主入口main函数    rclpy.init(args=args)                            # ROS2 Python接口初始化    node = SubscriberNode("interface_position_sub")  # 创建ROS2节点对象并进行初始化    rclpy.spin(node)                                 # 循环等待ROS2退出    node.destroy_node()                              # 销毁节点对象    rclpy.shutdown()                                 # 关闭ROS2 Python接口

接口命令行操作

接口命令的常用操作如下:

$ ros2 interface list                    # 查看系统接口列表$ ros2 interface sh
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8496

    浏览量

    150826
  • 相机
    +关注

    关注

    4

    文章

    1343

    浏览量

    53500
  • 通信接口
    +关注

    关注

    3

    文章

    234

    浏览量

    30961
  • ROS
    ROS
    +关注

    关注

    1

    文章

    276

    浏览量

    16963
收藏 人收藏

    评论

    相关推荐

    iphone接口定义

    本文提供详细的iphone接口定义,有iphone接口定义英文版和iphone接口定义中文介绍说
    发表于 03-28 15:15 1.4w次阅读

    USB接口定义

    USB接口定义 USB接口定义  更多尽在:USB产品网
    发表于 04-21 11:58 3.4w次阅读

    MIDI接口定义和游戏杆接口定义

    MIDI 接口定义和游戏杆接口定义图 MIDI 接口和 PC 游戏杆接口是共用的,外观为 15
    发表于 11-27 20:13 4104次阅读
    MIDI<b class='flag-5'>接口</b><b class='flag-5'>定义</b>和游戏杆<b class='flag-5'>接口</b><b class='flag-5'>定义</b>图

    rs422接口定义 rs232接口定义 rs485接口定义

    rs422接口定义 rs232接口定义 rs485接口定义 Pin 信
    发表于 04-27 17:33 1.5w次阅读

    手机usb接口定义

    手机8针的usb接口定义 手机12针的usb接口定义 K750c手机US
    发表于 06-10 11:19 1.5w次阅读
    手机usb<b class='flag-5'>接口</b><b class='flag-5'>定义</b>

    MIDI接口定义,MIDI接口游戏杆接口引脚功能定义

    MIDI接口信号定义与游戏杆接口功能定义 MIDI接口和PC游戏杆接口是共用的,外观见下图:
    发表于 05-03 23:27 6780次阅读
    MIDI<b class='flag-5'>接口</b><b class='flag-5'>定义</b>,MIDI<b class='flag-5'>接口</b>游戏杆<b class='flag-5'>接口</b>引脚功能<b class='flag-5'>定义</b>图

    SCART接口功能定义

    SCART接口功能定义 附录:SCART 接口功能定义A、传输复合视频信号(Composite Video Only):
    发表于 08-21 22:40 7487次阅读
    SCART<b class='flag-5'>接口</b>功能<b class='flag-5'>定义</b>

    USB接口与miniUSB接口定义

    USB接口与miniUSB接口定义 USB接口定义:
    发表于 12-21 10:54 2.6w次阅读

    常用接口定义

    常用接口定义,常用接口定义,常用接口定义.
    发表于 04-29 17:57 19次下载

    SATA的接口定义及硬盘电源接口定义

    SATA接口的pin定义包括:信号电源和数据线接口定义
    发表于 06-16 18:21 23次下载

    接口定义 通信接口的作用

    通信接口 在ROS系统中,无论话题还是服务,或者我们后续将要学习的动作,都会用到一个重要的概念——通信接口
    的头像 发表于 12-01 14:59 759次阅读

    ROS通信接口机制介绍

    ROS通信接口 接口可以让程序之间的依赖降低,便于我们使用别人的代码,也方便别人使用我们的代码,这就是ROS的核心目标,减少重复造轮子。 ROS有三种常用的通信机制,分别是
    的头像 发表于 12-01 15:03 783次阅读
    ROS<b class='flag-5'>通信</b><b class='flag-5'>接口</b>机制介绍

    服务通信接口定义与使用

    了解了通信接口的概念,接下来我们再从代码实现的角度,研究下如何定义以及使用一个接口。 在之前服务概念讲解的课程中,我们编写了这样一个例程,我们再来回顾下。 有三个节点: 第一个驱动相机
    的头像 发表于 12-01 15:28 432次阅读
    服务<b class='flag-5'>通信</b><b class='flag-5'>接口</b>的<b class='flag-5'>定义</b>与使用

    SIM卡座的接口定义

    SIM卡座连接器的接口定义是移动通信设备中不可或缺的一部分,确保了SIM卡与设备之间的稳定通信和数据传输。在本文中,连欣科技将详细探讨一下SIM卡座的
    的头像 发表于 06-17 17:47 3449次阅读
    SIM卡座的<b class='flag-5'>接口</b><b class='flag-5'>定义</b>

    DDR4接口引脚定义及功能

    DDR4(Double Data Rate 4)接口引脚的具体定义和功能是一个复杂且详细的话题,涉及到电源、地、控制信号、时钟信号、地址信号以及数据信号等多个方面。
    的头像 发表于 09-04 12:39 4818次阅读