小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
[FishBotCamera]3.结合YOLO实现检测
-
结合上一节的内容,我们可以对图像进行识别:https://github.com/fishros/yolov5_ros2
YOLO_ROS2
基于YOLOV5 的ROS2封装,允许用户使用给定的模型文件和相机参数进行三维空间物体检测和抓取操作。
1. 下载并安装依赖
cd ~/fishbot_ws/src git clone https://github.com/fishros/yolov5_ros2.git
首先,确保您已经更新了系统并且安装了必要的依赖。以下是一些安装步骤,其中
$ROS_DISTRO
是您的ROS2发行版(例如:foxy
、galactic
):sudo apt update sudo apt install python3-pip ros-$ROS_DISTRO-vision-msgs pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple yolov5
2. 编译和运行
编译项目并设置环境变量:
cd ~/fishbot_ws/ colcon build source install/setup.bash
现在,您可以运行Yolo_ROS2节点。默认情况下,它将使用CPU来进行检测,使用名为
/image
的图像话题。您可以根据需要更改这些参数:ros2 run yolov5_ros2 yolo_detect_2d --ros-args -p device:=cpu -p image_topic:=/fishbot_camera_raw
3. 订阅结果
Yolo_ROS2将检测结果发布到
/yolo_result
话题中,包括原始像素坐标以及归一化后的相机坐标系下的x和y坐标。您可以使用以下命令查看检测结果:ros2 topic echo /yolo_result
4. 更进一步使用
4.1 参数设置
在运行Yolo_ROS2节点时,您可以使用
-p name:=value
的方式来修改参数值。4.1.1 图像话题
您可以通过指定以下参数来更改图像话题:
image_topic:=/image
4.1.2 计算设备设置
如果您有CUDA支持的显卡,可以选择以下参数来配置计算设备:
device:=cpu
4.1.3 是否实时显示结果
您可以使用以下参数来控制是否实时显示检测结果。设置为
True
将实时显示结果,设置为False
则不会显示:show_result:=False
请注意,实时显示中的
cv2.imshow
可能会卡住。如果只需要验证结果,可以将此参数设置为False
。4.1.4 切换不同Yolov5模型
默认情况下,Yolo_ROS2使用
yolov5s
模型。您可以通过以下参数来更改模型:model:=yolov5m
4.1.5 是否发布结果图像
如果您希望Yolo_ROS2发布检测结果的图像,请使用以下参数:
pub_result_img:=True
这将允许您通过
/result_img
话题查看检测结果的图像。4.1.5 相机参数文件
功能包默认从 /camera/camera_info 话题获取相机参数,在获取成功前,相机参数文件路径可以通过参数进行设置,参数为:camera_info_file,通过该参数可以设置文件路径,注意需要使用绝对目录:
camera_info_file:=/home/fishros/chapt9/src/yolov5_ros2/config/camera_info.yaml
-
-
@小鱼
我在编译的时候发生了这样的警告Starting >>> yolov5_ros2 [0.309s] WARNING:colcon.colcon_ros.task.ament_python.build:Package 'yolov5_ros2' doesn't explicitly install a marker in the package index (colcon-ros currently does it implicitly but that fallback will be removed in the future) Finished <<< yolov5_ros2 [0.66s] Summary: 1 package finished [0.75s]
-
@lingzhiying 可以忽略,直接测试看看能不能用。
-
此回复已被删除! -
-
小鱼,我想用自己训练的模型。将模型放入config文件夹,在程序中修改选取的模型名字,可以运行我自己的模型吗?有哪些要注意的?
-
@2826778595 可以的,没什么要注意的,注意版本即可
-
@小鱼 自己训练的yolo5模型确实可以。之前测试不知道用的是yolo8模型,发现不行,才有此一问。
-
@小鱼 大佬您好,我想订阅/yolo_result话题中的分类结果,
例如:header.detections.id中的值person,但是仔细研究发现您是把Detection2D接口信息嵌入到了Detection2DArray的detections[ ]中,我不知道该如何获取嵌入到detections[ ]的id的值,能否给些提示,或者更新一个案例。
我这是属于喂到嘴边不知道怎么下口去吃,尴尬。 -
@2826778595 这里有一个递归读取的方式,读取header.detections.id中的值person。
代码如下:
import rclpy
from rclpy.node import Node
from vision_msgs.msg import Detection2DArrayclass DetectionSubscriber(Node):
def init(self):
super().init('detection_subscriber')
self.subscription = self.create_subscription(
Detection2DArray, # 消息类型
'yolo_result', # 订阅的话题名称
self.listener_callback, # 回调函数
10 # 队列大小
)
self.subscription # prevent unused variable warningdef listener_callback(self, msg: Detection2DArray): self.get_logger().info('Received a Detection2DArray message') for detection in msg.detections: # 打印出每个检测到的对象的ID self.get_logger().info(f"Detected object ID: {detection.id}")
def main(args=None):
rclpy.init(args=args)
detection_subscriber = DetectionSubscriber()
rclpy.spin(detection_subscriber)
# 关闭和清理ROS 2节点
detection_subscriber.destroy_node()
rclpy.shutdown()if name == 'main':
main()
我个人觉得比较呆,期待有更好的方法。 -
import rclpy from rclpy.node import Node from vision_msgs.msg import Detection2DArray class DetectionSubscriber(Node): def __init__(self): super().__init__('detection_subscriber') self.subscription = self.create_subscription( Detection2DArray, # 消息类型 'yolo_result', # 订阅的话题名称 self.listener_callback, # 回调函数 10 # 队列大小 ) self.subscription # prevent unused variable warning def listener_callback(self, msg: Detection2DArray): self.get_logger().info('Received a Detection2DArray message') for detection in msg.detections: # 打印出每个检测到的对象的ID self.get_logger().info(f"Detected object ID: {detection.id}") def main(args=None): rclpy.init(args=args) detection_subscriber = DetectionSubscriber() rclpy.spin(detection_subscriber) # 关闭和清理ROS 2节点 detection_subscriber.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()
-
@2826778595 既然是数组,遍历读取就好,这个做法没啥问题
-
@小鱼 好嘞,谢谢。
-
新问题:
1、pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple yolov5 我把这行换成yolo8,代码里导入的包也是yolo8,可以运行yolo8的模型吗?
2、同时安装yolo5和8在Linux会产生冲突吗?
担心冲突,所以先问问。 -
小鱼,我在这一节里启动yolov5的时候提示警告不匹配版本该怎么解决呀,这个不匹配了在rqt里也看不到图像 -
@2431039560 我也遇到这个问题 请问你是如何解决的呢
-
@1004461581 摄像头和小车和电脑在同一个子网下就可以了,改一下IP最后面的那个数字
-
@2431039560是udpserver_ip吗,改了这个还是不行哎
-
@1004461581 发一下网络结构看看
-
@小鱼 感谢已经解决