一、创作背景
现在到网上搜索“Gazebo小车仿真”这个关键词,出来的内容要么就是Turtlebot系列或者Husky系列,要么就是从零搭建自己的小车模型。。。那么如果你既不想使用Turtlebot这种虽复杂但过于小巧的底盘模型,又不想使用博主们自己编写搭建的接地气小车模型的话,那么本教程即将为你带来一个颜值还算过得去,描述文件结构清晰简洁的底盘模型——Jackal四轮差速底盘!
二、环境依赖
官方推荐的是Ubuntu16.04 + ROS Kinetic系统版本组合
我这边使用的是Ubuntu18.04 + ROS Melodic系统版本组合
所以本教程只能保证在最高为ROS Melodic版的环境下完美复现,如果你使用的是ROS Noetic等更新的版本,则不保证能够使用该模型。望知悉!以免做无用功。当然,如果有朋友使用本教程,在Ubuntu20.04 + Noetic版本上成功复现的,也请不吝回复,让更多朋友知道。
三、代码链接
完整工程在 multi_jackal_simulate.zip 这个压缩包
https://github.com/RustSon/multi_jackal_simulatehttps://github.com/RustSon/multi_jackal_simulate
四、部署流程
1、把下载下来的代码解压到一个空的工作空间,比如我这里叫做 jackal_ws/src:
└── jackal_ws/src
├── multi_jackal_base
├── multi_jackal_control
├── multi_jackal_description
├── multi_jackal_nav
├── multi_jackal_tutorials
├── navigation-melodic-devel
├── navigation_msgs
└── README.md
2、安装一些必要的依赖:
cd jackal_ws
sudo apt-get install ros-melodic-controller-manager ros-melodic-interactive-marker-twist-server ros-melodic-robot-localization ros-melodic-robot-state-publisher ros-melodic-tf ros-melodic-urdf ros-melodic-xacro ros-melodic-gazebo-ros-control ros-melodic-hector-gazebo-plugins ros-melodic-joint-state-controller ros-melodic-diff-drive-controller ros-melodic-lms1xx ros-melodic-pointgrey-camera-driver ros-melodic-pointgrey-camera-description ros-melodic-teb-local-planner
catkin_make -j4
因为我这里给的工程里面包含了 navigation 导航包,而我上面安装的依赖里是没有包含导航包的依赖项的,如果编译报错,你可以根据错误提示,自行安装相应的ros依赖包。当然,如果你觉得这样过于麻烦,也可以使用下面这条命令一键完成:
sudo apt-get install ros-melodic-navigation
3、不出意外,你现在已经编译通过了。如果你之前从未使用过 Gazebo 进行仿真演练,那么请先下载必要的一些模型文件到本地;如果你已经使用过一些比较复杂的仿真场景了,那么这一步无需进行:
cd ~/.gazebo/
mkdir models
cd models
wget http://file.ncnynl.com/ros/gazebo_models.txt
wget -i gazebo_models.txt
ls model.tar.g* | xargs -n1 tar xzvf
4、准备工作已经完成,现在开始打开仿真:
加载一个底盘,运行:
cd jackal_ws/
source devel/setup.bash
roslaunch multi_jackal_tutorials one_jackal.launch
加载三个底盘,运行:
cd jackal_ws/
source devel/setup.bash
roslaunch multi_jackal_tutorials three_jackal.launch
5、终端出现以下红字错误,无需理睬,可正常使用:
6、如下图所示,此时你应该可以看到 Gazebo 和 Rviz 都已经打开:
7、同时终端会一直刷屏以下黄色警告:
8、这些都是正常现象,因为我们还没有给小车导航包一个可以使用的地图信息,这个时候我们可以选择两种方式给小车提供地图:
方法一:
利用map_server加载发布地图信息(此处不着重讲该方法,不过需要map文件的可以私信我并留下你的邮箱,我会在查看后一一发送)
方法二:
利用建图工具包进行实时建图并发布地图信息(开源的建图工具包有Cartographer、Gmapping、Hector等,我推荐使用Cartographer进行建图,后面教程二也会重点讲解这部分,这里为了快速跑起我们的底盘模型,将采用比较简单的Gmapping进行建图)
首先安装gmapping工具包:
sudo apt-get install ros-melodic-gmapping
其次,进入 jackal_ws/src/multi_jackal_tutorials/launch 文件目录下:
gedit gmapping.launch
将下方内容复制到该launch中,并保存
另开终端,启动建图:
source devel/setup.bash
roslaunch multi_jackal_tutorials gmapping.launch
<launch>
<arg name="robot_num" value="1"/>
<arg name="robot_name" value="robot_$(arg robot_num)"/>
<arg name="scan" default="/$(arg robot_name)/front/scan" /> <!-- 根据自己发布scan名称进行修改 -->
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
<param name="base_frame" value="$(arg robot_name)/base_link"/> <!-- 根据自己的基座标系名称进行修改 -->
<param name="odom_frame" value="$(arg robot_name)/odom"/> <!-- 根据自己的里程计坐标系名称进行修改 -->
<param name="map_update_interval" value="0.01"/>
<!-- Set maxUrange < actual maximum range of the Laser -->
<param name="maxRange" value="8.0"/>
<param name="maxUrange" value="7.5"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<param name="minimumScore" value="10.0"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.05"/>
<param name="angularUpdate" value="0.05"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="80"/>
<param name="xmin" value="-2.0"/>
<param name="ymin" value="-2.0"/>
<param name="xmax" value="2.0"/>
<param name="ymax" value="2.0"/>
<param name="delta" value="0.05"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<remap from="scan" to="$(arg scan)"/>
</node>
</launch>
9、此刻可以看到Rviz已开始出现正常的地图,同时终端的黄色警告也停止了跳动
10、接下来你可以可以快乐的玩耍Jackal模型啦!比如在Rviz上点击一个Goal,底盘就会自动导航过去了。
五、高级选项
打开 jackal_ws/src/multi_jackal_tutorials/launch/one_jackal.launch 文件:
<?xml version="1.0"?>
<launch>
<arg name="ns" default="robot_1"/>
<arg name="config" default="front_laser"/>
<arg name="config_id" default="0"/>
<arg name="world" default="multi_robot_world_2.world"/> <!-- turtlebot3_house multi_robot_world_2 -->
<arg name="gui" default="true"/>
<arg name="rviz" default="true"/>
<!-- Start Gazebo. -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="$(arg gui)"/>
<arg name="world_name" value="$(find multi_jackal_tutorials)/worlds/$(arg world)"/>
</include>
<!-- Spawn the robot. -->
<include file="$(find multi_jackal_base)/launch/jackal_base.launch">
<arg name="ns" value="$(arg ns)"/>
<arg name="config" value="$(arg config)"/>
<arg name="config_id" value="$(arg config_id)"/>
<arg name="use_move_base" value="true"/>
</include>
<!-- View in RVIZ. -->
<group if="$(arg rviz)">
<node name="rviz" pkg="rviz" type="rviz" ns="$(arg ns)" args="-d $(find multi_jackal_tutorials)/rviz/one_jackal.rviz" >
<remap from="/move_base_simple/goal" to="/$(arg ns)/move_base_simple/goal"/>
</node>
</group>
</launch>
最前面的六个参数都是可以改变的,分别可以有以下选择:
ns :这个是机器人前缀,可随意更改,只要保证 gmapping.launch 中的 robot_name 和它对应上即可
config :可以选择 base 、twocams、front_laser、alvartags、front_bumblebee2等等
config_id :这个通常是 0
world :可以选择 empty、multi_robot_world_2、stuff、turtlebot3_house等等
gui :是否开启 Gazebo界面
rviz :是否开启 Rviz
当然,子目录层级中的一些launch文件里也是有很多可选配置,后续教程如果用上,会一一进行讲解。