首页 > 其他分享 >ROS-发布与订阅

ROS-发布与订阅

时间:2024-09-09 17:07:11浏览次数:4  
标签:node 订阅 rclpy cv2 发布 __ import ROS data

首先是publisher.py中的代码

#encoding:utf-8
import cv2
import rclpy
import threading
import numpy as np
from rclpy.node import Node
from cv_bridge import CvBridge
from sensor_msgs.msg import CompressedImage
from std_msgs.msg import String

cap = None
class NodePublisher(Node):
    def __init__(self, node_name):
        super().__init__(node_name)
        self.get_logger().info("hello,my name is %s" % node_name)

def quit(data):
    print("Receive Message={}".format(data.data))
    if data.data == "quit":
        # 释放摄像头资源
        cap.release()
        cv2.destroyAllWindows()
        exit(0)

def run_camera(cap, image_pub):
    bridge = CvBridge()
    while cap.isOpened():
        ret,frame = cap.read()
        if ret:
            frame = np.array(cv2.flip(frame, 1))
            data = bridge.cv2_to_compressed_imgmsg(frame)
            #data = bridge.cv2_to_imgmsg(frame,"bgr8")
            image_pub.publish(data)

def main():
    global cap
    height = 640
    width = 480
    cap = cv2.VideoCapture(-1)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
    cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
    rclpy.init()
    node = NodePublisher("Camera")
    image_pub = node.create_publisher(CompressedImage, "image_data", 10)
    node.create_subscription(String, "client_quit", quit, 1)
    t = threading.Thread(target=run_camera,args=(cap,image_pub))
    t.start()
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == "__main__":
    main()

接着是subscriber.py中的代码

#encoding:utf-8
import cv2
import rclpy
import time
from rclpy.node import Node
from cv_bridge import CvBridge
from sensor_msgs.msg import Image, CompressedImage
from std_msgs.msg import String

bridge = CvBridge()
pub = None

def callback(data):
        cv_img = bridge.compressed_imgmsg_to_cv2(data,"bgr8")
        #cv_img = bridge.imgmsg_to_cv2(data,"bgr8")
        cv2.imshow("frame",cv_img)
        key = cv2.waitKey(1000//20)
        if (key & 0xFF) == ord("q"):
            msg = String()
            msg.data = "quit"
            pub.publish(msg)
            cv2.destroyAllWindows()
            exit(0)

class NodeSubscribe(Node):
    def __init(self, name):
        super().__init__(name)
        self.get_logger().info("hello,I am %s", name)

def main(args=None):
    global pub
    rclpy.init()
    node = NodeSubscribe("image_node")
    node.create_subscription(CompressedImage, "image_data", callback, 10)
    pub = node.create_publisher(String,"client_quit", 1)
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == "__main__":
    main()

使用线程的方式启动摄像头的捕获,再利用rclpy.spinrclpy.shutdown让其在主循环中运行从而接收消息。

标签:node,订阅,rclpy,cv2,发布,__,import,ROS,data
From: https://www.cnblogs.com/commuter/p/18404866

相关文章

  • Ros2- Moveit2 - Visualizing Collisions(可视化碰撞)
    本节将引导您了解C++示例代码,该代码可让您在RViz中移动和与机器人手臂交互时可视化机器人本身与世界之间的碰撞接触点。入门运行代码使用Roslaunch启动文件直接从moveit_tutorials运行代码:roslaunchmoveit_tutorialsvisualizing_collisions_tutorial.launch现在......
  • ROS2 - Moveit2 - 创建Moveit插件(MoveIt Plugins)
    创建MoveIt插件本节详细说明了如何在ROS中添加插件。两个必需元素是基类和插件类。插件类继承自基类并覆盖其虚拟函数。用于此目的的主要库是pluginlib。本教程包含三种不同类型的插件,即运动规划器、控制器管理器和约束采样器。运动规划器插件在本节中,我们将展示如何将新......
  • SprinBoot+Vue兼职发布平台的设计与实现
    目录1项目介绍2项目截图3核心代码3.1Controller3.2Service3.3Dao3.4application.yml3.5SpringbootApplication3.5Vue4数据库表设计5文档参考6计算机毕设选题推荐7源码获取1项目介绍博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w......
  • 拉取ros2_control_demos存储库
    目录克隆存储库方法1:使用gitclone和rosdep安装依赖方法2:使用vcs工具管理多个存储库区别总结rosdep和APT的关系网络问题安装依赖克隆存储库方法1:使用gitclone和rosdep安装依赖下载存储库:mkdir-p~/ros2_ws/srccd~/ros2_ws/srcgitclo......
  • 【更新日志】AI运动识别插件又双叕发布更新了,v1.5.4版已正式发布。
    Ai运动识别插件可以为您的小程序赋于原生的人体检测、运动识别、姿态识别、运动计时计数AI能力,让您的小程序轻松实现AI健身、线上运动会、学生体测等场景,并拥有大量的用户案例,针对近期开发者的反馈,我们修复了相关问题,并对部分功能进行了优化增强,发布了v1.5.4版。本次版本的详细......
  • redis订阅者和进阶
    Redis进阶redis订阅者模式简介redis存在订阅者模式。就像是一个广播系统。存在三种角色:订阅者、发布者、频道。在redis当中,它们表示为subscriber(订阅者)、publisher(发布者)、channel(频道)其中的行为大抵是:订阅者订阅频道-->发布者针对于特定频道发布信息-->特定订阅者......
  • [LeetCode] 2181. Merge Nodes in Between Zeros
    Youaregiventheheadofalinkedlist,whichcontainsaseriesofintegersseparatedby0's.ThebeginningandendofthelinkedlistwillhaveNode.val==0.Foreverytwoconsecutive0's,mergeallthenodeslyinginbetweenthemintoasing......
  • cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?
    跨平台系列cross-plateform跨平台应用程序-01-概览cross-plateform跨平台应用程序-02-有哪些主流技术栈?cross-plateform跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?cross-plateform跨平台应用程序-04-ReactNative介绍cross-plateform跨平台应用程序-05-Flut......
  • ROS - 一个进程中创建多个ROS节点
    文章目录1、概述2、方法1:创建多个命名空间3、方法2:使用多线程4、方法3:节点间通信(分离进程)4、实际验证不可行方案1:两次调用ros::init1、概述在ROS(RobotOperatingSystem)中,每个进程通常只能通过ros::init初始化一个节点。ROS的设计是基于一个进程对应一......
  • 虚拟机安装Ubuntu16并安装Ros(Kinetic)
    1.虚拟机安装镜像教程参考:https://www.cnblogs.com/su1961117443/p/12419892.html或者https://www.bilibili.com/video/BV1zt411G7Vn?p=2可以安装vmtools,界面显示窗口自适应。2.ROS各个版本注:因为ubuntu是16.04的,所以这里我们安装Kinetic版本的ROS.参考链接:https://blog.csdn.ne......