前言

本文将介绍 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.launchamcl_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_footprintodom → base_link 的 TF。
  • 两者组合形成最终的 map → base_link TF,用于表示机器人在全局地图中的位姿。

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 节点:

  1. 直接启动:

    roslaunch your_package_name amcl_omni.launch
    
  2. 嵌入其他启动文件中:

    <include file="$(find your_package_name)/launch/amcl_omni.launch"/>
    

该配置文件既可独立运行 AMCL 节点,也可以被集成到更复杂的导航系统 launch 文件中。

RViz 中查看 AMCL 粒子群

在 RViz 中添加 PoseArray 并订阅 /particlecloud 话题,即可直观查看 AMCL 的粒子定位效果。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐