Hector SLAM算法学习与代码解析

本文详细介绍了Hector SLAM算法的学习过程,包括Occupancy Grid Map、Map Access、Scan Matching和Multi-Resolution Map Representation。通过双线性插值方法评估激光点在栅格地图中的匹配程度,并通过迭代匹配优化位姿增量。文章还讨论了算法的局限性,如双线性插值的不连续性和缺乏地图修正能力。同时提到了Cartographer的三线性差值改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 and store in ca
### Hector SLAM 算法流程 Hector SLAM 的核心在于通过激光扫描数据来创建环境的地图并估计机器人的位置。该过程主要依赖于激光测距仪提供的精确距离测量,利用这些数据进行地图构建和定位。 #### 主要步骤概述: 1. **初始化** - 启动ROS节点,并加载必要的参数配置文件。 - 初始化内部状态变量以及所需的数据结构用于存储地图信息。 2. **获取传感器读数** - 定期接收来自激光雷达的扫描消息。 - 对原始数据进行预处理,去除噪声点或异常值。 3. **特征提取配准** - 提取每次扫描中的显著几何特性作为匹配依据。 - 将新获得的一组激光点云同已有地图上的对应部分做对比分析,计算两者之间的相对位姿变化量。 4. **优化求解器应用** - 构造目标函数表示两帧之间差异程度最小化问题。 - 使用高斯-牛顿迭代方法寻找使误差平方和达到极小的最佳平移旋转矩阵[^2]。 5. **更新全局坐标系下的地图表达** - 把最新的观测结果融入到累积形成的环境中去。 - 维护一个不断增长且自洽的世界模型描述。 6. **发布姿态估计** - 输出机器人当前位置的姿态信息给其他订阅者使用。 7. **循环执行上述操作直到任务结束** 下面是基于以上说明绘制的一个简化版Hector SLAM算法流程图: ```mermaid graph TD; A[启动ROS节点] --> B{接收到新的<br>激光扫描?}; B ----> C[预处理数据]; C --> D[特征提取]; D --> E[配准当前帧<br>至现有地图]; E --> F[运行GN优化]; F --> G[更新地图]; G --> H[广播最新位姿]; H --> I[等待下一周期]; I --> B; B ----> J[继续监听]; J --> I; ``` 此图表展示了从启动到完成一次完整的SLAM循环所经历的主要阶段及其相互关系。需要注意的是实际实现可能会更加复杂一些,涉及到更多细节和技术考量。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值