问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ROS应用之AMCL 自适应采样

创作时间:
作者:
@小白创作中心

ROS应用之AMCL 自适应采样

引用
CSDN
1.
https://blog.csdn.net/weixin_68094467/article/details/144984462

前言
AMCL(Adaptive Monte Carlo Localization)是ROS中实现机器人自定位的重要算法之一。自适应采样(Adaptive Sampling)是AMCL中一个关键的优化机制,用于动态调整粒子数量以提高定位的效率和精度。在传统粒子滤波中,粒子的数量是固定的,而在AMCL中,通过自适应采样机制,粒子数量可以根据机器人的不确定性动态变化,使得算法在资源利用和定位精度之间取得平衡。
本文将围绕AMCL的自适应采样展开详细讨论,包括其原理、实现方法、部署步骤和代码解析,并通过运行示例展示其效果。

原理介绍

  1. 基本概念
    自适应采样的核心思想是:根据机器人当前状态的不确定性,动态调整粒子的数量
  • 当机器人位姿的不确定性较大时(如初始定位阶段或粒子分布发散阶段),需要更多粒子来覆盖更大的搜索空间。
  • 当位姿的不确定性较小时(如定位已收敛),减少粒子数量以节省计算资源。
  1. 整体流程
    自适应采样的过程主要分为以下几个阶段:

  2. 估计不确定性:通过计算粒子权重分布的方差或熵,量化机器人当前的定位不确定性。

  3. 调整粒子数量:根据不确定性的大小,动态改变粒子的数量,使其与当前定位精度需求相匹配。

  4. 粒子重新采样:根据新的粒子数量和权重分布,生成新的粒子集。

  5. 迭代更新:继续进行AMCL的运动更新和传感器更新,直到定位收敛。

  6. 关键特点

  • 高效性:通过动态调整粒子数量,在降低计算开销的同时保持定位精度。
  • 鲁棒性:能够适应机器人在复杂环境中定位精度的需求变化。
  • 动态性:粒子数量随定位状态实时变化,避免固定粒子数带来的过高或过低计算负担。
  1. 算法流程
    自适应采样的算法流程如下:

  2. 粒子权重归一化: 对所有粒子的权重进行归一化计算,确保总权重为1:

    其中,wi是粒子 i 的权重,N 是当前粒子的数量。

  3. 计算有效粒子数量: 使用粒子权重的有效粒子数量公式:

    这里的 Neff 用于量化粒子权重的集中程度。当 Neff 较小时,说明粒子权重高度集中,机器人位姿不确定性较大。

  4. 调整粒子数量: 根据 Neff 和设定的最小、最大粒子数量阈值(如100和500),动态调整当前粒子数量 N。

  5. 重新采样: 使用重采样算法(如系统重采样或低方差重采样)生成新的粒子集。

  6. 迭代更新: 将新的粒子集带入AMCL的后续步骤(运动更新和传感器更新),继续优化定位结果。

部署环境介绍

  1. ROS 版本:支持ROS1(Melodic、Noetic)和ROS2(Foxy、Humble)。
  2. 硬件环境:支持差速驱动机器人(如TurtleBot3),需要搭载激光雷达和里程计。
  3. 依赖库
  • amcl 软件包(自带在 ROS 的 navigation 栈中)
  • RViz(用于可视化)

部署流程

  1. 安装依赖: 安装 ROS 的 navigation 包:
sudo apt-get install ros-${ROS_DISTRO}-navigation
  1. 配置机器人环境: 使用适配的机器人 URDF 文件,确保机器人拥有里程计(/odom)、激光雷达(/scan)和静态地图(/map)。

  2. 启动AMCL节点: 启动AMCL节点:

roslaunch turtlebot3_navigation turtlebot3_navigation.launch
  1. 调整参数: 在AMCL配置文件中,确保启用了自适应采样功能:
min_particles: 100
max_particles: 500
kld_err: 0.01
kld_z: 0.99

代码示例

以下代码展示了AMCL中自适应采样的关键实现部分(基于ROS源码):

1.自适应采样核心逻辑

// AMCL 源码: pf_kdtree.cpp
int pf_resample_limit(pf_t *pf)
{
 int max_samples = pf->max_samples;
 int min_samples = pf->min_samples;
 double kld_err = pf->kld_err;
 double kld_z = pf->kld_z;
 // 粒子数调整
 int new_particle_count = min_samples;
 double sum_weight = 0.0;
 for (int i = 0; i < pf->current_particles; i++)
 {
 double p = pf->particles[i].weight / sum_weight;
 sum_weight += p * p;
 }
 // 计算 N_eff
 double n_eff = 1.0 / sum_weight;
 if (n_eff < kld_err)
 {
 new_particle_count = std::min(new_particle_count + 100, max_samples);
 }
 return new_particle_count;
}

代码解读

  1. 函数输入与输出
  • pf_resample_limit 函数根据当前的粒子权重和不确定性计算粒子数量。
  • 输入:当前粒子集 pf 。
  • 输出:调整后的粒子数量。
  1. 有效粒子数计算: 使用粒子权重平方和的倒数
    来估计有效粒子数量。

  2. 动态调整逻辑

  • 当 Neff 较小时(说明不确定性较大),增加粒子数量。
  • 当 Neff 较大时(说明定位已收敛),减少粒子数量。
  1. 粒子数量上下限
  • 使用 min_samples 和 max_samples 限制粒子数量范围,避免资源过度使用或粒子不足。

运行效果说明

运行AMCL自适应采样功能时,其效果主要体现在粒子数量的动态调整和定位精度的变化上。以下从多个角度详细说明运行效果,包括可视化工具、日志输出、资源使用、定位精度对比等,帮助全面理解AMCL自适应采样的实际表现。

1. 粒子数量的动态变化

RViz 可视化
在运行AMCL时,RViz可以动态展示粒子的分布和数量变化:

  • 初始阶段:

  • 在机器人刚启动或刚放置在未知环境时,不确定性最高。

  • 粒子会均匀分布在地图中的所有可能区域,形成一个密集的粒子云。

  • 此时粒子数量接近最大值( max_particles ,例如500个),确保覆盖所有可能的位置。

  • 收敛阶段:

  • 随着机器人运动,激光扫描数据与地图匹配逐渐增加,粒子逐渐集中在一个位置附近。

  • AMCL会减少粒子数量(如减少到200个左右),在保持精度的前提下减少计算资源开销。

  • 动态环境变化阶段:

  • 当机器人进入较复杂的环境(如窄通道、动态障碍物)或发生大幅运动(如旋转90度)时,不确定性增加。

  • AMCL会根据需求再次增加粒子数量,以保证定位的可靠性。

RViz 中的效果示例:

  • 蓝色的点表示粒子分布,可以看到粒子数量在不同阶段发生明显变化。
  • 当机器人处于稳定运动时,粒子云较小且集中;在定位不确定性增加时,粒子云范围会扩大。

粒子数量对比
通过终端日志输出,可以看到粒子数量的实时调整。例如:

[INFO] Particle count: 500 (Initial localization)
[INFO] Particle count: 400 (Exploration phase)
[INFO] Particle count: 200 (Converged localization)
[INFO] Particle count: 350 (Dynamic environment detected)
[INFO] Particle count: 250 (Stable phase)

粒子数量的动态调整不仅反映了环境变化,也表明自适应采样机制的有效性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号