您当前的位置: 首页 >  后端

暂无认证

  • 2浏览

    0关注

    100336博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

一起做激光SLAM:常见SLAM技巧使用效果对比,后端

发布时间:2022-01-20 07:00:00 ,浏览量:2

43ff4fc6302c49a525342fc0bc8cc55b.png

本节目标

9ddbf298525ad21b103d6b2c4bcd1c6e.png

搭建一套700行代码的激光SLAM。通过对ALOAM进行修改实验,确定对激光SLAM最核心的技巧,并接上节里程计,完成后端,构建较大场景(轨迹约2km)地图。

预期效果:

2aec73b4f0f5745e52dd38ca837503f5.png

rosbag数据: 

https://pan.baidu.com/s/1o-noUxgVCdFkaIH21zPq0A

提取码: mewi

程序:https://gitee.com/eminbogen/one_liom

cc202eaca07259f5c46868296faf423c.png

实际地图与ALOAM效果

416ad4fd45c0aff2c58682e23f35884c.png

因为先试了一下LOAM跟丢了,所以用完整走完的ALOAM来进行实验。蓝色为里程计结果,绿色为后端优化后的效果,差距非常大。第三张图是跟丢的LOAM。

ff4d013a1c958cccd2ef23f7e43fdfff.png

3f693c81a9f931f8c90e63203c0f0003.png

3f61ab06c939b2e66bb3ffb3724ed233.png

6459f1eaeedd193e60018fddb9c00b09.png

ALOAM修改实验

5645fe9c35a3360ad80a401d6d16997b.png

棱匹配与曲率排序

棱匹配,是希望图像中曲率较大的点匹配到对应的棱上,与点面匹配对应。在下图中c可以当做我们的当前帧的点,ab为前一帧棱上点,作公式如下,即CA×CB/AB,由于叉乘为|CA|*|CB|*sin,所以在AB点固定时角度越接近0度或180度,两向量越小,分子就越小,可以将d作为损失量进行优化。实验后来发现这个没啥用。

2ee6c6a8144e13b2957455cd7f8c2e70.png

 程序:

Eigen::Matrix nu = (lpc - lpa).cross(lpc - lpb);
Eigen::Matrix de = lpa - lpb;
residual[0] = nu.x() / de.norm();
residual[1] = nu.y() / de.norm();
residual[2] = nu.z() / de.norm();

曲率排序是在选取特征点对于16线,每线分为6区域,每区域内按曲率高低录取面点和棱点。实验后来发现这个很有用。

程序:

//利用cloudScanEndInd将每条线分成六块,每块使用sort排序,并从最平缓的4个点录入laserCloudplane,录入后对周围点作不选取的标志
for(int i=0;i<16;i++)
{
    //每条线起止
    int start_num = cloudScanEndInd[i];
    int end_num = cloudScanEndInd[i+1];
    //分六块
    for(int j=0;j<6;j++)
    {
  int start_num_temp = start_num+ ((end_num-start_num)/6)*j;
  int end_num_temp = start_num+ ((end_num-start_num)/6)*(j+1);
  //块内排序cloudSortInd会从1,2,3,4这种顺序变成乱序,乱序后指代的点曲率从小到大排列
  std::sort (cloudSortInd + start_num_temp, cloudSortInd + end_num_temp, comp);
  //计数4个
  int plane_num=0;
  //k要在区间内,点要小于5个
  for(int k=start_num_temp;k            
关注
打赏
1655516835
查看更多评论
立即登录/注册

微信扫码登录

0.0883s