目录
建图算法选择
在Autoware中提供的构建点云地图的算法是ndt_mapping,属于比较基础的算法,速度会比较慢(没有GPU加速的情况下),最近几年LOAM系列的算法比较火,我周围做SLAM的同学推荐我试试LeGO_LOAM,以下的内容就主要基于这两个算法进行。
一 . NDT_mapping
1. 首先启动autoware:
$ roslaunch runtime_mananger runtime_mananger
由于NDT_mapping的实时性不是很好(CPU),自己电脑GPU算力不够,没测试过。。所以建议先用雷达录制Bag文件,再进行建图
2. 在Simulation界面点击Ref加在录制好的Bag
点击Play 后等个1 ~ 2秒后点击Pause

3. Computing界面
选择ndt_mapping 节点后面的[app]进行参数设置,参数含义后边再补充,最常用的就是GPU算力足够的话,Method Type选择pcl_anh_gpu,其他参数默认即可

设置完参数,回到Computing界面,启动ndt_mapping这个节点

4. 开始建图
回到Simulation界面,点击pause恢复播放bag,此时在终端会有以下界面:

要注意的是Processed/Input: 33/39这条显示,表示的是读入的点云数据和已经处理的点云的数据,两者之间相差不要过大,之前看有人说8G显存的GPU在两个数字相差500左右就要暂停等待一下,我用自己电脑CPU的话一直控制不让他相差超过300,要不然处理后输出的点云会很奇怪。。。
剩下时间等待建图成功之后即可,等建完点云地图之后,回到Computing界面,点击ndt_mapping后面的app, 点击下方的Ref选择自己想要保存PCD文件的为知,并点击PCD OUTPUT 就可以在自己选择的目录下看到绘制好的点云地图了。
二 . LeGO_LOAM
刚拿到小车的时候,我想要在学校围着一栋楼建个图跑一跑,但是NDT_Mapping实在是太慢了,加上我没有GPU可以加速,每次跑都要半个多小时,还要盯着终端看读入的点云数目不能超过处理的点云数目太多,烦死个人,然后我周围的小伙伴给我推荐了LeGO_LOAM,果然又快又好用
1. LeGO_LOAM 的安装
安装过程在LeGO_LOAM的官方github(传送门)上都有,这里记录我的安装过程和踩的小坑~
(1)首先需要先安装ROS和 gtsam.
安装ROS我在上一篇博客中有写(传送门),这里提一下安装gtsam,步骤如下:
wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2.zip
cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/
cd ~/Downloads/gtsam-4.0.0-alpha2/
mkdir build && cd build
cmake ..
sudo make install
我遇到的第一个坑出现了,出现了下面这个问题:
经过排查后是gtsam的问题,原因是我按照上面那个步骤安装的gtsam不对,但我同学就没事,,我又重新找了一版,分享到(这里).
(2)安装LeGO_LOAM
cd ~/catkin_ws/src
git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git
cd ..
catkin_make
2. Demo
官方Bag地址:Google Drive
启动LeGO_LOAM:
roslaunch lego_loam run.launch
播放Bag:
rosbag play *.bag --clock --topic /velodyne_points /imu/data
3. 自用建图
首先原始LeGO_LOAM建出的图是没办法直接拿来用的,因为它的坐标系与咱们正常使用的坐标系朝向不同,所以在输出的时候需要对其进行下转换
在mapOptmization.cpp文件中添加一些代码使得最后输出的pcd文件的坐标系为常用坐标系:
保存地图:
在源码中找到这句话,注释掉,每次跑完算法之后就会自动保存pcd文件,需要的是finalpcd
突然发现自己电脑上的LeGO_LOAM删掉了,只有SC_LeGO_LOAM,反正也差不多,并且使用来说SC_LeGO_LOAM更好用留个坑,以后再用LeGO的时候补上
三 . SC_LeGO_LOAM
相比LeGO_LOAM,回环检测的效果更优,建出的地图更方便使用(标注)。
1. 安装
同LeGO_LOAM
2. 使用
主要在mapOptmization.cpp增加了DS1指针用于最后输出finalCloud.pcd
pcl::PointCloud<PointType>::Ptr globalMapKeyFramesDS1;

进行坐标变换的代码:
globalMapKeyFramesDS1->width = globalMapKeyFramesDS->points.size();
globalMapKeyFramesDS1->height = 1;
for(int i = 0; i < globalMapKeyFramesDS->points.size(); ++i)
{
thisPoint.y = globalMapKeyFramesDS->points[i].x;
thisPoint.z = globalMapKeyFramesDS->points[i].y;
thisPoint.x = globalMapKeyFramesDS->points[i].z;
thisPoint.intensity = globalMapKeyFramesDS->points[i].intensity;
globalMapKeyFramesDS1->points.push_back(thisPoint);
}

修改了下采样参数使得最后输出的点云更加稠密:(方便标注)

详情可以见自用备份:https://github.com/HereQ/SC_LeGO_LOAM_Convert_coordinate.git
参考
- https://github.com/RobustFieldAutonomyLab/LeGO-LOAM
- https://blog.csdn.net/Kamfai_Row/article/details/106893979
- https://www.cnblogs.com/hgl0417/p/11130747.html
- https://blog.csdn.net/JZJHfc/article/details/105318182