ROS:navigation laser_scan_matcher参数配置

本文详细介绍了ROS中的laser_scan_matcher包,一种用于激光扫描配准的开源工具。该包能够处理连续的sensor_msgs/LaserScan消息,通过匹配估计激光位置,并发布为geometry_msgs/Pose2D或tf变换。文章涵盖了输入类型、关键帧匹配、参数配置等方面,适用于机器人定位与地图构建。

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

开源包链接:

git https://github.com/ccny-ros-pkg/scan_tools.git

 
1.简介

所述laser_scan_matcher包是增量激光扫描配准工具。该软件包允许扫描连续的sensor_msgs / LaserScan消息之间的匹配,并将估计的激光位置发布为geometry_msgs / Pose2D或tf变换。

该包装可以在没有其他传感器提供的任何测距估计的情况下使用。因此,它可以作为独立的里程计算器估算器。或者,您可以提供多种类型的测距输入,以提高注册速度和准确性。

 
2.输入
支持的消息类型

所述laser_scan_matcher可以操作使用sensor_msgs /激光扫描消息或sensor_msgs / PointCloud2消息。使用sensor_msgs / PointCloud2时,请确保它们没有nan值。

 
扫描预测

虽然laser_scan_matcher可以通过仅使用扫描数据来操作,但我们可以通过在每次新的扫描消息到达时提供对传感器的当前位置的猜测来加速扫描注册过程。当没有猜测时,合理的(并且广泛使用的)假设是传感器不移动(零速度模型)。以下是laser_scan_matcher接受的输入列表:

    IMU:以sensor_msgs / IMU消息的形式估计机器人的方位角(Δ-θ)的变化。我们假设IMU消息的偏航分量对应于机器人的方向。因此,我们并不需要一个完整的6DoF IMU传感器 - 只要其输出被打包为IMU消息,便宜的单轴陀螺仪也可以工作。所需主题是imu / data。

    车轮测距法:从车轮编码器等测距传感器估算机器人的x,y和方向角。所需的主题是odom。

    恒速模型:假设机器人根据机器人速度的估计值移动。可以从外部传感器获得速度估计,或者通过导出和过滤扫描匹配器本身的输出来获得速度估计。所需主题是vel。有关如何使用简单过滤器实现此目的的示例,请查看Alpha-beta跟踪以了解扫描匹配预测。

    零速度模型:不要使用任何预测,即假设机器人停留在同一个地方。

我们可以使用上述的组合,例如IMU以及车轮里程计或IMU以及alpha beta跟踪。当启用多个预测模式时,优先级为IMU> Odometry> Constant Velocity> Zero Velocity。

我应该在实践中使用什么?

IMU和(在某种程度上)车轮里程计输入显着提高了旋转运动的收敛速度。因此强烈建议添加IMU输入。

当扫描匹配器的性能稳定时,Alpha-beta跟踪可以显着提高速度,但可能会导致高动态环境或功能较差的环境出现奇怪的行为。我们建议启用它并根据经验确定它是否对您的环境有用。

 
关键帧与帧到帧扫描匹配

在经典的帧到帧激光测距仪中,每个激光扫描与先前的扫描进行比较。随着时间的推移聚合两者之间的变换以计算机器人在固定框架中的位置。

扫描中的一些噪音是不可避免的。因此,即使对于静止不动的机器人,增量变换也可能是非零的。这可能导致机器人姿势的缓慢漂移。

为了缓解这种情况,我们实现了基于关键帧的匹配。在当前激光扫描和“关键帧”扫描之间计算姿势的变化。在机器人移动一定距离后更新关键帧扫描。因此,如果机器人静止不动,关键帧扫描将不会改变,并且姿势将保持更加漂移。

设置更新关键帧的容差可以通过kf_dist_linear和kf_dist_angular参数来实现。它们的默认值在静止和移动时提供更强大的性能。

为了将scan_matching模式改回到经典的帧到帧,用户可以简单地将两个阈值中的任何一个设置为零。

 
3.参数

3.1 坐标系

~fixed_frame (string, default: "world") 世界坐标系

~base_frame (string, default: "base_link") 机器人本体坐标系

3.2运动预测

~use_imu (bool, default: true) 是否使用imu进行扫描注册的θ预测。需要输入/ imu / data话题。

~use_odom (bool, default: true) 是否使用车轮测距法进行扫描配准的x,y和θ预测。需要输入odom话题。

~use_vel (bool, default: false) 是否使用恒定速度模型进行扫描配准的x,y和θ预测。需要输入vel话题。

3.3 点云输入

使用sensor_msgs / PointCloud2而不是sensor_msgs / LaserScan消息时的参数。

~use_cloud_input (bool, default: false)

是否订阅/云话题sensor_msgs / PointCloud2的消息,而不是/扫描与话题sensor_msgs /激光扫描消息。

~cloud_range_min (double, default: 0.1)

传感器的最小范围,如果使用sensor_msgs / PointCloud2消息。如果使用sensor_msgs / LaserScan消息则不需要。

~cloud_range_max (double, default: 50.0)

传感器的最大范围,如果使用sensor_msgs / PointCloud2消息。如果使用sensor_msgs / LaserScan消息则不需要。

3.4关键帧

用于设置基于关键帧扫描的注册的参数。使用默认值,当传感器移动10厘米或10度时,关键帧会更新。将这些中的任何一个设置为零将减少到帧到帧扫描匹配。将它们保持在默认水平应该可以减少机器人静止时的漂移。

~kf_dist_linear (double, default: 0.10) 在更新关键帧扫描之前固定帧需要移动的距离(以米为单位)

~kf_dist_angular (double, default: 0.175) 在更新关键帧扫描之前固定帧需要移动的角度(以弧度表示)

3.5输出

~publish_tf (bool, default: true) 是否发布扫描匹配器对世界帧中基帧位置的估计作为变换。

~publish_pose (bool, default: true) 是否发布扫描匹配器对世界框架中基础框架位置的估计作为geometry_msgs / Pose2D

~publish_pose_stamped (bool, default: false) 是否发布扫描匹配器对世界框架中基础框架位置的估计作为geometry_msgs / PoseStamped

3.6扫描匹配

~max_iterations (int, default: 10) 最大ICP周期迭代

~max_correspondence_dist (double, default: 0.3) 通信有效的最大距离

~max_angular_correction_deg (double, default: 45.0) 扫描之间的最大角位移,以度为单位

~max_linear_correction (double, default: 0.50) 扫描之间的最大位移(m)

~epsilon_xy (double, default: 0.000001) 停止阈值(m)

~epsilon_theta (double, default: 0.000001) 停止阈值(rad)

~outliers_maxPerc (double, default: 0.90) 要考虑的对应关系的百分比:如果为0.90,则总是丢弃前10%的对应关系,错误更多

3.7扫描匹配(高级)

~sigma (double, default: 0.010) 扫描中的噪声(m)(不确定在当前实现中是否有任何影响)

~use_corr_tricks (int, default: 1) 如果为1,请使用智能技巧查找对应关系(参见论文)。

~restart (int, default: 0) 重新启动:如果为1,则在错误超过阈值时重新启动

~restart_threshold_mean_error (double, default: 0.01) 重新启动:重新启动的阈值

~restart_dt (double, default: 1.0) 重新启动:置换以重新启动。(M)

~restart_dtheta (double, default: 0.1) 重新启动:置换以重新启动。(弧度)

~clustering_threshold (double, default: 0.25) 保持相同群集的最大距离

~orientation_neighbourhood (int, default: 10) 用于估计方向的相邻光线的数量

~use_point_to_line_distance (int, default: 1) 如果为0,则为普通ICP

~do_alpha_test (int, default: 0) 如果为1,则根据角度丢弃对应关系

~do_alpha_test_thresholdDeg (double, default: 20.0) 丢弃基于角度的对应关系 - 阈值角度,以度为单位

~outliers_adaptive_order (double, default: 0.7)

描述用于丢弃的简单自适应算法的参数。1)订购错误。2)根据outliers_adaptive_order选择百分位数(如果为0.7,则获得70%的百分位数)。3)定义自适应阈值乘以outliers_adaptive_mult与所选百分位数的误差值。4)放弃超过阈值的对应关系。这对于保守是有用的; 但删除最大的错误。

~outliers_adaptive_mul (double, default: 2.0)

描述用于丢弃的简单自适应算法的参数。1)订购错误。2)根据outliers_adaptive_order选择百分位数(如果为0.7,则获得70%的百分位数)。3)定义自适应阈值乘以outliers_adaptive_mult与所选百分位数的误差值。4)放弃超过阈值的对应关系。这对于保守是有用的; 但删除最大的错误。

~do_visibility_test (int, default: 0)

如果您已经猜到了解决方案,则可以计算新位置中一次扫描点的极角。如果极角不是读数指数的单调函数,则意味着表面在下一个位置不可见。如果它不可见,那么我们不会将它用于匹配。

~outliers_remove_doubles (int, default: 1)

如果为1,则laser_sens中没有两个点可以具有相同的对应关系。

~do_compute_covariance (int, default: 0)

如果为1,则使用方法http://purl.org/censi/2006/icpcov计算ICP的协方差(更改此操作对当前实现没有影响)

~debug_verify_trick (int, default: 0)

如果为1,检查find_correspondences_tricks给出正确的答案

~use_ml_weights (int, default: 0)

如果为1,则使用第一次扫描中的字段“true_alpha”(或“alpha”)来计算发生率β,并使用因子(1 / cos ^ 2(beta))来加权对应关系。(更改此操作对当前实现没有影响)

~use_sigma_weights (int, default: 0)

如果为1,则第二次扫描中的字段'readings_sigma'用于将对应关系加权1 / sigma ^ 2(不确定是否在当前实现中对此进行更改有效)

 

    参考文献

[1] ROS laser_scan_matcher http://wiki.ros.org/laser_scan_matcher

<think>我们首先需要整合关于在ROS1中使用laser_scan_matcher的信息。根据提供的引用,laser_scan_matcher是一个增量激光扫描配准工具,它使用PLICP算法,并基于CSM实现。它能够处理连续的LaserScan消息,并输出姿态估计(Pose2D或tf变换)。用户的问题集中在使用教程、配置和示例上。我们将分步骤说明:1.安装和编译2.配置参数3.运行示例根据引用[4]和[5],在ROSKinetic中编译时可能会遇到找不到csm包的问题。解决方案是修改头文件路径,将`#include<csm/csm_all.h>`替换为具体的本地路径(例如`#include"/home/ocean/ros_ws/csm_ws/src/csm/sm/csm/csm_all.h"`)。但注意,这种方法不够通用,更好的做法是确保csm被正确安装在系统中,或者设置CMakeLists.txt来正确找到csm。但用户可能更关注如何使用,所以我们将重点放在配置和使用上。步骤1:安装假设用户已经安装了ROS1(如Kinetic或Melodic),可以通过以下步骤安装laser_scan_matcher:方法一:从源码安装```#创建ROS工作空间(如果已有可跳过)mkdir-p~/catkin_ws/srccd~/catkin_ws/src#克隆scan_tools包(包含laser_scan_matcher)gitclonehttps://github.com/ros-perception/scan_tools.git#安装依赖(特别是csm)sudoapt-getinstallros-<distro>-csm#如果找不到csm包,也可以从源码安装csmgitclonehttps://github.com/AndreaCensi/csm.git#然后编译整个工作空间cd~/catkin_wscatkin_make```注意:在编译laser_scan_matcher时,如果出现头文件找不到的错误,可以按照引用[4]和[5]的方法修改头文件路径,但更推荐的方法是设置include目录。可以在CMakeLists.txt中增加csm的include路径,或者使用ROS的find_package机制。但是,由于csm可能不是标准的ROS包,所以我们可能需要手动在CMakeLists.txt中设置。例如,在`laser_scan_matcher`的CMakeLists.txt中,确保包含:```include_directories(include${catkin_INCLUDE_DIRS}${YOUR_CSM_INCLUDE_DIR}#例如:/home/yourname/catkin_ws/src/csm/sm)```步骤2:配置参数根据引用[2],我们可以配置一些参数。参数通常通过ROS参数服务器设置,可以在launch文件中设置。主要参数包括:-`max_iterations`:最大迭代次数(默认10)-`kf_dist_linear`:关键帧的线性距离阈值(默认0.05米)-`kf_dist_angular`:关键帧的角度阈值(默认0.0087弧度,约0.5度)-`use_odom`:是否使用里程计(默认false)-`use_imu`:是否使用IMU(默认false)-`use_alpha_beta`:是否使用alpha-beta滤波器(默认false)-`publish_tf`:是否发布tf变换(默认true)-`base_frame`:机器人基座坐标系(例如"base_link")-`odom_frame`:里程计坐标系(例如"odom")一个典型的launch文件(例如`laser_scan_matcher_example.launch`)可能如下:```xml<launch><nodepkg="laser_scan_matcher"type="laser_scan_matcher_node"name="laser_scan_matcher_node"output="screen"><paramname="max_iterations"value="10"/><paramname="kf_dist_linear"value="0.05"/><paramname="kf_dist_angular"value="0.0087"/><paramname="use_odom"value="false"/><paramname="use_imu"value="false"/><paramname="use_alpha_beta"value="false"/><paramname="publish_tf"value="true"/><paramname="base_frame"value="base_link"/><paramname="odom_frame"value="odom"/><paramname="fixed_frame"value="odom"/><!--或者"map",如果已经建图--><remapfrom="scan"to="/scan"/><!--输入的话题,假设为/scan--></node></launch>```步骤3:运行示例假设已经有一个激光雷达发布`/scan`话题,运行上面的launch文件:```roslaunchyour_packagelaser_scan_matcher_example.launch```然后,可以通过rviz查看机器人姿态估计的结果,或者通过rostopic查看发布的位姿话题:-如果没有使用里程计,该节点将仅根据激光扫描提供姿态估计(即基于扫描匹配的里程计)。-默认发布的话题:`/pose2D`(geometry_msgs/Pose2D)和tf变换(从odom_frame到base_frame的变换)。注意:如果要与其他系统(如导航包)一起使用,通常需要发布从odom_frame到base_frame的tf变换。示例:测试数据如果你没有现成的机器人,可以使用rosbag数据包进行测试。例如,使用turtlebot的rosbag记录文件。总结:在ROS1中使用laser_scan_matcher的步骤包括安装依赖、编译、配置参数和运行节点。配置时需要注意输入的话题名称和坐标系设置。相关问题:1.如何将laser_scan_matcher与IMU或里程计数据融合使用?2.如何处理laser_scan_matcher在长时间运行中的漂移问题?3.laser_scan_matcher与其他激光SLAM(如gmapping、cartographer)有何不同?</think> ### ROS1 Laser_Scan_Matcher 使用指南 #### 1. **核心功能** Laser_scan_matcherROS1 的增量激光扫描匹配工具: - 基于 PLICP(点对线迭代最近点)算法 - 处理连续 `sensor_msgs/LaserScan` 数据流 - 输出姿态估计(`geometry_msgs/Pose2D` 或 TF 变换) - 核心依赖 Andrea Censi 的 CSM(规范扫描匹配器)库[^1][^3] #### 2. **安装配置** ```bash # 创建工作空间 mkdir -p ~/lidar_ws/src cd ~/lidar_ws/src # 克隆源码 git clone https://github.com/ros-perception/scan_tools.git git clone https://github.com/AndreaCensi/csm.git # 解决路径错误(常见问题[^4][^5]) sed -i 's|<csm/csm_all.h>|"$(pwd)/csm/sm/csm/csm_all.h"|' \ scan_tools/laser_scan_matcher/include/laser_scan_matcher/laser_scan_matcher.h # 编译安装 cd ~/lidar_ws catkin_make source devel/setup.bash ``` #### 3. **参数配置示例(launch 文件)** ```xml <node pkg="laser_scan_matcher" type="laser_scan_matcher_node" name="laser_match"> <!-- 核心参数 --> <param name="fixed_frame" value="odom"/> <param name="base_frame" value="base_link"/> <param name="use_alpha_beta" value="true"/> <!-- 精度控制 --> <param name="max_iterations" value="50"/> <param name="kf_dist_linear" value="0.1"/> <param name="kf_dist_angular" value="0.175"/> <!-- 约10度 --> <!-- 输入输出设置 --> <remap from="scan" to="/hokuyo_scan"/> <param name="publish_tf" value="true"/> <param name="publish_pose" value="true"/> </node> ``` #### 4. **运行与验证** ```bash # 启动节点 roslaunch your_pkg laser_matcher.launch # 可视化验证 rosrun tf view_frames # 生成TF树PDF rosrun rviz rviz -d $(rospack find laser_scan_matcher)/demo/demo.rviz ``` #### 5. **关键性能调优参数** | 参数 | 默认值 | 优化建议 | |------|--------|----------| | `max_iterations` | 10 | 增加可提高精度(>30),但增加计算负载 | | `kf_dist_linear` | 0.05m | 增大可降低关键帧频率 | | `kf_dist_angular` | 0.0087rad | 根据机器人旋转速度调整 | | `sigma` | 0.01 | 增大对噪声更鲁棒 | #### 6. **数据流示例** ```mermaid graph LR A[LaserScan /scan] --> B(laser_scan_matcher) B --> C[Pose2D /pose2D] B --> D[TF base_frame→fixed_frame] ``` #### 7. **适用场景** 1. 无里程计情况下的位姿估计 2. 激光里程计辅助导航栈 3. 低计算资源环境下的SLAM前端 4. 多传感器融合的辅助校正源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通哈膨胀哈哈哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值