1)slam_toolbox建图(引用karto_slam)
开源项目地址:https://github.com/SteveMacenski/slam_toolbox
个人的评价是,slam_toolbox作为三星研究院出品的建图工具包,功能相当完善,简单易用,效果、工程性甚至优于谷歌的cartographer,具备完善的动态地图更新longlife-slam功能。底层slam算法是karto_slam,资源占用也低于cartographer。
但是就大地图(2k平以上)构建效果来看,slam_toolbox可能存在较为明显的大地图扭曲问题,精度不高。
订阅的主题
/scan | sensor_msgs/LaserScan | 激光的输入扫描以利用 |
---|---|---|
/tf | tf2 | 从您配置的 odom_frame 到 base_frame 的有效转换 |
发布的主题
/map | nav_msgs/OccupancyGrid | 位姿图在map_update_interval 频率上的占用网格表示 |
---|
服务接口
话题 | 类型 | 描述 |
---|---|---|
/slam_toolbox/clear_changes | slam_toolbox/Clear | 清除所有未决的手动姿势图操作更改 |
/slam_toolbox/deserialize_map | slam_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 | 切换进入和退出交互模式,发布节点的交互标记及其位置以在应用程序中更新 |
① 建图测试
位姿图路点(无视左侧视图栏报错,这是因为没有重开全部程序,使用了map(amcl提供)、slam_map(slam_toolbox提供)作为tf的根节点,但是tf不支持并行树状图,故tf会来回切换,但不影响建图程序运行,因为tf树中的odom_combined->map的变换不被slam_toolbox节点所使用)
在同样未经调参优化的情况下,对比cartographer,slam_toolbox在细节方面更优(slam_toolbox在墙壁厚度方面显示更准确)
大长廊场景建图,此为公司办公楼层地图,长约80m,宽约50米:
对于slam_toolbox,有以下问题:
1)所建地图出现角度歪斜情况,难以闭合;
2)部分房间与走廊出现不平行情况
查看tf树图
slam_map到odom_combined的变换,由slam_toolbox提供
② 探索建图接口
服务1:保存位姿图到磁盘
/slam_toolbox/serialize_map
服务2:保存栅格地图到磁盘
注意点:该节点的保存地图服务/slam_toolbox/save_map不好用,不能保存任意话题名的map(改写源码,增加这点),并且实际上只是调用了map_server的map_saver包,可以不用。
服务3:获取动态的建图map图数据
/slam_toolbox/dynamic_map
服务4:清除交互式模式对位姿图路点的修改
/slam_toolbox/clear_changes
服务5:切换交互模式,可拖动位姿图
/slam_toolbox/toggle_interactive_mode
服务6:确认交互式按钮修改的位姿图路点
(只是保存在内存,未更新对应磁盘的文件)
/slam_toolbox/manual_loop_closure
服务7:加载磁盘位姿图
/slam_toolbox/deserialize_map
- match_type含义:
1:开始于位姿图零点
2:开始于通过该服务的initial_pose字段请求的位姿
3:自动定位(?不确定)
③ 探索定位接口
比建图接口多一个
定位服务1:清除定位的缓存
/slam_toolbox/clear_localization_buffer
initialpose定位指定值:
localization包拓展的地图仅供定位时参考,定位位姿图回归后自然消除/合并。
④ 探索lifelong-slam接口
开源项目地址:https://github.com/SteveMacenski/slam_toolbox/wiki/Experimental-Lifelong-Mapping-Node
终身制图,即动态更新地图,相比定位模式缺少了initialpose的话题订阅
配置参数文件说明
以下设置和选项向您展示。默认配置在config
目录中给出。
求解器参数
solver_plugin
- 用于 karto 扫描求解器的非线性求解器类型。选项:solver_plugins::CeresSolver
, solver_plugins::SpaSolver
, solver_plugins::G2oSolver
. 默认值:solver_plugins::CeresSolver
。
ceres_linear_solver
- Ceres 使用的线性求解器。选项:SPARSE_NORMAL_CHOLESKY
, SPARSE_SCHUR
, ITERATIVE_SCHUR
, CGNR
. 默认为SPARSE_NORMAL_CHOLESKY
.
ceres_preconditioner
- 与该求解器一起使用的预处理器。选项:JACOBI
,IDENTITY
(无)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 问题创建中用于性能优化的“映射”或“本地化”模式
工具箱参数
odom_frame
- 里程计框架
map_frame
- 地图框
base_frame
- 基本框架
scan_topic
- 扫描主题,_绝对_路径,ei /scan
notscan
map_file_name
- 启动时加载的姿势图文件的名称(如果可用)
map_start_pose
- 姿势以开始姿势图映射/定位(如果可用)
map_start_at_dock
- 如果可用,在码头(第一个节点)开始加载姿势图。如果同时设置了pose和dock,它将使用pose
debug_logging
- 将记录器更改为调试
throttle_scans
- 同步模式下限制的扫描次数
transform_publish_period
- odom 变换发布期间的地图。0 不会发布转换
map_update_interval
- 为其他应用程序/可视化更新 2D 占用图的间隔
enable_interactive_mode
- 是否允许启用交互模式。交互模式将保留映射到其 ID 的激光扫描缓存,以便在交互模式下进行可视化。结果,进程的内存将增加。这在本地化和终身模式下被手动禁用,因为它们会随着时间的推移增加内存利用率。适用于映射或连续映射模式。
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_closing
- 是否做闭环(如果你不确定,答案是“真的”)
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
- 测试精细扫描匹配的角度范围
coarse_search_angle_offset
- 测试粗略扫描匹配的角度范围
coarse_angle_resolution
- 在偏移范围内的角度分辨率以测试扫描匹配
minimum_angle_penalty
- 角度最小的惩罚可以确保尺寸不会爆炸
minimum_distance_penalty
- 扫描可以确保尺寸不会爆炸的最小惩罚
use_response_expansion
- 如果没有找到可行的匹配,是否自动增加搜索网格大小