Bug系列路径规划算法原理介绍(三)——Tangent BUG算法_tangent bug代码详解-程序员宅基地

技术标签: 运动规划  算法  Tangent BUG  运动规划和控制  bug  路径规划  


在这里插入图片描述


   本系列文章主要对Bug类路径规划算法的原理进行介绍,在本系列的第一篇文章中按照时间顺序梳理了自1986年至2018年Bug类路径规划算法的发展,整理了13种BUG系列中的典型算法,从本系列的第二篇文章开始依次详细介绍了其中具有代表性的BUG1、BUG2、Tangent BUG、I-BUG、RandomBug、BugFlood等算法。


   本篇文章作为本系列文章第三篇文章,主要对Tangent BUG算法进行介绍

   本系列其他文章见:BUG系列路径规划算法原理介绍——总结篇


   一、Tangent BUG 算法的提出

   1996年 I. Kamon和E. Rivlin在论文《A new range-sensor based globally convergent navigation algorithm for mobile robots》中提出了TangentBug算法

   (1)论文链接:https://ieeexplore.ieee.org/abstract/document/503814

   (2)论文DOI: 10.1109/ROBOT.1996.503814


   二、Tangent BUG 算法

   Tangent BUG算法是对BUG2算法的改进算法。它利用机器人上搭载的激光雷达等传感器对障碍物做出提前规避。

   借助传感器,我们可以测得每束光线到达传感器探测范围内障碍物的距离。假设传感器的探测半径为R,当探测光线在探测半径内没有遇到障碍物时,我们便规定该条探测光线与障碍物的距离为无穷远,当探测光线在探测半径内遇到障碍物时,可得到其到障碍物的距离ρ(x,θ),如下式所示,其中x是机器人当前位置,θ是当前探测光线的角度。

   根据上式,可以计算获得每条探测光线距离障碍物的距离,并可得到障碍物距离不连续的探测光线(即与相邻的探测光线相比,距离障碍物的距离发生突变的探测光线),如下面左图中的黑色粗线所示,易知这些探测光线出现在与探测范围内的障碍物相交与不相交的临界位置,这些探测光线与障碍物的交点记为Oi,如下面的右图中的O1 ~ O8所示,下面右图中的黑色粗线表示ρ(x,θ)连续的区间。


   了解以上内容之后,下面对Tangent BUG 算法的流程进行介绍,Tangent BUG 算法依然包括朝目标点移动和绕行障碍物两种行为,首先机器人从起始点沿着直线向目标运动,直到感应到位于自身和目标连线之间的障碍物,并得到ρ(x,θ)发生突变的边界点Oi,根据设定的规则,选取最佳的Oi点,比如我们可以选择d(x,oi)+d(oi,goal)最小的点作为最佳的Oi点,即选择Oi点中,机器人当前位置到该Oi点之间的距离与该Oi点到目标点的距离之和最小的点作为最佳Oi点。

   在下面左图中的例子中,在O1~O4中,d(x,o2)+d(o2,goal)的值最小,即选取O2作为最佳Oi点,同理在下面右图的例子中选取O4作为最佳Oi点。

   得到当前的最佳Oi点后,机器人开始朝着当前最佳Oi点移动,需要注意的是在机器人移动过程中传感器的探测光线与障碍物之间的距离和交点是实时变化的,Oi点和最佳Oi点的位置也是实时变化更新的,因此其运动轨迹会相对平滑一些,如下图所示。

   在朝着目标移动行为中,当机器人在朝着Oi点移动的过程中,d(x,oi)+d(oi,goal)的值应该是逐渐减小的,若发现d(x,oi)+d(oi,goal)的值不再减少,而将要开始增加,则开始执行绕行障碍物行为,沿障碍物边界运动。

   将障碍物区分为跟随障碍物(Followed obstacle)和阻挡障碍物(Blocking obstacle),跟随障碍物即为当前机器人正在感知的障碍,阻挡障碍物即为与从机器人当前位置到目标点之间的连线相交的障碍物。与此对应的也定义了两种距离:d_reach是机器人已感应到的边界与目标之间的最短距离。d_followed是在阻挡障碍物和目标之间的最短距离。

   与朝目标运动过程相同,在绕行障碍物行为中,机器人会继续朝选定最佳Oi运动,并不断更新d_reach和d_followed值,当 d_reach<d_followed时,机器人终止绕行障碍物行为,停止沿障碍物边界运动。转而开始执行朝目标点移动行为,继续朝目标点移动,以此循环,直至到达目标点。


   下面举一个例子来辅助理解以上内容,在下图所示的例子中,机器人从起始点开始朝着目标点直线,在移动过程中搭载的激光雷达会首先探测到障碍物WO2,然而该障碍物与机器人当前位置与目标点之间的连线不相交,即该障碍物不会影响机器人到达目标点,机器人回继续执行,直至机器人探测到障碍物WO1,即下面左图所示的状态,发现WO1与机器人当前位置与目标点之间的连线相交,停止朝目标点直行,开始朝最佳Oi点移动,在下面左图的状态中,即开始朝O2移动,在移动过程中会不断更新最佳Oi点的位置,直至d(x,oi)+d(oi,goal)的值不再减小,则开始绕行障碍物行为,并不断更新d_reach和d_followed值,在下面右图中的例子中,M点所在位置即为机器人观测到的障碍物距目标距离最近点,即d_followed=d(M,goal),当 d_reach<d_followed时,机器人终止绕行障碍物行为,停止沿障碍物边界运动。转而开始执行朝目标点移动行为,继续朝目标点移动,以此循环,直至到达目标点。

   上面右图中画出的运动轨迹中,实线部分为机器人朝目标点直行轨迹,虚线部分为朝目标点移动过程中的朝最佳Oi点移动轨迹,点线部分为绕行障碍物行为中朝最佳Oi点移动轨迹。


   下图中分别给出了传感器的探测半径为0和R时的两种轨迹


   Tangent BUG 算法的伪代码如下:


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

智能推荐

iscsi配置_在linux操作系统上配置iscsi的服务器targetcli不小心退出了-程序员宅基地

文章浏览阅读1.7k次。一、环境配置(安装)服务器端:yum install targetcli #管理程序systemctl start target #打开服务客户端:yum install iscsi-initiator-utils #iscsi应用程序通常这个都安装过了。二、targetcli的配置服务器端: 首先要有一块需要共享的硬盘分区,这是我要共享的..._在linux操作系统上配置iscsi的服务器targetcli不小心退出了

QTreeWidget详细使用介绍_qtreewidget用法-程序员宅基地

文章浏览阅读1.1w次,点赞10次,收藏87次。QTreeWidget继承自QTreeView,是通过树形结构来展示数据结构的控件。1.QTreeWidget和QTreeView的区别QTreeView一般和相应的QXXModel合用,形成Model/View结构.QTreeView是一个视图类,你需要手动给其指定模型类,才能够显示数据。QTreeWidget继承自QTreeView,是封闭了默认Model的QTreeView,应用了模型/视图的编程方法,将数据和显示分开了。就灵活性来讲,QTreeView要灵活些。QTreewidg._qtreewidget用法

Android CameraX和SurfaceView的基本使用_camerax surfaceview-程序员宅基地

文章浏览阅读1.9k次。Jetpack CameraX 库 的 PreviewView 可以帮助您解决这一问题。通过在各种 Android 设备上提供开发者友好、一致且稳定的 API,使得展示相机的预览变得不再困难。_camerax surfaceview

链接器的奥秘:解析计算机系统中的Linker_链接器linker-程序员宅基地

文章浏览阅读310次。链接器作为计算机系统中重要的组成部分,负责将多个目标文件和库文件合并成可执行文件。它通过符号解析、地址重定位和符号重定位等步骤,完成了程序的连接和重定位工作。此外,链接器还可以进行一些优化,以提高程序的执行效率。链接器的工作原理和功能对于软件开发人员来说至关重要,在编写高效、可靠的程序时起着重要作用。希望本文能够帮助读者更好地理解和应用链接器,提升软件开发的水平。_链接器linker

qtdesigner添加菜单栏工具栏及监听事件_qtdesigner顶部导航菜单栏-程序员宅基地

文章浏览阅读5.7k次,点赞15次,收藏53次。qtdesigner添加菜单栏和工具栏_qtdesigner顶部导航菜单栏

荧光染料标记果糖的理化性质FITC/ICG/TRITC/Cy3土茯苓多糖︱海带多糖︱甘草多糖产品类别:荧光标记类供应商:重庆新维创以果糖聚合而成。如:菊糖、麦冬多糖、桔梗多糖等。-程序员宅基地

文章浏览阅读391次,点赞3次,收藏3次。近年来,关于活性多糖生物功能的报道主要包括多糖的抗肿瘤、抗凝血、抗氧化、降血脂、抗病毒、提高免疫功能等,如牛膝多糖为水溶性的小分子多糖,具有调节免疫、保护肝脏、抑制肿瘤作用;FITC/ICG/TRITC/Cy3荧光标记乳糖-N-岩藻五糖 Lacto-N-fucopentaose。FITC/ICG/TRITC/Cy3荧光标记乳糖-N-四糖 LNT/Lacto-N-tetraose。FITC/ICG/TRITC/Cy3荧光标记海茸β-13/16-葡聚糖 DAG (DAG)如:菊糖、麦冬多糖、桔梗多糖等。

随便推点

Vuex介绍&同步取值&异步问题_vuex同步异步获取数据的区别-程序员宅基地

文章浏览阅读5.5k次,点赞3次,收藏9次。前言:我们在之前就有了子类与父类之间的传参,又有利用总线进行传参,但两者都有一定的弊端。如:总线定义组件太多容易混淆等;所以接下来我们会利用VueX进行参数传。目录一:VueX简介一:VueX简介官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。可以想象为一个“前端数据库”(数据仓库), 让其在各个页面上实现数据的共享包括状态,并且可操作 Vuex分成五个部分: 1.State:单一状态树 2.Getters:状态获取 3..._vuex同步异步获取数据的区别

servlet返回数据的方法_servlet 返回值-程序员宅基地

文章浏览阅读2.6w次,点赞2次,收藏17次。servlet返回数据的方法方法1. RequestDispatcher.forward()界面跳转 HttpSession session =request.getSession(); Object obj = session.getAttribute (LoginConstants.LOGIN_USER); if (null !=..._servlet 返回值

golang string 去最后一个字符_golang 取字符串最后一个元素-程序员宅基地

文章浏览阅读1.8w次。package mainimport ( "fmt" "strings")func main() { fmt.Println("Hello, 世界") var s string s = "333," strings.TrimRight(s, ",") fmt.Println(s) s = strings.TrimRight(s, ",") fmt.Println(s)..._golang 取字符串最后一个元素

unity的hierarchy中什么都没了。_unity报错把hierarschy没了-程序员宅基地

文章浏览阅读2.2k次。出现原因我在build游戏时发现没有安装WebGLbuild工具,安装的同时在buildPC版,unity崩了,我强退。解决方法此项目里的内容已损坏,GG,新建个项目,导入资源包。可能是出BUG了,发现从unity中open还是打不开。show in explorer,从资源管理器中打开,成功。..._unity报错把hierarschy没了

C语言中scanf在int类型数组中要添加&,而字符数组中的字符串输入不用添加&_数组输入要加&吗-程序员宅基地

文章浏览阅读2k次,点赞7次,收藏21次。而对于字符数组scanf("%s",数组名)来说,我要输入字符串的话,就不需要“&”,因为你输入的字符串会自动寻址,依次存入。但是如果你用的是单个字符的话scanf("%c",&数组名[下标]),就需要添加“&”,因为得寻址,依次添加即可。int数组,是scanf("%d",&数组名[下标]),&寻址符号,在它的后面添加变量,意思是找到变量的地址然后依次进行存储。_数组输入要加&吗

十九、EF框架(Entity FrameWork Core框架)-程序员宅基地

文章浏览阅读1.2k次。十九、EF框架(Entity FrameWork Core框架)_ef框架

推荐文章

热门文章

相关标签