Hector SLAM算法学习与代码解析

Hector SLAM算法学习与代码解析

最初了解到Hector SLAM 是从https://www.youtube.com/embed/F8pdObV_df4看到手持激光建图,被吸引到了也就想看一下具体的实现。关于Hector SLAM算法有一篇论文:A Flexible and Scalable SLAM System with Full 3D Motion Estimation;以及开源代码:https://github.com/tu-darmstadt-ros-pkg/hector_slam。对照着论文和代码,一睹算法真容,主要分享对论文的第四部分2D SLAM的理解。


Occupancy Grid Map

这里写图片描述

Map Access

初始化的时候,将获取的激光数据作为第一帧处理映射到地图中。在t时刻,激光获取到新的激光数据,想要与t-1时刻的地图匹配,首先要把激光数据变换到栅格地图之中;例如激光点Pm变换到栅格地图中,我们希望的是激光点能够到一个“被占据”的栅格(灰色)中,如果t时刻所有的激光点都能够变换到被占据的栅格中,也就意味着匹配成功。
为了刻画激光点映射到栅格地图中是否对应被占据栅格中以及对应的程度,采用了双线性插值的方法,求出M(Pm)。M(P00)->M(P11)的范围是0 到 1,表示被占据的概率。

Map Access

对应的程序实现:

 Eigen::Vector3f interpMapValueWithDerivatives(const Eigen::Vector2f& coords)
  {
    //check if coords are within map limits.
    if (concreteGridMap->pointOutOfMapBounds(coords)){
      return Eigen::Vector3f(0.0f, 0.0f, 0.0f);
    }

    //map coords are always positive, floor them by casting to int
    Eigen::Vector2i indMin(coords.cast<int>());

    //get factors for bilinear interpolation
    Eigen::Vector2f factors(coords - indMin.cast<float>());

    int sizeX = concreteGridMap->getSizeX();

    int index = indMin[1] * sizeX + indMin[0];

    // get grid values for the 4 grid points surrounding the current coords. Check cached data first, if not contained
    // filter gridPoint with gaussian 
  • 13
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值