激光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)
blank

相关推荐

  • t分布与t检验的一点理解

    t分布与t检验的一点理解

  • HTML入门

    HTML入门HTML入门

  • 一致性哈希算法原理详解

    一致性哈希算法原理详解(1)一致性哈希算法将整个哈希值空间按照顺时针方向组织成一个虚拟的圆环,称为Hash环;(2)接着将各个服务器使用Hash函数进行哈希,具体可以选择服务器的IP或主机名作为关键字进行哈希,从而确定每台机器在哈希环上的位置;(3)最后使用算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针寻找,第一台遇到的服务器就是其应该定位到的服务器

  • Mac 读写NTFS硬盘

    Mac 读写NTFS硬盘查看磁盘DeviceNode:【diskutilinfo磁盘路径】diskutilinfo/Volumes/CPBA_X64FRE_ZH-CN_DV5通过DeviceNode卸载磁盘:【sudoumount/dev/disk2s1】…

  • Linux清理挖矿程序

    Linux清理挖矿程序Linux清理挖矿程序@bugLinux清理挖矿程序最近服务器经常被挖矿,一些经验1.找到挖矿程序挖矿程序跑起来几乎占满了所有的CPU,以及GPU,用watch-n1nvidia-smi可以实时看到挖矿程序的PID号,此时不能用kill-9PID号来进行清楚,会发现它换一个PID号继续跑,基本上关机、重启、改密码等操作它也会自动跑上。使用top可以看到挖矿程序进程名字xxx(command一行),psaux|grepxxx或者ls-l/proc/{PID号}/exe找到病毒

  • docker搭建kafka集群[通俗易懂]

    docker搭建kafka集群[通俗易懂]docker搭建kafka集群我在M1mbp上使用的以下镜像新建文件zk-kafka-docker-compose.ymlversion:”2″services:zookeeper:user:rootimage:docker.io/zookeeperports:-“12181:2181″environment:-ALLOW_ANONYMOUS_LOGIN=yesvolumes:-zoo

发表回复

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

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