一、安装配置运行的环境
Ubuntu 18.04 | Ros Melodic | Gazebo 9.0.0 |
---|
二、下载源码包
- 先创建ros的工作区域racecar_ws
1 | mkdir -p ~/racecar_ws/src |
- 并转换到工作区域目录,
1 | cd ~/racecar_ws/src |
- 把当前目录初始化为一个ROS工作空间
1 | catkin_init_workspace |
- 开始下载Gazebo搭建赛道功能包racecar(这里使用的别人github上开源出来的代码)
1 | git clone https://github.com/xmy0916/racecar.git |
下载完成后racecar功能包是这样的
三、安装本次运行需要的控件
1 2 3 4 5 6 7 | 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功能包编译
1 2 | cd ~/racecar_ws catkin_make |
编译成功如下图所示:
五、启动仿真编译
- 设置环境变量,程序注册
1 2 | echo "source ~/racecar_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc |
- 启动gazebo,运行打开小车模型
1 | roslaunch racecar_gazebo racecar.launch |
- 运行结果显示,系统将会打开一个tk的控制界面小窗,控制小车的移动,如图
- 可以看到一个红色小车的模型
六、手动搭建小车的赛道
- 在终端打开
Gazebo ,点击Edit->Build Editor,创建模型,保存该模型
- 完成后关闭gazebo,找到对应Location文件夹,看到自己创建赛道模型
- 运行小车模型,导入刚自己创建的赛道模型框架,保存为world文件
- 拖入刚创建的地图到恰当位置
- 为保证模型顺利加载,请提前将模型文件库下载并放置到
~/.gazebo/models ,下载模型文件库gazebo_models的方法 - 方法一:打开终端用命令下载(我发现比较慢… …)
1 | 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文件
1 2 | cd ~/racecar_ws/src/racecar/racecar_gazebo/launch sudo gedit mango.launch |
在里面加入如下代码:
1 2 3 4 5 6 7 | <?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自己的地图
1 2 | source ./devel/setup.bash roslaunch racecar_gazebo mango.launch |
- 会看见如下效果
- 小车的详细运动情况如下表所示:
WASD控制 | 运动情况 |
---|---|
W | 前进 |
S | 后退 |
D | 轮子右转,小车不动 |
A | 轮子左转,小车不动 |
A + W | 小车左向前移 |
A + S | 小车右向后移 |
D + W | 小车右向前移 |
D + S | 小车左向后移 |
- 如下面的GIF动图是我的小车运动的情况,有点慢…,但是还是可以看见它的移动轨迹的。
- 这里由于mp4文件无法上传到博客,所以我用到了:
虚拟机 Ubuntu 下用 【ffmpeg】 将视频 mp4 转换为 gif 动图
八、通过自己建立的赛道进行gmapping建图
上面运行的终端不关闭,继续gmapping建图运行
1 | roslaunch racecar_gazebo slam_gmapping.launch |
(rviz中放大模型,感觉什么都可以看清楚了!)
- 这里可以看见小车的起点
- 运行一圈后小车到达的终点
- 跑完整圈,Rviz中的轨迹以及小车的视角显示如下图所示
- 建图完成后详细全图情况
- 我把控制小车转完整圈的整个运行做成了GIF动图上传了上来,可以看见,它运行的很慢,大约8分钟,大家耐心等待!
- 刚才上面的各个终端都不要关闭,继续新建终端,保存刚才gmapping创建的地图
1 2 | cd ~/racecar_ws rosrun map_server map_saver -f mango_car_map |
- 保存成功的地图详细情况如图所示
九、小车自主定位导航
- 打开终端,执行如下命令
1 2 | cd ~/racecar_ws/src/racecar/racecar_gazebo/launch sudo gedit mango_auto.launch |
- 在mango_auto.launch编辑如下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?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.手工导航,运行自己创建的赛道
1 2 3 | cd ~/racecar_ws source ./devel/setup.bash roslaunch racecar_gazebo mango_auto.launch |
2.继续打开另一个终端,启动rviz
1 | roslaunch racecar_gazebo racecar_rviz.launch |
- 导航进行时,可以看见效果如下图
- 此时用2D Nav Goal发布目标来设计小车行车轨迹(这个不好控制,要小心!)
- 继续再打开另一个终端,启动path_pursuit.py脚本文件
1 | rosrun racecar_gazebo path_pursuit.py |
- 继续导航的下效果图
- 到达终点,Goal Resched!
事实证明,只要你在仿真过程中各方面控制的好,小车是可以自动导航驾驶的。我觉得这个和无人驾驶很像,无人驾驶的实现也是主要靠计算机类的系统实现,自动规划路线并控制小车到达了预定的目标。感觉导航实现的无人驾驶有优点也有缺点吧,优点当然有很多,百度一下就有很多这里就不详细说了;缺点就是我感觉它辨别障碍物主要依靠激光雷达,但是有时候激光雷达也会出问题吧,总之应该不会万无一失。
由于我的赛道建的太窄了,所以用了可乐罐充当障碍物,大家在实验搭建过程中记得把赛道的距离取好,用专门的跑到障碍物这样更加接近真实的环境。
十、遇见的问题及解决办法
(根据上面步骤做,不一定会遇见这些问题。)
-
问题一
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” failed
解决办法
原因是确少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文件
1 2 | cd /opt/ros/melodic/share/catkin/cmake sudo gedit catkinConfig.cmake |
在
1 | 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
解决办法
这主要是缺少相关的包导致的,安装就可以了
1 | 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
解决办法
也是缺少相关包导致的,执行如下命令安装
1 | 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
详细过程如图所示
本次ROS机器人定位导航仿真结束了,作为物联网小白,肯定有很多不足,希望各位大佬指正,谢谢。