现有yolov5训练好的模型best.pt,怎么与ros2机器人结合,在ubuntu需要安装哪些包,给出代码以及安装的详细过程

2023-04-09by@1902730159-F0Gu0&@ChatGPT.Model: gpt-3.5
1902730159-F0Gu0

现有yolov5训练好的模型best.pt,怎么与ros2机器人结合,在ubuntu需要安装哪些包,给出代码以及安装的详细过程

Avatar
Avatar

要将yolov5模型与ROS2机器人结合,需要在ROS2中使用Python代码来调用模型。以下是在Ubuntu上安装所需的软件包和步骤:

  1. 安装ROS2

在Ubuntu上安装ROS2的详细说明可以参考ROS2官方文档:https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html

  1. 安装Python3

Ubuntu 18.04自带Python3,如果没有可以使用以下命令安装:

sudo apt-get update
sudo apt-get install python3
  1. 安装Python包

使用以下命令安装所需的Python包:

python3 -m pip install numpy opencv-python-headless torch
  1. 下载yolov5

可以从github上下载yolov5模型:https://github.com/ultralytics/yolov5

git clone https://github.com/ultralytics/yolov5.git
  1. 下载预训练模型

在yolov5/models目录下可以找到预训练模型,可以直接使用该模型进行测试。如果需要使用自己的训练模型,可以将模型文件放到该目录下。

  1. 编写ROS2 Python代码

在ROS2中,可以通过Python代码来调用yolov5模型进行物体检测。以下是一个简单的示例代码:

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import numpy as np
import torch
from yolov5.models.experimental import attempt_load
from yolov5.utils.datasets import letterbox
from yolov5.utils.general import check_img_size, non_max_suppression, scale_coords
from yolov5.utils.plots import plot_one_box

class YOLOv5Node(Node):
    def __init__(self):
        super().__init__('yolov5_node')
        self.subscription = self.create_subscription(
            Image,
            '/camera/image_raw',
            self.image_callback,
            10)
        self.cv_bridge = CvBridge()
        self.model = attempt_load('models/best.pt', map_location=torch.device('cpu'))
        self.img_size = check_img_size(640, s=self.model.stride.max())
        self.conf_thres = 0.5
        self.iou_thres = 0.5

    def image_callback(self, msg):
        cv_image = self.cv_bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
        img = letterbox(cv_image, new_shape=self.img_size)[0]
        img = img[:, :, ::-1].transpose(2, 0, 1)
        img = np.ascontiguousarray(img)
        img = torch.from_numpy(img).to(torch.float32)
        img /= 255.0
        if img.ndimension() == 3:
            img = img.unsqueeze(0)
        pred = self.model(img)[0]
        pred = non_max_suppression(pred, self.conf_thres, self.iou_thres)
        for det in pred:
            if det is not None and len(det):
                det[:, :4] = scale_coords(img.shape[2:], det[:, :4], cv_image.shape).round()
                for *xyxy, conf, cls in reversed(det):
                    plot_one_box(xyxy, cv_image, label=f'{cls:.2f}', color=(0, 255, 0))
        cv2.imshow("yolov5", cv_image)
        cv2.waitKey(1)

def main(args=None):
    rclpy.init(args=args)
    node = YOLOv5Node()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

这个例子代码可以订阅ROS2话题/camera/image_raw,对接收到的图像进行物体检测,并使用opencv在图像上绘制检测结果。其中,使用了yolov5中的一些工具函数来对图像进行预处理、后处理和绘制。

  1. 运行ROS2节点

在一个终端中运行ROS2 master:

ros2 run ros2 run roscore

在另一个终端中运行yolov5节点:

ros2
Avatar
ros2 run <package_name> <node_name>

其中,<package_name>和<node_name>分别代表ROS2包和节点的名称,可以根据实际情况进行修改。在本例中,可以使用以下命令运行节点:

ros2 run <package_name> yolov5_node
  1. 查看检测结果

在运行节点后,可以使用ROS2图像查看器(ros2 image_view)来查看检测结果:

ros2 run image_view image_view

在图像查看器中选择/camera/image_raw和/yolov5节点的输出话题即可查看检测结果。

以上是在Ubuntu上将yolov5模型与ROS2机器人结合的步骤和代码示例。需要注意的是,这只是一个简单的示例,实际情况可能会更加复杂,需要根据具体需求进行相应的修改和调整。

1902730159-F0Gu0

怎么在gazebo中作用

Avatar
Avatar

要在Gazebo中应用yolov5模型,可以使用ROS2和Gazebo的结合体ROS2 Gazebo插件(ROS2 Gazebo Plugin),通过在Gazebo中模拟相机图像并将其传递给ROS2节点,最终可以在Gazebo中对场景进行物体检测。

以下是在Ubuntu上安装所需的软件包和步骤:

  1. 安装ROS2

在Ubuntu上安装ROS2的详细说明可以参考ROS2官方文档:https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Debians.html

  1. 安装Gazebo

在Ubuntu上安装Gazebo的详细说明可以参考Gazebo官方文档:http://gazebosim.org/tutorials?tut=ros2_installing&cat=connect_ros

  1. 安装ROS2 Gazebo插件

使用以下命令安装ROS2 Gazebo插件:

sudo apt-get update
sudo apt-get install ros-foxy-gazebo-ros-pkgs
  1. 下载yolov5

可以从github上下载yolov5模型:https://github.com/ultralytics/yolov5

git clone https://github.com/ultralytics/yolov5.git
  1. 下载预训练模型

在yolov5/models目录下可以找到预训练模型,可以直接使用该模型进行测试。如果需要使用自己的训练模型,可以将模型文件放到该目录下。

  1. 编写ROS2 Python代码

在ROS2中,可以通过Python代码来调用yolov5模型进行物体检测。以下是一个简单的示例代码:

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import numpy as np
import torch
from yolov5.models.experimental import attempt_load
from yolov5.utils.datasets import letterbox
from yolov5.utils.general import check_img_size, non_max_suppression, scale_coords
from yolov5.utils.plots import plot_one_box

class YOLOv5Node(Node):
    def __init__(self):
        super().__init__('yolov5_node')
        self.subscription = self.create_subscription(
            Image,
            '/camera/image_raw',
            self.image_callback,
            10)
        self.cv_bridge = CvBridge()
        self.model = attempt_load('models/best.pt', map_location=torch.device('cpu'))
        self.img_size = check_img_size(640, s=self.model.stride.max())
        self.conf_thres = 0.5
        self.iou_thres = 0.5

    def image_callback(self, msg):
        cv_image = self.cv_bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
        img = letterbox(cv_image, new_shape=self.img_size)[0]
        img = img[:, :, ::-1].transpose(2, 0, 1)
        img = np.ascontiguousarray(img)
        img = torch.from_numpy(img).to(torch.float32)
        img /= 255.0
        if img.ndimension() == 3:
            img = img.unsqueeze(0)
        pred = self.model(img)[0]
        pred = non_max_suppression(pred, self.conf_thres, self.iou_thres)
        for det in pred:
            if det is not None and len(det):
                det[:, :4] = scale_coords(img.shape[2:], det[:, :4], cv_image.shape).round()
                for *xyxy, conf, cls in reversed(det):
                    plot_one_box(xyxy, cv_image, label=f'{cls:.2f}', color=(0, 255, 0))
        cv2.imshow("yolov5", cv_image)
        cv2.waitKey(1)

def main(args=None):
    rclpy.init(args=args)
    node = YOLOv5Node()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

这个例子代码可以订阅ROS2话题/camera/image_raw,对接收到的图像进行物体检测,并使用opencv在图像上绘制检测结果。其中,使用

Avatar

了yolov5中的一些工具函数来对图像进行预处理、后处理和绘制。

  1. 编写Gazebo插件

在Gazebo中,可以通过插件来模拟相机,并将相机图像传递给ROS2节点进行物体检测。以下是一个示例插件代码:

#include <gazebo/common/Plugin.hh>
#include <gazebo/common/UpdateInfo.hh>
#include <gazebo/transport/TransportTypes.hh>
#include <gazebo/msgs/msgs.hh>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/opencv.hpp>

namespace gazebo
{
  class YOLOv5Plugin : public ModelPlugin
  {
  public:
    YOLOv5Plugin() {}
    ~YOLOv5Plugin() {}

    void Load(physics::ModelPtr _model, sdf::ElementPtr _sdf)
    {
      if (!ros::isInitialized())
      {
        ROS_FATAL("ROS is not initialized");
        return;
      }

      this->model_ = _model;
      this->world_ = _model->GetWorld();

      this->camera_ = this->world_->CameraByName("camera_name");
      if (!this->camera_)
      {
        ROS_FATAL("Camera not found");
        return;
      }

      this->ros_node_ = new ros::NodeHandle("");

      this->image_pub_ = this->ros_node_->advertise<sensor_msgs::Image>("camera/image_raw", 1);

      this->update_connection_ = event::Events::ConnectWorldUpdateBegin(
          std::bind(&YOLOv5Plugin::OnUpdate, this, std::placeholders::_1));
    }

    void OnUpdate(const common::UpdateInfo &_info)
    {
      // Get camera image
      const auto image = this->camera_->Capture();

      // Convert image to ROS message
      cv_bridge::CvImage cv_image;
      cv_image.header.stamp = ros::Time::now();
      cv_image.encoding = "bgr8";
      cv_image.image = image->data;
      sensor_msgs::Image ros_image;
      cv_image.toImageMsg(ros_image);

      // Publish image
      this->image_pub_.publish(ros_image);
    }

  private:
    physics::ModelPtr model_;
    physics::WorldPtr world_;
    rendering::CameraPtr camera_;
    ros::NodeHandle *ros_node_;
    ros::Publisher image_pub_;
    event::ConnectionPtr update_connection_;
  };

  GZ_REGISTER_MODEL_PLUGIN(YOLOv5Plugin)
}

这个插件代码可以模拟相机,并将相机图像转换为ROS2消息,发布到ROS2话题/camera/image_raw中。

需要注意的是,在插件中需要将camera_name替换为实际使用的相机名称。

  1. 运行Gazebo和ROS2节点

在运行Gazebo之前,需要在ROS2中启动yolov5节点:

ros2 run <package_name> yolov5_node

然后,在Gazebo中加载模型,并添加YOLOv5插件:

<plugin name="yolov5_plugin" filename="libyolov5_plugin.so">
  <camera_name>camera_name</camera_name>
</plugin>

其中,<camera_name>代表使用的相机名称,需要与插件中的名称一致。

  1. 查看检测结果

在运行Gazebo和ROS2节点后,可以使用ROS2图像查看器(ros2 image_view)来查看检测结果:

ros2 run image_view image_view

在图像查看器中选择/camera/image_raw和/yolov5节点的输出话题即可查看检测结果。

以上是在Ubuntu上使用ROS2和Gazebo将yolov5模型应用于机器人仿真的步骤和代码示例。需要注意的是,这只是一个简单的示例,实际情况可能会更加复杂,需要根据具体需求进行相应的修改和调整。

1902730159-F0Gu0

训练好的yolov5番茄识别模型best.pt,怎么与ros2机器人在仿真环境中结合,给出详细代码与教程和解释

Avatar
Avatar

An error occurred with your deployment

EDGE_FUNCTION_INVOCATION_TIMEOUT