首页 > 其他分享 >Field D* 路径规划

Field D* 路径规划

时间:2024-09-15 14:50:54浏览次数:3  
标签:neighbor 代价 路径 Field 算法 邻居 规划 节点

D*算法

D* 算法是用于路径规划的增量式搜索算法,旨在解决在环境中有障碍物动态变化时的路径规划问题。D* 算法的主要思想是在每次环境状态变化时,只更新受影响的部分路径,而不必重新规划整个路径。

D* 算法的核心概念包括:

  1. 代价函数:通常包括实际代价函数 g 和备用代价函数 rhsg 表示从起始节点到当前节点的实际代价,而 rhs 表示备用的最小代价。

  2. 启发式函数:用于估计从当前节点到目标节点的代价。常用的启发式函数包括欧几里德距离、曼哈顿距离等。

  3. 更新策略:D* 算法中通常使用增量更新的方式,根据环境的变化,仅更新受到影响的部分路径,以减少重新规划的计算量。

  4. 反向搜索:D* 算法通常是从目标节点向起始节点进行反向搜索,通过更新路径的代价来逐步找到最优路径。

Field D*

Field D* 基于启发式搜索,从目标点开始依次搜索最小的估值函数f(s)来确定需要扩展的节点:

式中:f(s)表示从起点经节点s到目标点路径的代价估计值,g(s)表示当前节点到目标点的实际代价,启发函数h(s)表示当前节点到起始点代价估计值.传统的基于栅格规划中,点s到其邻节点只能是直线轨迹(见图1),代价值为

式中:nbrs(s)表示节点s 邻节点的集合,c(s,si)为节点s与si 的路径代之间边的代价,g(si)为节点si价值.而 Field D* 允许节点s可以直线移动到其栅格的任意边界点sy.插值点sy 的路径代价g(sy)可以由其所在边的2个端节点的代价g(s1)与g(s2)由式(3)线性计算近似得到

式中:y 是s1 到sy 的距离,取决于当前栅格的代价及g(s1)、g(s2)代价之差[5].此时g(s)可由式(4)求解到邻边上的插值点或者端点的最小代价得到,boundary(s)是{s1s→2,s2s→3,s3s→4,s4s→5,s5s→6,s6s→7,s7s→8,s8s→1}邻边上点的集合.

math.hypot

math.hypot(x, y) 函数返回欧几里德范数 sqrt(x*x + y*y)。在这个函数中,给定两个数字 x 和 y,它将返回这两个数字构成的直角三角形的斜边长(即两个数字构成的二维平面上的点到原点的距离)。

init_table

    def init_table(self):
        for i in range(1, self.Env.x_range - 1):
            for j in range(1, self.Env.y_range - 1):    # 从(1,1)到(49, 29)?
                s_neighbor = self.get_neighbor_pure((i, j))
                s_neighbor.append(s_neighbor[0])    # 为啥还要再加一个?
                for k in range(8):
                    self.cknbr[((i, j), s_neighbor[k])] = s_neighbor[k + 1]
                s_neighbor = list(reversed(s_neighbor))
                for k in range(8):
                    self.ccknbr[((i, j), s_neighbor[k])] = s_neighbor[k + 1]

这段代码看起来是在初始化一个表格,用于存储节点及其邻居节点之间的关系。具体来说,对于给定范围内的节点 (i, j),首先获取其纯粹邻居节点,然后根据这些邻居节点的顺序构建节点和邻居节点之间的关系,并存储在 cknbr 和 ccknbr 中。

在循环中,首先获取节点 (i, j) 的纯粹邻居节点列表 s_neighbor,然后将这个列表的第一个元素再添加一次,这样做是为了循环连接邻居节点,使得最后一个邻居节点指向第一个邻居节点,形成一个闭环。

接着,根据这些邻居节点的顺序,依次构建节点和邻居节点之间的关系,并存储在 cknbr 和 ccknbr 中,以便后续路径规划算法使用这些信息。

在代码片段中,cknbr 和 ccknbr 存储了节点和邻居节点之间的关系,可能存在以下区别:

  1. cknbr:可能代表“Clockwise Neighbor”(顺时针邻居)的缩写。这个表可能存储了节点的邻居节点按照顺时针的顺序排列的信息。这种排序方式可能在某些算法中很重要,比如在路径规划算法中,按顺时针或逆时针的顺序访问邻居节点可能会影响路径选择或优化。

  2. ccknbr:可能代表“Counter-Clockwise Neighbor”(逆时针邻居)的缩写。这个表可能存储了节点的邻居节点按照逆时针的顺序排列的信息。同样地,在某些算法中,按逆时针的顺序访问邻居节点也可能具有特定的用途。

初始化cost

        for i in range(self.Env.x_range):
            for j in range(self.Env.y_range):
                self.rhs[(i, j)] = float("inf")
                self.g[(i, j)] = float("inf")
                self.bptr[(i, j)] = (i, j)

这段代码看起来是在初始化三个字典 rhsg, 和 bptr。这些字典的作用可能如下:

  1. rhs: 可能代表"Right Hand Side"的缩写,通常在路径规划算法中用于存储节点的备用代价值。在 D* 算法中,rhs 值表示从起始节点到节点 (i, j) 的最小代价。

  2. g: 可能代表"Cost to Go"的缩写,通常在路径规划中表示从起始节点到节点 (i, j) 的实际代价值。在 D* 算法中,g 值表示从起始节点到节点 (i, j) 的当前最小代价。

  3. bptr: 可能代表"Back Pointer"的缩写,通常在路径规划中用于存储节点 (i, j) 的前驱节点。在 D* 算法中,bptr 可能用于回溯路径,确定路径规划的具体路径。

通过对这些字典进行初始化,将 rhs 和 g 设置为无穷大,通常表示未知或不可达,而将 bptr 设置为节点自身,可能表示每个节点的初始前驱节点为其自身。

经典二维路径规划的局限性

考虑一个在户外环境中导航的地面车辆。我们可以将这个环境表示为一个二维遍历网格,其中单元被遍历的代价,反映在环境的各个区域导航的困难。有了这样的网格,我们可以很容易地提取一个用于路径规划的图:为每个单元中心分配一个节点,用边将节点连接到每个相邻的单元中心(节点)。每条边的代价是它所连接的两个单元格的遍历代价该边的长度的组合。图1(a)显示了均匀二维网格中一个单元的节点和边缘提取过程。

然后,我们可以在这个图上进行规划,以生成从机器人的初始位置到一个期望的目标位置的路径,使用前面提到的任何一种算法。不幸的是,使用这个图生成的路径仅限于π4增量的标题。这意味着最终的解路径在路径代价上可能是次优的,涉及不必要的转弯,或者两者兼有。

https://github.com/MuneebBaderoen/AdaptiveFieldDStar/tree/master

荣誉项目。使用自适应网格细化进行寻路。Field D*算法在二维和2.5D三角形网格中的自适应细化实现。我们的目标是执行局部网格细化,在计算路径所经过的区域中生成精细的三角形网格,并迭代地改进使用此动态方案找到的路径的近似值。我们将研究当前寻路算法用于指导字段D*中节点扩展的启发式方法。用C++实现。

标签:neighbor,代价,路径,Field,算法,邻居,规划,节点
From: https://blog.csdn.net/m0_60857098/article/details/142066425

相关文章

  • 高级系统规划与管理师笔记(一)
    目录第一章信息系统综合知识一、信息基本概念二、信息的传输模型三、信息质量的属性(6)四、信息化从“小”到“大”,分层以下5个层次:五、信息化的基本内涵(重点)六、两化融合:主要为工业化和信息化七、电子政务(区分)八、电子商务的概念九、电子商务的类型十、消费者与消......
  • 【数据结构和算法实践-树-LeetCode113-路径总和Ⅱ】
    数据结构和算法实践-树-LeetCode113-路径总和Ⅱ题目MyThought代码示例JAVA-8题目给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点输入:root=[5,4,8,11,null,13......
  • PCIe进阶之TL:Common Packet Header Fields & TLPs with Data Payloads Rules
    1TransactionLayerProtocol-PacketDefinitionTLP有四种事务类型:Memory、I/O、Configuration和Messages,两种地址格式:32bit和64bit。构成TLP时,所有标记为Reserved的字段(有时缩写为R)都必须全为0。接收者Rx必须忽略此字段中的值,PCIeSwitch必须对其进行原封不......
  • 掌握C#中的动态规划技术
    C#中的动态规划(DynamicProgramming,DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划通常用于优化问题,特别是那些具有重叠子问题和最优子结构性质的问题。在C#中实现动态规划算法通常涉及以下几个步......
  • 路径规划 | 基于A*算法的往返式全覆盖路径规划的改进算法(Matlab)
    目录效果一览基本介绍程序设计参考文献效果一览基本介绍基于A*算法的往返式全覆盖路径规划的改进算法matlab实现代码往返式全覆盖路径规划,通过建立二维栅格地图,设置障碍物,以及起始点根据定义往返式路径规划的定义的优先级运动规则从起始点开始进行全图遍历,利用A星算法逃离死角......
  • 网约车APP开发指南:基于同城代驾系统源码的实现路径
    基于同城代驾系统源码进行二次开发,不仅可以缩短开发周期,还能节省成本,提高市场竞争力。本篇文章,小编将详细解析如何基于同城代驾系统源码实现一款高效的网约车APP。 一、项目背景及需求分析在开发网约车APP之前,首先需要明确应用的定位与目标用户群体。网约车服务的需求主要集中在城......
  • NOIP 复习题之动态规划
    AT_joi2022ho_c選挙で勝とう首先要先把协作者买出来,再对于之后的州把买的协作者全部用上。则我们可以先枚举需要的协作者数量\(x\),可以知道的是:我们枚举选择哪些\(x\)个协作者,再在剩下的州中选择\(A_i\)最小的\(K-x\)个州即可。则考虑dp。我们对\(B_i\)进行排序后,协作......
  • powershell@路径处理相关命令@路径拆分@路径解析@路径拼接@路径判断
    文章目录abstract一览表常用的路径处理场景重点路径处理命令1.Split-Path2.Convert-Path3.Join-Path4.Resolve-Path5.Test-Pathrvpavscvpa总结对比powershellprovider@powershell提供程序abstract在PowerShell中,处理路径相关的命令十分丰富,它们可以帮助我们管理、解析......
  • blazor路径
    Blazor遵循ASP.NETCore应用对于静态资产的约定。静态资产位于项目的 webroot (wwwroot)文件夹中或是 wwwroot 文件夹下的文件夹中。使用基相对路径(/)来引用静态资产的Web根。在下面的示例中,logo.png 实际位于 {PROJECTROOT}/wwwroot/images 文件夹中。 {PR......
  • 代数模型(Algebraic Models)---线性规划------+ 案例 + Python源码求解(见文中)
    目录一、代数模型(AlgebraicModels)详解1.1什么是代数模型?1.2代数模型的基本形式1.3安装所需要的Python包--运行下述案例1.4代数模型的应用案例案例1:市场供需平衡模型Python求解代码Python求解结果如下图:案例2:运输问题中的线性规划模型进行数学建模分析1.目标函数2.......