写在前面
我的本科毕设需要使用到LOAM算法,最近因为疫情原因,可能没有小车来操作,故学习了如何在gazebo中进行实物仿真。目前实现了gazebo和LOAM之间的配合。
本来打算在网上找一些资源,用起来会快一点,发现全网没有详细介绍如何在gazebo中实现LOAM算法的,倒是有一些介绍在gazebo中实现ORB-SLAM算法的,比如这个博客
https://blog.csdn.net/baidu_36211769/article/details/103374441
所以我打算写一片gazebo+LOAM的博客,才进入这个领域不久,希望前辈们批评指正,指点迷津。
操作
环境准备
Ubuntu版本为18.04
ros版本为melodic
gazebo版本为9
一般来讲,较新的ros版本都会自带gazebo,如果没有的话,可以安装一下,参考这个博客
https://blog.csdn.net/weixin_41045354/article/details/84881498
代码准备
前人栽树后人乘凉。总体的代码都是在已有基础上改动的。
LOAM代码
LOAM部分的代码本来想使用的2014年发表在RSS上的论文《LOAM:Lidar Odometry and Mapping in Real-time》的开源代码。源码地址在
但经过几次测试,发现存在一些地图畸变的问题,所以选择了以LOAM为基础比较容易上手的ALOAM代码。源码地址在
当然也可以选择LeGO-LOAM。源码地址在
下面以A-LOAM为例展开
网站上有具体的操作,这里我按我的步骤说明一下吧。
1、搭建环境依赖
主要用到的是Ceres Solver以及PCL
这个都比较常用,没有的话可以安装一下。
2、建立工作空间并编译
打开终端,输入
$ mkdir ~/A_LOAM_ws
$ cd ~/A_LOAM_ws
$ mkdir src
$ cd ~/A_LOAM_ws/src/
$ git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git
$ cd ~/A_LOAM_ws
$ catkin_make
$ source devel/setup.bash
在编译过程中如果遇到提示缺少库的话,大家按照自己的需要添加,应该问题不大。
2、测试
网站上给出的一些数据集地址都挂掉了,这里我找到一个数据集,大家可作为作为测试使用。
如果翻不了墙,可以在这里下载。
把这个包放在刚才建立的A_LOAM_ws目录下面,方便使用。
接着刚才的终端,运行LOAM算法,输入
$ roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch
同一个目录下新建一个标签页或窗口,输入
$ rosbag play nsh_indoor_outdoor.bag
这个时候可以在自动打开的rivz窗口中看到LOAM的建图过程了,最后的结果如下
3、总结
大家如果想要弄懂其中的源码算法,可以参考大佬魏新slam的一些LOAM源码解析的博客,或介绍ALOAM的博客。
如果这一部分测试没有问题,就可以继续往下看了。
gazebo代码
这一部分是借鉴的clearpath公司开发的huskyA200的ROS和gazebo文件。其源代码链接
我进行的主要改动包括:原来需要joystick操作,现在改成了键盘控制;引入Velodyne包,将原有的sick的2D激光雷达改为了Velodyne的3D激光雷达;新增了一个museum.world文件,并使用此文件作为地图;打开gazebo自动打开键盘控制。
由于改动较多,所以这里直接给出改完之后的代码,链接如下
上面连接很多人反应用不了,可以使用评论区的网盘链接。
大家可以直接clone下来使用
具体操作如下
1、环境准备
因为在其中用到的Velodyne VLP-16传感器并不是ros自带的,所以需要自己下载。
打开终端,输入
sudo apt-get install ros-melodic-velodyne
如果ros版本不是melodic,请换成相应名称
2、建立工作空间并编译
使用评论区网盘链接,直接新建husky_ws文件夹,把src文件夹解压到下面即可正常编译。
在编译过程中如果遇到提示缺少库的话,大家按照自己的需要添加。
3、测试
打开终端,输入
$ source devel/setup.bash
$ roslaunch husky_gazebo husky_playpen.launch
可能会出现一些标红报错的现象,但并不影响使用,最后终端界面为
可以发现自动打开了gazebo,界面为(使用不同world文件展示的环境会不一样)
此时鼠标点击终端,即可对小车进行控制,具体控制按钮可以在终端中已经说明。
如果想要查看其中的点云图像,可以新打开一个终端窗口,输入
$ rviz
打开rviz之后点击界面左下角的Add按钮,选择By topic,找到消息velodyne_points
点OK,将DIsplay工具栏的Gloabl Options中Fixed Frame选为base_link,即可看到点云
4、一些说明
- 小车的初始直行速度和初始转弯速度可以在teleop_twist_keyboard包的teleop_twist_keyboard.py文件中修改,不想改的化运行之后临时键盘改也行
- Lidar的参数,如Hz、samples等可在husky_description包中里husky.urdf.xacro文件中修改,默认参数在第一步下载的velodyne_description的文件VLP-16.urdf.xacro里,默认路径为/opt/ros/melodic/share/velodyne_description/urdf/VLP-16.urdf.xacro
- 地图修改在husky_gazebo包的文件playpen.launch里,所有world文件也在这个包里的world文件夹下。
- 其实小车也有一个realsense的RGBD摄像头,可以在husky_playpen.launch文件中,通过修改参数realsense_enabled打开使用
联合运行
在完成LOAM和husky gazebo的分别调试之后,便可以进行联合运行。
具体方法和分别调试是类似的,具体如下
打开终端,输入
$ cd ~/A_LOAM_ws
$ source devel/setup.bash
$ roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch
再开一个终端,输入
$ cd ~/husky_ws
$ source devel/setup.bash
$ roslaunch husky_gazebo husky_playpen.launch
这样就可以通过控制小车来走完这个地图,最后得到的地图如下
对比真实的线框图,我们可以发现建图是十分精确的
总结
虽然历经坎坷,但最后成功将gazebo和ALOAM算法结合在了一起,也得到了地图。
其实之前使用的LOAM算法,但总是出现一些奇怪的问题,所以换了ALOAM,当然也可以尝试使用LeGO-LOAM算法,毕竟算法是不断更新改进的,我们也要时刻站在巨人的肩膀上!
又使用LeGO-LOAM算法试了一下,得到的效果是这样的,感觉更好,欢迎大家使用