ubutu下ros2实现小车仿真建模与目标检测

2023-10-26

1.安装ros2

这里使用小鱼的一键安装,根据自己的喜好安装,博主用的是ros2的foxy版本

wget http://fishros.com/install -O fishros && . fishros 

2.下载代码(这里使用的是古月居的代码)

https://book.guyuehome.com/

可以结合古月居的B站视频来自己一步一步操作,里面有讲解基础理论与一些环境的配置

https://www.bilibili.com/video/BV16B4y1Q7jQ?p=1&vd_source=7ab152ebd2f75f63466b8dc7d78d3cf2

3.下载yolov5的代码

https://github.com/fishros/yolov5_ros2/tree/main

将古月居下载的代码与yolov5的代码一起放入一个文件夹下

4.打开终端安装依赖

sudo apt update
sudo apt install python3-pip ros-<ros2-distro>-vision-msgs # <ros2-distro>替换为humble,foxy或galactic等ros2发行版
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple yolov5

注:如果pip3的安装命令出现报错如下:

 这里就代表下载torch时网速慢,需要换源下载,这里我用的是去下载了torch的离线包自己进行安装https://download.pytorch.org/whl/cu116,下载安装包之前自己要先安装cuda

 进入torch后使用Ctrl+f进行搜索,cuda对应的torch版本和你的python版本,一键安装ros2的时候会下载一个python2与python3,在终端输入python3就会得到python的版本

 

从网上自己搜索torch对应版本的torchvision版本

 在这里右键打开终端进行安装,torchvision同理,要学会常用tab建去补全命令

 然后重新下载依赖

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple yolov5

5.修改下载的yolov5_ros2下的yolo_detect_2d.py代码

from math import frexp
from traceback import print_tb
from torch import imag
from yolov5 import YOLOv5
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory
from rcl_interfaces.msg import ParameterDescriptor

from vision_msgs.msg import Detection2DArray, ObjectHypothesisWithPose, Detection2D
from sensor_msgs.msg import Image, CameraInfo
from cv_bridge import CvBridge
import cv2
import yaml

from yolov5_ros2.cv_tool import px2xy

package_share_directory = get_package_share_directory('yolov5_ros2')
# package_share_directory = "/home/mouse/code/github/yolov
# 
# 5_test/src/yolov5_ros2"


class YoloV5Ros2(Node):
    def __init__(self):
        super().__init__('yolov5_ros2')
        self.declare_parameter("device", "cuda", ParameterDescriptor(
            name="device", description="calculate_device default:cpu optional:cuda:0"))

        self.declare_parameter("model", "yolov5s", ParameterDescriptor(
            name="model", description="default: yolov5s.pt"))

        self.declare_parameter("image_topic", "/image_raw", ParameterDescriptor(
            name="image_topic", description=f"default: /image_raw"))
        # /camera/image_raw

        self.declare_parameter("camera_info_topic", "/camera/camera_info", ParameterDescriptor(
            name="camera_info_topic", description=f"default: /camera/camera_info"))

        # 默认从camera_info中读取参数,如果可以从话题接收到参数则覆盖文件中的参数
        self.declare_parameter("camera_info_file", f"{package_share_directory}/config/camera_info.yaml", ParameterDescriptor(
            name="camera_info", description=f"{package_share_directory}/config/camera_info.yaml"))

        # 默认显示识别结果
        self.declare_parameter("show_result", True, ParameterDescriptor(
            name="show_result", description=f"default: True"))

        # 1.load model
        model_path = package_share_directory + "/config/" + self.get_parameter('model').value + ".pt"
        device = self.get_parameter('device').value
        self.yolov5 = YOLOv5(model_path=model_path, device=device)

        # 2.create publisher
        self.yolo_result_pub = self.create_publisher(
            Detection2DArray, "yolo_result", 10)
        self.result_msg = Detection2DArray()

        # 3.create sub image (if 3d, sub depth, if 2d load camera info)
        image_topic = self.get_parameter('image_topic').value
        self.image_sub = self.create_subscription(
            Image, image_topic, self.image_callback, 10)

        camera_info_topic = self.get_parameter('camera_info_topic').value
        self.camera_info_sub = self.create_subscription(
            CameraInfo, camera_info_topic, self.camera_info_callback, 1)

        # get camera info
        with open(self.get_parameter('camera_info_file').value) as f:
            self.camera_info = yaml.full_load(f.read())
            print(self.camera_info['k'], self.camera_info['d'])

        # 4.convert cv2 (cvbridge)
        self.bridge = CvBridge()

        self.show_result = self.get_parameter('show_result').value

    def camera_info_callback(self, msg: CameraInfo):
        """
        通过回调函数获取到相机的参数信息
        """
        self.camera_info['k'] = msg.k
        self.camera_info['p'] = msg.p
        self.camera_info['d'] = msg.d
        self.camera_info['r'] = msg.r
        self.camera_info['roi'] = msg.roi

        self.camera_info_sub.destroy()

    def image_callback(self, msg: Image):

        # 5.detect pub result
        image = self.bridge.imgmsg_to_cv2(msg)
        detect_result = self.yolov5.predict(image)
        self.get_logger().info(str(detect_result))

        self.result_msg.detections.clear()
        self.result_msg.header.frame_id = "camera"
        self.result_msg.header.stamp = self.get_clock().now().to_msg()

        # parse results
        predictions = detect_result.pred[0]
        boxes = predictions[:, :4]  # x1, y1, x2, y2
        scores = predictions[:, 4]
        categories = predictions[:, 5]

        for index in range(len(categories)):
            name = detect_result.names[int(categories[index])]
            detection2d = Detection2D()
            detection2d.tracking_id = name
            # detection2d.bbox
            x1, y1, x2, y2 = boxes[index]
            x1 = int(x1)
            y1 = int(y1)
            x2 = int(x2)
            y2 = int(y2)
            center_x = (x1+x2)/2.0
            center_y = (y1+y2)/2.0

            # detection2d.bbox.center.position.x = center_x
            # detection2d.bbox.center.position.y = center_y
            
            # galactic使用如下center坐标,否则会报错:Pose2D object has no attribute position
            # 其它版本未验证
            # 参考http://docs.ros.org/en/api/vision_msgs/html/msg/BoundingBox2D.html 及 http://docs.ros.org/en/api/geometry_msgs/html/msg/Pose2D.html
            detection2d.bbox.center.x = center_x
            detection2d.bbox.center.y = center_y

            detection2d.bbox.size_x = float(x2-x1)
            detection2d.bbox.size_y = float(y2-y1)

            obj_pose = ObjectHypothesisWithPose()
            obj_pose.id = name
            obj_pose.score = float(scores[index])

            # px2xy
            world_x, world_y = px2xy(
                [center_x, center_y], self.camera_info["k"], self.camera_info["d"], 1)
            obj_pose.pose.pose.position.x = world_x
            obj_pose.pose.pose.position.y = world_y
            # obj_pose.pose.pose.position.z = 1.0  #2D相机则显示,归一化后的结果,用户用时自行乘上深度z获取正确xy
            detection2d.results.append(obj_pose)
            self.result_msg.detections.append(detection2d)

            # draw
            if self.show_result:
                cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
                cv2.putText(image, name, (x1, y1),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
                cv2.imshow('result', image)
                cv2.waitKey(1)

        # if view or pub
        if self.show_result:
            cv2.imshow('result', image)
            cv2.waitKey(1)

        print("before publish out if")
        if len(categories) > 0:
            self.yolo_result_pub.publish(self.result_msg)

def main():
    rclpy.init()
    rclpy.spin(YoloV5Ros2())
    rclpy.shutdown()


if __name__ == "__main__":
    main()

6.编译工作空间

 在src外打开终端进行编译

colcon build

使用colcon build进行编译src文件夹下的代码

 搜寻本地编译

source install/local_setup.bash

如果想随时随地使用,打开主目录,使用ctrl+h打开隐藏文件找到.bashrc文件打开,插入一行

7.运行仿真建模

ros2 launch learning_gazebo load_mbot_camera_into_gazebo.launch.py

 开启另一个终端

ros2 run yolov5_ros2 yolo_detect_2d --ros-args -p device:=cpu -p image_topic:=/camera/image_raw

注:image_topic:=后是相机发布的话题名,将话题名改为相机所发布的话题名一致就能实现目标检测了,效果如下

 可以通过开启另一个终端下输入以下命令实现小车的移动

ros2 run teleop_twist_keyboard teleop_twist_keyboard

 在上面终端中按i是前进,j是向左旋转视角,l是向右旋转,k是停止移动,,(逗号)为后退。

博客会不定期修改与更新,建议收藏!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ubutu下ros2实现小车仿真建模与目标检测 的相关文章

  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • 如何查看 Ubuntu 上的 Binutils 版本?

    我已经搜索过 但没有找到一个选项来告诉我我的 Ubuntu 上有哪个版本的 binutils 或者至少我不知道如何解释它 gcc v 没有透露任何有关 binutils 的信息 ld v 告诉我GNU ld GNU Binutils for
  • opencv_contrib编译错误:类没有成员

    我必须实现 SURF 算法来进行图像拼接 我在使用列出的库时遇到了问题here https stackoverflow com questions 33560251 opencv 3 0 0 ubuntu 14 04 nonfree non
  • Tomcat从Eclipse和startup.sh启动

    奇怪的事情发生了 我可以从 Eclipse 和startup sh 启动Tomcat 从 Eclipse 运行我可以访问 localhost 8080 而从startup sh 运行时我不能 可能是什么问题呢 Ubuntu 11 10 在
  • 什么是 TTY?如何在 Ubuntu 上启用它?

    我目前正在设置一个 Node js 服务器 并且在这里使用调试模块https github com visionmedia debug https github com visionmedia debug 我正在尝试启用它 以便我可以在输出
  • 有人可以解释一下 Postgresql 角色、Postgresql 用户和 Linux 用户之间的关系吗?

    我正在尝试在 Ubuntu 14 服务器上设置 Postgres 9 3 此时我感到非常沮丧 我以前使用过 MySQL 所以我对一般数据库概念以及客户端 服务器模型等很满意 我从两个用户开始 root 和 sam 我 作为 sam 我使用
  • Ubuntu systemd 自定义服务因 python 脚本而失败

    希望获得有关 Ubuntu 中的 systemd 守护进程服务的一些帮助 我写了一个 python 脚本来禁用 Dell XPS 上的触摸屏 这更像是一个问题 而不是一个有用的功能 该脚本可以工作 但我不想一直启动它 这就是为什么我想到编写
  • Linux中使用管道进行进程间通信

    我已经编写了在 linux 中写入数字以进行管道传输的代码 如下所示 但显示错误 任何人都可以帮助我解决这个问题 基本上该程序的问题陈述如下 一个程序将打开一个管道 向管道写入一个数字 其他程序将打开同一管道 读取数字并打印它们 关闭两个管
  • Cordova 构建 - 无法解析 com.android.tools.build:gradle:1.5.0

    升级我的机器 Ubuntu 15 10 的 cordova 和 npm 后 我无法使用 cordova 构建新项目 构建指责 graddle 中存在错误 我做了一些研究并找到了一些可能的解决方案 解决方案例如更改版本和 url graddl
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • BASH 中的空函数

    我正在使用 FPM 工具创建 deb 包 此工具在从支持的文件中删除包之前 之后创建 不幸的是FPM生成的bash脚本包含这样的函数 dummy 该脚本退出时出现错误 语法错误 意外 BASH 不允许空函数吗 哪个版本的 bash linu
  • 我可以在 Ubuntu 上使用 Homebrew 吗?

    我只是尝试使用 Homebrew 和 Linuxbrew 在我的 Ubuntu 服务器上安装软件包 但都失败了 这就是我尝试安装它们的方法 sudo apt get install build essential curl git m4 r
  • Nodejs + npm,在ntfs分区安装模块

    我在安装 npm 模块时遇到问题 NodeJS 安装在 Windows 主机上 Virtual Box 上运行的 Ubuntu 11 10 上 我的项目文件位于 NTFS 分区上 我必须与 Windows 共享它们 当我尝试安装某些 npm
  • 在 Ubuntu 上使用 Python 获取显示器分辨率

    对于 Ubuntu win32api 中是否有与 GetSystemMetrics 相当的代码 我需要获取显示器的宽度和高度 以像素为单位 我可以建议一些可以使用的方法 不过我还没有使用过 xlib 版本 1 xlib Python 程序的
  • Ubuntu 下使用 rpmbuild 构建

    我需要在 Ubuntu 10 4 下使用补丁构建 yum 原因是我需要为我的虚拟服务器实例提供支持 chroot 的 yum 由于 ubuntu 的 yum src 不可用 第 3 方存储库 我从官方存储库下载了源代码 并从 linux v
  • 如何从 Linux 命令行打开 Sublime Text 2 文件到选项卡,而不是新窗口

    我有 ST2 设置 这样我就可以执行 sublime file txt 它将在 ST2 窗口中打开 但是我怎样才能让它在当前打开的窗口的新选项卡中打开呢 尝试 Sublime 命令行帮助 subl 帮助 Sublime Text 2 内部版
  • matplotlib 中没有绘图窗口

    我刚刚使用 synaptic 软件包系统在 Ubuntu 9 10 中安装了 matplotlib 但是 当我尝试以下简单示例时 gt gt gt from pylab import plot gt gt gt plot 1 2 3 1 2
  • 让 Java 与 Windows 10 Ubuntu 一起使用

    我安装了 Windows 10 周年更新 以便可以在 Windows 上的 Ubuntu 上尝试 Bash 看如何安装 http www howtogeek com 249966 how to install and use the lin
  • “设置:非法选项 -”在一台主机上,但在另一台主机上则不然

    我在我的一台 ubuntu 虚拟机中编写了一个 sh 脚本 该脚本工作正常 但是当我尝试在其他虚拟机中运行它时 它不起作用 两个虚拟机应该相同 和bash version两个虚拟机均回复 GNU bash version 4 3 11 1

随机推荐

  • 4.2用Effect实现多纹理化效果

    4 2用Effect实现多纹理化效果 前面我们介绍了一个使用像素着色器实现的多纹理化 这里用Effect框架重新给于实现 读者可以比较两者之间的异同 体会Effect框架给我们带来了哪些方面的改善 4 2 1着色器 下面是着色器代码 该代码
  • sqlmap的用法,sqlmap -r

    sqlmap结合burpsuit进行sql注入漏洞查找 配置好burpsuit和浏览器之间的代理 网上方法很多 创建一个记事本 准备写入参数使用 1 在sqlmap根目录下创建list txt 你也可以在其他地方创建 待会写上目录就行 2
  • Mysql 数据库介绍

    目录 数据库 1 数据库的介绍 2 数据库的分类 3 数据库的作用 4 数据库特点 5 小结 关系型数据库管理系统 1 关系数据库管理系统的介绍 2 SQL的介绍 3 小结 MySQL数据库 1 MySQL数据库的介绍 数据库 1 数据库的
  • python引用、浅拷贝、深拷贝

    在python中 对象的赋值往往是通过 进行的 但是由于 右边的类型方式不一样 所以产生变量虽然值相同 但是在内存中的地址值不同 可能会造成内存空间的浪费 如题所示 对象赋值中存在三种类型情况的赋值 引用赋值 引用赋值l2 l1 首先创建个
  • vue3中的reactive函数声明数组

    vue3中reacitve函数如何声明一个响应式数组 如以下案例
  • 2021最新 阿里云搭建饥荒专用服务器

    前几天我一朋友在steam上邀请我一起玩饥荒 可是联机的时候 总是一卡一卡的 好不容易玩的正尽兴的时候 我朋友突然有事就离开了房间 好不容易打的怪 建的家 房主一退就不能再次玩了只能等待他回来 针对这样个的问题 我决定自己搭建饥荒的专有服务
  • 【matlab】:matlab中如何三维画球?

    首先介绍一个函数ellipsoid 这个函数是在三维立体空间画椭圆用的 这个函数参数如下 ellipsoid x y z x1 y1 z1 x y z代表了椭球的中心 x1 y1 z1代表了x y z方向的分量 然后如果是要画球的话 把这三
  • HTML5+CSS3小实例:简单又好看的加载动画效果

    HTML5 CSS3做一个简单又好看的加载动画效果 一个三色圆环转动 再加圆环内部文字转动 效果虽然简单 但第一次看到还是很惊艳的 最主要一点 代码真的超简单的 效果 源码
  • 曲线拟合

    问题解决 给你一个二维的序列 你如何用多项式进行曲线拟合 一阶直线拟合 二阶抛物线拟合 并非阶次越高越好 看拟合情况而定 曲线拟合 clear clc syms s 声明一个符号变量 详细参考 https jingyan baidu com
  • PicoDet代码学习记录

    推理步骤 picodet s 320 coco yml Infer py main gt run Trainer py init self model create cfg architecture Picodet py from conf
  • Ubuntu20.04 中已经安装 Pytorch 但 Import 报错 - 解决记录

    01 问题描述 笔者使用的是 Ubuntu 20 04 3 LTS 在使用 PyTorch 训练模型的时候 torch 模块引用失败 报错信息是 OSError home wang local lib python3 8 site pack
  • CUDA学习笔记——cudaDeviceSynchronize()的理解

    内核是操作系统提供软件对计算机硬件进行访问的软件 内核启动是异步的 这意味着在内核完成执行之前 他将在启动gpu进程后立即将控制权返回给cpu线程 而cpu线程的下一步是应用程序的退出 在应用程序退出时 其将输出发送到标准输出的功能由操作系
  • 会议论文和期刊论文在写作上有什么区别?有什么侧重点?

    作为一名科研工作者 无论你是初入圈内的 小萌新 还是久经沙场的 老将 写论文都是我们的必经之路 而要想论文投中 就需要我们的积极努力啦 其中 杂志社以及很多大型学术会议的征稿就是很好的一个途径哦 不过这两者的论文要求是否一致呢 又是否匹配我
  • cocos2d之Box2D详解 鼠标关节实现

    cocos2d之Box2D详解 鼠标关节实现 DionysosLai2014 5 7 我们经常要移动物理世界中的某个物体 比方说石头 木块等 如果我们直接改变这些物体的位置 让这些物体跟随我们手指移动 即使这样是可行的 却违反了物理世界的基
  • Ubuntu16.04下安装Android机顶盒(Android4.4.2)NDK交叉编译环境

    Ubuntu16 04下安装Android机顶盒 Android4 4 2 NDK交叉编译环境 文章目录 Ubuntu16 04下安装Android机顶盒 Android4 4 2 NDK交叉编译环境 一 前言 二 ndk下载 三 ndk安
  • 拦截器响应头中配置“Access-Control-Expose-Headers”实现跨域请求暴露token

    问题场景 和前端同事联调接口中 前端同事反映说在跨域请求的情况下无法获取token的值 后来找到解决办法 解决 1 在登录拦截器处理类中的响应对象 把token对象暴露出来即可 2 关键代码 response setHeader Acces
  • Java设计模式之单例模式_Demo

    单例模式 初识 单例模式 Singleton Pattern 是 Java 中最简单的设计模式之一 这种类型的设计模式属于创建型模式 它提供了一种创建对象的最佳方式 这种模式涉及到一个单一的类 该类负责创建自己的对象 同时确保只有单个对象被
  • LaTeX学习笔记

    在编辑公式的时候 可能会用到这个命令 begin array lcl end array 其中 lcl 表示左对齐 如果将 lcl 替换为 c 即 begin array c end array 则表示居中对齐 科研文献中常常需要使用eps
  • 文心一言更大的故事是在云计算

    3月16日 百度发布新一代大语言模型 生成式AI产品文心一言 展示了文心一言在文学创作 商业文案创作 数理推算 中文理解 多模态生成五大场景中的综合能力 生成式AI为科技创新带来无限想象 文心一言依托 百度AI大底座 而落地 由百度智能云对
  • ubutu下ros2实现小车仿真建模与目标检测

    1 安装ros2 这里使用小鱼的一键安装 根据自己的喜好安装 博主用的是ros2的foxy版本 wget http fishros com install O fishros fishros 2 下载代码 这里使用的是古月居的代码 http