【ROS】python rospy定义一个节点实现图像目标检测结果的发布和在Rviz上的实时显示

这篇具有很好参考价值的文章主要介绍了【ROS】python rospy定义一个节点实现图像目标检测结果的发布和在Rviz上的实时显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

  之前,我们调用了torch中的yolov5模型,把机器人上相机采集的RGB图像放入模型中去做目标检测,最近想实现把检测结果能够实时在Rviz上做一个展示的效果。其实思路很简单,就是自己定义一个Publisher把目标检测的结果放进去,然后在Rviz里针对它去做一个订阅,实现效果放在文章最后了。接下来,说一下具体的解决方法。

1. 明确要发布的消息类型

  参考Camera的数据类型,我们需要发布的应该是一个Image类型的msg。Image数据类型的具体结构查阅可以参考作者上一篇文章,这里也还是放一个我读到的Camera的一个Image的msg:
【ROS】python rospy定义一个节点实现图像目标检测结果的发布和在Rviz上的实时显示
  对于Image类型的数据来说,我们不需要去先new一个类,再自己去写header和定义宽、高之类的,这里我们只需要给出data数据,我们可以用cv_bridge.cv2_to_imgmsg(img, "bgr8")去完成cv2读取的图像格式向ros的图像格式的转换,具体就是:

from cv_bridge import CvBridge

cv_bridge = CvBridge()
img_msg = cv_bridge.cv2_to_imgmsg(img, "bgr8")

  更详细的也可以参考下面的链接。https://blog.csdn.net/gezongbo/article/details/122706911

2. YOLOv5模型的调用和结果返回

  关于YOLOv5模型的调用,Pytorch官方的hub里面给出了很多模型,我们这里用的是YOLOv5x,使用方法也非常简单,具体步骤可以参考下面两个链接:
  https://pytorch.org/hub/ultralytics_yolov5/
  https://github.com/ultralytics/yolov5/issues/36
  需要注意的是,如果直接将检测后得到的result返回,返回值应该是一个Detections类的实例;而我们需要返回的值是检测完之后的带检测框的图像,方法为调用该类中的render()方法,在第二个链接的Base64 Results部分也有使用,想深入了解的话也可以去yolov5模型的代码里去查看,应该在yolov5/models/common.py中。模型地址:
https://github.com/ultralytics/yolov5
简单来说,如果传入模型的只有一张图片,那么我们获取这张带检测结果的图像只需要:

import torch

# Model
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
# Image
img = cv2.imread('test.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# Inference
results = yolo(img)
# Get the Image with boundingbox
result_img = results.render()[0]

3. 如何写一个Publisher

  关于如何写一个发布器Publisher, 可以参考这一篇文章。https://blog.csdn.net/Mr_Poohhhh/article/details/103797043

大概就是:

class MyPublisher:
    def __init__(self):
        # 定义一个发布器
        self.__pub_ = rospy.Publisher('topic to be published',
        Pub msg type, queue_size)
	
    def my_public(self,data):
		# data为需要publish的数据	
        self.__pub_.publish(data)

def main():
	# 这里自己处理好好要发布的data
    data = Pub msg type() 
    publisher = MyPublisher()
    publisher.my_public(data)
if __name__ == "__main__":
    main()

4. 完整代码

#!/usr/bin/env python

import torch
import rospy
import numpy as np
import copy
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
import message_filters

class YoloRGB(object):
    def __init__(self):
        self.cv_bridge = CvBridge()
        # /locobot/yolo_result/img 是我们自己定义的节点名字
        self.yolo_img_pub = rospy.Publisher("/locobot/yolo_result/img", Image, queue_size=5)
    
    def img_pub(self, img=None):
        img_msg = self.cv_bridge.cv2_to_imgmsg(img, "bgr8")
        self.yolo_img_pub.publish(img_msg)

def main():
	# 输入图片(这里可以自己做替换)
	img = cv2.imread('test.png')
	img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
	
	# 检测部分
	model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
	results = yolo(img)
	result_img = results.render()[0]
	
	# 这里写一个while(true)是因为程序运行完成了之后这个publisher就订阅不到了
	# 具体效果自己把握
	yolo_pub = YoloRGB()
	while(true):
		# 发布imgmsg
		yolo_pub.img_pub(result_img)
    
if __name__ == "__main__":
    main()

5. 在Rviz订阅我们自己发布的话题

  在我们自己的程序跑起来之后,可以打开Rviz找到我们自己定义的话题名,然后选择加入到我们的界面中。具体步骤为:
  左边Displays窗口点Add按钮。
【ROS】python rospy定义一个节点实现图像目标检测结果的发布和在Rviz上的实时显示
  切换到By topic下找到我们自己定义命名的topic。
【ROS】python rospy定义一个节点实现图像目标检测结果的发布和在Rviz上的实时显示
  可以看到我们新加入的Image能够成功显示了。
【ROS】python rospy定义一个节点实现图像目标检测结果的发布和在Rviz上的实时显示
  最后的效果就是这样啦。
【ROS】python rospy定义一个节点实现图像目标检测结果的发布和在Rviz上的实时显示文章来源地址https://www.toymoban.com/news/detail-403518.html

到了这里,关于【ROS】python rospy定义一个节点实现图像目标检测结果的发布和在Rviz上的实时显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ros2 foxy创建一个包和节点-ubuntu20.04

    我们创建了两个目录,ros2_ws和在他下面的子目录,运行编译的目录在ros2_ws目录下,src目录下是我们生成的ros的包,我们自己编写的代码也都早src目录下,colcon build编译之后会在ros2_ws目录下生成一下文件,运行程序也是在ros2_ws这个目录下。 使用 ros2 pkg create 来创建包和节点,

    2024年02月02日
    浏览(49)
  • 【数据结构】链表C语言编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点

    这段代码是用C语言编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点。以下是每段代码的详细解释: 文件注释: 这段代码是一个文件注释 包含头文件: #include stdio.h  和  #include stdlib.h :这两个头文件

    2024年02月09日
    浏览(45)
  • 【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 roscore 启动ros核心节点 roscd 将工作空间切换到指定ros功能包 catkin_create_pkg 将工作空间切换到指定ros功能包 ** rqt_graph 启动节点间的关系图 rosrun 包名 节点名称 启动节点 ( rosrun

    2024年02月02日
    浏览(45)
  • 【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信

    Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。 本章将介绍如何通过服务通信的方式实现节点数据交换以及ROS相关指令 在ros中,一个节点想要获取某种服务(例如: 一个节点想要获取此时的相机数据,节点就需要向相机发送一个请

    2024年02月03日
    浏览(39)
  • 基于光流方法实时跟踪目标在图像中的运动轨迹(python和C++实现)

    光流方法是通过跟踪图像中的特征点(角点,边缘点等),分析这些点在帧与帧之间的运动,来计算物体运动轨迹和速度。具体实现目标如下: 1、选取图像中的易被识别的特征点,如Harris角点,FAST角点。 2、为每个特征点选取一个领域窗口,跟踪该窗口在连续视频帧中的变

    2023年04月24日
    浏览(35)
  • 【ROS入门】使用 ROS 动作(Action)机制实现目标请求、进度与完成结果的反馈

    使用 ROS 动作(Action)机制实现目标请求、进度与完成结果的反馈: 创建服务端,注册 Action 客户端发送action 请求检测 40个零件 服务端接收后,每隔 1s 检测一个零件 (每检测一个打印1次),并实时给客户端返回检测进度(客户端打印进度百分比),并在检测完毕时告知客户端目标完

    2024年02月07日
    浏览(35)
  • ubutu下ros2实现小车仿真建模与目标检测

    1.安装ros2 这里使用小鱼的一键安装,根据自己的喜好安装,博主用的是ros2的foxy版本 2.下载代码(这里使用的是古月居的代码) https://book.guyuehome.com/ 可以结合古月居的B站视频来自己一步一步操作,里面有讲解基础理论与一些环境的配置 https://www.bilibili.com/video/BV16B4y1Q7jQ?p=1

    2024年02月04日
    浏览(38)
  • 基于python+MobileNetV2算法模型实现一个图像识别分类系统

    算法模型介绍 模型使用训练 模型评估 项目扩展 图像识别是计算机视觉领域的重要研究方向,它在人脸识别、物体检测、图像分类等领域有着广泛的应用。随着移动设备的普及和计算资源的限制,设计高效的图像识别算法变得尤为重要。MobileNetV2是谷歌(Google)团队在2018年提

    2024年02月12日
    浏览(39)
  • ROS实现自定义信息以及使用

    消息包定义一般如下👇 (1)创建包和依赖项 (2)在新建的qq_msgs的包新建msgs的文件夹,在该文件夹里面新建Carry.msg类型的文件。   其实,Carry.msg就是你自己定义的消息类型,属于qq_msgs包下面的。 (3)在对应CMakeList.txt文件下查看如下信息   查看依赖项是否都满足 (4)选中

    2024年02月13日
    浏览(38)
  • 【运动规划算法项目实战】如何实现机器人多目标点导航(附ROS C++代码)

    在ROS机器人应用中,实现机器人多目标点导航是非常常见的需求。本文将介绍如何使用ROS和actionlib来实现机器人的多目标点导航,目标点信息将被记录在YAML文件中。 我们可以通过使用MoveBaseAction来实现机器人的导航功能。MoveBaseAction是一个ROS中的action类型,它提供了控制机器

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包