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

激光slam认知_激光slam的优缺点slam介绍什么是slam?SLAM(simultaneouslocalizationandmapping),也称为CML(ConcurrentMappingandLocalization),即时定位与地图构建,或并发建图与定位。问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描绘出此环境完全的地图所谓完全的地图(aconsistent…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ThingsBoard——Docker重启失败,报错Connection to localhost:5432 refused的解决方法

    ThingsBoard——Docker重启失败,报错Connection to localhost:5432 refused的解决方法一、问题现在还没编译好thingsboard源代码,用的是docker搭建起来的环境。在写自定义节点,要打包好扔到docker里,再重启docker。后来发现经常重启失败,报错的错误也都是这样:2022-03-0508:53:23,164[main]ERRORcom.zaxxer.hikari.pool.HikariPool-HikariPool-1-Exceptionduringpoolinitialization.org.postgresql.util.PSQLExcepti

  • 个人网站如何赚钱

    个人网站如何赚钱

  • tkmapper教程_tkr和tka的区别

    tkmapper教程_tkr和tka的区别tkMapper入门1、tkMapper介绍1.1SpringBoot整合MyBatis以及tkMapper1.2在启动类上修改注解`@MapperScan`2、tkMapper的使用2.1创建数据表2.2创建实体类2.3创建Mapper接口2.4测试3、tkMapper的常用方法3.1类别实体类3.2类别接口增加修改删除查询查询所有根据主键查询条件查询分页查询带条件的分页查询关联查询1、通过多个单表操作实现2、自定义连接查询2.1、在DAO接口自定义方法2.2、创建Mapper文件1、

  • 60mph和kmh换算_mph换算器(速度计算器在线)「建议收藏」

    60mph和kmh换算_mph换算器(速度计算器在线)「建议收藏」mph是英里每时的意思吗?如何换算成千米每时?100mph=160.9kmhmph是英里每时的意思吗?如何换算成千米每时?mph是米/小时的意思mitersperhour也可写成m/hAkm/h=A*1000m/h玩极品飞车12,上面的速度是mph,怎么换算啊1英里=5280英尺=63360英寸=1609.344米汽车速度表上,英制的MPH与公制的km/…

  • 走进云时代_怎么跟上时代的脚步

    走进云时代_怎么跟上时代的脚步如何跟上时代的步伐进入云世界

  • windows下安装docker_bindService

    windows下安装docker_bindService1、下载BINDhttp://ftp.isc.org/isc/bind9/9.4.3/BIND9.4.3.zip2、安装下载回来是zip的压缩包,解压以后直接双击BINDInstall.exe安装,默认安装路径是C:\WINDOWS\system32\dns。bind在win32下将自己注册成服务,服务名叫ISCBIND,程序名为named.exe,启动服务需要用一专有帐户,默认名称为named,密码由安装者自定义。点击install以后,程序便安装在C:\WINDOWS\system32\dns

    2022年10月30日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号