amcl说明

介绍
文章中使用下面算法:sample_motion_model_odometry, beam_range_finder_model, likelihood_field_range_finder_model, Augmented_MCL, 和 KLD_Sampling_MCL.
amcl读入激光地图,激光扫描数据,和tf变换信息,并且输出位姿估计。启动时,amcl根据提供的参数初始化粒子滤波器。注意,由于默认,如果没有参数被设置,初始的滤波器状态将适度地标定粒子点云中心在(0,0,0) 。

1. 参数配置说明

<launch>
  <node pkg="amcl" type="amcl" name="amcl" output="screen">
    <!-- Publish scans from best pose at a max of 10 Hz -->

    //全部滤波器参数
    <param name="min_particles" value="500"/>   //允许的粒子数量的最小值,默认100
    <param name="max_particles" value="5000"/> //允许的例子数量的最大值,默认5000
    <param name="kld_err" value="0.05"/>    //真实分布和估计分布之间的最大误差,默认0.01
    <param name="kld_z" value="0.99"/>   //上标准分位数(1-p),其中p是估计分布上误差小于kld_err的概率,默认0.99
    <param name="update_min_d" value="0.2"/>   //在执行滤波更新前平移运动的距离,默认0.2m
    <param name="update_min_a" value="0.5"/>   //执行滤波更新前旋转的角度,默认pi/6 rad
    <param name="resample_interval" value="1"/>   //在重采样前需要的滤波更新的次数,默认2
    <param name="transform_tolerance" value="0.1"/>  //tf变换发布推迟的时间,为了说明tf变换在未来时间内是可用的
    <param name="recovery_alpha_slow" value="0.0"/> //慢速的平均权重滤波的指数衰减频率,用作决定什么时候通过增加随机位姿来recover,默认0(disable),可能0.001是一个不错的值
    <param name="recovery_alpha_fast" value="0.0"/>  //快速的平均权重滤波的指数衰减频率,用作决定什么时候通过增加随机位姿来recover,默认0(disable),可能0.1是个不错的值
    <param name="gui_publish_rate" value="10.0"/>  //扫描和路径发布到可视化软件的最大频率,设置参数为-1.0意为失能此功能,默认-1.0
    <param name="save_pose_rate" value="0.5"/>  //存储上一次估计的位姿和协方差到参数服务器的最大速率。被保存的位姿将会用在连续的运动上来初始化滤波器。-1.0失能。
    <param name="use_map_topic" value="false"/>  //当设置为true时,AMCL将会订阅map话题,而不是调用服务返回地图。也就是说,当设置为true时,有另外一个节点实时的发布map话题,也就是机器人在实时的进行地图构建,并供给amcl话题使用;当设置为false时,通过map server,也就是调用已经构建完成的地图。在navigation 1.4.2中新加入的参数。
    <param name="first_map_only" value="false"/>  //当设置为true时,AMCL将仅仅使用订阅的第一个地图,而不是每次接收到新的时更新为一个新的地图,在navigation 1.4.2中新加入的参数。

    //激光模型参数
    <param name="laser_min_range" value="-1.0"/>  //被考虑的最小扫描范围;参数设置为-1.0时,将会使用激光上报的最小扫描范围
    <param name="laser_max_range" value="-1.0"/>  //被考虑的最大扫描范围;参数设置为-1.0时,将会使用激光上报的最大扫描范围
    <param name="laser_max_beams" value="30"/>   //更新滤波器时,每次扫描中多少个等间距的光束被使用
    <param name="laser_z_hit" value="0.5"/> //模型的z_hit部分的最大权值,默认0.95
    <param name="laser_z_short" value="0.05"/> //模型的z_short部分的最大权值,默认0.1
    <param name="laser_z_max" value="0.05"/> //模型的z_max部分的最大权值,默认0.05
    <param name="laser_z_rand" value="0.5"/> //模型的z_rand部分的最大权值,默认0.05
    <param name="laser_sigma_hit" value="0.2"/> //被用在模型的z_hit部分的高斯模型的标准差,默认0.2m
    <param name="laser_lambda_short" value="0.1"/> //模型z_short部分的指数衰减参数,默认0.1
    <param name="laser_likehood_max_dist" value="2.0"/> //地图上做障碍物膨胀的最大距离,用作likehood_field模型
    <param name="laser_model_type" value="likelihood_field"/> //模型使用,可以是beam, likehood_field, likehood_field_prob(和likehood_field一样但是融合了beamskip特征),默认是“likehood_field”    

    //里程计模型参数
    <param name="odom_model_type" value="diff"/> //模型使用,可以是"diff", "omni", "diff-corrected", "omni-corrected",后面两  个是对老版本里程计模型的矫正,相应的里程计参数需要做一定的减小
    <param name="odom_alpha1" value="0.2"/> //指定由机器人运动部分的旋转分量估计的里程计旋转的期望噪声,默认0.2
    <param name="odom_alpha2" value="0.2"/> //制定由机器人运动部分的平移分量估计的里程计旋转的期望噪声,默认0.2
    <!-- translation std dev, m -->
    <param name="odom_alpha3" value="0.8"/> //指定由机器人运动部分的平移分量估计的里程计平移的期望噪声,默认0.2
    <param name="odom_alpha4" value="0.2"/> //指定由机器人运动部分的旋转分量估计的里程计平移的期望噪声,默认0.2
    <param name="odom_alpha5" value="0.1"/> //平移相关的噪声参数(仅用于模型是“omni”的情况)
    <param name="odom_frame_id" value="odom"/>  //里程计默认使用的坐标系
    <param name="base_frame_id" value="base_link"/>  //用作机器人的基坐标系
    <param name="global_frame_id" value="map"/>  //由定位系统发布的坐标系名称
    <param name="tf_broadcast" value="true"/>  //设置为false阻止amcl发布全局坐标系和里程计坐标系之间的tf变换

    //机器人初始化数据设置
    <param name="initial_pose_x" value="0.0"/> //初始位姿均值(x),用于初始化高斯分布滤波器。
    <param name="initial_pose_y" value="0.0"/> //初始位姿均值(y),用于初始化高斯分布滤波器。
    <param name="initial_pose_a" value="0.0"/> //初始位姿均值(yaw),用于初始化高斯分布滤波器。
    <param name="initial_cov_xx" value="0.5*0.5"/> //初始位姿协方差(x*x),用于初始化高斯分布滤波器。
    <param name="initial_cov_yy" value="0.5*0.5"/> //初始位姿协方差(y*y),用于初始化高斯分布滤波器。
    <param name="initial_cov_aa" value="(π/12)*(π/12)"/> //初始位姿协方差(yaw*yaw),用于初始化高斯分布滤波器。
  </node>
</launch>

Note:初始位置和初始方差也可在此文件中声明。

2. 订阅的话题
scan(sensor_msgs/LaserScan):激光扫描

tf(tf/tfMessage Message) :tf变换

Initialpose(geometry_msgs/PoseWithCovarianceStamped):用作初始化粒子滤波的均值和协方差

map(nav_msgs/OccupancyGrid):当 use_map_topic 被设置时,AMCL订阅这个话题来获得用作激光定位的地图

3. 发布的话题

amcl_pose(geometry_msgs/PoseWithCovarianceStamped):在地图中机器人的估计位姿,带有标准差。

particlecloud(geometry_msgs/PoseArray):被滤波器操控的机器人位姿集

tf(tf/tfMessage Message):发布从里程计到地图的tf变换(能够通过参数odom_frame_id参数映射)

4. 服务

global_localization(std_srvs/Empty):初始化全局定位,然而所有例子被随机撒在地图中的无障碍区域

5. 调用的服务

static_map(nav_msgs/GetMap):amcl调用服务获得地图用作基于激光的定位;启动块在从这个服务获得地图

6. TF变换

amcl变换引入激光扫描到里程计坐标系(odom_frame_id)。所以就必须存在一条路径从激光发布的坐标系经过tf树到里程计坐标系。

执行细节是:在第一次激光扫描接收后,amcl查询激光坐标系和base坐标系之间的变换,并且永久绑定它。所以amcl不能处理激光坐标系相对于base运动的情况。

下列图片显示使用里程计定位和AMCL定位之间的区别。在操作期间,amcl估计base坐标系相对于全局坐标系之间的变换,但是它仅仅发布全局坐标系和里程计坐标系之间的变换。更重要的是,这个变换考虑了航迹推算过程中发生的漂移。

这里写图片描述

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值