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

    文章

    7640

    浏览量

    148515
  • 相机
    +关注

    关注

    4

    文章

    1253

    浏览量

    52453
  • 通信接口
    +关注

    关注

    3

    文章

    218

    浏览量

    30786
  • ROS
    ROS
    +关注

    关注

    1

    文章

    271

    浏览量

    16684
收藏 人收藏

    评论

    相关推荐

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

    VGA和RGB接口定义

    VGA和RGB接口定义 1.VGA的定义
    发表于 05-03 23:13 5405次阅读

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

    MIDI接口信号定义与游戏杆接口功能定义 MIDI接口和PC游戏杆接口是共用的,外观见下图:
    发表于 05-03 23:27 6535次阅读
    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>图

    USB接口与miniUSB接口定义

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

    常用接口定义

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

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

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

    软件定义网络中北向接口语言的结构和核心特性

    简单可控和灵活.软件定义网络中的北向接口是指控制器与网络应用之间进行通信接口.在软件定义网络应用研究与开发的过程中,北向
    发表于 01-15 14:07 0次下载
    软件<b class='flag-5'>定义</b>网络中北向<b class='flag-5'>接口</b>语言的结构和核心特性

    一文知道Java中接口定义

    使用interface来定义一个接口接口定义同类的定义类似,也是分为接口的声明和
    发表于 10-16 15:44 1412次阅读
    一文知道Java中<b class='flag-5'>接口</b>的<b class='flag-5'>定义</b>

    接口定义 通信接口的作用

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

    ROS通信接口机制介绍

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

    服务通信接口定义与使用

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