< >
Home » ROS与navigation教程 » ROS与navigation教程-amcl

ROS与navigation教程-amcl

ROS与navigation教程-amcl

说明:

  • 介绍amcl的概念和相关知识。

代码库

概要

  • amcl是一种机器人在2D中移动的概率定位系统。 它实现了自适应(或KLD采样)蒙特卡罗定位方法(如Dieter Fox所述),该方法使用粒子滤波器来针对已知地图跟踪机器人的位姿。

Algorithms

  • 在《Probabilistic Robotics》这书中,提及了许多的参数和算法。推荐读者阅读该书来获得更多相关信息。

  • 其中用到该书的算法有sample_motion_model_odometry, beam_range_finder_model, likelihood_field_range_finder_model, Augmented_MCL, and KLD_Sampling_MCL。

  • 基于目前现有的实现的话, 这个node仅能使用激光扫描和扫描地图来工作,但是可以进行扩展以使用其它传感器数据。

Example

  • 在base_scan topic上使用激光数据定位:
amcl scan:=base_scan

Nodes

( 1 ) amcl

  • amcl节点接收laser-based地图,激光扫描和tf变换信息,并且输出位姿评估。

  • 启动时,amcl根据提供的参数初始化其粒子滤波器。

  • 注意:如果没有设置参数,初始滤波器状态将是以(0,0,0)为中心的适中大小的粒子云。

( 1.1 ) Subscribed Topics

scan ([sensor_msgs/LaserScan][2]) 
  • 激光扫描。
tf ([tf/tfMessage][3]) 
  • tf变换信息。
initialpose ([geometry_msgs/PoseWithCovarianceStamped][4]) 
  • 用来初始化粒子滤波器的均值和协方差。
map ([nav_msgs/OccupancyGrid][5]) 
  • 当设置use_map_topic参数时,AMCL会订阅此话题来获取用于laser-based定位的地图。New in navigation 1.4.2.

( 1.2 ) Published Topics

amcl_pose ([geometry_msgs/PoseWithCovarianceStamped][6]) 
  • 机器人在地图上的带有协方差的预估位姿。
particlecloud ([geometry_msgs/PoseArray][7]) 
  • 粒子滤波器维护的预估位姿集合。
tf ([tf/tfMessage][8]) 
  • 发布里程(可以通过~odom_frame_id参数重新映射)到地图的变换。

( 1.3 ) Services

global_localization ([std_srvs/Empty][9]) 
  • 初始化全局定位,其中所有粒子随机分布在地图中的自由空间中。
request_nomotion_update ([std_srvs/Empty][10]) 
  • 用于手动执行更新和发布更新的粒子。

( 1.4 ) Services Called

static_map ([nav_msgs/GetMap][11])
  • amcl调用此服务来获取laser-based定位的地图; 从该服务获取地图的启动模块。

  • amcl calls this service to retrieve the map that is used for laser-based localization; startup blocks on getting the map from this service.

( 1.5 ) Parameters

ROS参数可以使用三种类型来配置amcl节点:verall filter, laser model, 和 odometery model。

Overall filter 参数

~min_particles (int, default: 100) 
  • 允许的最少粒子数。
~max_particles (int, default: 5000) 
  • 允许的最多粒子数。
~kld_err (double, default: 0.01) 
  • 实际分布与估计分布之间的最大误差。
~kld_z (double, default: 0.99) 
  • Upper standard normal quantile for (1 - p), where p is the probability that the error on the estimated distrubition will be less than kld_err.
~update_min_d (double, default: 0.2 meters) 
  • 执行更新过滤器操作之前需要进行平移运动。
~update_min_a (double, default: π/6.0 radians) 
  • 执行更新滤波器操作之前需要进行旋转运动。
~resample_interval (int, default: 2) 
  • 重新采样前需要的滤波器到更新次数。
~transform_tolerance (double, default: 0.1 seconds) 
  • Time with which to post-date the transform that is published, to indicate that this transform is valid into the future.
~recovery_alpha_slow (double, default: 0.0 (disabled)) 
  • slow average weight滤波器的指数衰减率,用于决定何时通过添加随机位姿进行恢复。

  • 建议设置为0.001。

  • Exponential decay rate for the slow average weight filter, used in deciding when to recover by adding random poses. A good value might be 0.001.

~recovery_alpha_fast (double, default: 0.0 (disabled)) 
  • fast average weight滤波器的指数衰减率,用于决定何时通过添加随机位姿进行恢复。

  • 建议设置为0.1。

  • Exponential decay rate for the fast average weight filter, used in deciding when to recover by adding random poses. A good value might be 0.1.

~initial_pose_x (double, default: 0.0 meters) 
  • 初始位姿mean(x),用于初始化高斯分布的滤波器。
~initial_pose_y (double, default: 0.0 meters) 
  • 初始位姿mean(y),用于初始化高斯分布的滤波器。
~initial_pose_a (double, default: 0.0 radians) 
  • 初始位姿mean(yaw),用于初始化高斯分布的滤波器。

~initial_cov_xx (double, default: 0.5*0.5 meters)

  • 初始位姿covariance (x*x) ,用于初始化高斯分布的滤波器。
~initial_cov_yy (double, default: 0.5*0.5 meters) 
  • 初始位姿covariance (y*y) ,用于初始化高斯分布的滤波器。
~initial_cov_aa (double, default: (π/12)
  • 初始位姿covariance (yaw*yaw) ,用于初始化高斯分布的滤波器。
~gui_publish_rate (double, default: -1.0 Hz) 
  • 指定最大可用多大速率(Hz)扫描并发布用于可视化的路径。

  • 若设置为-1.0,则表示为禁用。

~save_pose_rate (double, default: 0.5 Hz) 
  • 指定在 ~initial_pose_* and ~initial_cov_*变量存储的上次预估的位姿和协方差到参数服务器的最大速率 (Hz)。保存的位姿会在后面初始化滤波器时候使用。

  • 若设置为-1.0,则表示为禁用。

~use_map_topic (bool, default: false) 
  • 若为true,AMCL将订阅地图话题,而不是进行服务调用来获取其地图。New in navigation 1.4.2.
~first_map_only (bool, default: false) 
  • 若为true,AMCL将使用订阅到的第一个地图,不会使用每次更新获取的新地图。New in navigation 1.4.2.

Laser model 参数

注意:无论使用什么混合权重,权重加总应该等于1。beam model使用了所有的4种权重: z_hit, z_short, z_max, 和 z_rand。likelihood_field model仅仅使用了2种: z_hit 和 z_rand。

~laser_min_range (double, default: -1.0) 
  • 指定最小的扫描范围。

  • 若设置为-1.0,则表示使用已报告的激光的最小范围。

~laser_max_range (double, default: -1.0) 
  • 指定最大的扫描范围。

  • 若设置为-1.0,则表示使用已报告的激光的最大范围。

~laser_max_beams (int, default: 30) 
  • 在更新滤波器时,每次扫描中使用多少个均匀分布的beam。
~laser_z_hit (double, default: 0.95) 
  • 模型的z_hit部分的混合权重。
~laser_z_short (double, default: 0.1) 
  • 模型的z_short部分的混合权重。
~laser_z_max (double, default: 0.05) 
  • 模型的z_max部分的混合权重。
~laser_z_rand (double, default: 0.05) 
  • 模型的z_rand部分的混合权重。
~laser_sigma_hit (double, default: 0.2 meters) 
  • 在z_hit部分模型中使用的高斯模型的标准差。
~laser_lambda_short (double, default: 0.1) 
  • 模型中z_short部分的指数衰减参数。
~laser_likelihood_max_dist (double, default: 2.0 meters) 
  • 在地图上进行障碍物膨胀的最大距离,用于likelihood_field模型。
~laser_model_type (string, default: "likelihood_field") 
  • 需要用到哪种模型, either beam, likelihood_field, or likelihood_field_prob (same as likelihood_field but incorporates the beamskip feature, if enabled). 。

Odometry model 参数

如果~odom_model_type参数设置为“diff”,则使用《Probabilistic Robotics》p136中的sample_motion_model_odometry算法; 正如本书中所定义一样,该模型使用odom_alpha_1到odom_alpha_4的噪声参数。

如果~odom_model_type参数设置为“omni”,那么使用自定义模型用于omni-directional 基座,该模型使用odom_alpha_1到odom_alpha_5的噪声参数。前4个参数类似于“diff”模型,第5个参数用于捕获机器人在垂直于前进方向的位移(没有旋转)趋势。

~odom_model_type (string, default: "diff") 
  • 需要使用哪个模型,either "diff", "omni", "diff-corrected" or "omni-corrected"。
~odom_alpha1 (double, default: 0.2) 
  • 基于机器人运动旋转分量,来指定里程旋转估计中预期的噪声。

  • Specifies the expected noise in odometry's rotation estimate from the rotational component of the robot's motion.

~odom_alpha2 (double, default: 0.2) 
  • 基于机器人运动旋转分量,来指定里程平移估计中预期的噪声。

  • Specifies the expected noise in odometry's rotation estimate from translational component of the robot's motion.

~odom_alpha3 (double, default: 0.2)
  • 基于机器人运动平移分量,来指定里程平移估计中预期的噪声。

  • Specifies the expected noise in odometry's translation estimate from the translational component of the robot's motion.

~odom_alpha4 (double, default: 0.2) 
  • 基于机器人运动平移分量,来指定里程旋转估计中预期的噪声。

  • Specifies the expected noise in odometry's translation estimate from the rotational component of the robot's motion.

    ~odom_alpha5 (double, default: 0.2)

  • Translation-related noise parameter (only used if model is "omni").
~odom_frame_id (string, default:"odom")
  • 里程计使用的坐标系。
~base_frame_id (string, default: "base_link") 
  • 移动基座使用的坐标系。
~global_frame_id (string, default:"map")
  • 由定位系统发布的坐标系的名称。
~tf_broadcast (bool, default: true) 
  • 但若设置为false,则可防止amcl在全局坐标系和里程计坐标系之间发布tf变换。

( 1.6 ) Transforms

  • amcl要把进来的激光扫描信息转换到里程坐标系 (~odom_frame_id)。因此,tf树中必定会存在一条从发布激光的坐标系到里程坐标系的路径。

  • 实现细节:在接收到第一次激光扫描时,amcl查找激光坐标系和基座坐标系(~base_frame_id)之间的的变换,并将其永久锁存(latches it forever)。 所以amcl不能处理相对于基地移动的激光。

  • 下图显示了使用里程计和amcl的定位的区别。 在操作期间,amcl评估了相对于全局坐标系(~global_frame_id)的基座坐标系(~base_frame_id)的变换,但它仅在全局坐标系和里程计坐标系(~odom_frame_id)之间发布变换。 本质上,这种变换解释了使用“Dead Reckoning”进行的累计漂移。 AMCL发布的转换可能带有未来时间戳,但是对AMCL来说是有效的。

请输入图片描述

参考资料

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros与navigation教程