基于Cartographer-ros的激光SLAM导航机器人实现原理

以Autolabor Pro1 导航套件为例,概述SLAM导航机器人的实现原理,并介绍该机器人的实现原理。

在这里插入图片描述
Autolabor Pro1 导航机器人是一个基于ROS的开放式机器人平台,包含机器人底盘、全套传感器及软件系统,已实现了室内外自动导航自动循迹智能避障等功能。

详细视频介绍

平台室内自动导航的技术方案是激光SLAM


目录

  1. SLAM 介绍
  2. 基于激光SLAM的机器人自主导航
  3. Autolabor Pro1 SLAM 导航功能详解

SLAM 介绍

SLAM,全称是 Simultaneous Localization and Mapping,同时定位与地图构建。

SLAM 技术解决的是,我在哪里?(定位Localization )我周围是什么样?(建图Mapping)这两个问题。

移动设备从未知环境中的某一点开始运动,根据传感器获取到的数据,即时计算获取传感器的位置并绘制周围的环境。

在这里插入图片描述

SLAM 的应用很广泛,有扫地机器人、无人驾驶汽车、无人机,三维场景重建等。

根据使用传感器不同,SLAM的可分为激光SLAM和视觉SLAM(VSLAM),本文介绍的是激光SLAM,对视觉SLAM相关知识感兴趣的可以看这里

基于激光SLAM的机器人自主导航

激光SLAM导航,指的是使用激光雷达采集的数据进行建图与定位(SLAM),并在构建的环境地图中自动导航(规划+控制)。
在这里插入图片描述
地图构建完成后,给出目标点,根据当前位置信息与已知环境地图规划出可行走路径,控制机器人运动,最终达到目标点。

在这里插入图片描述
以上只是简单概述了机器人导航的流程,但 SLAM 与 路径规划/Planning 都是很复杂的内容,在此不做过多的探讨。

Autolabor Pro1 SLAM 导航功能详解

Autolabor SLAM 导航使用的是谷歌开源的 Cartographer,支持多平台和传感器配置,提供2D和3D实时同步定位与建图,使用回环检测消除建图产生的累积误差,建图效果更好,在国内外众多机器人应用上得到了广泛使用。

Cartographer is a system that provides real-time simultaneous localization and mapping (SLAM) in 2D and 3D across multiple platforms and sensor configurations.

cartographer 2d demo

传感器

在这里插入图片描述
Autolabor SLAM导航机器人,前后底部各安置了1个激光雷达,前侧车体内部左右各有一个编码器/轮速里程计。

前后双激光雷达,能够360度探测周围环境,测量距离最大可达10m,可以有效的提升避障效率。

建图原理

在这里插入图片描述

步骤输入数据操作输出数据使用ROS包
1左编码器数据 右编码器数据使用运动模型计算编码器数据,得到符合ROS标准的里程计数据里程计数据autolabor_pro_driver
2前雷达数据 后雷达数据裁切并融合前后激光雷达采集的数据,得到机器人周围环境点云数据雷达点云数据cartographer_ros laser_filters
3里程计数据 雷达点云数据点云匹配相对位姿数据 子地图数据cartographer_ros
4相对位姿数据 子地图数据回环检测,得到子地图拼接的全地图数据地图数据cartographer_ros

Tips:

  1. Cartographer 可以配置传感器的个数,是否使用里程计odom/imu等。此应用中使用了odom的数据,但实际上cartographer是可以不用里程计数据的。相应的配置文件在cartographer_ros\configuration_files路径下。

  2. Cartographer 最终生成的地图是由一个个的子地图拼接而来的submap
    list,由cartographer_occupancy_grid_node 节点将其转换为ROS的网格地图,再发布出去。

Cartographer 建图 launch配置示例


    <node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename two_laser_mapping.lua"
      output="screen">
    </node>
    
    <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros" type="cartographer_occupancy_grid_node" args="-resolution 0.05" />


导航原理

在这里插入图片描述

步骤输入数据操作输出数据使用ROS包
1左编码器数据 右编码器数据使用运动模型计算编码器数据,得到符合ROS标准的里程计数据里程计数据autolabor_pro_driver
2前雷达数据 后雷达数据 里程计数据 地图数据将机器人的实时数据与已构建的地图进行匹配当前机器人在环境中的位姿cartographer_ros
3目标机器人位姿给机器人制定一个目标点move_base
4当前机器人位姿 地图数据 目标机器人位姿根据机器人当前位姿与地图数据,进行全局规划路线路径数据(初步预估导航路线)global_planner(dijkstra)
5路径数据 地图数据 前雷达数据 后雷达数据根据规划路径开始导航,进行过程中随着实际环境、障碍物变化,进行局部路径规划,实时避障局部路径规划 避障costmap_2d teb_local_planner
6速度信息 /cmd_vel向底发送速度命令move_base

说明:

  1. move_base, global_planner(dijkstra), costmap_2d 这些功能包(package)都从属于
    Navigation 导航这个大的功能包集,teb_local_planner 是navigation包的一个插件。
  2. 机器人导航过程中,会按照周围环境、实时障碍物做调整不断规划调整路径,向底层发布指令,步骤五和六是一个多次的过程,并非一次就结束了。

导航 launch配置示例

<node name="cartographer_node" pkg="cartographer_ros"
      type="cartographer_node" args="
          -configuration_directory $(find cartographer_ros)/configuration_files
          -configuration_basename two_laser_navigation.lua
          -load_state_filename $(find autolabor_navigation_launch)/map/map.pbstream"
      output="screen">
    </node>

    <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros" type="cartographer_occupancy_grid_node" args="-resolution 0.05" />

    <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
        <rosparam file="$(find autolabor_navigation_launch)/two_laser_navigation_param/move_base_params.yaml" command="load" />
        <rosparam file="$(find autolabor_navigation_launch)/two_laser_navigation_param/global_costmap_params.yaml" command="load" ns="global_costmap"/>
        <rosparam file="$(find autolabor_navigation_launch)/two_laser_navigation_param/local_costmap_params.yaml" command="load" ns="local_costmap"/>
        <rosparam file="$(find autolabor_navigation_launch)/two_laser_navigation_param/global_planner_params.yaml" command="load" ns="GlobalPlanner"/>
        <rosparam file="$(find autolabor_navigation_launch)/two_laser_navigation_param/teb_local_planner_params.yaml" command="load" ns="TebLocalPlannerROS"/>
    </node>

以上介绍了基于ROS的激光SLAM导航机器人的实现原理与流程,下次给大家讲讲定点巡逻/循迹机器人的实现原理。

对配置文件感兴趣的小伙伴,可以微信关注公众号autolabor,对话框回复【导航launch】获取完整的建图导航launch。

在这里插入图片描述

  • 4
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Cartographer主要理论是通过闭环检测来消除构图过程中产生的累积误差[1]。用于闭环检测的基本单元是submap。一个submap是由一定数量的laser scan构成。将一个laser scan插入其对应的submap时,会基于submap已有的laser scan及其它传感器数据估计其在该submap中的最佳位置。submap的创建在短时间内的误差累积被认为是足够小的。然而随着时间推移,越来越多的submap被创建后,submap间的误差累积则会越来越大。因此需要通过闭环检测适当的优化这些submap的位姿进而消除这些累积误差,这就将问题转化成一个位姿优化问题。当一个submap的构建完成时,也就是不会再有新的laser scan插入到该submap时,该submap就会加入到闭环检测中。闭环检测会考虑所有的已完成创建的submap。当一个新的laser scan加入到地图中时,如果该laser scan的估计位姿与地图中某个submap的某个laser scan的位姿比较接近的话,那么通过某种 scan match策略就会找到该闭环。Cartographer中的scan match策略通过在新加入地图的laser scan的估计位姿附近取一个窗口,进而在该窗口内寻找该laser scan的一个可能的匹配,如果找到了一个足够好的匹配,则会将该匹配的闭环约束加入到位姿优化问题中。Cartographer的重点内容就是融合多传感器数据的局部submap创建以及用于闭环检测的scan match策略的实现。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值