鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    [FishBotCamera]3.结合YOLO实现检测

    已定时 已固定 已锁定 已移动
    FishBot二驱机器人
    fishbotcamera yolo 检测
    15
    61
    11.5k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小鱼小
      小鱼 技术大佬
      最后由 编辑

      结合上一节的内容,我们可以对图像进行识别: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
      

      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

      L D 2 3 条回复 最后回复 回复 引用 0
      • 小鱼小 小鱼 在 中 引用了 这个主题
      • L
        lingzhiying @小鱼
        最后由 编辑

        @小鱼
        我在编译的时候发生了这样的警告

        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]
        
        
        小鱼小 1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @lingzhiying
          最后由 编辑

          @lingzhiying 可以忽略,直接测试看看能不能用。

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          1 条回复 最后回复 回复 引用 0
          • D
            daleandfire @小鱼
            最后由 编辑

            此回复已被删除!
            小鱼小 1 条回复 最后回复 回复 引用 0
            • 小鱼小
              小鱼 技术大佬 @daleandfire
              最后由 编辑

              @daleandfire https://fishros.org.cn/forum/topic/151/提问前必看-不符合要求的问题拒绝回答

              新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

              1 条回复 最后回复 回复 引用 0
              • 28267785952
                无处在 ROS2开发者
                最后由 编辑

                小鱼,我想用自己训练的模型。将模型放入config文件夹,在程序中修改选取的模型名字,可以运行我自己的模型吗?有哪些要注意的?

                小鱼小 1 条回复 最后回复 回复 引用 0
                • 小鱼小
                  小鱼 技术大佬 @2826778595
                  最后由 编辑

                  @2826778595 可以的,没什么要注意的,注意版本即可

                  新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                  28267785952 1 条回复 最后回复 回复 引用 0
                  • 28267785952
                    无处在 ROS2开发者 @小鱼
                    最后由 编辑

                    @小鱼 自己训练的yolo5模型确实可以。之前测试不知道用的是yolo8模型,发现不行,才有此一问。

                    1 条回复 最后回复 回复 引用 0
                    • 28267785952
                      无处在 ROS2开发者
                      最后由 编辑

                      @小鱼 大佬您好,我想订阅/yolo_result话题中的分类结果,
                      c6671f00-1e02-4b10-91e4-3faa3955e4d2-图片.png
                      例如:header.detections.id中的值person,但是仔细研究发现您是把Detection2D接口信息嵌入到了Detection2DArray的detections[ ]中,我不知道该如何获取嵌入到detections[ ]的id的值,能否给些提示,或者更新一个案例。
                      😊 我这是属于喂到嘴边不知道怎么下口去吃,尴尬。

                      28267785952 1 条回复 最后回复 回复 引用 0
                      • 28267785952
                        无处在 ROS2开发者 @2826778595
                        最后由 编辑

                        @2826778595 这里有一个递归读取的方式,读取header.detections.id中的值person。
                        代码如下:
                        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()
                        我个人觉得比较呆,期待有更好的方法。

                        28267785952 1 条回复 最后回复 回复 引用 0
                        • 28267785952
                          无处在 ROS2开发者 @2826778595
                          最后由 编辑

                          @2826778595

                          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()
                          
                          
                          小鱼小 1 条回复 最后回复 回复 引用 0
                          • 小鱼小
                            小鱼 技术大佬 @2826778595
                            最后由 编辑

                            @2826778595 既然是数组,遍历读取就好,这个做法没啥问题

                            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                            28267785952 1 条回复 最后回复 回复 引用 0
                            • 28267785952
                              无处在 ROS2开发者 @小鱼
                              最后由 编辑

                              @小鱼 好嘞,谢谢。

                              1 条回复 最后回复 回复 引用 0
                              • 28267785952
                                无处在 ROS2开发者
                                最后由 编辑

                                新问题:
                                1、pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple yolov5 我把这行换成yolo8,代码里导入的包也是yolo8,可以运行yolo8的模型吗?
                                2、同时安装yolo5和8在Linux会产生冲突吗?
                                担心冲突,所以先问问。

                                1 条回复 最后回复 回复 引用 2
                                • 2
                                  萌新
                                  最后由 编辑

                                  64e8b8ba-ea10-4dc3-b7e9-f6921b74cbe2-image.png
                                  小鱼,我在这一节里启动yolov5的时候提示警告不匹配版本该怎么解决呀,这个不匹配了在rqt里也看不到图像

                                  10044615811 1 条回复 最后回复 回复 引用 0
                                  • 10044615811
                                    班超 @2431039560
                                    最后由 编辑

                                    @2431039560 我也遇到这个问题 请问你是如何解决的呢

                                    2 1 条回复 最后回复 回复 引用 0
                                    • 2
                                      萌新 @1004461581
                                      最后由 编辑

                                      @1004461581 摄像头和小车和电脑在同一个子网下就可以了,改一下IP最后面的那个数字

                                      10044615811 1 条回复 最后回复 回复 引用 0
                                      • 10044615811
                                        班超 @2431039560
                                        最后由 编辑

                                        @2431039560是udpserver_ip吗,改了这个还是不行哎

                                        小鱼小 2 2 条回复 最后回复 回复 引用 0
                                        • 小鱼小
                                          小鱼 技术大佬 @1004461581
                                          最后由 编辑

                                          @1004461581 发一下网络结构看看

                                          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                                          10044615811 1 条回复 最后回复 回复 引用 0
                                          • 10044615811
                                            班超 @小鱼
                                            最后由 编辑

                                            @小鱼 感谢已经解决

                                            小鱼小 1 条回复 最后回复 回复 引用 0
                                            • 第一个帖子
                                              最后一个帖子
                                            皖ICP备16016415号-7
                                            Powered by NodeBB | 鱼香ROS