Navigation--导航机理_navigation导航-程序员宅基地

技术标签: 自动驾驶  机器人  人工智能  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/majingming123/article/details/128230797

智能推荐

论文笔记--DeepFly3D,一种基于深度学习的方法,用于拴住的成年果蝇的3D肢体和附属物追踪_动物行为3d模拟算法-程序员宅基地

文章浏览阅读3k次。没有外部校准模式的校准  从多个图像中估计3D姿势需要校准相机,以达到与目标尺寸相称的精度水平–在测量像果蝇这样小的动物的腿部运动时,这是一个困难的挑战。因此,DeepFly3D没有使用典型的外部校准网格,而是使用苍蝇本身作为校准目标。它检测苍蝇身体上的任意点,并依靠捆绑调整(Chavdarova等人,2018)来同时为这些点分配三维位置,并估计每个摄像头的位置和方向。为了提高鲁棒性,它执行了适用于系留苍蝇的肢体长度和运动范围的几何约束。_动物行为3d模拟算法

未能加载文件或程序集“ExcelHelper”或它的某一个依赖项。试图加载格式不正确的程序。_未能加载文件或程序集“excelreport”或它的某一个依赖项。试图加载格式不正确的-程序员宅基地

文章浏览阅读823次。未能加载文件或程序集“ExcelHelper”或它的某一个依赖项。试图加载格式不正确的程序。说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.BadImageFormatException: 未能加载文件或程序集“ExcelHelper”或它的某一个依赖项。试图加载格式不正确的_未能加载文件或程序集“excelreport”或它的某一个依赖项。试图加载格式不正确的

python中try...except...else...finally_try: 语句1 语句x #该语句会产生异常 语句2 except: 语句3 else: 语句4 f-程序员宅基地

文章浏览阅读267次。python中的try、except、else、finally用法_try: 语句1 语句x #该语句会产生异常 语句2 except: 语句3 else: 语句4 finally:

rosbag文件如何解析出来_ros解析bag-程序员宅基地

文章浏览阅读2.5k次。1、cd xxx/xxxx //进入bag所在路径2、rosbag info xxx.bag //查看rosbag的信息如下图所示:解析数据获得带时间戳的点云数据1、rosrun pcl_ros bag_to_pcd <*.bag> <output_directory>获得带时间戳的图像数据法1如下代码能一次性没有遗漏的解析出全部带有时间戳的图片#coding:utf-8import roslib; import rosbagimport _ros解析bag

linux 查看gz打包文件里的日志_根据时间查询.gz中的日志-程序员宅基地

文章浏览阅读2.8w次,点赞10次,收藏7次。有很多时候我们想要查看日志文件,发现服务器已经被重启了,然后原来的日志就被打包存起来了,这个时候生成的gz日志文件我们就没有办法直接去查看了。 所以这个时候我们就需要zcat+日志名.gz来查看,还可以用 | grep 来进行筛选自己想要的日志信息。..._根据时间查询.gz中的日志

Snort规则入门学习_snort和mtx规则区别-程序员宅基地

文章浏览阅读6.9k次,点赞5次,收藏32次。Snort规则学习入门引言从一条简单的snort规则开始alert tcp any any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"mountd access";)snort 每条规则都可以分成逻辑上的两个部分:规则头(header)和规则选项(General Option)从开头到括号前属于规则头部分,括号内的部分属于规则选项。规则选项中冒号前面的词叫做选项关键词(option keywords)。如果许多选项组合在一起_snort和mtx规则区别

随便推点

【PCIe总线】-- PCI、PCIE基础知识_pci1x2x-程序员宅基地

文章浏览阅读2.7k次。整理的一部分PCI、PCIe基础知识PCI基础知识: 1.PCI总线的组成:HOST桥、PCI桥、PCI设备、 2.PCI桥的作用可以隔离PCI设备,不影响各条总线的带宽 3.总线x1上的通讯和总线x2上的通讯无关,同一条总线上的设备可以自由通讯; 4.如果PCI桥出现问题,那么PCI桥下的设备之间可以自由通讯但是无法将数据发送到外面 5.PCI的..._pci1x2x

LVM逻辑卷与快照_卷和快照-程序员宅基地

文章浏览阅读2.4k次。简介LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存..._卷和快照

HTTP状态码(HTTP Status Code)-程序员宅基地

文章浏览阅读1.9k次。HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。HTTP: Status 1xx (临时响应)->表示临时响应并需要请求者继续执行操作的状态代码。详细代码及说明:HTTP: Status 1

(建议收藏)计算机网络:TCP-首部格式,序号确认和连接管理习题解析与拓展_当 tcp 接收端要确认一个有效载荷大小 是100b和序列号为800 的数据段时,应该-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏46次。TCP(1)-首部格式,序号确认和连接管理一.单选题(共12题,69.6分)1 关于TCP,以下哪一项描述是错误的A、提供面向字节流传输服务B、因为面向字节流,所示实现过程简单C、提供面向连接传输服务D、实现进程间通信正确答案: B首先要明确一点,TCP确实是面向字节流的,物理层是比特流。意思就是说,在网络里,不管是UDP还是TCP,都是面向字节流的,因为他们都以字节传输。但是TCP要比UDP更加复杂,这里不能说它所示实现过程简单,和UDP比复杂多了。TCP是面向连接的,服务给应用层_当 tcp 接收端要确认一个有效载荷大小 是100b和序列号为800 的数据段时,应该

python是高级语言还是低级语言_作为一名程序员必需知道的术语:高级/低级语言?解释/编译语言?...-程序员宅基地

文章浏览阅读1.3w次。作为一名合格的程序员,你必须知道一些计算机软件编程方面的术语。这次给大家解释一下下面两对常见的术语:高级语言/低级语言、解释语言/编译语言。什么是高级语言/低级语言?1、高级语言我们现在大多数人使用的语言,如C、C++、Python、Java、Matlab、LabVIEW等等,都属于高级语言,相对于低级语言,它更接近于我们平时正常的人思维,其最大的特点是编写容易,代码可读性好。实现同样的功能,使用..._python属于高级语言吗

Button和ImageButton_下列说法错误的是a button和imagebutton都可以实现按钮功能b button没有src-程序员宅基地

文章浏览阅读1.5k次。Button----按钮ImageButton----图片按钮 共有特征:都可以作为一个按钮产生点击事件不同点1、 Button有text的属性,ImageButton没有2、 ImageButton有src属性,Button没有onClick事件Button和ImageButton都有一个onClick事件通过他们自身的.setOnClickListener(_下列说法错误的是a button和imagebutton都可以实现按钮功能b button没有src属

推荐文章

热门文章

相关标签