Navigation2调参系列之AMCL定位

本文详细介绍了ROS2 Nav2中AMCL(Adaptive Monte Carlo Localization)的参数设置,包括旋转噪声、平移噪声等多个关键参数,并分享了因参数调整不当导致的定位错误案例。作者还预告将进行移动机器人导航和建图的课程分享,进一步探讨AMCL的原理和参数应用。

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

做张封面,参数调的好,头发多不了,放个三毛的图再

在Nav2导航中,默认进行状态估计(位置)的组件是AMCL (Adaptive Monte Carlo Localization)自适应蒙特卡洛定位,它通过机器人里程计的位置结合雷达点云和地图估计出机器人当前的位置即机器人在地图坐标系的试试位姿。

该组件有非常之多的参数,小鱼再翻译nav2文档时有详细的进行翻译过,但前几天依然犯了个错误,把一个参数给想当然的改错了,导致发布的定位信息比系统时间还要早。所以今天把之前翻译的参数介绍拿到过来,也和大家分享一下,遇到问题不要慌,可以多翻一翻官方文档。

过几天小鱼会对移动机器人导航和建图做一个小课程,跟大家分享下,关于amcl的原理和参数也会进行更详细的介绍。

nav2中文网地址:http://nav2.fishros.com/

AMCL参数

alpha1

类型默认值
double0.2

描述从旋转角度考虑机器人里程计的旋转噪声

alpha2

类型默认值
double0.2

描述机器人平移分量中的里程计旋转噪音,噪声在机器人左右两边分布

alpha3

类型默认值
double0.2

描述机器人平移过程中的里程计平移噪音,沿着机器人前进方向分布

alpha4

类型默认值
double0.2

描述机器人旋转过程中的里程计平移噪音, 斜角方向上的运动噪声
alpha5

类型默认值
double0.2

描述仅适用于全向式(Omni): 平移噪声。

base_frame_id

类型默认值
string“base_footprint”

描述机器人基座frame名称。
beam_skip_distance

类型默认值
double0.5

描述设置忽略掉似然场模型中大多数粒子与地图不一致的光束,表示忽略的最大距离单位 (m) 。

beam_skip_error_threshold

类型默认值
double0.9

描述不匹配地图后的光束百分比,由于不一致而强制完全更新。

beam_skip_threshold

类型默认值
double0.3

描述需要跳过的光束(beams )的百分比。

do_beamskip

类型默认值
boolFalse

描述是否在似然场模型(Likelihood field model)中进行波束(beam )跳过。

global_frame_id

类型默认值
string“map”

描述定位系统发布的坐标系名称。

lambda_short

类型默认值
double0.1

描述模型z_short部分的指数衰减参数。

laser_likihood_max_dist

类型默认值
double2.0

描述在地图上进行障碍物充气的最大距离,用于likelihood_field模型。

laser_max_range

类型默认值
double100.0

描述要考虑的最大扫描范围,设为-1.0会直接使用激光报告的最大范围。

laser_min_range

类型默认值
double-1.0

描述要考虑的最小扫描范围,-1.0将使用激光发出的的最小范围。
laser_model_type

类型默认值
string“likelihood_field”

描述使用哪个模型,beam、likelihood_field 或 likelihood_field_prob。likelihood_field_prob 包含beamskip功能。

set_initial_pose

类型默认值
boolFalse

描述AMCL从参数 initial_pose* 设置机器人初始姿势,而不是等待话题 [initial_pose `消息。

initial_pose

类型默认值
Pose2D{0.0, 0.0, 0.0, 0.0}

描述全局坐标系中机器人底座初始位姿的X、Y、Z坐标和偏航角(单位为米和弧度)。

max_beams

类型默认值
int60

描述更新过滤器时,设置每次扫描要使用多少个均匀间隔的光束。
max_particles

类型默认值
int2000

描述所允许的最大粒子数。

min_particles

类型默认值
int500

描述所允许的最小粒子数。

odom_frame_id

类型默认值
string“odom”

描述里程计使用的frame名称。

pf_err

类型默认值
double0.05

描述粒子过滤器总体误差。

pf_z

类型默认值
double0.99

描述粒子过滤器总体密度。

recovery_alpha_fast

类型默认值
double0.0

描述快速平均重量过滤器的指数衰减率,用于决定何时通过添加随机姿势来恢复。一个好的值可能是0.001。

recovery_alpha_slow

类型默认值
double0.0

描述慢平均重量过滤器的指数衰减率,用于通过添加随机姿势来决定何时恢复。一个好的值可能是0.001。

resample_interval

类型默认值
int1

描述重新采样前所需的过滤器更新数量。

robot_model_type

类型默认值
string“nav2_amcl::DifferentialMotionModel”

描述插件类的完全限定类型。可以值为nav2_amcl::DifferentialMotionModel和nav2_amcl::OmniMotionModel。

save_pose_rate

类型默认值
double0.5

描述将最后估计姿态和协方差存储到参数服务器的最大速率 (Hz),在变量 ~initial_pose_* 和 ~initial_cov_* 中。此保存的姿势将在后续运行中用于初始化过滤器 (-1.0表示禁用)。

sigma_hit

类型默认值
double0.2

描述用于设置在模型z_hit部分中使用的高斯模型的标准差。

tf_broadcast

类型默认值
boolTrue

描述用于设置是否广播坐标变换。参数False可以以防止amcl发布全局坐标系和里程计坐标系之间的坐标变换。

transform_tolerance

类型默认值
double1.0

描述TF转换发布后的,该转换的所维持的有效时间。

update_min_a

类型默认值
double0.2

描述在执行过滤器更新之前需要的最小旋转角度。

update_min_d

类型默认值
double0.25

描述在执行过滤器更新之前需要的最小平移距离。

z_hit

类型默认值
double0.5

描述模型中z_hit部分的混合权重,所有使用的z权重之和必须为1。光束(Beam)模型使用所有共4个z_*权重,而似然模型(Likelihood)使用z_hit和z_rand权重。

z_max

类型默认值
double0.05

描述模型中z_max部分的混合权重,所有使用的z权重之和必须为1。光束(Beam)模型使用所有共4个z_*权重,而似然模型(Likelihood)使用z_hit和z_rand权重。

z_rand

类型默认值
double0.5

描述模型中z_rand部分的混合权重,所有使用的z权重之和必须为1。光束(Beam)模型使用所有共4个z_*权重,而似然模型(Likelihood)使用z_hit和z_rand权重。

z_short

类型默认值
double0.005

描述模型中z_short部分的混合权重,所有使用的z权重之和必须为1。光束(Beam)模型使用所有共4个z_*权重,而似然模型(Likelihood)使用z_hit和z_rand权重。

always_reset_initial_pose

类型默认值
boolFalse

描述充值时AMCL要求一个初始姿势,该姿态可以通过一个话题或参数initial_pose* (同时参数 set_initial_pose: true ) 获取。否则,默认AMCL将使用最后已知的姿势进行初始化。

scan_topic

类型默认值
stringscan

描述要订阅的激光雷达话题名称。

map_topic

类型默认值
stringmap

描述用于订阅地图的话题名称。

Example

amcl:
  ros__parameters:
    alpha1: 0.2
    alpha2: 0.2
    alpha3: 0.2
    alpha4: 0.2
    alpha5: 0.2
    base_frame_id: "base_footprint"
    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
    set_initial_pose: false
    laser_likelihood_max_dist: 2.0
    laser_max_range: 100.0
    laser_min_range: -1.0
    laser_model_type: "likelihood_field"
    max_beams: 60
    max_particles: 2000
    min_particles: 500
    odom_frame_id: "odom"
    pf_err: 0.05
    pf_z: 0.99
    recovery_alpha_fast: 0.0
    recovery_alpha_slow: 0.0
    resample_interval: 1
    robot_model_type: "nav2_amcl::DifferentialMotionModel"
    save_pose_rate: 0.5
    sigma_hit: 0.2
    tf_broadcast: true
    transform_tolerance: 1.0
    update_min_a: 0.2
    update_min_d: 0.25
    z_hit: 0.5
    z_max: 0.05
    z_rand: 0.5
    z_short: 0.05
    always_reset_initial_pose: false
    scan_topic: scan
    map_topic: map
### 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、付费专栏及课程。

余额充值