一、前言
操作系统:ubuntu16.04
ROS版本:kinetic
Gazebo版本:7.0.0
本文介绍在MIT的racecar模型基础上搭建slam,仿真实现2019年室外光电创意组比赛。
二、效果
三、准备工作
3.1安装仿真环境
3.2 创建工作区间
mkdir -p ~/racecar_ws/src
cd ~/racecar_ws/src
catkin_init_workspace
git clone https://github.com/xmy0916/racecar.git
cd ..
catkin_make
创建成功如下:
四、仿真介绍
4.1 阿克曼模型介绍
这个其实也没什么高大上的,就是我们常见的车模的样子,通过舵机改变前面两个转向轮的方向,后面的驱动轮方向始终不变,模型如下图(图片原文:http://www.rcfans.com/bbs/forum.php?mod=viewthread&tid=358236&ordertype=1 ):
其中阿克曼角就是图中的 b – a,当阿克曼角越接近0的时候车子最适合漂移(老司机划重点),这种模型的设计就是为了让汽车在转向的过程中更加顺滑。而我们室外光电的车模就是基于这种车辆模型,但是钢铁侠官方给的驱动方式是差速控制,显然不是最合理的控制手段。
4.2 仿真文件介绍
4.2.1 racecar_contrl文件夹
这个文件主要是配置了车辆的关节运动,为什么说关节呢,这里设计racecar转向其实和机械臂的关节设计是一样的,他们的类型都是joint_state_controller
4.2.2 racecar_contrl/config文件夹
这个是关节参数的具体配置文件,里面有转向PID的参数配置,仿真其实就实际一样的。常用的舵机转向相当于是自带了位置环所以我们一般不去设计他的PID;但是仿真的转向没有位置环,因为我们是仿真世界的主人,我们可以知道关节转动了多少角度,也能控制转向速度,所以用角度作为反馈来控制转向速度从而让关节快速的转到我们所需要的角度,所以这里就必须配置关节的PID了,具体实现gazebo已经帮我们做好了,只要自己调参数就行。
4.2.3 racecar_contrl/launch文件夹
这个是配置了一些关节控制的启动文件。
4.2.4 racecar_contrl/scripts文件夹
这里面存放了一些控制的脚本,可以直接运行keyboard_teleop.py就可以控制小车运动。
4.2.5 racecar_description文件夹
这个是整个车模的描述文件夹,含有小车的xacro模型文件,和场地的模型文件,还有场地外观的材料文件。
4.2.6 racecar_gazebo文件夹
gazebo有关的文件
4.2.7 racecar_gazebo/config文件夹
里面是slam的配置文件,以及rviz启动的文件,gazebo文件夹下其他几个文件夹类似就不累述了
4.2.8 system文件夹
这里面主要用上的就是阿克曼消息的转换,文件中还有一些与硬件有关的驱动
五、启动仿真
5.1 使能环境变量:
echo "source ~/racecar_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
5.2 启动地图:
roslaunch racecar_gazebo racecar_runway.launch
六、建图
6.1 启动slam和rviz:
roslaunch racecar_gazebo slam_gmapping.launch
6.2 控制车辆(左侧有个控制窗口,图标是问号点开),WASD控制前左后右的运动就可以建图了:
大家建图可以把锥桶先删了在建图的时候!!!
6.3 保存地图:
rosrun map_server map_saver -f ~/racecar_ws/src/racecar_gazebo/map/map_runway
6.4 关闭建图:
ctrl + c关闭所有窗口
七、导航
7.1 启动导航和环境地图:
roslaunch racecar_gazebo racecar_runway_navigation.launch
7.2 启动rviz:
roslaunch racecar_gazebo racecar_rviz.launch
7.3 用2D Nav Goal发布目标:
7.4 启动导航脚本
rosrun racecar_gazebo path_pursuit.py
或者
cd ~/racecar_ws/src/racecar_gazebo/scripts
python path_pursuit.py
开始导航!
八、总结
本文完整源代码地址:github.com/xmy0916/racecar
感谢古月居老师邀请写这个教程,室外光电创意组的至此全部完成,当然大家直接git clone下来的工程运行起来没什么难度……在MIT的github官网只有车辆的gazebo文件没有配置amcl和gmapping,自己配置一遍参数才知道过程是多么的艰辛,之前在网上看到有2019年参加过室外光电创意组的同学实现了这个仿真,但是没有开源教程和代码,我自己费劲千辛万苦弄了三四天才搭建好完整的框架开源给大家,点个赞支持下呗~后续会推出其他组别(除了电磁组)的阿克曼车模仿真教程。
九、后文
介绍下怎么自己场地建模
9.1 ctrl + alt + t打开新的终端输入命令打开空的gazebo:
gazebo
9.2 点击左上角的Edit选择Building Edit:
9.3 点击Create Walls下面的Wall:
9.4 根据场地模型在白色区域绘制地图(我这里画过了就随便画下):
9.5 画完后点击左上角的File选择save as:
9.6 修改名字runway,路径随便放一个先:
9.7 可以看见对应目录下有了模型的描述文件:
9.8 重启gazebo,点击左上角的Insert可以看到刚刚建立的模型,点击一下拖到gazebo中:
9.9 这里最好把坐标轴放到我们车的起点,如图画圈处(不改也没关系,可以在启动文件里定义车模的坐标):
9.10 插入锥桶,点击Insert选择Construction Cone拖入gazebo(如果没下载锥桶模型,参考这里:下载教程):
9.11 保存世界文件,点击左上角File选择Save World As放在刚才的目录下叫runway_world.world就行:
9.12 文件内容如下: