激光slam认知

slam介绍

什么是slam?

  • SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建,或并发建图与定位
  • 问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描绘出此环境完全的地图
  • 所谓完全的地图(a consistent map)是指不受障碍行进到房间可进入的每个角落

slam分类

根据建图时所用的传感器的不同,可将现有的slam算法分为两类:

  • 激光slam
  • 视觉slam

在这里插入图片描述

机器人必备条件

硬件要求

  • 差分轮式机器人,可使用Twist速度指令控制
    • linear:XYZ方向的线速度,单位是m/s
    • angular:XYZ方向上的角速度,单位是rad/s
  • 机器人必须安装激光雷达等测距设备,可以获取环境深度信息
  • 最好使用正方形和圆形的机器人,其他外形的机器人虽然可以正常使用,但是效果可能不佳

深度信息

激光雷达扫描信息:
在这里插入图片描述

  • angle_min:可检测范围的起始角度
  • angle_max:可检测范围的终止角度,与angle_min组成激光雷达的可检测范围
  • angle_increment:相邻数据帧之间的角度步长
  • time_increment:采集到相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用
  • scan_time:采集一帧数据所需要的时间
  • range_min:最近可检测深度的阈值
  • range_max:最远可检测深度的阈值
  • ranges:一帧深度数据的存储数组

在这里插入图片描述

里程计信息

在这里插入图片描述

  • pose:机器人当前位置坐标,包括
    • 机器人的XYZ三轴位置与方向
    • 用于校正误差的协方差矩阵
  • twist:机器人当前的运行状态,包括
    • XYZ三轴的线速度与角速度
    • 用于校正误差的协方差矩阵

仿真环境

创建仿真环境:
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
在这里插入图片描述
注意:
编译源码时可能需要一些依赖比如:sudo apt-get install ros-kinetic-gazebo-ros-control
安装以上命令有错误时尝试:sudo apt-get –f install

ROS gmapping slam算法实现

gmapping功能包

  • 基于激光雷达
  • Rao-Blackwellized粒子滤波算法
  • 二维栅格地图
  • 需要机器人提供里程计信息
  • OpenSlam开源算法
  • 输出地图话题:nav_msgs/OccupancyGrid
  • gmapping功能包的总体框架
    在这里插入图片描述
安装gmapping

sudo apt-get install ros-kinetic-gmapping

gmapping功能包中的话题和服务

在这里插入图片描述

gmapping功能包中的tf变换

在这里插入图片描述

栅格地图取值原理

在这里插入图片描述

  • 致命障碍:
    • 栅格值为254
    • 障碍物与机器人的中心重合
    • 机器人必然与障碍物发生碰撞
  • 内切障碍:
    • 栅格值为253
    • 障碍物处于机器人轮廓的内切圆
    • 机器人也必然与障碍物发生碰撞
  • 外切障碍:
    • 栅格值为252~128
    • 障碍物处于机器人的轮廓的外切圆内
    • 机器人与障碍物临界接触,不一定发生碰撞
  • 非自由空间:
    • 栅格值为128~0
    • 障碍物附近区域
    • 机器人进入该区域,将有较大概率发生碰撞
  • 自由空间:
    • 栅格值为0
    • 没有障碍物
    • 机器人可以自由通过
  • 未知区域
    • 栅格值为255
    • 并未探知是否有障碍物
    • 机器人可以前往继续建图
配置gmapping节点

文件为:src5/mbot_navigation/launch/gmapping.launch
参数说明可参看:http://wiki.ros.org/gmapping

<launch>
    <arg name="scan_topic" default="scan" />

    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
        <param name="odom_frame" value="odom"/>
        <param name="map_update_interval" value="5.0"/>
        <!-- Set maxUrange < actual maximum range of the Laser -->
        <param name="maxRange" value="5.0"/>
        <param name="maxUrange" value="4.5"/>
        <param name="sigma" value="0.05"/>
        <param name="kernelSize" value="1"/>
        <param name="lstep" value="0.05"/>
        <param name="astep" value="0.05"/>
        <param name="iterations" value="5"/>
        <param name="lsigma" value="0.075"/>
        <param name="ogain" value="3.0"/>
        <param name="lskip" value="0"/>
        <param name="srr" value="0.01"/>
        <param name="srt" value="0.02"/>
        <param name="str" value="0.01"/>
        <param name="stt" value="0.02"/>
        <param name="linearUpdate" value="0.5"/>
        <param name="angularUpdate" value="0.436"/>
        <param name="temporalUpdate" value="-1.0"/>
        <param name="resampleThreshold" value="0.5"/>
        <param name="particles" value="80"/>
        <param name="xmin" value="-1.0"/>
        <param name="ymin" value="-1.0"/>
        <param name="xmax" value="1.0"/>
        <param name="ymax" value="1.0"/>
        <param name="delta" value="0.05"/>
        <param name="llsamplerange" value="0.01"/>
        <param name="llsamplestep" value="0.01"/>
        <param name="lasamplerange" value="0.005"/>
        <param name="lasamplestep" value="0.005"/>
        <remap from="scan" to="$(arg scan_topic)"/>
    </node>
</launch>

操作小记

启动mapping演示(激光雷达)
$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation gmapping_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

效果如下
在这里插入图片描述
用键盘控制机器人移动得到地图
在这里插入图片描述
保存地图:rosrun map_server map_saver -f cloister_gmapping
下面为得到的地图 :
src5/mbot_navigation/maps/cloister_gmapping.pgm
在这里插入图片描述
src5/mbot_navigation/maps/cloister_gmapping.yaml

image: cloister_gmapping.pgm
resolution: 0.050000
origin: [-15.400000, -12.200000, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

启动gmapping演示(Kinect)
$ roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch
$ roslaunch mbot_navigation gmapping_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

效果如下:
在这里插入图片描述


真实机器人gmapping建图示例
# 机器人端
$ roslaunch mbot_bringup mbot_with_laser.launch

# pc端
$ roslaunch mbot_navigation gmapping_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

效果如下:
在这里插入图片描述

ROS hector slam算法实现

hector_slam功能包

  • 基于激光雷达
  • 高斯牛顿方法
  • 二维栅格地图
  • 不需要里程计数据
  • 输出地图话题:nav_msgs/OccupancyGrid
  • 总体框架
    在这里插入图片描述
安装hector_slam

sudo apt-get install ros-kinetic-hector-slam

hector功能包中的话题和服务

在这里插入图片描述

hector功能包中的tf变换

在这里插入图片描述

配置hector_mapping节点

src5/mbot_navigation/launch/hector.launch

<launch>

    <node pkg = "hector_mapping" type="hector_mapping" name="hector_mapping" output="screen">
        <!-- Frame names -->
        <param name="pub_map_odom_transform" value="true"/>
        <param name="map_frame" value="map" />
        <param name="base_frame" value="base_footprint" />
        <param name="odom_frame" value="odom" />

        <!-- Tf use -->
        <param name="use_tf_scan_transformation" value="true"/>
        <param name="use_tf_pose_start_estimate" value="false"/>

        <!-- Map size / start point -->
        <param name="map_resolution" value="0.05"/>
        <param name="map_size" value="2048"/>
        <param name="map_start_x" value="0.5"/>
        <param name="map_start_y" value="0.5" />
        <param name="laser_z_min_value" value = "-1.0" />
        <param name="laser_z_max_value" value = "1.0" />
        <param name="map_multi_res_levels" value="2" />

        <param name="map_pub_period" value="2" />
        <param name="laser_min_dist" value="0.4" />
        <param name="laser_max_dist" value="5.5" />
        <param name="output_timing" value="false" />
        <param name="pub_map_scanmatch_transform" value="true" />

        <!-- Map update parameters -->
        <param name="update_factor_free" value="0.4"/>
        <param name="update_factor_occupied" value="0.7" />    
        <param name="map_update_distance_thresh" value="0.2"/>
        <param name="map_update_angle_thresh" value="0.06" />

        <!-- Advertising config --> 
        <param name="advertise_map_service" value="true"/>
        <param name="scan_subscriber_queue_size" value="5"/>
        <param name="scan_topic" value="scan"/>
    </node>

</launch>

操作小记

启动hector_slam演示
$ roslaunch mbot_gaze mbot_laser_nav_gazebo.launch
$ roslaunch mbot_navigation hector_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

效果如下:
在这里插入图片描述
注意:hector_slam过程中发生打滑现象
在这里插入图片描述

ROS cartographer slam算法实现

cartographer功能包

  • 2016年10月5日,谷歌开源
  • 基于图网络的优化方法
  • 二维或三维条件下的定位及建图功能
  • 设计目的是在计算资源有限的情况下,实时获取相对较高精度的2D地图
  • 主要基于激光雷达
  • 后续会支持更多传感器和机器人平台,同时不断增加新的功能

操作小记

mkdir -p catkin_google_ws/src

# 安装工具
sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build

# 初始化工作空间
cd catkin_google_ws
wstool init src

将源码(位置:catkin_google_ws/src)复制到src目录下

编译:rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
安装:catkin_make_isolated --install --use-ninja
设置环境变量:在home文件夹下的.bashrc中最后一行添加:
source ~/catkin_google_ws/install_isolated/setup.bash

配置cartographer节点
src5/mbot_navigation/launch/cartographer_demo_rplidar.launch

<launch>  
  
  <param name="/use_sim_time" value="true" />  

  <node name="cartographer_node" pkg="cartographer_ros"  
        type="cartographer_node" args="  
            -configuration_directory $(find cartographer_ros)/configuration_files  
            -configuration_basename rplidar.lua"  
        output="screen">  
    <remap from="scan" to="scan" />  
  </node>  

  <node name="rviz" pkg="rviz" type="rviz" required="true"  
        args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />  
</launch>

参数配置
src5/mbot_navigation/config/rplidar.lua

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
    map_builder = MAP_BUILDER,
    trajectory_builder = TRAJECTORY_BUILDER,
    map_frame = "map",
    tracking_frame = "laser_link",
    published_frame = "laser_link",
    odom_frame = "odom",
    provide_odom_frame = true,
    use_odometry = false,
    num_laser_scans = 1,
    num_multi_echo_laser_scans = 0,
    num_subdivisions_per_laser_scan = 1,
    num_point_clouds = 0,
    lookup_transform_timeout_sec = 0.2,
    submap_publish_period_sec = 0.3,
    pose_publish_period_sec = 5e-3,
    trajectory_publish_period_sec = 30e-3,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER_2D.submaps.num_range_data = 35
TRAJECTORY_BUILDER_2D.min_range = 0.3
TRAJECTORY_BUILDER_2D.max_range = 8.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 1.
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 10.
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e-1

SPARSE_POSE_GRAPH.optimization_problem.huber_scale = 1e2
SPARSE_POSE_GRAPH.optimize_every_n_scans = 35
SPARSE_POSE_GRAPH.constraint_builder.min_score = 0.65

return options

启动仿真

cd catkin_google_ws

catkin_make_isolated --install --use-ninja
roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
roslaunch cartographer_ros cartographer_demo_rplidar.launch
roslaunch mbot_teleop mbot_teleop.launch

效果如下:
在这里插入图片描述

发布了138 篇原创文章 · 获赞 68 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_40626497/article/details/103760464