ROS2(二) - nav2_amcl节点概况

AMCL是一种针对二维移动机器人的概率定位系统,实现自适应蒙特卡罗定位方法,使用粒子滤波器进行机器人姿态跟踪。算法包括motion model、range finder model等,通过订阅激光扫描、tf转换和地图信息,输出带协方差的机器人姿态估计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

算法

从Probabilistic Robotics书中的算法

  • sample_motion_model_odometry
  • beam_range_finder_model
  • likelihood_field_range_finder_model
  • Augmented_MCL, and KLD_Sampling_MCL

amcl接收基于激光的地图,激光扫描数据和tf转换消息,并输出姿态估计pose estimates。启动时,AMCL根据提供的参数初始化其粒子过滤器。请注意,由于默认设置,如果未设置任何参数,则初始过滤状态将是以(0,0,0)为中心的中等大小的粒子云

订阅的主题

  • scan (sensor_msgs/LaserScan)
    Laser scans.转换到odom_frame_id
  • (tf/tfMessage)
    Transforms.
  • initialpose (geometry_msgs/PoseWithCovarianceStamped)
    Mean and covariance with which to (re-)initialize the particle filter.用于(重新)初始化粒子滤波器的平均值和协方差
  • map (nav_msgs/OccupancyGrid)
    When the use_map_topic parameter is set, AMCL subscribes to this topic to retrieve the map used for laser-based localization. 当设置了use_map_topic参数时,AMCL订阅此主题以检索用于基于激光的本地化的映射

发布的主题

  • amcl_pose (geometry_msgs/PoseWithCovarianceStamped)
    Robot’s estimated pose in the map, with covariance.机器人在地图上的估计姿态,具有协方差后验位姿和一个6*6的协方差矩阵(xyz+三个转角)
  • particlecloud (geometry_msgs/PoseArray)
    The set of pose estimates being maintained by the filter.由过滤器维护的姿态估计集合。粒子位姿的数组
  • tf (tf/tfMessage)
    Publishes the transform from odom (which can be remapped via the ~odom_frame_id parameter) to map. 发布从odom到map的transform。

服务

  • global_localization(std_srvs / Empty)
    启动全局定位,其中所有粒子随机分散通过地图中的自由空间。没有给定初始位姿的情况下在全局范围内初始化粒子位姿。callback调用pf_init_model,然后调用uniformPseGenerator,在地图上随机生成pf -> max_samples个粒子。
  • request_nomotion_update:没有运动模型更新的情况下也更新粒子群。
  • dynamix_configure:动态参数配置器

粒子滤波

通过寻找一组在状态空间中传播的随机样本来近似的表示概率密度函数,用样本均值代替积分运算,进而获得系统状态的最小方差估计的过程,这些样本被形象的称为“粒子”,故而叫粒子滤波。

  • 初始化粒子群
  • 按照上一时刻的 x t − 1 x_{t-1} xt1及控制数据 u t u_t ut(可能是编码器数据,可能是odom),产生t时刻的假象状态 x t x_t xt(从 p ( x t ∣ u t , x t − 1 ) p(x_t|u_t,x_{t-1}) p(xtut,xt1)中采样)
  • 计算每个 x t x_t xt的重要性因子。 w t = p ( z t ∣ x t ) w_t = p(z_t|x_t) wt=p(ztxt)
  • 粒子 x t x_t xt和权重 w t w_t wt构成t时刻的新的粒子集
  • 重采样/重要性采样:
    • 从包含M个粒子的粒子集中,按照每个粒子的权重,作为概率,抽取M次。这样粒子集的分布发生变化。这时粒子集中有许多重复粒子。

具体参考ros官方navigation功能介绍

### ROS2 AMCL 配置与使用 AMCL(Adaptive Monte Carlo Localization)是一种概率定位算法,用于估计机器人在其已知地图中的位置。以下是关于如何配置和使用 ROS2 中的 AMCL 的详细介绍。 #### 安装依赖项 为了在 ROS2 环境下运行 AMCL 节点,需安装 `navigation2` 和其相关包。可以通过以下命令完成安装: ```bash sudo apt install ros-<distro>-navigation2 ros-<distro>-nav2-amcl ``` 其中 `<distro>` 是当前使用的 ROS2 发行版名称,例如 `humble` 或 `foxy`[^1]。 #### 参数配置文件 AMCL 使用参数服务器来加载配置数据。通常会创建一个 YAML 文件来进行设置。下面是一个典型的 AMCL 配置示例: ```yaml amcl: ros__parameters: use_sim_time: true alpha1: 0.2 alpha2: 0.2 alpha3: 0.2 alpha4: 0.2 alpha5: 0.2 base_frame_id: "base_link" beam_skip_distance: 0.5 beam_skip_error_threshold: 0.9 beam_skip_threshold: 0.3 do_beamskip: false global_frame_id: "map" lambda_short: 0.1 laser_likelihood_max_dist: 2.0 laser_max_range: 100.0 laser_min_range: -1.0 max_particles: 2000 min_particles: 500 odom_frame_id: "odom" pf_err: 0.05 pf_z: 0.97 resample_interval: 1 robot_model_type: "differential" transform_tolerance: 1.0 update_min_d: 0.2 update_min_a: 0.5 initial_pose_x: 0.0 initial_pose_y: 0.0 initial_pose_a: 0.0 ``` 此配置定义了粒子滤波器的行为以及激光雷达传感器的数据处理方式。 #### 启动 AMCL 节点 启动 AMCL 可通过导航栈提供的 launch 文件实现。假设已经有一个地图文件 `/path/to/map.yaml`,可以这样执行: ```bash ros2 launch nav2_bringup bringup_launch.py map:=/path/to/map.yaml amcl:=true ``` 上述命令将加载指定的地图并启用 AMCL 功能。 #### 常见问题排查 如果遇到无法正常工作的情况,请检查以下几个方面: - **TF树结构**:确认 TF 树中有从 `map -> odom -> base_link` 的转换关系。 - **传感器话题订阅**:验证 AMCL 是否成功订阅到激光扫描消息主题 `/scan`。 - **初始位姿设定**:当不提供精确初始化时,可能需要手动调整机器人的起始姿态以加速收敛过程。 ```python import rclpy from geometry_msgs.msg import PoseWithCovarianceStamped def set_initial_pose(node, publisher): msg = PoseWithCovarianceStamped() msg.header.frame_id = 'map' msg.pose.pose.position.x = 0.0 msg.pose.pose.position.y = 0.0 msg.pose.pose.orientation.w = 1.0 publisher.publish(msg) rclpy.init() node = rclpy.create_node('set_initial_pose_node') publisher = node.create_publisher(PoseWithCovarianceStamped, '/initialpose', 10) set_initial_pose(node, publisher) rclpy.spin_once(node) node.destroy_node() rclpy.shutdown() ``` 以上脚本可用于发布初始位姿信息给 AMCL 节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值