Ubuntu18.04下利用Gazebo搭建赛道完成ROS机器人定位导航仿真 + 加载YOLO检测识别标记物体【智能车】

  • 本次实验我用到的所有安装包的下载链接:

https://download.csdn.net/download/qq_44830040/12594415


里面包括: yolov2.weights、yolov2-tiny.weights、yolov3.weights、racecar-master.zip和darknet_ros.zip包,下载了直接解压到相应目录就可以了。


一、安装配置运行的环境

Ubuntu 18.04Ros MelodicGazebo 9.0.0

二、创建工作区域,下载源码包

  • 先创建ros的工作区域racecar_ws
mkdir -p ~/racecar_ws/src

在这里插入图片描述

  • 并转换到工作区域目录,
cd ~/racecar_ws/src

在这里插入图片描述

  • 把当前目录初始化为一个ROS工作空间
catkin_init_workspace

在这里插入图片描述

  • 开始下载Gazebo搭建赛道功能包racecar(这里使用的别人github上开源出来的代码)
git clone https://github.com/xmy0916/racecar.git

在这里插入图片描述
下载完成后racecar功能包是这样的
在这里插入图片描述

三、安装本次运行需要的控件

(控件的安装是防止后面运行不正确,这里一步步安装就好。)

sudo apt-get install ros-melodic-driver-base
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
sudo apt-get install ros-melodic-ackermann-msgs
sudo apt-get install ros-melodic-global-planner
sudo apt-get install ros-melodic-teb-local-planner

四、racecar功能包编译

cd ~/racecar_ws
catkin_make

在这里插入图片描述
编译成功如下图所示:
(出现100%,恭喜你很幸运,如果出现问题,本文后面有解决办法!)
在这里插入图片描述

五、启动仿真编译

  • 设置环境变量,程序注册
echo "source ~/racecar_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

在这里插入图片描述

  • 启动gazebo,运行打开小车模型
roslaunch racecar_gazebo racecar.launch 
  • 运行结果显示,系统将会打开一个tk的控制界面小窗,控制小车的移动,如图
    在这里插入图片描述
  • 可以看到一个红色小车的模型
    在这里插入图片描述

六、手动搭建小车的赛道

  • 在终端打开Gazebo,点击Edit->Build Editor,创建模型,保存该模型
    在这里插入图片描述
  • 完成后关闭gazebo,找到对应Location文件夹,看到自己创建赛道模型
    在这里插入图片描述
  • 运行小车模型,导入刚自己创建的赛道模型框架,保存为world文件
    在这里插入图片描述
  • 拖入刚创建的地图到恰当位置
    在这里插入图片描述

  • 为保证模型顺利加载,请提前将模型文件库下载并放置到~/.gazebo/models,下载模型文件库gazebo_models的方法
  • 方法一:打开终端用命令下载(我发现比较慢… …)
git clone https://bitbucket.org/osrf/gazebo_models/downloads/
  • 方法二:先用浏览器下载,再放入相应路径里面
    网址(https://github.com/osrf/gazebo_models),点击gazebo_models,进去之后选择下载就好了
    在这里插入图片描述
  • 将模型文件库下载并放置到~/.gazebo/models应该是这样的
    在这里插入图片描述

  • 继续完善上面的赛道,添加障碍物
    在这里插入图片描述
  • 保存world文件到下载功能包中的racecar_gazebo里面worlds文件夹,选择File->Save World AS,保存好后关闭gazebo,如图
    在这里插入图片描述
  • 创建launch文件,配置赛道参数
    先进入路径:~/racecar_ws/src/racecar/racecar_gazebo/launch,并创建mango.launch文件
cd ~/racecar_ws/src/racecar/racecar_gazebo/launch
sudo gedit mango.launch

在里面加入如下代码:

<?xml version="1.0"?>
<launch>
  <!-- Launch the racecar -->
  <include file="$(find racecar_gazebo)/launch/racecar.launch">
    <arg name="world_name" value="mango"/>
  </include>
</launch>

在这里插入图片描述
然后保存关闭。

七、运行自己创建的地图

  • 运行gazebo自己的地图
source ./devel/setup.bash
roslaunch racecar_gazebo mango.launch 

在这里插入图片描述

  • 会看见如下效果
    在这里插入图片描述
  • 小车的详细运动情况如下表所示:
WASD控制运动情况
W前进
S后退
D轮子右转,小车不动
A轮子左转,小车不动
A + W小车左向前移
A + S小车右向后移
D + W小车右向前移
D + S小车左向后移
  • 如下面的GIF动图是我的小车运动的情况,有点慢…,但是还是可以看见它的移动轨迹的。
    在这里插入图片描述

八、通过自己建立的赛道进行gmapping建图

上面运行的终端不关闭,继续gmapping建图运行

roslaunch racecar_gazebo slam_gmapping.launch

在这里插入图片描述
(rviz中放大模型,感觉什么都可以看清楚了!)
在这里插入图片描述

  • 这里可以看见小车的起点
    在这里插入图片描述
  • 运行一圈后小车到达的终点
    在这里插入图片描述
  • 跑完整圈,Rviz中的轨迹以及小车的视角显示如下图所示
    在这里插入图片描述
  • 建图完成后详细全图情况
    在这里插入图片描述
  • 我把控制小车转完整圈的整个运行做成了GIF动图上传了上来,可以看见,它运行的很慢,大约8分钟,大家耐心等待!

    在这里插入图片描述
  • 刚才上面的各个终端都不要关闭,继续新建终端,保存刚才gmapping创建的地图
cd ~/racecar_ws
rosrun map_server map_saver -f mango_car_map

在这里插入图片描述

  • 保存成功的地图详细情况如图所示
    在这里插入图片描述

九、小车自主定位导航

  • 打开终端,执行如下命令
cd ~/racecar_ws/src/racecar/racecar_gazebo/launch
sudo gedit mango_auto.launch
  • 在mango_auto.launch编辑如下代码
<?xml version="1.0"?>
<launch>
  <!-- Launch the racecar -->
  <include file="$(find racecar_gazebo)/launch/racecar.launch">
    <arg name="world_name" value="mango"/>
  </include>
  
  <!-- Launch the built-map -->
  <node name="map_server" pkg="map_server" type="map_server" args="$(find racecar_gazebo)/map/mango_car_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>

  • 保存退出!
  • 这里需要注意的两个地方,改为自己创建的world文件名和刚才保存地图的yaml文件路径和其名称。
    在这里插入图片描述

1.手工导航,运行自己创建的赛道

cd ~/racecar_ws
source ./devel/setup.bash
roslaunch racecar_gazebo mango_auto.launch

在这里插入图片描述
2.继续打开另一个终端,启动rviz

roslaunch racecar_gazebo racecar_rviz.launch

在这里插入图片描述

  • 导航进行时,可以看见效果如下图
    在这里插入图片描述
  • 此时用2D Nav Goal发布目标来设计小车行车轨迹(这个不好控制,要小心!)
    在这里插入图片描述
  • 继续再打开另一个终端,启动path_pursuit.py脚本文件
rosrun racecar_gazebo path_pursuit.py

在这里插入图片描述

  • 继续导航的下效果图
    在这里插入图片描述
  • 到达终点,Goal Resched!
    在这里插入图片描述

十、加载YOLO,让小车通过darknet_ros识别检测标记物体

  • 下载darknet_ros包和权重文件(yolov3.weights、yolov2.weights和yolov2-tiny.weights),放在如下的目录下
    在这里插入图片描述
  • 在工作目录进行编译,这个过程好像有点久
catkin_make -DCMAKE_BUILD_TYPE=Release

在这里插入图片描述

  • 编译成功如下
    在这里插入图片描述
  • 看见100%很开心,没有你就继续去查看后面问题及解决办法的问题十和十一吧,我就是这么成功的。
  • 启动gazebo
roslaunch racecar_gazebo racecar_runway_navigation.launch

在这里插入图片描述

  • 启动成功会出现这个界面
    在这里插入图片描述
  • ~/racecar_ws/src/racecar/racecar_description/urdf 目录下双击打开racecar.gazebo
    在这里插入图片描述
  • 查看话题
    在这里插入图片描述
  • ~/racecar_ws/src/darknet_ros/darknet_ros/config 目录
    在这里插入图片描述
  • 修改~/racecar_ws/src/darknet_ros/darknet_ros/config/ros.yaml文件中订阅的话题,将话题智能车上摄像头发布的话题,如图所示
    在这里插入图片描述
  • 启动YOLO V3,检测小车摄像头看到的物体是什么
roslaunch darknet_ros darknet_ros.launch

在这里插入图片描述

  • 启动过程的中间截图如图所示
    在这里插入图片描述
  • 启动后出现的效果如图(我的电脑打开YOLO V3很卡,重启了几次… …)
    (出现了下面这种情况,打听了一下,这里似乎都很卡,所以只能等或者关机重启吧?!)
    在这里插入图片描述
  • 重启了还是这样,空白?!
    在这里插入图片描述
  • 不空白了,但是没检测到,好像卡了。。。
    在这里插入图片描述
  • 再来,路径移动了这么远,但是为什么小车路途中都没有标记障碍物,好奇怪?(又卡了… )
    在这里插入图片描述
  • 再来几次,最终小车识别物体加标签在YOLO V3中得到的效果图
    在这里插入图片描述

  • 总结体会
  • 事实证明,只要你在仿真过程中各方面控制的好,小车是可以实现自动导航驾驶的。自动规划路线并控制小车到达了预定的目标,这和现实中的开车是一样的,这里是人为的用键盘“WSAD”控制小车移动的方向,小车被卡住或者遇到障碍物有时会翻车。
  • 还有就是小车自动导航驾驶的时候注意在绘制赛道的时候起点和终点的选择,没控制好小车的运行轨迹小车如果撞墙就会被认为到达了终点。
  • 由于我经验不足,赛道建的太窄了,所以用了可乐罐充当障碍物,大家在实验搭建过程中记得把赛道的距离取好,用专门的跑道障碍物这样更加接近真实的环境。
  • 在最后做加载YOLO,让小车通过darknet_ros识别检测标记物体时,可能我虚拟机内存什么的不好,导致运行加载YOLO V3的时候很卡很卡,运行了很多次。

十一、遇见的问题及解决办法

(根据上面步骤做,不一定会遇见下面这些问题。)

  • 问题一
    CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
    Could not find a package configuration file provided by “driver_base” with
    any of the following names:

    driver_baseConfig.cmake
    driver_base-config.cmake

    Add the installation prefix of “driver_base” to CMAKE_PREFIX_PATH or set
    “driver_base_DIR” to a directory containing one of the above files. If
    “driver_base” provides a separate development package or SDK, be sure it
    has been installed.
    Call Stack (most recent call first):
    racecar/system/hokuyo_node/CMakeLists.txt:13 (find_package)

– Configuring incomplete, errors occurred!
See also “/home/mango/racecar_ws/build/CMakeFiles/CMakeOutput.log”.
See also “/home/mango/racecar_ws/build/CMakeFiles/CMakeError.log”.
Invoking “cmake” faile
在这里插入图片描述
解决办法 原因是确少driver_base功能包,装上它就好了
sudo apt-get install ros-melodic-driver-base
在这里插入图片描述

  • 然后执行catkin_make编译通过

  • 问题二
    CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
    Could not find a package configuration file provided by “OpenCV” with any
    of the following names:

    OpenCVConfig.cmake
    opencv-config.cmake

    Add the installation prefix of “OpenCV” to CMAKE_PREFIX_PATH or set
    “OpenCV_DIR” to a directory containing one of the above files. If “OpenCV”
    provides a separate development package or SDK, be sure it has been
    installed.
    Call Stack (most recent call first):
    racecar/racecar_gazebo/CMakeLists.txt:8 (find_package)

– Configuring incomplete, errors occurred!
See also “/home/mango/racecar_ws/build/CMakeFiles/CMakeOutput.log”.
See also “/home/mango/racecar_ws/build/CMakeFiles/CMakeError.log”.
Invoking “cmake” failed
在这里插入图片描述
解决办法首先使用指令搜索OpenCVConfig.cmake文件的路径:
在这里插入图片描述

  • 进入相关目录编辑catkinConfig.cmake文件
cd /opt/ros/melodic/share/catkin/cmake
sudo gedit catkinConfig.cmake

在这里插入图片描述

  • find _package前面添加如下内容
set(OpenCV_DIR /usr/share/OpenCV)

在这里插入图片描述

  • 好像这个路径下添加也可以解决
    在这里插入图片描述
  • 问题三
    /home/mango/racecar_ws/src/racecar/racecar_gazebo/src/findLine.cpp:7:10: fatal e
    rror: ackermann_msgs/AckermannDrive.h: 没有那个文件或目录
    #include “ackermann_msgs/AckermannDrive.h”
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    compilation terminated.
    racecar/racecar_gazebo/CMakeFiles/findLine.dir/build.make:62: recipe for target
    ‘racecar/racecar_gazebo/CMakeFiles/findLine.dir/src/findLine.cpp.o’ failed
    make[2]: *** [racecar/racecar_gazebo/CMakeFiles/findLine.dir/src/findLine.cpp.o]
    Error 1
    CMakeFiles/Makefile2:4559: recipe for target ‘racecar/racecar_gazebo/CMakeFiles/
    findLine.dir/all’ failed
    make[1]: *** [racecar/racecar_gazebo/CMakeFiles/findLine.dir/all] Error 2
    Makefile:140: recipe for target ‘all’ failed
    make: *** [all] Error 2
    Invoking “make -j1 -l1” failed

在这里插入图片描述
解决办法 这主要是缺少相关的包导致的,安装就可以了

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

在这里插入图片描述

  • 问题四
    [gazebo_gui-3] process has died [pid 11595, exit code 137, cmd /opt/ros/melodic/lib/gazebo_ros/gzclient __name:=gazebo_gui __log:=/home/mango/.ros/log/465e242c-bad7-11ea-800b-000c2971498d/gazebo_gui-3.log].
    log file: /home/mango/.ros/log/465e242c-bad7-11ea-800b-000c2971498d/gazebo_gui-3*.log
    在这里插入图片描述

  • 问题五
    [gazebo-2] process has died [pid 12735, exit code 255, cmd /opt/ros/melodic/lib/gazebo_ros/gzserver -e ode /home/mango/racecar_ws/src/racecar/racecar_gazebo/worlds/racecar_runway.world __name:=gazebo __log:=/home/mango/.ros/log/1d633998-bad9-11ea-800b-000c2971498d/gazebo-2.log].
    log file: /home/mango/.ros/log/1d633998-bad9-11ea-800b-000c2971498d/gazebo-2*.log

  • (这两个问题可以重启虚拟机试试。)

  • 问题六
    ERROR: cannot launch node of type [gmapping/slam_gmapping]: gmapping
    ROS path [0]=/opt/ros/melodic/share/ros
    ROS path [1]=/home/mango/racecar_ws/src
    ROS path [2]=/home/mango/catkin_ws/src
    ROS path [3]=/opt/ros/melodic/share
    解决办法 也是缺少相关包导致的,执行如下命令安装

sudo apt-get install ros-melodic-gmapping

在这里插入图片描述

  • 问题七
    [ERROR] [1593527090.154212151, 0.524000000]: Could not load controller ‘right_steering_hinge_position_controller’ because controller type ‘effort_controllers/JointPositionController’ does not exist.
    [ERROR] [1593527090.154343639, 0.524000000]: Use ‘rosservice call controller_manager/list_controller_types’ to get the available types
    [ERROR] [1593527091.155908, 0.713000]: Failed to load right_steering_hinge_position_controller
    在这里插入图片描述
  • 问题八
    [rospack] Error: package ‘map_server’ not found
    解决办法 sudo apt-get install ros-melodic-map-server
    在这里插入图片描述
  • 问题九
    ERROR: cannot launch node of type [move_base/move_base]: move_base
    ROS path [0]=/opt/ros/melodic/share/ros
    ROS path [1]=/home/mango/racecar_ws/src
    ROS path [2]=/opt/ros/melodic/share
    [ERROR] [1593684906.410814958]: Map_server could not open /home/mango/racecar_ws/src/racecar/racecar_gazebo/map/mango_car_map.yaml.
    [map_server-20] process has died [pid 2352, exit code 255, cmd /opt/ros/melodic/lib/map_server/map_server /home/mango/racecar_ws/src/racecar/racecar_gazebo/map/mango_car_map.yaml __name:=map_server __log:=/home/mango/.ros/log/e38cc340-bc4c-11ea-b168-000c2971498d/map_server-20.log].
    log file: /home/mango/.ros/log/e38cc340-bc4c-11ea-b168-000c2971498d/map_server-20*.log
    在这里插入图片描述
    解决办法 sudo apt-get -y install ros-melodic-navigation
  • 详细过程如图所示
    在这里插入图片描述
  • 问题十
    /usr/local/include/opencv2/highgui/highgui_c.h:139:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘:’ token
    CVAPI(cv::Rect)cvGetWindowImageRect(const char* name);
    ^
    darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/build.make:86: recipe for target ‘darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/src/image_interface.c.o’ failed
    make[2]: *** [darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/src/image_interface.c.o] Error 1
    CMakeFiles/Makefile2:4884: recipe for target ‘darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/all’ failed
    make[1]: *** [darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/all] Error 2
    Makefile:140: recipe for target ‘all’ failed
    make: *** [all] Error 2
    Invoking “make -j1 -l1” failed
    在这里插入图片描述
    解决办法usr/local/include/opencv2/highui目录下,右击点击在终端打开
    在这里插入图片描述
  • 执行如下命令
sudo gedit highgui_c.h

在这里插入图片描述

  • 进入后在右下角可以看见显示行号
    在这里插入图片描述
  • 找到大约139行左右
    在这里插入图片描述
  • 将原来的cv::Rect修改为CvRect,如图所示
    在这里插入图片描述
  • 保存退出,到刚才出错位置重新进行编译
    在这里插入图片描述
  • 问题十一
    /usr/local/include/opencv2/core/cvdef.h:485:1: error: unknown type name ‘namespace’
    namespace cv {
    ^~~~~~~~~
    /usr/local/include/opencv2/core/cvdef.h:485:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘{’ token
    namespace cv {
    ^
    darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/build.make:86: recipe for target ‘darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/src/image_interface.c.o’ failed
    make[2]: *** [darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/src/image_interface.c.o] Error 1
    CMakeFiles/Makefile2:4884: recipe for target ‘darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/all’ failed
    make[1]: *** [darknet_ros/darknet_ros/CMakeFiles/darknet_ros_lib.dir/all] Error 2
    Makefile:140: recipe for target ‘all’ failed
    make: *** [all] Error 2
    Invoking “make -j1 -l1” failed
    在这里插入图片描述
    解决办法 找到/usr/local/include/opencv2/highgui/目录下,右击打开终端
    在这里插入图片描述
  • 运行命令
sudo gedit cvdef.h

在这里插入图片描述

  • 找到如图所示代码,将大约485行到494内容加注释,效果如图所示
    在这里插入图片描述
  • 保存退出,再回到刚才编译的地方重新编译
  • 问题十二
    [darknet_ros-1] process has died [pid 2939, exit code -6, cmd /home/mango/racecar_ws/devel/lib/darknet_ros/darknet_ros __name:=darknet_ros __log:=/home/mango/.ros/log/90936984-c190-11ea-9533-000c2971498d/darknet_ros-1.log].
    log file: /home/mango/.ros/log/90936984-c190-11ea-9533-000c2971498d/darknet_ros-1*.log
    在这里插入图片描述
    解决办法~/racecar_ws/src/darknet_ros目录下执行如下命令
git stash

在这里插入图片描述

  • 问题十三
    [ERROR] [1594271195.588705, 0.000000]: Spawn service failed. Exiting.
    [ INFO] [1594271195.707695099, 830.929000000]: Physics dynamic reconfigure ready.
    [racecar_spawn-3] process has died [pid 6097, exit code 1, cmd /opt/ros/melodic/lib/gazebo_ros/spawn_model -urdf -param robot_description -model racecar -x -5.388334 -y -4.094883 -z 0.0 __name:=racecar_spawn __log:=/home/mango/.ros/log/e2f0cbd4-c1a1-11ea-a3b1-000c2971498d/racecar_spawn-3.log].
    log file: /home/mango/.ros/log/e2f0cbd4-c1a1-11ea-a3b1-000c2971498d/racecar_spawn-3*.log
    在这里插入图片描述

  • 相关的参考链接:
    https://blog.csdn.net/miss_bear/article/details/107137732
    https://www.guyuehome.com/6463
  • 本次ROS机器人定位导航仿真结束了,作为物联网小白,肯定有很多不足,希望各位大佬指正,谢谢。

评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值