Navigation--导航机理

news2024/10/6 12:23:36

1.ROS navigation为移动机器人导航相关包的集合,实现定位规划避障等相关功能。

整体工作流程为:

1.加载地图

navigation通过map_server加载现有地图。navigation无建图相关包,需另外实现后保存,默认只支持2维地图,其他包类似grid_map提供2.5维地图的加载。

2.发布TF坐标变换

navigation包内的AMCL提供map->odom的变换,AMCL实际为全局绝对定位,即map->base,但在应用时里程计会提供odom->base的变换,因此AMCL会获取TF信息转换后再发布map->base变换,navigation不包含里程计的实现,需另外独立实现。

3.启动move_base加载相关插件

move_base为导航的核心框架,通过预设接口(plugin)加载地图(costmap_2d)和规划避障(global_planner, local_planner, recovery)相关插件,读取设置参数(机器人外形,规划避障设置等),并发布相关话题和服务器。

实现机器人的自主导航除navigation外还需要一张图和里程计,当然navigation内部的算法都可以根据需要进行更换

一张地图--map

amcl+里程计---odom

异常处理(recovery_behaviors)

一、一张地图--map

1.要进行导航,我们肯定需要有个地图,这个地图可以手绘也可以用SLAM方法来创建,但是原始的地图并不能直接进行导航,通常需要先将其转换成“代价地图”(cost_map)。

什么是“代价地图”,就是说机器人在地图里移动是需要付出“代价”的,这个“代价”有显性的也有隐性的。显性的,比如行走的距离,绕远路费电啊,这是最明显的“代价”。隐性的,比如靠近障碍物,万一机器人一哆嗦就磕着脑袋碰着胳臂了,这是隐性的“代价”。还有一些机器人体型比较长(无人驾驶大卡车有木有),转个弯掉个头巨费劲,对它来说,路线转弯太多也是“代价”,所以导航的路线越顺滑代价就越小。

        1.因此产生global_costmap,是由全局地图(通常是SLAM建好的)和激光雷达侦测到的当前机器人周围的障碍物分布融合后生成。

        map_server提供的全局地图代表的是以前记录的地图。近处的变化可以用激光雷达侦测扫描由sensor_source提供;

        越靠近障碍物,与障碍物碰撞的风险越大,于是颜色越深,隐性“代价”越大;移动距离产生的显性代价,通常都是在路径规划算法内部才会实现,一般不会显示。

        2.有了代价地图,由全局规划器(global_planner)来生成得到导航的路线;

         global_planner 全局规划器的任务就是从外部获得导航的目标点,然后在全局代价地图里找出“代价最小”的那条路线;

        3.现在nav_msgs/path路线已经有,突发情况如何规避,这就是局部规划器(local_planner)。局部规划器的工作就是从全局规划器获得导航路线,根据这个路线向机器人发送速度,驱动机器人“尽可能”按照路线去行走。

        局部规划器(local_planner)的调教也是最曲折最费时的部分。因为机器人的底盘类型千差万别,有的只能前后移动和原地转向(差动底盘),有的可以360°随意移动(全向底盘),有的底盘是履带双足四足甚至多足,除非撞墙否则都不带避障的.

         4.局部规划器利用激光雷达获得的当前障碍物数据,又做了一个“代价地图”,叫做局部代价地图(local_costmap)它是由sensor_source联合产生的。

 远处瞅个大概,近处瞄得仔细,既有大局观,又注重局部视野,再加上各种细节走位。

全局地图是导航;局部地图是视野(躲避行人,红绿灯等特殊情况);amcl是gps(告诉你现在在哪里);

二、amcl

多重影分身之术;

所有分身随机的分布在地图里,rviz里面的PoseArry;机器人移动时,所有的分身也跟随移动,在移动的过程中,会不停的用激光雷达扫描到的身边障碍物和地图进行比对,以判断自己是不是那个正确的位置。比如有的分身走着发现面前一堵墙,再查查地图里自己的位置,这地方没有墙自己的位置八成是错的,于是“嘭”的一声,这个分身就消失了。最终收敛成少量的分身,也就最有可能是机器人位置的真身。

 

 三、异常处理(原地旋转)

导航调试中,最常见的问题莫过于机器人遇到新出现的障碍物时,会不停的原地打转。

recovery_behavior”的机制

recovery_behavior”被激活,通常是出现在机器人面前被大体积的障碍物挡住导航路线的时候。一些局部规划器(local_planner)如果参数设置不合理,就会导致规划不出能绕过障碍的局部路线。

 在ROS中,“recovery_behaviors”里默认行为通常会设置为“rotate_recovery”,也就是让机器人原地旋转,用激光雷达去完全的扫描附近的障碍物。

 按照“recovery_behavior”设计的机制,当转圈也解决不了问题的时候,最终还是得全局规划器(global_planner)出马,按照现在的囧境,重新规划一条新的全局导航路线;

 参考大神:5分钟看懂ROS的Navigation导航系统-云巴巴 (yun88.com)icon-default.png?t=M85Bhttps://www.yun88.com/news/992.html

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

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

相关文章

[附源码]Python计算机毕业设计Django游戏商城平台论文

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

推荐测试用例管理工具,看这篇就行。

我们在考虑测试用例管理的时候,其实不能单纯考虑测试用管理,因为你的测试用例是需要和需求关联起来的,是需要和 bug 关联起来的。在有些行业,比如汽车、医药,不仅要对需求进行测试,还需要对架构设计、详细设…

某CCF C会议对国内和国外作者实行两套标准, 引27%+中稿者发声!

点击文末公众号卡片,不错过计算机会议投稿信息 本文主要反映轻松参会交流群内UIC22(CCF C类) 的81位国内中稿作者的诉求(占UIC22中稿数的27%)。目前群内作者们的诉求为,希望国内作者可选择线上参会。因为线下参会有困难&#xff0…

2023年湖北监理工程师报考时间是什么时候?

2023年湖北监理工程师报考时间是什么时候? 监理工程师考试时间虽说是全国统一的,但是监理工程师报名时间不统一,每个省份自行安排报名时间,监理工程师报名时间基本都是在2.3月份开始报名,具体关注每个省人事考试院网站…

文件包含漏洞(原理及介绍)

文件包含漏洞(原理及介绍) File inclusion,文件包含(漏洞)。程序开发人员通常出于灵活性的考虑,会将被包含的文件设置成变量,然后动态调用这些文件。但正是因为调用的灵活性导致用户可能调用一…

flex布局子项属性

flex布局子项属性 1、flex属性 源代码 flex属性定义子项目分配剩余空间,用flex来表示占多少份数 flex: number; 填数值,分配剩余空间的占比 2、align-self控制子项自己在侧轴上的排列方式 源代码 align-self属性允许单个项目有…

Semi-Supervised Classification with Graph Convolutional Networks

Semi-Supervised Classification with Graph Convolutional Networks, ICLR, 2017 要点: 1、可扩展的半监督学习方法 2、基于卷积神经网络的有效变体,直接对图进行操作 3、通过谱图卷积的局部一阶近似来激励卷积架构的选择 4、在图的边数上进行线性缩放…

车辆纵向动力学、加速性能和燃料消耗研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 车辆纵向动力学方面包括车辆传动系统换挡控制、制动系统的设计与控制以及车辆状态的参数估计;车辆横向动力学方面涉及车辆转向…

lua vm 共享 proto

lua vm共享proto 场景 在skynet中,对于每一个lua服务,实际上就是在snlua上启动了一个lua虚拟机去完成lua逻辑,所以skynet的服务是相互隔离的。 这样就会产生一个问题,多个服务都require同一个lua库,每个服务内都会有…

原生API编写简单富文本编辑器001

原生API编写简单富文本编辑器001 从这一节开始,我们将亲自动手,使用我们之前介绍过的浏览器原生API来实现一个简单的可以处理文本的富文本编辑器。 1. 设计 这一个简单版的编辑器,由于我们是基于原生的API,基于浏览器原生API的…

线性表-双向链表

双向链表 双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。链表的头结…

手动实现SpringBoot日志链路追踪

概述 有时候一个业务调用链场景,很长,调了各种各样的方法,看日志的时候,各个接口的日志穿插,确实让人头大。 模糊匹配搜索日志能解决吗?能解决一点点。但是不能完全呈现出整个链路相关的日志。 那要做到方…

致迷茫的程序员一封信——我的程序生涯

0、开头 大家好,我是罗鹏程,一个很老套的开头,哈哈哈。 这封信姗姗来迟,与其说是一封信,不如说是来听听我的故事。从2020开始,收到过很多网友的问题,职业的选择,是做大数据还…

Intellij Idea生成含有META-INF的jar包

新建一个module,如果不会新建的话,参考:Intellij Idea新建module。命名为jar_test。 新建一个java类DateUtil,可以输出当前时间对应的是星期几。代码如下: import java.util.Calendar; import java.util.Date;publi…

编译原理 1 - 概述、形式语言

第1章 引论一些概念1.3 编译程序的总体结构1.4 编译程序的组织第二章 形式语言2.1 文法描述中的基本概念上下文无关文法第1章 引论 一些概念 机器语言:以0、1代码表示的机器指令所构成的语言 每一个具体的计算机系统都具有自己的指令系统 汇编语言:用助…

shiro

概述 shiro是什么 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成:认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。 为…

批量数据导入Neo4j的方式

批量数据导入Neo4j的方式 文章目录批量数据导入Neo4j的方式1、写在前面2、前置芝士3、CSV数据导入Neo4j3.1 LOAD CSV Cypher命令3.2 neo4j-admin命令3.3 Kettle导入工具4、数据导入失败5、参考资料1、写在前面 Linux版本:Ubuntu Kylin 16.04Neo4j版本:N…

分布式微服务架构下网络通信的底层实现原理

在分布式架构中,网络通信是底层基础,没有网络,也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作,共同完成一件事情。 同样,在大规模的系统架构中,应用吞吐量上不去、网络存在通信延迟、…

图的遍历(基础)

一、图的遍历的相关定义 遍历的定义:从已给的连通图中的某一顶点出发,沿着一些边访遍图中的所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。遍历的实质:找每个邻接点的过程。图的特…

跌倒自动检测雷达的应用

跌倒是老人最常发生的意外之一,据统计,我国每年有150多万老人跌倒身亡。如何及时发现和预防老人跌倒以及避免可能发生的伤害事件,已成为目前社会关注的热点。美国加州大学伯克利分校研究人员研发出一种可穿戴设备——跌倒自动检测雷达&#x…