机器人之Karto

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. 注意事项

更新时间尽量调大,不然很卡

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

酸奶可乐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值