路径规划算法初探

2023-05-16

前言:真实世界中人类的路径规划是对记忆信息和实时感知信息综合分析的过程,在虚拟技术中属于行为控制层级的技术。

一,机器人路径规划分类:

      1.全局路径规划(环境完全已知)

      2.局部路径规划(环境未知或部分未知,通过感知实时获取环境信息)

      另外环境又分静态与动态,所以任何路径规划问题均可细分为如下四类之一:

      1)全局静态环境路径规划:构型空间法,自由空间法,栅格法(区别在于环境建模的方法不同)

构型空间法——将机器人作为质点,根据机器人的大小与姿态,将障碍物的形状向外扩展形成构型空间,然后质点在构型空间中进行搜索

自由空间法——采用预定义的基本形体,构造自由空间,并将自由空间表示为图结构,进行图搜索,构造空间图的时间复杂度很大

栅格法——顾名思义,环境被离散为一系列网格单元,场景的复杂度由网格表示,按照网格内是否有障碍物,标记为自由区和障碍区
      2)全局动态环境路径规划: 
      3)局部静态环境路径规划:人工势场法,基于模糊逻辑的路径规划,基于遗传算法的路径规划

人工势场法——目标地对机器人有引力,障碍物对机器人又斥力,环境中任何一点势力为引力与斥力的叠加,机器人从初始位置开始,沿着势场下降最快的方向达到目标点。特点:(优:便于实时控制;缺:容易陷入局部最优,导致运动死锁发生,解决办法是广义势场法,逃脱算法)

基于模糊逻辑的路径规划——顾名思义,基于多传感器信息的模糊逻辑,来模拟人驾驶规则,特点:(优:鲁棒性,适合未知,动态环境的路径规划;缺:障碍物增多,计算量很大)深入理解需查阅相关文献

基于遗传算法的路径规划——遗传算法有利于寻找全局最优点而非陷入局部最优,但是速度慢,解决办法是遗传模拟退火算法,抑制早熟

      4)局部动态环境路径规划


        机器人路径规划模型分类:1.传统模型,基于功能的要求,按照自顶向下的方式建立的。其规划过程按照“感知-建模-规划-行动”的顺序进行,是一种典型的慎思结构,稳定但缺乏应变能力;2.基于行为的路径规划模型,该模型将路径规划分解为独立模块如,避障,跟踪等,这些行为模块通过彼此的协调和竞争,共同完成导航任务优缺点与1刚好相反。


二,虚拟人路径规划

      虚拟人全局路径规划可以使用人工势场法,可以直接使用A*算法,但是更好的方法是全局+局部双层模型:

      虚拟人路径规划应该建立在全局记忆和局部感知的混合信息基础上,其规划过程是全局规划和局部规划的有机结合。

1.虚拟人路径规划模型:利用合成视觉模拟感知系统,来获取规划所需的环境信息,并采用 A*算法进行全局路径搜索——双层算法:局部感知+全局寻优

       路径规划行为的整体结构是基于功能实现的,按照“感知-建模-规划-执行”的过程依次进行。但在路径规划模型内部,全局和局部两个规划器之间是按照基于行为的结构组织的,每个规划器都可以对虚拟人的执行系统进行控制,两者通过竞争和协作实现路径规划和躲避障碍的功能。这种复合的结构使得虚拟人在运动过程中既具有基于功能控制的理性特点,又具有基于行为控制的快速反应能力。
                              

路径规划模型从感知系统中获取的感知和记忆信息可分为两类:一类是经记忆模型淘汰后保存下的长期信息,这些记忆是虚拟人经过观察对环境形成的较为静态的信息,反映了环境中静态障碍的分布。另一类是感知到的短期信息,反映了环境中的动态障碍和未知障碍。
 
当虚拟人开始一次漫游时,首先全局规划器根据已有的长期信息进行全局静态规划,确定虚拟人应该经过的最优化路线。然后全局规划器控制执行系统按照该路径运动。在运动过程中,感知系统会持续对周围环境进行感知。当发现动态的物体或未知障碍时,局部规划器根据这些感知到的局部信息,确定短期內的运动。当避障行为的优先级高于沿原路径前进时,局部规划器就能够通过竞争获得执行系统的控制权,使得虚拟人按照局部规划结果运动。完成对当前感知障碍的规避行为后,全局规划器再次取得执行系统的控制权,使得虚拟人重新回到全局规划路径上,继续向目标点运动。
 
从以上对过程的分析可见,事实上局部规划器是采用局部规划技术实现规避动态或未知障碍的功能。尽管大部分研究都简单地通过改变运动路线来规避障碍,但这并不是唯一的手段。通过改变运动状态(如加速、减速)同样可以实现
避障行为。因此,局部规划器并不仅仅实现路径的规划,而是对包括路径在内的运动状态的规划。
 

2.环境建模方法:

         1).切线图表示二维空间,八叉树表示三维空间(通过A*算法进行空间路径搜索,全局)

         2).虚拟人的漫游行为一般是平面运动,我们将已知障碍的包围盒投影到二维平面上,采用离散网格的方法表示空间,以加快规划速度,首先采用膨胀法建立位姿空间,然后用四叉树的存储形式保存离散化的位姿空间。

        虚拟人路径规划策略就转化为在四叉树中寻找两个叶子结点间最短路径的方法,


3.通过A*算法进行空间路径搜索,全局,关于A*算法可以参考博客:堪称最好的A*算法

A*关键之处1为代价函数-启发式函数,2为程序实现中的open与closed集的数据结构,3为算法的改进

f = g+h,其中g为是起始点到点n的实际花费,h只是一个估计值,估计从n点到终点的最优路径的花费,当h收敛到一个极值时,A*算法有最优值,(h是启发函数)h->h*,当启发函数为h*时,得到的路径正好为最优路径


引用“堪称最好的A*算法”

  • 一种极端情况,如果h(n)是0,则只有g(n)起作用,此时A*演变成Dijkstra算法,这保证能找到最短路径。
  • 如果h(n)经常都比从n移动到目标的实际代价小(或者相等),则A*保证能找到一条最短路径。h(n)越小,A*扩展的结点越多,运行就得越慢。
  • 如果h(n)精确地等于从n移动到目标的代价,则A*将会仅仅寻找最佳路径而不扩展别的任何结点,这会运行得非常快。尽管这不可能在所有情况下发生,你仍可以在一些特殊情况下让它们精确地相等(译者:指让h(n)精确地等于实际值)。只要提供完美的信息,A*会运行得很完美,认识这一点很好。
  • 如果h(n)有时比从n移动到目标的实际代价高,则A*不能保证找到一条最短路径,但它运行得更快。
  • 另一种极端情况,如果h(n)比g(n)大很多,则只有h(n)起作用,A*演变成BFS算法。
  • 关键是我们的目的是什么是速度还是准确度

A*算法核心思路(从百度百科看到的安静

While(OPEN!=NULL)

{

    从OPEN表中取估价值f最小的节点n;

   if(n节点==目标节点) break;

else

{

   if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值

   if( X的估价值小于OPEN表的估价值 )

    更新OPEN表中的估价值; //取最小路径的估价值

   if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值

   if( X的估价值小于CLOSE表的估价值 )

    更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值

   if(X not in both)

    求X的估价值;

    并将X插入OPEN表中; //还没有排序

}

4.局部路径规划算法——有两个重要的概念点:

其一:碰撞检测,几何思路求交点,在实际应用中,碰撞预测工作由世界模型进行,然后将预测碰撞时间作为结果发送给两个对象,以降低整体计算量。

其二:碰撞避免方法——关键在于运动代价函数的选取(存在着一种潜在的优化规则,即如果沿某个方向运动,所需要付出的“代价”最小。)

        对于静态障碍,虚拟人只能通过改变运动方向来避免碰撞(代价函数为Eo)。

        对于运动障碍,则通过改变方向和运动速度(代价函数为Ev)都可能实现规避。最简单的选择策略是采用随机的方式。而更为合理的方式则是通过比较两者的代价函数最小值,选择其中代价较小的方法进行规避。通过调节Eo与Ev中的权重值,虚拟人会表现出不同的选择倾向。还可以加入视域的概念来进行碰撞检测。

当运动障碍是另一个虚拟人时,如果两者同时采取规避措施,可能会造成规避路线的振荡。一般的解决方法是采用随机选择或优先级的方式,保证只有其中一个进行规避;更为高级的思路是:1.每个虚拟人的感知范围是不同
的,因此两者不会同时预测到碰撞的发生,最先发现对方的虚拟人可能会先行规避。2.通过评价函数中各个权值的个性化,虚拟人会表现出不同的行为特征,赋予不同的碰撞代价函数权值,两者之中具有较小碰撞代价函数权值的虚拟人会更为谨慎,在较远的位置采取规避。

   

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

路径规划算法初探 的相关文章

  • gensim similarity计算文档相似度

    向量空间模型计算文档集合相似性 0 将原始输入的词转换为ID xff0c 词的id表示法简单易用 xff0c 但是无法预测未登记词 xff0c 难以挖掘词关系 xff1b 词汇鸿沟 1 任意两个词之间是独立的 xff0c 无法通过词的ID来
  • doc2vec计算文档相似度

    doc2vec是基于word2vec的 xff0c word2vec对于计算两个词语的相似度效率比较好 xff0c 修改了word2vec中的cbow和skip gram模型 xff0c paragraph vector直接得到doc向量
  • 多维中维度的理解

    项目有段时间了 xff0c 今天需要做一个需求查询调研 必须要照顾楼下业务人员理解的方式吧多维度表述清楚 还真不好讲 xff1a 原以为维度就是一个基准点 xff0c 一个看事情的角度 xff0c 静下来想 xff0c 要描述出来好像还真不
  • Spring注解

    注解介绍 注解有两个作用 xff1a 标注和注入 标注 xff1a 类路径下自动扫描 xff0c 减少在xml中配置bean 例如 64 Component 64 Service注入 xff1a 自动装配 xff0c 需要类的地方直接加注解
  • akka基础

    基本概念消息传递API 通用API消息传递方式 Future机制Actor生命周期处理状态和错误 监督kill actor生命周期监控和DeathWatch安全重启状态 纵向扩展 Router调度方式使用策略 横向扩展 订阅集群事件启动 退
  • ROS学习(9)自定义移动机器人模型Gazebo仿真

    文章目录 前言一 gazebo启动二 创建编译功能包三 更新xacro文件1 更新robot base xacro2 更新robot camera xacro3 更新robot lidar xacro4 更新robot xacro 四 更新
  • ROS学习(11)使用ROS创建地图

    文章目录 前言一 创建编译功能包二 更新启动文件三 启动模型四 保存地图五 加载地图六 总结 前言 创建地图是一件比较复杂的工作 xff0c ROS利用map server地图服务器 xff0c 借助激光雷达和机器人的里程信息来完成这项工作
  • ROS学习(12)使用ROS创建自定义地图

    文章目录 前言一 新建环境二 创建编译功能包三 新建 world文件四 新建world启动文件五 更新启动文件六 建图 前言 上一篇使用的是柳树车库环境 xff0c 实现完整建图工作比较复杂 xff0c 所以准备新建一个简单点的环境 xff
  • ROS学习(13)自定义机器人的ROS导航

    文章目录 前言一 创建编译功能包二 代价地图配置三 基本局部规划器配置四 创建导航包的启动文件五 运行启动文件六 为导航功能包集设置rviz七 导航仿真 前言 上一篇针对我家户型 xff0c 完成了自定义环境的建图工作 本篇主要完成对导航功
  • ROS学习(开篇)Ubuntu16.04安装ROS Kinetic详细教程

    文章目录 前言一 添加ROS软件源 xff08 sources list xff09 二 添加密钥三 更新apt功能包列表四 安装ROS五 初始化 rosdep六 将ROS环境变量添加到 bashrc文件中七 安装rosinstall等工具
  • ROS学习(14)自定义四轮小车的ROS导航

    文章目录 前言一 创建编译功能包二 代价地图配置三 基本局部规划器配置四 创建导航包的启动文件五 导航仿真六 总结 前言 本篇为自定义四轮小车的ROS导航仿真 xff0c 与前面自定义机器人导航类似 该篇源码非原创 xff0c 特此说明 x
  • ROS学习(24)plugin插件

    文章目录 前言一 工作原理二 具体实现1 创建基类2 创建plugin类3 注册插件4 编译插件的动态链接库5 将插件加入ROS6 调用插件7 运行效果 前言 ROS中的插件就是可以动态加载的扩展功能类 ROS中的pluginlib功能包提
  • ROS学习(28)Web GUI

    文章目录 前言一 rosbridge suite元功能包二 roslibjs ros2djs ros3djs功能包三 tf2 web republisher功能包四 创建web应用五 使用web浏览器控制机器人 前言 ROS Web too
  • 参看了别人写的面试讲解

    转帖 ERP顾问的面试 新的一年就要开始了 xff0c 有不少的同行估计都在想着跳槽了 今天我就把自己的当面试官的感受给大家谈谈 xff0c 也许 xff0c 从中 xff0c 你可以掌握 ERP 实施顾问面试的技巧 在来年 xff0c 当
  • ROS2学习(1)ROS2简述

    文章目录 前言一 ROS1存在的问题二 什么是ROS21 ROS2的设计目标2 ROS2的系统架构3 ROS2的关键中间件 DDS4 ROS2中的通信模型5 ROS2的编译系统 前言 虽然众多开发者对ROS1进行了很多开发建设 xff0c
  • Qt之实现自定义控件的两种方式——提升法

    文章目录 前言一 需求二 实现1 新建项目2 自定义控件类3 提升4 效果 前言 可以通过Qt设计师拖拽原生控件进行界面开发 xff0c 但有时候原生控件不能满足项目需求 此时 xff0c 就需要实现自定义控件 Qt中实现自定义控件 xff
  • Qt之实现自定义控件的两种方式——插件法

    文章目录 前言一 需求二 实现1 新建项目2 自定义控件类3 编译插件4 拖拽使用 xff08 1 xff09 在designer exe中直接拖拽 xff08 2 xff09 在Qt Creator的设计师中直接拖拽 5 在项目中正常使用
  • Qt自定义控件——动态圆形进度条

    文章目录 前言一 需求二 实现1 自定义控件类2 提升3 效果 前言 本篇通过提升法实现一个动态圆形进度条 一 需求 自定义实现一个动态圆形进度条 xff0c 支持设置进度条颜色 目标值背景色 外边框背景色 中央圆环背景色 旋转角度及大小自
  • linux下可视化git工具git-cola安装与使用(SSH方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发

随机推荐

  • 智能优化算法:布谷鸟搜索算法-附代码

    智能优化算法 xff1a 布谷鸟搜索算法 附代码 文章目录 智能优化算法 xff1a 布谷鸟搜索算法 附代码1 算法原理2 算法结果3 参考文献4 Matlab代码 摘要 xff1a 谷鸟搜索算法 cuckoo search cs xff0
  • 基于布谷鸟优化的BP神经网络(预测应用) - 附代码

    基于布谷鸟优化的BP神经网络 xff08 预测应用 xff09 附代码 文章目录 基于布谷鸟优化的BP神经网络 xff08 预测应用 xff09 附代码1 数据介绍3 CS优化BP神经网络3 1 BP神经网络参数设置3 2 布谷鸟算法应用
  • 基于粒子群优化的BP神经网络(分类应用) - 附代码

    基于粒子群优化的BP神经网络 xff08 分类应用 xff09 附代码 文章目录 基于粒子群优化的BP神经网络 xff08 分类应用 xff09 附代码1 鸢尾花iris数据介绍2 数据集整理3 粒子群优化BP神经网络3 1 BP神经网络参
  • Arm Keil MDK v5.30版本官宣,快来下载!

    近日 xff0c Arm很高兴地宣布发布Arm Keil MDK v5 30 此版本新增了对Cortex M55处理器和CMSIS Build的支持 xff0c 更新包括Arm Compiler 6 14 xff0c CMSIS 5 7 0
  • ubuntu下访问串口

    前言 最近准备将windows上自动瞄准的程序移植到linux xff0c 第一步准备调试一下ubuntu下的串口 在网上搜到一个串口库 xff0c 于是就拿来调用 xff0c 最后调试成功 过程如下 xff1a 过程 1 下载Serial
  • 热备笔记实验

    早上突然断电 本来笔记本的插头就忘记插了 xff0c 电池没用多久就熄火 最纳闷的是接入电源后本机数据库竟然挂掉了 xff0c 嘿嘿 xff0c 正好试一试前几天应用的热备回复 以下是我的全程 C Documents and Setting
  • Android学习之AIDL添加Service权限

    参考 Android开发艺术探索 xff0c 书中提供了两种方法 第一种方法 xff1a 在onBind中验证 在服务端的AndroidManifest添加自定义权限 lt permission android name 61 span c
  • ADRC(自抗扰控制器)技术附Matlab代码框架

    自抗扰控制器 Auto Active Disturbances Rejec ion Controller ADRC 是韩京清学者提出的 xff0c 是一种继PID控制器后的一种新型的实用的控制技术 它不是一种独立的技术 xff0c 可以理解
  • git视频及对初学者的学习建议

    http herry2013git blog 163 com blog static 21956801120144810133569 http herry2013git blog 163 com blog static 2195680112
  • 迷你光流使用说明

    为了让你有兴趣往下学习 xff0c 先上个定点悬停效果视频给你欣赏一下吧 xff01 点击打开视频链接 首先 xff0c 简单介绍一下我使用的这款光流传感器 长宽高 xff1a 14x11x5mm xff0c 重量约0 6克 xff0c 工
  • Handler的使用方法(一)

    想花点时间谈谈Handler的使用方法 xff0c 是应为Handler的使用涉及到了线程类的使用 xff0c 也是在程序中用到了线程 xff0c 关于线程 xff0c 是个很重要的概念 xff0c 因为以后的嵌入式系统的应用开发往往在程序
  • STM32控制APM飞控(二)MAVLINK源码集成到stm32工程中

    MAVLINK协议源码集成到32工程中 一 MAVLINK代码转化为C语言源码文件 主要根据 http www cnblogs com lovechen p 5801679 html 作者 恒久力行 的方式 xff0c 我进行归纳简要说明
  • STM32控制APM飞控(三)MAVLINK整合并适配stm32串口的收发

    目录 stm32底层串口代码更改能收发MAVLINK协议包 一 在上一次移植好的工程基础上进行如下改动
  • STM32控制APM飞控(五)MAVLINK的C源码的解释及MAVLINK心跳包

    MAVLINK的C源码的解释及MAVLINK心跳包 一 MAVLINK转化成C源码后的文件及文件夹解释 用pathon2 7将从github官网下载下来的MAVLINK源码转换成c语言源码的文件夹如图 xff1a 解释 xff1a a xf
  • (一) 概述(概念、组件、架构、适用场景) | 普罗米修斯(Prometheus)

    什么是普罗米修斯 xff1f Prometheus是一个开源系统监控和警报工具包 xff0c 最初在 SoundCloud构建 自 2012 年成立以来 xff0c 许多公司和组织都采用了 Prometheus xff0c 该项目拥有非常活
  • 多值依赖

    多值依赖 xff1a 比如 xff1a 学校中某一门课程由多个教员讲授 xff0c 他们使用相同的一套参考书 每个教员可以讲授多门课程 xff0c 每种参考书可以供多门课程使用 我们可以用一个非规范化的关系来表示教员T 课程C 和参考书B
  • Docker启动Mysql问题汇总

    最近在学习Docker技术 xff0c 遇到了不少问题 xff0c 记录分享一下 xff0c 感觉有用的可以参考一下 xff1b 1 Docker使用Mysql docker run d v opt data mysql02 var lib
  • 静态库和动态库/文件描述符与文件指针/文件操作/重定向

    c语言阶段学习文件操作复习 1 打开文件 FILE fopen const char path const char mode path xff1a 需要打开的文件路径 xff0c 可以是绝对路径 xff0c 也可以是相对路径 mode x
  • 一种可行的STM32F103外设RTC使用方法

    前言 最近做的项目需要用RTC功能 xff0c 记录掉上电时间 然后就开始琢磨STM32的RTC 在使用的过程中出现各种问题 搞的很是头痛 几经折腾 xff0c 终于弄出一种稳定的使用方法 刚开始最大的问题就是掉电后时钟不走 xff0c 代
  • 路径规划算法初探

    前言 xff1a 真实世界中人类的路径规划是对记忆信息和实时感知信息综合分析的过程 xff0c 在虚拟技术中属于行为控制层级的技术 一 xff0c 机器人路径规划分类 xff1a 1 全局路径规划 xff08 环境完全已知 xff09 2