yolov8部署于Ros系统上,实时发布检测目标的坐标信息

yolov8部署于Ros操作系统上,基于Ros话题通信机制,自定义消息类型,实时发布检测目标的坐标信息,以便无人机操作目标的坐标信息

首先要安装Ros系统,创建Ros工作空间,创建yolov8环境,自定义消息,基于yolov8检测目标坐标信息编写Ros话题通信代码,运行Ros系统

目录

一、创建Ros工作空间

二、创建yolov8环境

 三、自定义消息

四、编写代码

五、运行Ros系统


一、创建Ros工作空间

参考:赵虚左老师-Ros机器人入门课程

打开ubuntu命令终端,创建工作空间:

mkdir -p xxx_ws/src(必须得有 src)

进入此工作空间:

cd xxx_ws

对工作空间初始化

catkin_make

如图:

进入工作空间,并用vscode打开工作空间:

cd xxx_ws

code .

选定 src 右击 ---> create catkin package 命名Ros功能包并添加依赖项roscpp rospy std_msgs

二、创建yolov8环境

在虚拟机ubuntu18.04,创建yolov8环境,具体可见我的第一篇博客,但是这里因为是虚拟机,好像不能虚拟主机显卡,所以这里pytorch安装的是CPU版本

将yolov8代码粘贴进Ros工作空间功能包下

用conda命令激活创建的yolov8环境,再进入工作空间,用code . 打开Ros工作空间

在vscode终端用pip命令安装requirements文件,注意:如果显示找不到requirements文件,就加上requirements文件的地址再次运行:

再安装yolov8的ultralytics包,终端内运行

pip install ultralytics

 三、自定义消息

参考见b站赵虚左老师Ros入门课程视频p54

在功能包内创建文件夹msg,并在文件夹内创建如图所示文件(坐标信息都是int类型的)

配置package.mal文件

配置CMakelist文件

配置完后编译所有文件,在devel文件夹下会生成两种自定义消息类型文件,供C++使用的.h文件,和供python调用的.py文件

四、编写代码

参考见b站赵虚左老师Ros入门课程视频p60、p61

这里我的发布方是用python实现,接收方是用C++实现的,在功能包创建scripts文件夹,放python代码,src文件夹放C++代码:

发布方代码(python实现): 

#!/usr/bin/env python
from ultralytics import YOLO
import cv2
import rospy
from communication_yolo.msg import  yolomsg

model = YOLO("src/communication_yolo/yolov8_main/yolov8n.pt")
results = model.predict(source=0,show = True,stream=True)
rospy.init_node("yolo_ros_pub")        #初始化Ros节点
pub = rospy.Publisher("yolomsg",yolomsg,queue_size=10)         #创建发布对象,指定发布方的话题和消息类型
while not rospy.is_shutdown():
    for r in results:                   #results为yolov8处理的每帧图像
        point = list()                    #创建一个列表用于接收每帧图像中识别目标的boxes
        point = r.boxes.xyxy.tolist()  #将Tensor类型的xy坐标数据转为一个二维列表,外层列表长度为识别目标boxes的个数,内层为xyxy四个目标坐标信息
        i = 0
        while i < len(point):
            msg = yolomsg()             #创建自定义消息的对象
            msg.xmin= int(point[i][0])
            msg.ymin = int(point[i][1])
            msg.xmax =int(point[i][2])
            msg.ymax = int(point[i][3])
            pub.publish(msg)
            i += 1

注意:python代码写完要给赋予可执行权限 ,右键点击scripts文件夹进入终端,输入:chmod +x *.py,给所有.py文件赋予权限

chmod +x *.py

接收方代码(C++实现):

#include "ros/ros.h"
#include "/home/zzb/yolov8_ws/devel/include/communication_yolo/yolomsg.h"

void doyolomsg(const communication_yolo::yolomsg::ConstPtr& yolomsg)
{
    ROS_INFO("目标的坐标信息为:xmin=%d,ymin=%d,xmax=%d,ymax=%d",yolomsg->xmin,yolomsg->ymin,yolomsg->xmax,yolomsg->ymax); 
}

 int main(int argc, char *argv[])
 {
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"yolo_ros_sub");
    ros::NodeHandle nh;
    ros::Subscriber sub =nh.subscribe("yolomsg",10,doyolomsg);
    ros::spin();
 }


关于yolov8检测结果的声明与应用,以及做预测时参数修改见yolov8的官方说明

results为处理的每帧图像的结果,是一个对象;boxes为results对象的一个属性,表示目标的检测边界框,boxes为Boxes类的一个对象;其xyxy为一帧结果的所有边界框的四个坐标,是一个Tensor类型的二维数据 eg:

from ultralytics import YOLO

model = YOLO("yolov8n.pt")
results = model.predict("ultralytics/assets/zidane.jpg")

for r in results:
    print(r.boxes.xyxy)

结果为:


代码写好了,配置完CMakelist文件见b站赵虚左老师Ros入门课程视频p60、p61,就可以跑了

五、运行Ros系统

终端中输入roscore  启动Ros核心

另起终端conda activate yolov8  启动yolov8代码环境

cd yolov8_ws  进入工作空间

source ./devel/setup.bash  刷新一下

rosrun communication_yolo yolo_pub.py  启动发布方代码

rostopic echo yolomsg  查看发布的消息

另起终端,进入yolov8工作空间,启动接收方代码

source ./devel/setup.bash

rosrun communication_yolo yolo_sub

 


整体结果如下:1.为启动roscore

2.为发布方yolov8代码,摄像头检测结果

3.为发布方基于Ros话题通信,发布的数据

4.为接收方接收到数据后执行的回调函数的结果


Tips:

1、ros编译出错: 

解决办法: pip install empy==3.3.4

marm AttributeError: ‘module‘ object has no attribute ‘RAW_OPT‘-CSDN博客

  • 51
    点赞
  • 229
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

似苦又甜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值