前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >激光slam认知_激光slam的优缺点

激光slam认知_激光slam的优缺点

作者头像
全栈程序员站长
发布2022-09-24 07:26:03
9190
发布2022-09-24 07:26:03
举报

大家好,又见面了,我是你们的朋友全栈君。

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

代码语言:javascript
复制
<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演示(激光雷达)
代码语言:javascript
复制
$ 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

代码语言:javascript
复制
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)
代码语言:javascript
复制
$ roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch
$ roslaunch mbot_navigation gmapping_demo.launch
$ roslaunch mbot_teleop mbot_teleop.launch

效果如下:

在这里插入图片描述
在这里插入图片描述

真实机器人gmapping建图示例
代码语言:javascript
复制
# 机器人端
$ 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

代码语言:javascript
复制
<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演示
代码语言:javascript
复制
$ 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地图
  • 主要基于激光雷达
  • 后续会支持更多传感器和机器人平台,同时不断增加新的功能
操作小记
代码语言:javascript
复制
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

代码语言:javascript
复制
<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

代码语言:javascript
复制
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

启动仿真

代码语言:javascript
复制
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

效果如下:

在这里插入图片描述
在这里插入图片描述

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172360.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • slam介绍
    • 什么是slam?
      • slam分类
      • 机器人必备条件
        • 硬件要求
          • 深度信息
            • 里程计信息
              • 仿真环境
              • ROS gmapping slam算法实现
                • gmapping功能包
                  • 操作小记
                  • ROS hector slam算法实现
                    • hector_slam功能包
                      • 操作小记
                      • ROS cartographer slam算法实现
                        • cartographer功能包
                          • 操作小记
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档