当前位置:   article > 正文

SLAM_TOOLBOX的使用_slam-toolbox

slam-toolbox

简介


Slam Toolbox是一套用于2D Slam的工具。主要功能包括:

  • 建图、保存地图pgm文件
  • 细化地图、重新建图或在已保存的地图上继续建图
  • 长期建图:加载已保存的地图继续建图,同时从新的激光点云中删除无关信息
  • 在已有的地图上优化定位模式。也可以使用“激光雷达里程计”模式在没有建图的情况下运行定位模式
  • 同步、异步建图
  • 动态地图合并
  • 基于插件的优化求解器,带有一个新的基于谷歌 Ceres 的优化插件
  • 交互的RVIZ插件
  • 提供RVIZ图形操作工具,用于在建图期间操作节点和连接
  • 地图序列化和无损数据存储

对于在真实生产机器人上运行,建议使用: slam-toolbox,它进行了优化,使其速度提高了约10倍。需要为不需要安装在机器人上的其他开发工具(rviz 插件等)安装 deb/source。
该软件包已经过基准测试,可在 5 倍以上实时速度构建约 30,000 平方英尺的地图,在 3 倍实时速度构建约 60,000 平方英尺的地图。使用的最大面积约 200,000 平方英尺。以同步模式建图(即处理所有激光点云,无论延迟如何),并以异步模式构建更大的空间。
建图过程概述如下:

  1. ROS节点:SLAM toolbox以同步模式运行,生成ROS节点。该节点订阅激光扫描点云和里程计主题,并发布TF(地图到里程计的变换)和地图。
  2. 获取里程计和激光雷达数据:激光主题订阅的回调函数中,将生成一个位姿(使用里程计)和绑定在该节点的激光扫描。这些 PosedScan 对象形成一个队列。
  3. 数据处理:PosedScan对象队列用于构建位姿图;使用激光扫描匹配来完善里程计。该位姿图用于计算机器人位姿,并找到闭环。如果发现闭环,则优化位姿图,并更新姿态估计。姿态估计用于计算和发布机器人的里程计到地图坐标系的变换。
  4. 建图:与位姿图中每个位姿相关的激光扫描用于构建和发布地图。

长期建图


长期建图的概念是指完全或部分地对一个区域建图,并随着时间的推移,在继续与空间交互时完善和更新该地图。并且还允许在云中操作的应用程序,以及使用多台机器人在共享空间中进行建图(云分布式建图)。虽然 Slam Toolbox 也可以用于傻瓜式建图,并将该地图保存为 .pgm 文件,就像传统上存储地图一样,它还允许无损地保存位姿图和元数据以重新加载随后使用相同或不同的机器人继续建图。
长期建图由几个关键步骤组成:

  • 序列化和反序列化以存储和重新加载地图信息
  • KD树搜索匹配以在重新初始化时将机器人定位到其位置
  • 使用 2D 激光扫描,实现基于位姿图优化的 SLAM

允许用户创建和更新现有地图,然后序列化数据以在其他地图中使用。不仅可以保存数据,还可以保存位姿图以及要使用的相关元数据。
Slam Toolbox 支持所有主要模式:

  • 从预定义的点启动(假设靠近开始区域)
  • 从任何特定节点启动 - 选择一个节点 ID 以从附近开始
  • 从任何特定区域启动 - 指示地图框中的当前位姿开始,例如 AMCL

在 RVIZ 界面中,能够在地图中重新定位或继续使用 ROS 服务以图形或编程方式进行建图。

定位


定位由三部分组成:

  • 将现有的序列化地图加载到节点中
  • 在位姿图中维护最近扫描缓冲数据
  • 缓冲区过期后,扫描数据将被删除,地图不受影响

要启用定位模式,请在配置文件中设置mode: localization,以使得 Ceres 插件正确配置,以便能够快速添加和删除位姿图中的节点和约束,但这不是严格要求的,而是性能优化。定位模式将自动加载位姿图,进行第一次扫描并将其与局部区域进行匹配,以进一步细化估计位置,然后开始定位。
为了最大限度地减少通过 AMCL 迁移到此模式所需的更改量,我们还向 AMCL 使用的 /initialpose主题公开订阅者以重新定位到某个位置,该主题还连接到 RVIZ 中的 2D Pose Estimation工具。可以使用我们的方法进入定位模式,然后继续使用 AMCL 的 API,以便于集成。

它可以被认为是 AMCL 的替代品,不再需要任何 .pgm 地图。如果您想在移动时修改底层地图,上面的长期建图模式会做得更好。这种定位方法可能并不适合所有应用,它确实需要针对您的特定机器人进行大量调整,并且需要高质量的里程计。对于大多数初学者或寻求良好的开箱即用体验的用户,推荐 AMCL。

工具


基于插件的优化器

为 ScanSolver 抽象类创建了一个 pluginlib 接口,以便在运行时更改优化器来测试不同的优化器。

为人们可能感兴趣的几个不同的求解器生成了插件。支持 Ceres、G2O、SPA 和 GTSAM。

目前不支持GTSAM/G2O/SPA。它们的性能并不优于 Ceres。

地图合并 - 序列化原始数据和位姿图的使用示例

动态

使用 RVIZ 和插件加载任意数量的位姿图,这些位姿图将显示在RVIZ 中 map_N下,以及一组交互式标记以允许您移动它们。一旦您按照您喜欢的方式将它们全部相对定位,您就可以将子地图合并到全局地图中,可以使用您选择的地图服务器实现来下载该地图。

这更多地展示了一旦​​拥有了原始数据就可以做的事情,但这么左意义不大,除非你习惯于手动缝合地图。

RVIZ 插件

提供了 rviz 插件来帮助手动闭环和在线/离线建图。默认情况下,交互模式处于关闭状态(允许移动节点),因为这会对 rviz 造成很大影响。当您想要移动节点时,勾选交互框,移动您想要的内容,然后保存更改。如果犯了错误,请清除。完成后,再次退出交互模式。

还有一个工具可以帮助控制在线和离线数据。您可以随时停止处理新扫描或将新扫描数据保存到队列中。当您希望在机器人静止不动时允许包处理速度赶上(此选项仅在同步模式下有意义。在异步模式下,机器人永远不会落后。)或者您希望在手动循环闭合/手动“帮助”模式下,停止处理新扫描数据。如果队列中的内容超出您的需要,您也可以将其清除。

此外,还有用于序列化和反序列化服务的按钮,用于加载旧的位姿图以更新和细化,或继续建图,然后保存回文件。 “Start By Dock”复选框将尝试扫描第一个节点的匹配(假设您从自定义的位置开始),为您提供里程估计。另一种选择是开始使用 GUI 中输入的位置或调用底层服务。此外,如果您碰巧刚刚暂停机器人或在两次运行之间没有移动太多,您可以使用当前里程位置估计。最后(也是最有用的),您可以使用 RVIZ 工具进行2D Pose Estimation,告诉它在定位模式下要去哪里,就像 AMCL 一样。

此外,RVIZ 插件将允许您将序列化地图文件添加为 RVIZ 中的子地图。它们将显示一个交互式标记,您可以平移和旋转以匹配,然后使用“生成地图”按钮生成合成地图。此时,合成地图在 /map 主题上广播,可以使用 map_saver 保存该地图。

建议始终在dock附近继续建图,如果不可能,请从位姿或地图合并技术开始研究。

界面如下图所示。

手动修改地图

启用交互模式,图形节点将从标记更改为可以操作的交互式标记。移动节点时,可以保存更改,它会将更新的位置发送到位姿图,并导致优化运行发生,以使用新节点位置更改位姿图。如果机器人被推、滑倒、撞到墙上,或者里程计发生漂移并且您想手动纠正它,这会很有帮助。

当地图足够大时,RVIZ 中的交互式标记数量可能很大,并且 RVIZ 可能开始滞后。建议将此功能用作测试调试工具,而不是用于生产。

API

以下是使用的服务/主题。请参阅 rviz 插件以了解其使用的实现。

订阅的主题

TopicType描述
/scansensor_msgs/LaserScan来自激光雷达的输入扫描数据
tfN/A配置的 odom_framebase_frame 的转换

发布的主题

TopicType描述
mapnav_msgs/OccupancyGridmap_update_interval频率表示位姿图的占用网格
posegeometry_msgs/PoseWithCovarianceStamped 配置的map_framebase_frame的位姿以及根据扫描匹配计算的协方差

发布的服务

TopicType描述
/slam_toolbox/clear_changesslam_toolbox/Clear清除所有待处理的手动位姿图操作的更改
/slam_toolbox/deserialize_mapslam_toolbox/DeserializePoseGraph 从磁盘加载保存的序列化位姿图文件
/slam_toolbox/dynamic_map nav_msgs/OccupancyGrid 请求位姿图的当前状态作为占用网格
/slam_toolbox/manual_loop_closure slam_toolbox/LoopClosure 请求对位姿图进行手动更改
/slam_toolbox/pause_new_measurements slam_toolbox/Pause 暂停处理新传入的激光扫描
/slam_toolbox/save_map slam_toolbox/SaveMap 保存可用于显示或 AMCL 定位的地图图像文件。它是 map_server/map_saver 上的一个简单包装器,但很有用。
/slam_toolbox/serialize_map slam_toolbox/SerializePoseGraph 保存地图位姿图和数据,可用于继续建图、slam_toolbox 定位、离线操作等
/slam_toolbox/toggle_interactive_mode slam_toolbox/ToggleInteractive 切换进入和退出交互模式

配置文件

默认配置在 config 目录中给出。

求解器参数

  • solver_plugin - 用于 karto 扫描解算器的非线性解算器类型。选项:solver_plugins::CeresSolver, - solver_plugins::SpaSolver, solver_plugins::G2oSolver. Default: solver_plugins::CeresSolver.
  • ceres_linear_solver - Ceres 使用的线性求解器。选项:SPARSE_NORMAL_CHOLESKY、SPARSE_SCHUR、ITERATIVE_SCHUR、CGNR。默认为 SPARSE_NORMAL_CHOLESKY
  • ceres_preconditioner - 与该求解器一起使用的预处理器。选项:JACOBI、IDENTITY(none)、SCHUR_JACOBI。默认为JACOBI
  • ceres_trust_strategy - 信任区域策略。行搜索策略没有公开,因为它们对于这种用途表现不佳。选项:LEVENBERG_MARQUARDT、DOGLEG。默认值:LEVENBERG_MARQUARDT
  • ceres_dogleg_type - 如果信任策略是 DOGLEG,则使用dogleg策略。选项:TRADITIONAL_DOGLEG、SUBSPACE_DOGLEG。默认值:TRADITIONAL_DOGLEG
  • ceres_loss_function - 拒绝异常值的损失函数类型。没有一个等于损失平方。选项:None、HuberLoss、CauchyLoss。默认值:None
  • mode - “建图”或“定位”模式,用于 Ceres 问题创建中的性能优化

Toolbox参数

  • odom_frame - 里程计坐标系

  • map_frame - 地图坐标系

  • base_frame - 基坐标系

  • scan_topic - 扫描主题名, 注意是/scan 不是scan

  • scan_queue_size - 扫描消息对队列长度。在异步模式下应始终设置为 1

  • use_map_saver - 实例化地图服务程序并自行订阅map主题

  • map_file_name - 启动时加载的位姿图文件的名称(如果可用)

  • map_start_pose - 启动建图/定位时的位姿(如果可用)

  • map_start_at_dock - 在dock(第一个节点)处启动姿势图加载(如果可用)。如果同时设置了pose和dock,优先使用pose

  • debug_logging - 更改日志以进行调试

  • throttle_scans - 在同步模式下限制的扫描次数

  • transform_publish_period - 里程计odom变换发布周期。 0 不会发布变换。

  • map_update_interval - 更新 2D 占用地图的时间间隔

  • enable_interactive_mode - 是否允许启用交互模式。交互模式将保留映射到其 ID 的激光扫描缓存,以便在交互模式下进行可视化。结果,该进程的内存将会增加。在定位和长期建图模式下可以手动禁用此功能,因为它们会随着时间的推移增加内存利用率。对于建图或连续建图模式均有效。

  • position_covariance_scale - 从扫描匹配发布姿势时缩放位置协方差的量。这可用于调整下游定位滤波器中位姿的影响。协方差表示测量的不确定性,因此扩大协方差将减小位姿对下游滤波器的影响。默认值:1.0

  • yaw_covariance_scale - 从扫描匹配发布位姿时缩放偏航协方差的量。请参阅position_covariance_scale 的描述。默认值:1.0

  • resolution - 生成的 2D 占用图的分辨率

  • max_laser_range - 用于 2D 占用地图光栅化的最大激光范围

  • minimum_time_interval - 在同步模式下处理的扫描之间的最短持续时间

  • transform_timeout - 查找转换 TF 超时时间限制

  • tf_buffer_duration - 存储 TF 消息以供查询的时间。如果在同步模式下以倍速脱机运行,则设置高一些。

  • stack_size_to_use - 将堆栈大小重置为的字节数,以启用文件的序列化/反序列化。自由默认值为 40000000,但越少越好。

  • minimum_travel_distance - 处理新扫描之前的最小行进距离

匹配器参数

  • use_scan_matching - 是否使用扫描匹配来优化里程位姿

  • use_scan_barycenter - 是否使用重心或扫描位姿

  • minimum_travel_heading - 合理更新的最小航向变化

  • scan_buffer_size - 缓冲到链中的扫描次数,也用作定位模式循环缓冲区中的扫描次数

  • scan_buffer_maximum_scan_distance - 从缓冲区中删除之前扫描,距离之前位姿的最大距离

  • link_match_minimum_response_fine - 精细分辨率通过的阈值链接匹配算法响应

  • link_scan_maximum_distance - 有效链接扫描之间的最大距离

  • Loop_search_maximum_distance - 循环闭合时考虑的扫描距离的最大阈值

  • do_loop_close - 是否进行循环闭合(如果不确定,答案是“true”)

  • Loop_match_minimum_chain_size - 寻找循环闭合的扫描的最小链长度

  • Loop_match_maximum_variance_coarse - 粗略搜索中传递给细化的阈值方差

  • Loop_match_minimum_response_coarse - 粗略搜索中环路闭合算法的阈值响应要传递给细化

  • Loop_match_minimum_response_fine - 精细搜索中循环闭合算法的阈值响应传递给细化

  • correlation_search_space_dimension- 搜索网格大小以进行扫描相关性

  • correlation_search_space_resolution - 搜索网格分辨率以进行扫描相关性

  • correlation_search_space_smear_deviation - 用于平滑响应的多模态涂抹量

  • loop_search_space_dimension - 循环闭合算法的搜索网格的大小

  • loop_search_space_resolution - 搜索网格分辨率以进行循环闭合

  • loop_search_space_smear_deviation - 用于平滑响应的多模态涂抹量

  • distance_variance_penalty - 应用于匹配扫描的惩罚,因为它与里程姿势不同

  • angle_variance_penalty - 应用于匹配扫描的惩罚,因为它与里程姿势不同

  • fine_search_angle_offset - 用于测试精细扫描匹配的角度范围

  • rough_search_angle_offset - 用于测试粗略扫描匹配的角度范围

  • coarse_angle_resolution - 在扫描匹配中测试的偏移范围内的角度分辨率

  • minimum_angle_penalty - 确保尺寸不会膨胀的最小惩罚角度

  • minimum_distance_penalty - 扫描可以确保大小不会爆炸的最小惩罚

  • use_response_expansion - 如果没有找到可行的匹配,是否自动增加搜索网格大小

安装

使用 rosdep 安装

rosdep install -q -y -r --from-paths src --ignore-src
  • 1

或通过apt安装

apt install ros-eloquent-slam-toolbox
  • 1

通过下面的方式运行

ros2 launch slam_toolbox online_sync_launch.py
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/870461
推荐阅读
相关标签
  

闽ICP备14008679号