路径规划算法总结

2023-05-16

路径规划算法

1、Dijkstra算法

从物体所在的初始点开始,访问图中的结点。迭代检查 待检查节点集中的节点,该节点从初始节点向外扩展,直到达到目标节点,该算法能够保证找到一条从初始点到目标点的最短路径。

img

2.最佳优先搜索(BFS)算法

按照类似的流程进行,不同的是它能够评估任意节点到目标节点的 代价 (距离大小)。它选择的不是离初始点最近的节点,而是离目标点最近的节点 。它用了一个启发式函数快速的导向目标节点。例如,如果目标位于出发点的南方,BFS将趋向于导向南方的路径。

如下所示;越黄的值代表越高的启发式值(移动到目标点的代价越高),越暗淡的节点代表越低的启发式值(移动到目标的代价越低)。

img

3 A*算法

启发式方法,如BFS和常规方法如Dijsktra算法结合在一起的算法,有点不同的是,类似BFS的启发式方法经常给出一个近似解而不是保证最佳解,A是路径搜索中最受欢迎的选择,它相当灵活,并且能用于多种多样的情理之中,A * 潜在的搜索一个很大的区域,A 算法能用于搜素最短路径,A* 能用启发式函数引导它自己,在简单的情况中,它和BFS一样快。

img

在凹型障碍物的例子中,A*找到一条和Dijkstra算法一样好的路径:img

A * 算法把Dijkstra算法(靠近初始点的结点)和BFS算法(靠近目标点的结点)的信息块结合起来。A * 的标准术语中:g(n) 表示从初始结点到任意结点n的代价,h(n)表示从结点n到目标点的启发式评估代价。在上图中,yellow(h)表示远离目标的结点而teal(g)表示远离初始点的结点,当从初始点向目标点移动时,A* 权衡这两者。每次进行主循环时,它检查f(n)最小的结点 n,其中f(n) = g(n) + h(n)。

启发式算法

启发式函数h(n)告诉A*从任意结点n到目标结点的最小 代价 评估值。选择一个好的启发式函数是重要的。

启发式函数可以控制A*的行为;

1 一种极端的条件下,如果h(n)=0;那么只有g(n)起作用,此时A* 转换为Dijkstra算法,

2 如果h(n)经常都比从n移动到目标的实际距离小(或者相等),则A* 能保证找到一条最优路径,h(n)越小,A*的扩展点越多,运行也就越慢。

3.如果h(n)精确地等于从n移动到目标的代价,则A*将会仅仅寻找最佳路径而不扩展别的任何结点,这会运行得非常快

理想情况下,我们想最快的得到最短路径。如果我们的目标太低,我们仍然会得到最短路径,不过速度变慢了;如果我们的目标太高,那我们就放弃了最短路径。但A运行的更快。

A*计算f(n) = g(n) + h(n)。为了对这两个值进行相加,这两个值必须使用相同的衡量单位。

精确的启发式函数

如果你的启发式函数精确的等于实际最佳路径,此时 A* 扩展的结点将非常的少。A* 算法内部发生的事情是:在每一结点,他都计算f(n) = g(n) + h(n);当h(n)精确地和g(n)匹配时,f(n)的值在沿着该路径时将不会改变,不在正确路径(right path)上的所有结点的f值均大于正确路径上的f值,如果已经有较低f值的结点,A* 将不考虑f值较高的结点。

(1)预计算的精确启发式函数

构造精确启发函数的一种方法是预先计算任意一对结点之间最短路径的长度。

(2)线性精确启发式算法

4, 网格地图中的启发式算法

在网格地图中,有一些众所周知的启发函数。

4.1 曼哈顿距离

标准的启发函数是曼哈顿距离,考虑代价函数,并且找到一个从一个位置移动到邻近的最小代价D,H(n) = D * (abs ( n.x – goal.x ) + abs ( n.y – goal.y ) ;img

4.2 对角线距离

如果在你的地图中你允许对角运动那么你需要一个不同的启发函数;h(n) = D * max(abs(n.x - goal.x), abs(n.y - goal.y))

img

4.3 欧几里得距离

4.4 Breaking ties

导致低性能的一个原因来自于启发函数的ties。当某些路径具有相同的f值的时候,它们都会被搜索(explored),尽管我们只需要搜索其中的一条:img

为了解决这个问题,我们可以为附加函数添加一个附加值,附加值对于结点必须是确定性的,,而且他必须让 f 体现区别,一种添加附加值的方式是稍微改变衡量单位,如果我们减少衡量单位(译者注:原文为scale it downwards),那么当我们朝着目标移动的时候 f 将逐渐增加。很不幸,这意味着A倾向于扩展到靠近初始点的结点,而不是靠近目标的结点。我们可以增加衡量单位,A就会倾向于扩展到靠近目标的结点。

4.5 区域搜索

如果你想搜索邻近目标的任意不确定结点,而不是某个特定的结点,你应该建立一个启发函数h’(x),使得h’(x)为h1(x), h2(x), h3(x)。。。的最小值,而这些h1, h2, h3是邻近结点的启发函数。

如果不考虑具体实现代码,A* 算法是相当简单的,有两个集合OPEN和CLOSE集,其中OPEN 集保存待考察的结点,开始时,OPEN集只包含一个元素,初始结点。CLOSE集保存已考察过的结点,开始时,CLOSED集是空的。如果绘制成图,OPEN集就是被访问区域的边境,而CLOSED集合则是被访问区域的内部。每个结点同时保存其父结点的指针,因此我们可以知道它是如何被找到的。

5 RRT算法

快速搜索随机数(RRT)算法,是一种增量式采样的搜索算法,该方法在应用中不需要进行任何整定,具备良好的性能,它利用增量式方法构建搜索树,以逐渐提高分辨能力,而无需设置任何分辨率参数,在极限条件下,该搜索树将稠密的布满整个空间,此时搜索树由很多较短曲线和路径构成,以实现充满整个空间的目的

为了提高搜索效率采用双向随机搜索树(Bi~RRT),从起始点和目标点并行生成两颗,直到两棵树相遇,算法收敛,由于这个算法收敛速度快,因此广泛用于路径规划中

5.1滚动在线RRT算法

基本的RRT算法,倾向于遍历整个自由空间获得可行路径,这使得不可能用于未知或动态环境中的机器人在线运动规划。滚动规划的思想可以将RRT算法进行改进,使其具备在线规划的能力。

滚动规划;机器人利用局部信息进行局部运动规划,并根据一定的评价标准得到局部目标,机器人到达局部目标后在进行新的局部规划如此反复进行直到达到全局目标。

滚动规划的基本原理:

① 环境信息预测:在滚动的每一步,机器人根据探测到的视野信息和已知的环境信息,建立环境模型,包括设置已知区域内结点类型信息。

②局部滚动规划:将上述环境信息模型看成一个优化的窗口,在此基础上,根据目标点的位置和特定的优化策略计算出下一步的最优子目标,然后根据子目标,选择局部优化算法,确定向子目标行进的局部路径,并实施当前策略,依照所规划的局部路径行进若干步,窗口相应向前滚动。

③反馈信息校正:根据局部最优路径,机器人行走一段时间后,机器人会探测到新的未知信息,此时可以根据机器人在行走过程中探测到的新的信息补充校正原来的环境模型,用于滚动后下一步的路径规划。

基于滚动窗口的路径规划算法依靠实时探测到的局部环境信息,以滚动方式进行在线规划。

基于滚动窗口的路径规划算法的具体步骤如下:

步骤0:对起点,终点,工作环境,机器人的视野半径,步长进行初始化

步骤1:如果终点到达,规划终止

步骤2:对当前滚动窗口内的环境信息进行刷新;

步骤3:产生局部子目标;

步骤4:根据子目标及已知环境信息,在当前滚动窗口内规划一条优化的局部可行路径;

步骤5:依规划的局部路径行进一步,步长小于视野半径;

步骤6:返回步骤1

6、 人工势场法

人工势场法是由K提出的用于机器人运动规划的虚拟力方法,其基本思想是将目标和障碍物对机器人运动的影响具体化成人造市场,目标处 势能低,障碍物处 势能高,这种势差产生了目标对机器人的引力,障碍物对机器的斥力,其合力控制机器人沿势场负梯度方向向目标点运动,人工势场法方便计算,得到的路径安全平滑,但是复杂的势场环境可能在目标点之外产生局部最优。

解决人工势场法局部最优值问题,主要有两个方向:一是构造合适的势函数以减少或避免局部最小值的出现,需要全局地图的信息,并且依赖于障碍物的形状,情况复杂难以应用。

​ 二是在机器人遇到局部极小值点后,结合其他的方法使机器人离开局部极小点。多利用搜索法,多势场法和沿墙行走法等方法使机器人离开局部极小点。

6.1 人工势场法算法改进

当机器人的运行环境中包含形状复杂或者距离很近的障碍物时,可能出现势场局部极小点,导致机器人在该处停止或在其周围振动。如下图所示,当环境中出现“陷阱”形障碍物或者与目标成特定位置关系的障碍物时,可能在人工势场中产生局部极小点(图中L点),当机器人运动到局部极小点附近时,势场的负梯度方向指向L点。机器人将在L点处停止或在其附近振动或作圆周运动。

img

为了使机器人从局部极小点中逃离,在人工势场法的基础上引入应激行为,即增加绕行行为。当机器人遇到局部极小点时,忽略目标引力势能的作用,沿着斥力势的等势面方向移动,直到机器人离开局部极小区域。

7.BUG算法

BUG算法是一种完全应激的机器人避障算法,在未遇到障碍物时,沿直线向目标运动;在遇到障碍物后,沿着障碍物边界绕行,并利用一定的判断准则离开障碍物继续直行,这种应激式的算法计算简便,不需要获知全局地图和障碍物形状,具备完备性。但是其生成的路径平滑性不够好,对机器人的各种微分约束适应性比较差。

7,1 BUG1算法

该算法的基本思想是在没有障碍物时,沿着直线向目标运动可以得到最短的路线。当传感器检测到障碍物时,机器人绕行障碍物直到能够继续沿直线项目标运动。BUG1算法实现了最基本的向目标直行和绕行障碍物的思想。

img

7.2 BUG2算法

BUG2算法也有两种运动:朝向目标的直行和沿边界绕行。与BUG1算法不同的是,BUG2算法中的直线是连接初始点和目标点的直线,在计算过程中保持不变。当机器人在点遇到障碍物时,机器人开始绕行障碍物,如果机器人在绕行过程中在距离目标更近的点再次遇到直线,那么就停止绕行,继续沿着直线,向目标直行。如此循环,直到机器人到达目标点,如果机器人在绕行过程中未遇到直线上与目标更近的点,那么得出结论,机器人不能到达目标。img

img

7.3 TangentBUG算法

TangentBUG算法是对BUG2算法的提高。它利用机器人上距离传感器的读数对障碍物做出提前规避,可以获得更短更平滑的机器人路径。TangentBUG算法也有两种行为:直行(motion-to-go)和环绕障碍物(boundary-following)。

8 增量式启发算法

8.1 LPA*算法

是一种增量启发式搜索版本的A算法,这种路径规划算法适用于随着时间改变导致有限栅格地图上的边缘代价c(s1,s2)改变的问题,也就是随着时间改变障碍物增多或减少,网格点发生增删等,在许多场合下比再利用A重新搜索更高效。

8.2 D* Lite算法

D* Lite算法是以LPA为基础,结合A算法思想,提出一种增量启发式算法,适用于在未知环境中的导航以及路径规划,广泛用于目前各种移动机器人和自主车辆载具,例如“机遇号”和“勇气号”火星车测试的原型导航系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

路径规划算法总结 的相关文章

  • Gazebo仿真记录 Turtlebot3 + D435i

    在Gazebo环境中在Turtlebot3上添加深度相机D435和IMU 步骤 1 准备工作 创建ROS工作空间 xff0c 下载turtlebot3相关代码和realsense2 description 模型文件放到工作空间下 Turtl
  • Vicon轨迹topic转tum格式

    rostopic span class token function echo span span class token operator span xx gt gt xx span class token punctuation spa
  • Realsense d435i启动双目并关闭IR结构光(保证管用)

    想要采集一些双目的数据 上手了一下实验室闲置的stereolab zed2 xff0c 发现连官网都上不去 xff0c 而且环境配置麻烦的要死 xff0c 遂放弃 想起手里还有一个d435i也可以开双目 xff0c 果然还是realsens
  • 读取rosbag中的IMU信息并转为tum格式的csv和txt

    rostopic span class token operator span b xx span class token punctuation span bag span class token operator span p span
  • git中常用命令

    span class token number 1 span 安装 xff1a GitLens span class token number 2 span 快捷键打开终端 xff1a ctrl span class token opera
  • 镜像tag、push、pull、load等相关操作

    一 本身PaaS环境不能访问外网的操作 1 首先准备好镜像tar包 xff0c 上传到镜像服务器的 root目录下 执行命令为 xff1a docker load i 镜像 tar xff0c 如图所示 2 给镜像重新打上标记 xff0c
  • SNMPv3实验与报文分析

    一 SNMPv3工作原理 1 1 SNMPv3工作模式 SNMPv3采用客户机 服务器模式 如下图1所示 由图可知SNMP管理站可向代理发送普通请求 如GetRequest GetNextRequest等 xff0c 代理收到请求之后返回一
  • ACLLib图形库的基本使用

    ACLLib图形库的基本使用 使用环境 xff1a Dev C 43 43 5 7 1ACLLib图形库的下载 xff1a github上ACLLib的下载链接打开Dev C 43 43 xff0c 新建项目 xff0c 自定义你的文件名称
  • HBase Java Api

    任务目标 1 了解HBase语言的基本语法 2 了解HBase开发的原理 3 了解HBase Java API的使用 相关知识 HBase与Hadoop一样 xff0c 都是用Java编写的 xff0c 所以HBase对Java支持是必须的
  • 浅谈jQuery属性获取

    浅谈jQuery的属性获取 基本标签设置与基本css xff0c 附图下所示 上述代码如下图 xff1a 一 js的一些属性获取 1 var div 61 document getElementById first 这时候找到第一个div
  • 使用RGB-D摄像机的机器人目标跟踪和避障控制设计

    Control Design for Robotic Human Following and Obstacle Avoidance Using an RGB D Camera 摘要1 介绍2 系统总体架构3 算法介绍3 1 用户识别和定位3
  • Linux网络编程之PHP聊天室Workerman-chat

    云服务器上搭建 34 PHP聊天室框架 34 一 简介 xff1a 在服务器上搭建PHP聊天室框架 workerman chat 具体步骤 1 准备云服务器 购买阿里云服务器 可选购买其他云服务器 xff0c 如 xff1a 腾讯云 华为云
  • keil 下载安装 保姆级教程

    一 前言 最近被安排开发一个单片机的项目 xff0c 回头想了一下 xff0c 自己上次弄单片机的时候 xff0c 还都是在大学期间 xff0c 到现在也有三四年没有碰过了 xff0c 大部分的知识点都忘了 xff0c 所以又重新的把以前的
  • 从CSDN博客下载的图片如何无损去水印

    如果你想下载别人CSDN博客文章中很好看的图片 xff0c 但却有水印 想要下载去水印的图片 xff0c 可以先鼠标右击该图片 xff0c 选择复制图片地址 https img blog csdnimg cn 202009161408079
  • 不要再使用 Gitee 当图床了,官方已经开启防盗链了

    如果你正在使用或打算使用 Gitee 作为图床 xff0c 那么请不要这么做或打消该念头 近日 xff0c Gitee 官方已经开启防盗链 正在使用 Gitee 当图床的小伙伴或许已经发现所有的图片都已经变成了 Gitee 的 Logo 了
  • 基于BP神经网络的人脸朝向识别

    一 数字图像处理 1 1 问题假设 所给的全部人脸图像都未出现损坏等问题 xff1b 人脸的朝向仅分为5类 xff1a 左 中左 中间 中右 右 xff0c 其他朝向不予考虑 xff1b 对于题目中所给的人脸图像 xff0c 不考虑人脸的复
  • ::在c++中的意思

    在c 43 43 中 一 作用域符号 xff1a xff1a 前面是类名称 xff0c 后面一般是该类的成员名称 例类A中包含member1 A member1 二 全局作用域符号 用于区分全局变量和局部变量 xff1a xff1a cha
  • linux下cannot execute binary file: Exec format error解决办法

    对于linux下cannot execute binary file Exec format error明确说明是执行文件格式错误 xff0c 可能情况 xff1a 1 使用错误的命令 xff0c 如gcc c hello c o hell
  • PX4/Pixhawk---uORB深入理解和应用(最新版)

    1 简介 ps 第1章简介是参考 uORB深入理解和应用 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c 这可以让我们更好的理解PX4 Pixhawk的软件架构和运作 xff

随机推荐

  • 深拷贝和浅拷贝的区别

    1 简单理解 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体 xff0c 而不是引用 假设B复制了A xff0c 修改A的时候 xff0c 看B是否发生变化 xff1a 如果B跟着也变了 xff0c 说明是浅拷贝 xff0c
  • Linux系统下搭建PX4/Pixhawk原生固件编译环境

    对于新版本的固件V1 11 3 在pixhawk官网可以找到开发环境的搭建 xff0c 这里把开发环境链接贴出来 xff1a https docs px4 io master zh dev setup dev env linux ubunt
  • Pixhawk无人机飞行模式详解 (PX4源码)

    我帮大家把飞行模式控制量与特点总结一下 xff0c 方便看代码 xff0c 如下所示 xff1a 辅助模式 Position Mode 位置模式 xff08 定点模式 xff09 横滚俯仰控制角度 xff0c 油门控制上下速度 xff0c
  • pixhawk无人机避障

    本人最近用树莓派结合PX4做无人机避障 xff0c 使用激光雷达 xff0c 有没有一起的小伙伴 xff0c 我们一起交流 xff01 私信我 xff0c
  • 目录前导符不一致解决办法

    最近弄毕业设计 xff0c 写完论文以后发现生成的目录后面的前导码省略号数目 间距不一致 xff0c 非常的难看 xff0c 于是经过仔细研究找到了解决办法 xff1a 首先是问题所在 xff0c 请看下图 xff1a 首先在word中打开
  • 几种编码方式(RZ、NRZ、NRZI、曼彻斯特编码)

    在数字电路中 xff0c 组成一连串信息的基元就是0和1 xff0c 无论是在CPU DSP MCU甚至是个数字计数器中 xff0c 数字电路在其中能够处理的信息也只有0和1 xff0c 而对于任何外界的信息 xff0c 计算机都能通过两个
  • WIN10运行软件,窗口不显示 解决办法

    win10 运行软件后 xff0c 不显示窗口 今天遇到个问题 xff0c 我打开软碟通之后 xff0c 任务栏显示它已经打开了 xff0c 但是窗口就是不显示 xff0c 如下图 xff1a 用alt 43 tab 查看 xff0c 也能
  • 变频器的四大组成部分和工作原理

    随着电子技的发展变频器已经有了很大的变化 xff0c 但其基本原理并没有发生改变 变频器的主要部分有四个 xff1a 整流器 中间电路 逆变器 控制电路 1 xff09 整流器 通用变频器的整流电路是由三相桥式整流桥组成 它的功能是将工频电
  • Pytorch中torch的操作合集

    tensor的基本操作 PyTorch系例 torch Tensor详解和常用操作 这里最重要的概念是索引出来的结果与原数据共享内存 xff0c 也即修改一个 xff0c 另一个也会跟着修改 tensor的广播机制 Pytorch xff1
  • torch.tensor 内存共享机制

    tensor属于可变数据类型 xff0c 因此变量的值存储在堆中 xff0c 变量名存储在栈中 xff0c 当进行变量赋值时 xff0c 就是让栈中的变量指向堆 xff0c 如下面代码 xff1a span class token keyw
  • 熵 KL散度 交叉熵的理解

    熵 KL散度 交叉熵的概念 xff1a 理解二分类交叉熵 可视化的方法解释对数损失交叉熵公式推导 xff1a 理解交叉熵作为损失函数在神经网络中的作用熵 KL散度 交叉熵的关系 xff1a KL散度与交叉熵区别与联系训练过程中三者的应用 x
  • Docker数据目录迁移解决方案

    介绍 在docker的使用中随着下载镜像越来越多 xff0c 构建镜像 运行容器越来越多 数据目录必然会逐渐增大 xff1b 当所有docker镜像 容器对磁盘的使用达到上限时 xff0c 就需要对数据目录进行迁移 如何避免 xff1a 1
  • Git 三剑客 ———— git gui 可视化工具

    目录 页面介绍Unstaged changesStaged Changes xff08 Will Commit xff09 File DisplayCommand Set Repository 操作区Edit 操作区Branch 操作区Co
  • 数组对象转json格式

    1 数组转化成JSON对象后 xff0c key值是索引 xff0c value是数组对应的值 数组也可以转化成JSON对象 var jStr3 61 34 10 20 30 40 50 60 34 var j3 61 JSON parse
  • JS——DOM的结点操作

    H5自定义属性 自定义属性目的 目的 xff1a 是为了保存并且使用数据 有些数据可以把保存到页面中而不用保存到数据库 可以通过getAttribute获取 自定义属性 xff1a data 开头 这是一种规范 dataset xff1a
  • SecureCRT连接Linux

    在将SecureCRT连接Linux上时遇到一些问题 xff0c 记录如下 第一步 xff0c 我们要在在linux上安装openssh server服务 xff0c 并确认打开了22监听端口 在linux上操作命令如下 xff1a apt
  • Linux下添加虚拟串口,接收和发送数据

    之前写的那虚拟串口有点问题 xff0c 只能读取 xff0c 不能接收 今天再来改一下 将python的内容改为如下 xff1a 先新建一个文档 xff0c 内容如下 usr bin env python coding 61 utf 8 i
  • fatal: The remote end hung up unexpectedly解决办法

    今天在写完代码后 xff0c 准备提交到GitHub上 xff0c 结果得到了下面的结果 xff0c 记录一下 百度了之后 xff0c 发现大部分是有两种说法 一种是说提交的文件太大 xff0c 解决办法如下 link 一种是说管理员将项目
  • 简单了解几种常见的网络通信协议

    常见的网络协议有 TCP IP协议 UDP协议 HTTP协议 FTP协议 Telnet协议 SMTP协议 NFS协议等 这里主要简述一下前三种协议 一 TCP IP协议 1 什么是TCP IP协议 xff1f TCP IP传输协议 xff0
  • 路径规划算法总结

    路径规划算法 1 Dijkstra算法 从物体所在的初始点开始 xff0c 访问图中的结点 迭代检查 待检查节点集中的节点 xff0c 该节点从初始节点向外扩展 xff0c 直到达到目标节点 xff0c 该算法能够保证找到一条从初始点到目标