【ROS】AMCL 定位节点
【ROS】AMCL 定位节点
前言
本文将介绍 ROS 导航系统中的一个关键外部节点 —— AMCL 定位节点。
该节点主要基于以下信息进行定位:
map_server提供的静态地图- 当前时刻激光雷达发布的
/scan数据 - 底盘提供的
/odom里程计数据 - 各传感器间的 TF 坐标关系
AMCL 使用其内置的自适应蒙特卡洛算法,融合上述信息,实时估算机器人在地图中的精确位置和姿态,最终通过 TF 广播出 map → base_link 的坐标变换。
我的环境:
本教程使用的环境是:实体 ROS 小车,Ubuntu 18.04,ROS1 Melodic
参考资料:
AMCL 定位算法概述
AMCL 全称为 Adaptive Monte Carlo Localization(自适应蒙特卡洛定位算法),是一种基于粒子滤波的定位方法,主要用于在已知地图中估算机器人自身的位置。
该算法通过融合 里程计数据 和 激光雷达传感器信息,不断对机器人在地图中的位姿进行修正与优化。
关于 AMCL 算法的基本原理,建议参考以下视频中 第 1–5 分钟 的讲解内容,本文不再赘述:
AMCL 定位节点的参数
AMCL 是 ROS 导航系统中负责定位的核心模块。要想顺利实现导航功能,首先必须确保 AMCL 能够稳定、准确地估算出机器人当前的位姿。因此,合理配置 AMCL 的相关参数是导航系统运行前的重要准备工作。
参数类型
AMCL 支持丰富的参数配置,详见官方文档:
🔗 ROS Wiki - AMCL(3.1.5 参数小节)
实际使用中,我们通常直接在 AMCL 的启动文件(.launch 文件)中修改参数。ROS 官方提供了以下三种模板:
amcl.launch:通用模板,适用于各种底盘类型。amcl_diff.launch:针对**差速驱动(diff drive)**机器人优化。amcl_omni.launch:针对**全向轮(omni drive)**机器人优化。
调参建议
推荐根据机器人底盘类型,选择 amcl_diff.launch 或 amcl_omni.launch 作为调参起点。模板文件地址如下:
🔗 navigation/amcl/examples
调试时,可通过 rviz 观察以下内容,以判断定位效果:
- TF 树中
map → base_link的实时变化情况 - AMCL 粒子群的收敛速度与分布状态
一旦参数调试完成,配置良好的 .launch 文件即可直接用于 AMCL 节点的启动,是实现稳定导航的前提条件之一。
TF 机制说明
在 ROS Wiki - AMCL 的 3.1.6 小节中,介绍了 AMCL 节点与里程计(odom)在 TF 框架中的关系,其 TF 输出机制如图所示:

TF 发布逻辑
- AMCL 节点 负责发布
map → odom的 TF。 - 里程计系统(通常由底盘驱动节点发布)负责发布
odom → base_footprint或odom → base_link的 TF。 - 两者组合形成最终的
map → base_linkTF,用于表示机器人在全局地图中的位姿。
TF 特性说明
-
map → odom:- 由 AMCL 粒子滤波算法实时估算得出。
- 由于粒子分布更新的离散性,该 TF 会发生跳变,表现为 RViz 中小车位置偶尔“闪烁”或“跳动”。
- 这种跳变是算法正常行为的一部分,代表位姿估计的不确定性和粒子集的重采样。
-
odom → base_link(或base_footprint):- 由机器人里程计连续计算生成,变化平滑、连续,不会出现跳变。
- 此 TF 在构建**局部代价地图(costmap)**时也会被使用,因其具备良好的时间连续性。
总结
AMCL 输出的 map → odom TF 提供了机器人在全局地图中的定位参考,而里程计输出的 odom → base_link TF 则确保了短时间内的运动估计连续性。二者结合,使导航系统在实现局部稳定性与全局收敛性之间达到平衡。
示例配置:amcl_omni.launch(适用于全向轮 / 麦轮底盘)
下面是一个适用于全向轮机器人的 AMCL 启动文件示例。该配置基于 ROS 官方提供的模板,并设置了常用参数,可直接用于实际调试或作为参数优化的基础:
<launch>
<node pkg="amcl" type="amcl" name="amcl">
<!-- 选择全向轮定位模型 -->
<param name="odom_model_type" value="omni"/>
<!-- 里程计噪声参数(根据实际情况调整) -->
<param name="odom_alpha1" value="0.2"/>
<param name="odom_alpha2" value="0.2"/>
<param name="odom_alpha3" value="0.8"/>
<param name="odom_alpha4" value="0.2"/>
<param name="odom_alpha5" value="0.1"/>
<!-- 粒子滤波器相关参数 -->
<param name="min_particles" value="500"/>
<param name="max_particles" value="5000"/>
<param name="kld_err" value="0.05"/>
<param name="kld_z" value="0.99"/>
<!-- 激光模型设置 -->
<param name="laser_model_type" value="likelihood_field"/>
<!-- <param name="laser_model_type" value="beam"/> -->
<param name="laser_max_beams" value="30"/>
<param name="laser_z_hit" value="0.5"/>
<param name="laser_z_short" value="0.05"/>
<param name="laser_z_max" value="0.05"/>
<param name="laser_z_rand" value="0.5"/>
<param name="laser_sigma_hit" value="0.2"/>
<param name="laser_lambda_short" value="0.1"/>
<param name="laser_likelihood_max_dist" value="2.0"/>
<!-- 更新频率与位姿变化阈值 -->
<param name="update_min_d" value="0.2"/>
<param name="update_min_a" value="0.5"/>
<param name="resample_interval" value="1"/>
<!-- 其他设置 -->
<param name="odom_frame_id" value="odom"/>
<param name="transform_tolerance" value="0.1"/>
<param name="gui_publish_rate" value="10.0"/>
<param name="recovery_alpha_slow" value="0.0"/>
<param name="recovery_alpha_fast" value="0.0"/>
</node>
</launch>
使用说明
我们可以通过以下两种方式启动该 AMCL 节点:
-
直接启动:
roslaunch your_package_name amcl_omni.launch -
嵌入其他启动文件中:
<include file="$(find your_package_name)/launch/amcl_omni.launch"/>
该配置文件既可独立运行 AMCL 节点,也可以被集成到更复杂的导航系统 launch 文件中。
RViz 中查看 AMCL 粒子群
在 RViz 中添加 PoseArray 并订阅 /particlecloud 话题,即可直观查看 AMCL 的粒子定位效果。
更多推荐
所有评论(0)