0. 简介
karto是基于扫描匹配,回环检测和图优化的SLAM算法
1. 功能包介绍
1.0 订阅的话题
0. base_link → odom 基坐标系与里程计坐标系的TF
1. <scan frame> → base_link 雷达扫描坐标系与基坐标系的TF
2. scan (sensor_msgs/LaserScan) 雷达扫描数据
1.1 发布的主题及服务及TF
主题
0. map_metadata (nav_msgs/MapMetaData) 地图元数据
1. map (nav_msgs/OccupancyGrid) 地图数据
2. visualization_marker_array (visualization_msgs/MarkerArray) 定期更新的姿态图
服务
dynamic_map (nav_msgs/GetMap) 动态获取地图服务
TF
map → odom
1.3 整体框图
2. 配置使用
2.0 二进制安装
sudo apt-get install ros-<ros版本>-slam-karto
如
sudo apt install ros-noetic-slam-karto
2.1 launch文件配置
<launch>
<node pkg="slam_karto" type="slam_karto" name="slam_karto" output="screen" clear_params="true">
<param name="map_frame " value="map"/> <!-- 地图坐标系名称 -->
<param name="odom_frame" value="odom"/> <!-- 里程计坐标系名称 -->
<param name="base_frame" value="base_footprint"/> <!-- 基坐标系名称 -->
<param name="resolution" value="0.025"/> <!-- 默认值0.5,地图分辨率 -->
<param name="map_update_interval" value="25"/> <!-- 默认值5.0,地图更新之间的时间间隔(s) -->
<!-- 下列不建议修改 -->
<param name="throttle_scans" value="1"/> <!-- 默认值1,每这么多雷达扫描光束处理1次 -->
<param name="delta" value="0.05"/> <!-- 默认值0.05,与分辨率相同,为与 gmapping 的参数名称兼容而定义 -->
<param name="transform_publish_period" value="0.05"/> <!-- 默认值0.05,TF发布之间的时间间隔(s),置0为禁用 -->
<param name="use_scan_matching" value="true"/> <!-- 默认值true,置true时,映射器将使用扫描匹配算法。实际环境下,应置true,以便映射器算法可以纠正里程计和扫描数据中的噪声和错误。模拟情况下,应置为false -->
<param name="use_scan_barycenter" value="true"/> <!-- 默认值true,使用扫描端点的重心来定义扫描之间的距离 -->
<param name="minimum_travel_distance" value="0.2"/> <!-- 默认值0.2,设置扫描之间的最小行程,如果新扫描的位置大于上一次扫描的 minimumTravelDistance,则映射器将使用来自新扫描的数据。否则,如果它也不满足最小航向变化要求,它将丢弃新扫描。出于性能原因,通常最好仅在机器人移动了合理数量时才处理扫描 -->
<param name="minimum_travel_heading" value="deg2rad(10)"/> <!-- 默认值deg2rad(10),设置扫描之间的最小航向变化。如果新扫描的航向大于上一次扫描的 minimum_travel_heading,则映射器将使用新扫描的数据。否则,如果它也不满足最小移动距离要求,它将丢弃新扫描。出于性能原因,通常最好仅在机器人移动了合理数量时才处理扫描 -->
<param name="scan_buffer_size" value="70"/> <!-- 默认值70,设置为扫描匹配存储的扫描链的长度。 scan_buffer_size 应设置为大约 scan_buffer_maximum_scan_distance / minimum_travel_distance。这个想法是获得一个大约 20 米长的区域用于扫描匹配。例如,如果我们每隔 minimum_travel_distance == 0.3 米添加一次扫描,那么 scan_buffer_size 应该是 20 / 0.3 = 67 -->
<param name="scan_buffer_maximum_scan_distance" value="20.0"/> <!-- 默认值20.0,为匹配而存储的扫描链中第一次和最后一次扫描之间的最大距离 -->
<param name="link_match_minimum_response_fine" value="0.8"/> <!-- 默认值0.8,仅当相关响应值大于此值时,才会链接扫描 -->
<param name="link_scan_maximum_distance" value="10.0"/> <!-- 默认值10.0,链接扫描之间的最大距离。无论相关响应值如何,相距较远的扫描都不会链接 -->
<param name="loop_search_maximum_distance" value="4.0"/> <!-- 默认值4.0,距当前位置小于此距离的扫描将被视为闭环匹配 -->
<param name="do_loop_closing" value="true"/> <!-- 默认值true,启用/禁用闭环 -->
<param name="loop_match_minimum_chain_size" value="10"/> <!-- 默认值10,当闭环检测找到一个候选对象时,它必须是大量链接扫描的一部分。如果扫描链小于此值,不会尝试关闭循环 -->
<param name="loop_match_maximum_variance_coarse" value="sqrt(0.4)"/> <!-- 默认值sqrt(0.4),可能的闭环的协方差值必须小于该值才能考虑可行的解决方案。这适用于粗略搜索 -->
<param name="loop_match_minimum_response_coarse" value="0.8"/> <!-- 默认值0.8,如果响应大于此值,则以粗分辨率启动闭环搜索 -->
<param name="loop_match_minimum_response_fine" value="0.8"/> <!-- 默认值0.8,如果响应大于此值,则以精细分辨率启动闭环搜索 -->
<param name="correlation_search_space_dimension" value="0.3"/> <!-- 默认值0.3,设置匹配器使用的搜索网格的大小。搜索网格的大小为correlation_search_space_dimension x correlation_search_space_dimension -->
<param name="correlation_search_space_resolution" value="0.01"/> <!-- 默认值0.01,设置相关网格的分辨率(网格单元的大小) -->
<param name="correlation_search_space_smear_deviation" value="0.03"/> <!-- 默认值0.03,点读数被 X 和 Y 中的该值涂抹,以创建更平滑的响应 -->
<param name="loop_search_space_dimension" value="8.0"/> <!-- 默认值8.0,匹配器使用的搜索网格的大小 -->
<param name="loop_search_space_resolution" value="0.05"/> <!-- 默认值0.05,相关网格的分辨率(网格单元的大小) -->
<param name="loop_search_space_smear_deviation" value="0.03"/> <!-- 默认值0.03,点读数被 X 和 Y 中的该值涂抹,以创建更平滑的响应 -->
<param name="distance_variance_penalty" value="sqrt(0.3)"/> <!-- 默认值sqrt(0.3),扫描匹配时偏离里程计的惩罚方差。惩罚是一个乘数(小于 1.0),是被测扫描位置的增量和里程计姿态的函数 -->
<param name="angle_variance_penalty" value="sqrt(deg2rad(20))"/> <!-- 默认值sqrt(deg2rad(20)),见 distance_variance_penalty -->
<param name="fine_search_angle_offset" value="deg2rad(0.2)"/> <!-- 默认值deg2rad(0.2),精细搜索期间要搜索的角度范围 -->
<param name="coarse_search_angle_offset" value="deg2rad(20.0)"/> <!-- 默认值deg2rad(20.0),在粗略搜索期间要搜索的角度范围 -->
<param name="coarse_angle_resolution" value="deg2rad(2.0)"/> <!-- 默认值deg2rad(2.0),在粗略搜索期间要搜索的角度分辨率 -->
<param name="minimum_angle_penalty" value="0.9"/> <!-- 默认值0.9,角度惩罚乘数的最小值,因此分数不会变得太小 -->
<param name="minimum_distance_penalty" value="0.5"/> <!-- 默认值0.5,距离惩罚乘数的最小值,因此分数不会变得太小 -->
<param name="use_response_expansion" value="false"/> <!-- 默认值false,如果最初没有找到好的匹配,是否增加搜索空间 -->
</node>
</launch>
3. 注意事项
更新时间尽量调大,不然很卡