Hector-SLAM 作为激光SLAM算法,主要适用于那些需要快速反应且计算资源有限的场景,比如室内机器人(如扫地机器人、仓储AGV)、手持设备建图、无人机(需IMU) 等结构化或半结构化环境,且场景不太大(回环问题不突出)的情况。本文从核心原理、数学推导开始,带你一步步理解它,并分享一些实践的经验。
Hector-SLAM 的核心思想是通过优化当前激光扫描数据与已有地图的匹配程度来直接估计机器人的位姿(位置和姿态),它不依赖轮式里程计 ,这使得它特别适合应用于地面不平坦(如无人机)或轮子打滑导致里程计不可靠的场景。
其大致流程可概括为以下几个步骤,这构成了算法的主循环:

2. 数学推导Hector-SLAM 的关键在于扫描匹配,其目标是找到一个机器人位姿

(即 x、y 坐标和偏航角),使得当前激光扫描的所有点映射到全局地图上时,与已有障碍物重合的概率最大。
为了量化“匹配程度”,我们构建了以下目标函数(代表当前帧雷达数据占据地图的概率):

其中:

目标函数 M(Si(ξ))是非线性的,使用高斯牛顿法来求解,先对目标函数进行一阶泰勒展开实现线性化:

为了最小化 E(ξ+Δξ),令其关于 Δξ 的导数为零,经过推导,可以得到如下方程:

然后更新位姿估计:ξ=ξ+Δξ,重复此过程直至收敛(如 Δξ 足够小)。
栅格地图是离散的,对于变换后的点 Si(ξ),找到它所在栅格周围最近的四个点 P00,P10,P01,P11,Hector-SLAM 使用这些点的占用值双线性插值(拉格朗日2次插值),得出 Si(ξ) 处的占用值 M(Si(ξ))(点(x,y)的栅格值)和梯度 ∇M(Si (ξ)),其中梯度 ∇M(Si(ξ))是一个关于地图坐标 (x,y) 的梯度向量,通过栅格值分别对x与y求偏导得到,即

这使得我们在离散的地图上获得了连续可导的近似,从而能够应用优化算法。
了解原理后,在实践中硬件选择与注意事项
ROS中的关键参数说明
参数名 | 含义及调优建议 |
|---|---|
~map_update_distance_thresh | 机器人移动超过此距离(米)才更新地图。建图时调小(如0.1) 以提高地图细节;导航时调大(如0.4) 以减少计算量。 |
~map_update_angle_thresh | 机器人旋转超过此角度(弧度)才更新地图。同上,平衡更新频率和计算量。 |
~map_resolution | 地图分辨率(米/像素)。分辨率越高(值越小),地图越精细,但计算量越大,且更易陷入局部极小。Hector采用多分辨率地图克服此问题,先在低分辨率地图匹配,再逐步细化。 |
~update_factor_free / ~update_factor_occupied | 地图更新时,空闲栅格和占用栅格的概率更新因子。通常使用默认值即可,除非环境非常特殊。 |
优点 | 缺点 |
|---|---|
不依赖里程计,可在轮子打滑、空中平台等场景工作 | 无回环检测,累积误差无法消除,不适用于大范围回环场景。 |
计算效率相对较高(与粒子滤波类方法比),资源消耗更可控。 | 对初值敏感。若运动过快或机器人位姿初值给得不准,易匹配失败(需IMU或运动预测辅助)。 |
建图精度高,在中小型室内环境表现优异。 | 严重依赖高频率、高质量的激光雷达。激光数据若失真,性能急剧下降。 |