Chapter6:机器人SLAM与自主导航

news2024/11/18 15:28:50

R O S 1 {\rm ROS1} ROS1的基础及应用,基于古月的课,各位可以去看,基于 h a w k b o t {\rm hawkbot} hawkbot机器人进行实际操作。
R O S {\rm ROS} ROS版本: R O S 1 {\rm ROS1} ROS1 M e l o d i c {\rm Melodic} Melodic;实际机器人: H a w k b o t {\rm Hawkbot} Hawkbot



1.机器人必备条件

  1. 硬件要求

    • 差分轮式机器人,使用 T w i s t {\rm Twist} Twist速度指令控制
      • l i n e a r {\rm linear} linear X Y Z {\rm XYZ} XYZ方向上的线速度,单位: m / s {\rm m/s} m/s
      • a n g u l a r {\rm angular} angular X Y Z {\rm XYZ} XYZ方向上的角速度,单位: r a d / s {\rm rad/s} rad/s
    • 机器人必须安装激光雷达等测距设备,可以获取环境深度信息;
    • 最好使用正方形和圆形的机器人,其他外形的机器人效果可能不佳;
  2. 深度信息

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

    • p o s e {\rm pose} pose:机器人当前位置坐标,包括机器人的 X Y Z {\rm XYZ} XYZ三轴位置与方向参数,及用于校正误差的协方差矩阵;
    • t w i s t {\rm twist} twist:机器人当前的运动状态,包括 X Y Z {\rm XYZ} XYZ三轴的线速度与角速度,及用于校正误差的协方差矩阵;
  4. 仿真环境

    # 创建仿真环境
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    

2.ROS SLAM功能包应用方法

  1. g m a p p i n g {\rm gmapping} gmapping功能包概述

    • 基于激光雷达;
    • R a o − B l a c k w e l l i z e d {\rm Rao-Blackwellized} RaoBlackwellized粒子滤波算法;
    • 二维栅格地图;
    • 需要机器人提供里程计信息;
    • O p e n S l a m {\rm OpenSlam} OpenSlam开源算法;
    • 输出地图话题: n a v _ m s g s / O c c u p a n c y G r i d {\rm nav\_msgs/OccupancyGrid} nav_msgs/OccupancyGrid
  2. g m a p p i n g {\rm gmapping} gmapping功能包总体框架

    1

  3. 安装 g m a p p i n g {\rm gmapping} gmapping功能包

    # 安装gmapping
    sudo apt-get install ros-melodic-gmapping
    

    2

  4. 栅格地图取值原理

    3

    • 致命障碍:栅格值为 254 254 254,障碍物与机器人中心重合,此时机器人必然与障碍物发生碰撞;
    • 内切障碍:栅格值为 253 253 253,障碍物处于机器人轮廓的内切圆内,此时机器人也必然与障碍物发生碰撞;
    • 外切障碍:栅格值为 252 ~ 128 252~128 252128,障碍物处于机器人轮廓的外切圆内,此时机器人与障碍物临界接触,不一定发生碰撞;
    • 非自由空间:栅格值为 128 ~ 0 128~0 1280,障碍物附近区域,一旦机器人进入该区域,将有较大概率发生碰撞,属于危险警戒区,机器人应该尽量避免进入;
    • 自由区域:栅格值为 0 0 0,此处没有障碍物,机器人可以自由通过;
    • 未知区域:栅格值为 255 255 255,此处还没有探知是否有障碍物,机器人可以前往继续建图;
  5. 配置 g m a p p i n g {\rm gmapping} gmapping功能包

    # gmapping.launch文件内容
    
    <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>
    
  6. 运行激光雷达建图例程

    # 1.启动gmapping演示
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    roslaunch mbot_navigaztion gmapping_demo.launch
    roslaunch mbot_teleop mbot_teleop.launch
    
    # 2.切换到地图保存目录,保存地图
    roscd mbot_navigation/maps/
    
    # rosrun map_server map_saver -f 地图名
    rosrun map_server map_saver -f simulink_maps
    
    # 注:
    # 建图效果好坏和很多因素有关,如硬件、算法本身、可调参数等;
    # 硬件条件不好,建图过程中可能发生移位,导致建图失败;
    

    建图效果:

    4

    地图的 . p g m {\rm .pgm} .pgm文和 . y a m l {\rm .yaml} .yaml信息:

    5

  7. 运行 k i n e c t {\rm kinect} kinect建图例程

    # 1.启动建图演示
    roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch
    roslaunch mbot_navigation gmapping_demo.launch
    roslaunch mbot_teleop mbot_teleop.launch
    
    # 2.若运行kinect抛出如下错误
    cannot launch node of type [depthimage_to_laserscan/depthimage_to_laserscan]:depthimage_to_laserscan
    
    # 解决方案
    sudo apt-get install ros-melodic-depthimage-to-laserscan
    
    # 注:
    # 使用摄像头建模,效果好坏和硬件配置很大关系;
    # 如下图所示,使用虚拟机建图十分卡顿,很容易发生移位;
    # 如果笔记本的配置不是很好,建议了解建图过程即可;
    # 如果笔记本配置不是很好,建图过程会直接卡死,想退出也难;
    

    没有完全建好的图效果(发生了移位):

    6

  8. 实际机器人建图实例

    # Hawkbot机器人的实际建图过程
    # 1.时间同步
    # 远程登录移动机器人端,并进行时间同步
    ssh ...
    sudo ntpdate 虚拟机IP
    
    # 2.启动建图节点
    roslaunch hawbot bringup.launch(机器人端)
    roslaunch hawkbot teleop_key.launch(机器人或虚拟机端)
    roslaunch hawkbot gmapping_slam.launch(虚拟机端)
    
    # 3.保存地图
    roscd hawkbot/maps/ 
    rosrun map_server map_saver -f 地图名称
    

    7

3.ROS中的导航框架

  1. R O S {\rm ROS} ROS的导航框架

    8

  2. m o v e _ b a s e {\rm move\_base} move_base

    9

    • 全局路径规划 ( g l o b a l   p l a n n e r ) ({\rm global\ planner}) (global planner)
      • 全局最优路径规划;
      • D i j k s t r a {\rm Dijkstra} Dijkstra A ∗ A^* A算法;
    • 本地实时规划 ( l o c a l   p l a n n e r ) ({\rm local\ planner}) (local planner)
      • 规划机器人每个周期内的线速度、角速度,使之尽量符合全局最优路径;
      • 实时避障;
      • T r a j e c t o r y   R o l l o u t {\rm Trajectory\ Rollout} Trajectory Rollout D y n a m i c   W i n d o w   A p p r o a c h e s {\rm Dynamic\ Window\ Approaches} Dynamic Window Approaches算法;
      • 搜索躲避和行进的多条路径,综合各评价标准选取最优路径;
  3. m o v e _ b a s e {\rm move\_base} move_base功能包的话题和服务

    10

  4. 配置 m o v e _ b a s e {\rm move\_base} move_base节点

    # move_base.launch文件内容
    <launch>
    
      <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true">
        <rosparam file="$(find mbot_navigation)/config/mbot/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find mbot_navigation)/config/mbot/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find mbot_navigation)/config/mbot/local_costmap_params.yaml" command="load" />
        <rosparam file="$(find mbot_navigation)/config/mbot/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find mbot_navigation)/config/mbot/base_local_planner_params.yaml" command="load" />
      </node>
      
    </launch>
    
  5. a m c l {\rm amcl} amcl

    • 蒙特卡罗定位方法;
    • 二维环境定位;
    • 针对已有地图使用粒子滤波器跟踪一个机器人的姿态;
  6. a m c l {\rm amcl} amcl功能包的话题和服务

    11

  7. a m c l {\rm amcl} amcl定位

    12

    • 里程计定位:只通过里程计的数据来处理 / b a s e {\rm /base} /base / o d o m {\rm /odom} /odom间的 T F {\rm TF} TF变换;
    • a m c l {\rm amcl} amcl定位:估算机器人在地图坐标系 / m a p {\rm /map} /map下的位姿信息,提供 / b a s e 、 / o d o m 、 / m a p {\rm /base、/odom、/map} /base/odom/map间的 T F {\rm TF} TF变换;
  8. 配置 a m c l {\rm amcl} amcl节点

    # amcl.launch文件内容
    <launch>
        <arg name="use_map_topic" default="false"/>
        <arg name="scan_topic" default="scan"/>
    
        <node pkg="amcl" type="amcl" name="amcl" clear_params="true">
            <param name="use_map_topic" value="$(arg use_map_topic)"/>
            <!-- Publish scans from best pose at a max of 10 Hz -->
            <param name="odom_model_type" value="diff"/>
            <param name="odom_alpha5" value="0.1"/>
            <param name="gui_publish_rate" value="10.0"/>
            <param name="laser_max_beams" value="60"/>
            <param name="laser_max_range" value="12.0"/>
            <param name="min_particles" value="500"/>
            <param name="max_particles" value="2000"/>
            <param name="kld_err" value="0.05"/>
            <param name="kld_z" value="0.99"/>
            <param name="odom_alpha1" value="0.2"/>
            <param name="odom_alpha2" value="0.2"/>
            <!-- translation std dev, m -->
            <param name="odom_alpha3" value="0.2"/>
            <param name="odom_alpha4" value="0.2"/>
            <param name="laser_z_hit" value="0.5"/>
            <param name="laser_z_short" value="0.05"/>
            <param name="laser_z_max" value="0.05"/>
            <param name="laser_z_rand" value="0.5"/>
            <param name="laser_sigma_hit" value="0.2"/>
            <param name="laser_lambda_short" value="0.1"/>
            <param name="laser_model_type" value="likelihood_field"/>
            <!-- <param name="laser_model_type" value="beam"/> -->
            <param name="laser_likelihood_max_dist" value="2.0"/>
            <param name="update_min_d" value="0.25"/>
            <param name="update_min_a" value="0.2"/>
            <param name="odom_frame_id" value="odom"/>
            <param name="resample_interval" value="1"/>
            <!-- Increase tolerance because the computer can get quite busy -->
            <param name="transform_tolerance" value="1.0"/>
            <param name="recovery_alpha_slow" value="0.0"/>
            <param name="recovery_alpha_fast" value="0.0"/>
            <remap from="scan" to="$(arg scan_topic)"/>
        </node>
    </launch>
    
    

4.ROS机器人自主导航

  1. 导航仿真

    # 1.启动导航仿真包
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    roslaunch mbot_navigation nav_cloister_demo.launch
    
    # 2.导航步骤
    # 2.1 若机器人不在建图坐标系原点,先点击"2D Pose Estimate",将地图和雷达数据对上;
    # 2.2 匹配好机器人初始位置后,点击"2D Nav Goal"发布机器人目标点;
    
    

    13

  2. 导航 S L A M {\rm SLAM} SLAM仿真

    # 1.启动相应.launch文件
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    roslaunch mbot_navigation exploring_slam_demo.launch
    
    # 2.通过点击"2D Nav Goal"发布机器人目标点进行建图;
    
    # 自主探索SLAM仿真
    # 启动相应的.launch文件
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    roslaunch mbot_navigation exploring_slam_demo.launch
    rosrun mbot_navigation exploring_slam.py
    
    

    15

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring Cloud Alibaba】001-单体架构与微服务架构

【Spring Cloud Alibaba】001-单体架构与微服务 文章目录【Spring Cloud Alibaba】001-单体架构与微服务一、单体架构1、单体应用与单体架构2、单体应用架构图3、单体架构优缺点优点缺点二、微服务1、微服务的“定义”2、微服务的特性3、微服务架构图4、微服务的优缺点优点缺点…

Python自动批量修改文件名称的方法大全

前言本文介绍基于Python语言&#xff0c;按照一定命名规则批量修改多个文件的文件名的方法。已知现有一个文件夹&#xff0c;其中包括班级所有同学上交的作业文件&#xff0c;每人一份&#xff1b;所有作业文件命名格式统一&#xff0c;都是地信1701_姓名_学习心得格式。现需要…

论文解读:(TransA)TransA: An Adaptive Approach for Knowledge Graph Embedding

简介 先前的知识表示方法&#xff1a;TransE、TransH、TransR、TransD、TranSparse等。的损失函数仅单纯的考虑hrh rhr和ttt在某个语义空间的欧氏距离&#xff0c;认为只要欧式距离最小&#xff0c;就认为h和th和th和t的关系为r。显然这种度量指标过于简单&#xff0c;虽然先…

榜上有名丨创新微MinewSemi荣登“物联之星”投资价值榜和创新产品榜

春风送暖&#xff0c;喜讯连连&#xff01;2023年2月7日&#xff0c;“2022物联之星”中国物联网产业年度榜单评选结果正式公布。经过层层评选&#xff0c;深圳创新微技术有限公司有幸在本届物联之星大奖中&#xff0c;荣获2022“物联之星”年度榜单之中国物联网企业投资价值50…

信号完整性设计规则之单根信号失真最小化

本文内容从《信号完整性与电源完整性分析》整理而来&#xff0c;加入了自己的理解&#xff0c;如有错误&#xff0c;欢迎批评指正。 1. 通常采用所能容许的最长上升边。 上升边越短&#xff0c;带宽越大&#xff0c;信号完整性问题越严重。 2. 使用可控阻抗走线。 可控阻抗…

硬件_IMX6ULL的LCD控制器

硬件_IMX6ULL的LCD控制器 文章目录硬件_IMX6ULL的LCD控制器一、 LCD控制器模块介绍1.1 硬件框图1.2 数据传输与处理1.3 时序控制二、 LCD控制器寄存器简介2.1 LCDIF_CTRL寄存器2.2 LCDIF_CTRL1寄存器2.3 LCDIF_TRANSFER_COUNT寄存器2.4 LCDIF_VDCTRL0寄存器2.5 LCDIF_VDCTRL1寄…

基础篇—一文掌握css的边框属性

CSS 边框属性 CSS边框属性允许你指定一个元素边框的样式和颜色。 1、边框样式 边框样式属性指定要显示什么样的边界。 border-style属性用来定义边框的样式 2、边框宽度 您可以通过 border-width 属性为边框指定宽度。 为边框指定宽度有两种方法:可以指定长度值,比如 2px…

检查nmos管是否损坏

NCEP85T14 功率mos管为例 以NMOS举例&#xff0c;只用万用表二极管档测量MOS管的好坏-电子发烧友网 NMOS的D极和S极之间有一个寄生二极管&#xff0c;方向为S到D&#xff0c;利用二极管单向导电性以及MOS管导通时寄生二极管截止的特性&#xff0c;可以快速测量MOS好坏。 1、测…

搭建Hexo博客-第2章-Hexo基本用法

搭建Hexo博客-第2章-Hexo基本用法 搭建Hexo博客-第2章-Hexo基本用法 搭建Hexo博客-第2章-Hexo基本用法 大家好&#xff0c;在上一篇文章中&#xff0c;我们学习了 Git 、GitHub 和 Coding 的基本用法&#xff0c;在这一节中&#xff0c;我将介绍 Hexo 的基本用法。阅读完这篇…

举个栗子~Tableau 技巧(251):统一多个工作表的坐标轴范围

在工作汇报场景&#xff0c;有一个很常见、很多数据粉反馈的需求&#xff1a;同一看板上的两个图表&#xff0c;因为轴范围不一致&#xff08;如下图&#xff09;&#xff0c;很难直观比较。有什么办法可以统一它们的坐标轴范围呢&#xff1f; 类似需求&#xff0c;不论两个还是…

SpringCloud学习笔记 - @SentinelResource的fallbackblockHandler配置详解 - sentinel

1. sentinel服务负载均衡测试 sentinel默认开启了负载均衡的轮询模式&#xff0c;为了测试sentinel服务负载均衡的效果&#xff0c;需要先创建两个服务提供者和一个服务消费者。 1.1. 分别创建两个服务提供者-支付服务9003、9004 1. 添加pom依赖&#xff1a; 提供者只需要将…

ElementUI中为什么使用this.$refs.form.validate验证成功却直接跳过

ElementUI中为什么使用this.$refs.form.validate验证成功却直接跳过 问题背景 在写一个Vue练手项目时&#xff0c;我使用rulse对表单中用户输入的数据进行校验&#xff0c;但莫名奇妙就发现&#xff1a;当我点击提交表单时&#xff0c;表单中的数据都验证成功了&#xff0c;但是…

SpringBoot分页实现

简介 分页功能是一个简单但必需的功能&#xff0c;在 SpringBoot 中分页实现非常的简单&#xff0c;有多种实现方式&#xff1b;主要和项目集成的持久层框架有关&#xff1b;这里主要介绍集成 MyBatis 和 SpringDataJpa 的分页实现 Mybatis - 使用 PageHelper 分页 首先在 p…

mybatis源码中一级和二级缓存分析

mybatis中,一级缓存的作用域为一个会话内; 二级缓存的作用域为全局的,可在多个会话中使用 1、一级缓存 [此处不讨论开启二级缓存的代码逻辑] 一级缓存的作用域在同一个事物中起作用。真正执行sql的是在 Executor&#xff1b;类图如下&#xff1b; 1.1、生成 Executor对象的…

玩转代码|使用acme.sh在Ubuntu配置Let’s Encrypt免费通配符SSL证书

&#x1f4e3;今日作品&#xff1a;使用acme.sh在Ubuntu配置Let’s Encrypt免费通配符SSL证书&#x1f466; 创作者&#xff1a;Jum朱⏰预计花费&#xff1a;10分钟&#x1f4d6;个人主页&#xff1a; Jum朱博客的个人主页acme.sh 是一款方便,强大的 Lets Encrypt 域名证书申请…

反射内存卡读写测试(RFM2gRead和RFM2gWrite)-- C++

一、函数介绍&#xff1a; 1.1 RFM2gWrite STDRFM2GCALL RFM2gWrite( RFM2GHANDLE rh, RFM2G_UINT32 Offset, void *Buffer, RFM2G_UINT32 Length ); 说明&#xff1a; RFM2gWrite()函数将一个或多个I/O数据缓冲区从应用程序传输到RFM2g节点&#xff0c;从指定的对齐内存偏…

InVEST模型 | 02 InVEST模型Python安装

InVEST在生态系统评估领域有着广泛的应用&#xff0c;由于其交互界面简洁直接&#xff0c;大大降低了模型的使用门槛。但当需要多次、多区域的运算时&#xff0c;手动点击的方法十分耗时费力&#xff0c;针对这样的情况&#xff0c;InVEST团队推出了natcap.invest接口&#xff…

Centos7部署Sonic前后端和Agent 端

前言 1、sonic介绍 Sonic是一款开源、支持分布式部署、在线自动化测试的私有云真机平台&#xff0c;Sonic官网地址 功能特性&#xff1a; Sonic架构&#xff1a; 2、准备工作 ①准备两台设备&#xff0c;并安装Centos系统&#xff0c;设备名称简称&#xff1a;设备1和设…

【Java】Java零基础第一节

Java.java 与 .class关于开发环境 - SDK第一个程序 - Hello worldJava程序理解 - Classes, New, Methods and Type.java 与 .class xxx.java文件&#xff1a; 存储的是人类语言可以看懂的高级语言(Language)&#xff0c;但是计算机不能看懂&#xff1b; xxx.class文件&#xf…

【YOLO V5】代码复现过程

接上篇&#xff0c;讲到如何从mask转成YOLOv5训练需要的txt数据集格式&#xff0c;这篇就在此基础上进行模型训练预测和部署转换吧&#xff01; 目录 1.环境准备 2.YOLO训练 2.1 数据集准备 2.2 data.yaml准备 2.3 yolov5.yaml准备 2.4 训练命令 3.YOLO预测 3.1OLOv5 P…