Gazebo搭建虚拟环境完成ROS机器人定位导航仿真及YOLO检测识别标记物体

本文详细介绍了如何在Ubuntu 18.04环境下,使用ROS Melodic和Gazebo搭建虚拟赛道,实现小车自主定位导航,并利用YOLOv3进行物体识别。步骤包括工作空间设置、racecar功能包编译、gmapping建图、路径规划及YOLO的集成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

环境说明:
本过程采用Ubuntu18.04+ROS Melodic+Gazebo+yolo3


一、前期准备

(一)创建工作空间

  1. 创建ros的工作区域

    mkdir -p ~/robot_positioning_ws/src
    
  2. 转换到工作区域目录

    cd ~/robot_positioning_ws/src
    
  3. 初始化ROS工作空间

    catkin_init_workspace
    

(二)功能包racecar

  1. 下载Gazebo搭建赛道

    git clone https://github.com/xmy0916/racecar.git
    

    在这里插入图片描述

  2. 安装controllers相关

    sudo apt-get install ros-melodic-controller-manager
    sudo apt-get install ros-melodic-gazebo-ros-control
    sudo apt-get install ros-melodic-effort-controllers
    sudo apt-get install ros-melodic-joint-state-controller
    
  3. racecar功能包编译

    cd ..
    catkin_make
    

    编译遇到的问题
    Could not find a package configuration file provided by "driver_base" with any of the following names在这里插入图片描述
    解决方法

    sudo apt-get install ros-melodic-driver-base
    

    Could not find a package configuration file provided by "OpenCV" with any of the following names
    在这里插入图片描述
    解决方法

    locate OpenCVConfig.cmake
    sudo gedit ~/robot_positioning_ws/src/racecar_gazebo/CMakeLists.txt
    修改第7行的路径成你的路径:set(OpenCV_DIR /opt/ros/kinetic/share/OpenCV-3.3.1-dev/)

    在这里插入图片描述
    ackermann_msgs/AckermannDrive.h: No such file or directory
    在这里插入图片描述
    解决方法

    sudo apt-get install ros-melodic-ackermann-msgs
    

    编译成功
    在这里插入图片描述

二、Gazebo搭建自己的虚拟环境

(一)相关设置

  1. 设置环境变量
    echo "source ~/robot_positioning_ws/devel/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    

(二)运行小车模型

  1. 运行语句
    roslaunch racecar_gazebo racecar.launch 
    
  2. 运行效果
    说明:tk的控制界面小窗,控制小车的移动,W表示前进,D表示向左转,S表示后退,A表示右转
    在这里插入图片描述

(三)手动搭建环境

  1. 打开gazebo

    roslaunch gazebo_ros empty_world.launch
    
  2. 点击Edit->Build Editor,创建模型,保存该模型
    在这里插入图片描述

  3. 导入刚自己创建的赛道模型框架
    运行小车模型

    roslaunch racecar_gazebo racecar.launch 
    

    导入创建环境模型
    insert->选择对应保存的模型
    在这里插入图片描述
    添加障碍物
    在这里插入图片描述
    保存为world文件
    在这里插入图片描述

(四)运行创建环境

  1. 创建launch文件,配置赛道参数
    cd ~/robot_positioning_ws/src/racecar/racecar_gazebo/launch
    sudo gedit lyy.launch
    
    lyy.launch内容
    <?xml version="1.0"?>
    <launch>
      <!-- Launch the racecar -->
      <include file="$(find racecar_gazebo)/launch/racecar.launch">
        <arg name="world_name" value="lyy"/>
      </include>
    </launch>
    
  2. 运行gazebo
    roslaunch racecar_gazebo lyy.launch 
    
    显示如下
    在这里插入图片描述

三、进行gmapping建图

  1. gmapping建图

    roslaunch racecar_gazebo slam_gmapping.launch
    

    问题描述:ERROR: cannot launch node of type [gmapping/slam_gmapping]: gmapping
    在这里插入图片描述
    解决方法

    sudo apt-get install ros-melodic-gmapping
    
  2. 跑完整圈(通过kt控制小窗)
    小车的起点
    在这里插入图片描述
    小车终点
    在这里插入图片描述
    Rviz中的轨迹显示
    在这里插入图片描述

  3. 保存gmapping创建的地图

    sudo apt-get install ros-melodic-map-server
    cd ~/robot_positioning_ws/src/racecar/racecar_gazebo/map
    rosrun map_server map_saver -f lyy_map
    

    在这里插入图片描述

四、小车自主定位导航

(一)自己创建的环境

  1. launch文件的编辑

    cd ~/robot_positioning_ws/src/racecar/racecar_gazebo/launch
    sudo gedit lyy_auto.launch
    

    lyy_auto.launch文件内容

    <?xml version="1.0"?>
    <launch>
      <!-- Launch the racecar -->
      <include file="$(find racecar_gazebo)/launch/racecar.launch">
        <arg name="world_name" value="lyy"/>
      </include>
      
      <!-- Launch the built-map -->
      <node name="map_server" pkg="map_server" type="map_server" args="$(find racecar_gazebo)/map/lyy_map.yaml" />
    
      <!--Launch the move base with time elastic band-->
      <param name="/use_sim_time" value="true"/>
      <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
        <rosparam file="$(find racecar_gazebo)/config/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find racecar_gazebo)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find racecar_gazebo)/config/local_costmap_params.yaml" command="load" />
        <rosparam file="$(find racecar_gazebo)/config/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find racecar_gazebo)/config/teb_local_planner_params.yaml" command="load" />
    
        <param name="base_global_planner" value="global_planner/GlobalPlanner" />
        <param name="planner_frequency" value="0.01" />
        <param name="planner_patience" value="5.0" />
        <!--param name="use_dijkstra" value="false" /-->
        
        <param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS" />
        <param name="controller_frequency" value="5.0" />
        <param name="controller_patience" value="15.0" />
    
        <param name="clearing_rotation_allowed" value="false" />
      </node>
      
    </launch>
    

    在这里插入图片描述

  2. 运行创建的环境

    roslaunch racecar_gazebo lyy_auto.launch
    
  3. 启动rviz

    roslaunch racecar_gazebo racecar_rviz.launch
    

    在这里插入图片描述

  4. 设计小车行车轨迹
    采用2D Nav Goal发布目标
    在这里插入图片描述
    问题描述:使用2D Nav Goal发布目标时,始终没有反应
    解决方式

    sudo apt-get install ros-melodic-teb-local-planner
    

    由于起点和终点之间没有做墙隔开,所以现在将终点移到对面

  5. 启动path_pursuit.py脚本文件

    rosrun racecar_gazebo path_pursuit.py
    

    实际出现情况
    在这里插入图片描述
    暂时不清楚是什么原因造成的。

(二)下载的功能包中自带环境

  1. 运行环境

    roslaunch racecar_gazebo racecar_runway_navigation.launch 	
    
  2. 启动rviz

    roslaunch racecar_gazebo racecar_rviz.launch
    
  3. 设计小车行车轨迹
    采用2D Nav Goal发布目标位置

  4. 启动path_pursuit.py脚本文件

    rosrun racecar_gazebo path_pursuit.py
    

    运行结果(一部分运动过程)
    在这里插入图片描述

五、使用YOLO检测识别标记物体

(一)加载YOLO

  1. ssh设置

    ssh-keygen ##输入之后根据提示输入两次回车,两次密码
    ls ~/.ssh
    eval `ssh-agent`
    ssh-add ~/.ssh/id_rsa
    cat ~/.ssh/id_rsa.pub #得到一串密匙
    

    登陆GitHub,在账户下拉选项中选择settings,ssh and GPG keys,选择new ssh key,输入名字Default public key,然后将得到的密匙复制到文本框中,然后点击add ssh key,密匙设置完成。

  2. 下载darknet-ros

    cd ~/robot_positioning_ws/src
    git clone --recursive git@github.com:leggedrobotics/darknet_ros.git
    
  3. 编译

    cd ~/robot_positioning_ws
    catkin_make -DCMAKE_BUILD_TYPE=Release
    

    在这里插入图片描述
    说明:
    开始编译整个项目,编译完成后会检查./darknet_ros/darknet_ros/yolo_network_config/weights文件下有没有yolov2-tiny.weights和yolov3.weights两个模型文件,默认下载好的代码里面为了节省体积是不带这两个模型文件的。因此编译之后会自动开始下载模型文件,此时又是一段漫长的等待时间。在开始编译之前,可以提前下载好,把模型文件拷贝到上述文件夹下,就不会再次下载了。

(二)实现检测标记物体

  1. 打开gazebo

    roslaunch racecar_gazebo racecar_runway_navigation.launch
    
  2. 打开racecar.gazebo文件查看话题
    在这里插入图片描述

  3. 修改ros.yaml文件中订阅的话题
    原文件
    在这里插入图片描述
    修改后文件
    在这里插入图片描述

  4. 启动YOLO V3

    roslaunch darknet_ros darknet_ros.launch
    

    这个给过程非常容易卡住,所以需要多尝试几次。
    在这里插入图片描述
    最终,识别的结果不是很准确,可能的原因是摄像头没有捕获到全部的物体,部分识别成为其他的物体。这个过程确实弄了好久,太容易卡了。需要比较有耐心,才能够的到最终的效果。自己构建环境的时候,需要注意起点与终点之间有有什么东西隔开,不然后面规划路径的时候,就不会绘制。


参考连接

  1. Ubuntu18.04下利用Gazebo搭建赛道完成ROS机器人定位导航仿真 + 加载YOLO检测识别标记物体【智能车】
  2. Ubuntu18.04下实现ROS智能车定位导航仿真
  3. ROS下实现darknet_ros(YOLO V3)检测
  4. 嵌入式系统应用开发·大作业——ROS机器人定位导航仿真
<think>嗯,用户问的是在Gazebo中,YOLO检测模型能不能搭配RealSense来检测物体并显示对应的三维坐标。我需要先理清楚各个组件之间的关系以及它们如何协同工作。 首先,Gazebo是一个机器人仿真环境,可以用来模拟机器人及其传感器,比如RealSense相机。RealSense相机在现实中是能够获取RGB图像和深度信息的,那么在Gazebo中应该也有相应的插件来模拟这个功能。用户可能是在仿真环境中测试他们的算法,避免直接使用真实硬件带来的成本和风险。 接下来是YOLO,这是一个基于深度学习的目标检测模型,主要用于识别图像中的物体并给出二维边界框。YOLO本身处理的是二维图像数据,所以需要深度信息来获取三维坐标。这时候RealSense的深度数据就派上用场了。在真实环境中,通常的做法是用YOLO检测物体的二维位置,然后通过深度相机提供的对应位置的深度值来计算出三维坐标。那么在Gazebo中,这个流程应该也是可行的,但需要考虑仿真的深度数据是否准确,以及如何将YOLO的输出与深度图对齐。 然后,我需要考虑在Gazebo中如何实现这一点。首先,用户需要在仿真中添加RealSense相机模型,并确保其能够发布RGB图像和深度信息。Gazebo的插件,比如`libgazebo_ros_realsense`,可能已经支持这一点。然后,用户需要将RGB图像输入到YOLO模型中进行物体检测,得到二维的边界框坐标。接着,利用检测到的二维坐标(比如中心点)在深度图像中找到对应的深度值,再通过相机的内参将二维坐标转换到三维空间。 这里需要注意坐标变换的问题。相机的光学中心到机器人基座或其他坐标系的关系可能需要通过TF变换来处理,这样获取的三维坐标才能正确转换到世界坐标系中。此外,仿真中的深度数据可能会有噪声,或者与现实中的情况不同,这可能会影响三维坐标的准确性,用户可能需要做一些校准或者滤波处理。 另外,用户可能关心的是整个流程的集成方法。比如,是否需要使用ROS(Robot Operating System)来连接GazeboYOLO和RealSense数据。通常,在ROS中,图像和深度信息会以话题的形式发布,YOLO可以通过订阅图像话题来进行检测,然后结合深度话题来获取三维坐标。可能需要编写一个节点来处理检测结果和深度数据的融合,以及坐标转换。 还有可能的挑战包括:YOLO仿真环境中的检测效果是否足够好,因为仿真中的物体可能与训练数据有差异;深度数据的精度是否足够;以及整个系统的实时性是否能满足需求。用户可能需要先在仿真中测试,调整模型参数或进行领域适应训练,以提高检测准确率。 总结一下,步骤大概是:在Gazebo中配置RealSense相机,获取RGB和深度数据;运行YOLO检测模型得到物体二维位置;将二维坐标映射到深度图获取深度值;转换到三维坐标系;可能还需要通过TF变换到世界坐标系。整个过程需要ROS的支持,以及处理可能的噪声和坐标对齐问题。</think>在Gazebo仿真环境中,**YOLO检测模型可以與RealSense相機结合實現物體檢測與三維坐標提取**,但需要通過ROS(Robot Operating System)進行系統集成。以下是具體實現原理與步驟: --- ### 1. **核心原理** - **YOLO**:負責從RGB圖像中檢測物體的2D邊界框(Bounding Box)和類別。 - **RealSense**:在Gazebo中模擬深度相機,提供RGB圖像和深度圖(Depth Image)。 - **坐標轉換**:通過深度圖將YOLO檢測的2D像素坐標轉換為3D世界坐標。 --- ### 2. **實現步驟** #### **步驟1:在Gazebo中部署RealSense相機** - 使用Gazebo的RealSense插件(如`libgazebo_ros_realsense`),模擬以下數據: - **RGB圖像**:通過`/camera/color/image_raw`話題發佈。 - **深度圖**:通過`/camera/depth/image_raw`話題發佈。 - **相機內參**:通過`/camera/color/camera_info`獲取(用於像素坐標到3D坐標的轉換)。 #### **步驟2:運行YOLO檢測模型** - 使用ROS封裝的YOLO節點(如`darknet_ros`)訂閱RGB圖像話題: ```python roslaunch darknet_ros yolo_v3.launch ``` - 輸出檢測結果:包含物體類別和2D邊界框(Bounding Box中心點坐標$(u, v)$)。 #### **步驟3:提取3D坐標** - **獲取深度值**:根據YOLO輸出的像素坐標$(u, v)$,從深度圖中讀取對應深度值$d$。 - **坐標轉換**:利用相機內參將$(u, v, d)$轉換為相機坐標系下的3D點$(X_c, Y_c, Z_c)$: $$ X_c = \frac{(u - c_x) \cdot d}{f_x}, \quad Y_c = \frac{(v - c_y) \cdot d}{f_y}, \quad Z_c = d $$ 其中$(f_x, f_y)$為焦距,$(c_x, c_y)$為光心坐標。 - **轉換到世界坐標系**:通過TF變換將相機坐標系下的點轉換到Gazebo世界坐標系: ```python rosrun tf2_ros transform_listener ``` --- ### 3. **關鍵代碼片段(ROS節點示例)** ```python # 訂閱YOLO檢測結果和深度圖 from sensor_msgs.msg import Image from darknet_ros_msgs.msg import BoundingBoxes def yolo_callback(msg): for box in msg.bounding_boxes: u = (box.xmin + box.xmax) / 2 v = (box.ymin + box.ymax) / 2 depth = depth_image[v, u] # 從深度圖獲取深度值 X_c = (u - cx) * depth / fx Y_c = (v - cy) * depth / fy Z_c = depth # 調用TF轉換到世界坐標系 ``` --- ### 4. **注意事項** - **深度圖噪聲**:Gazebo模擬的深度圖可能過於理想化,需添加噪聲插件以貼近真實數據。 - **坐標對齊**:確保RGB圖像與深度圖的像素嚴格對齊(RealSense插件需配置同步輸出)。 - **YOLO性能**:在仿真中訓練YOLO時,需使用與Gazebo場景風格相似的數據集。 --- ### 5. **擴展應用** - **機械臂抓取**:將3D坐標傳輸給機械臂執行抓取任務。 - **SLAM集成**:結合ORB-SLAM等算法,實現動態物體追蹤與地圖構建。 如果需要更詳細的代碼示例或Gazebo模型配置,可進一步說明具體需求!
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值