在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。

文章目录

  • 0 前言
  • 1 什么是节点拓展
  • 2 基于自行车模型拓展
    • 2.1 连续拓展
    • 2.2 离散拓展
    • 2.3 中间节点
  • 3 总结

0 前言

上两篇对Hybrid Astar算法的主体搜索流程做了剖析和实现,本节详细介绍节点拓展。

1 什么是节点拓展

节点拓展就是基于当前节点状态空间向量推导下一个节点状态空间向量。

关于状态空间的介绍可以参看这篇文章:Hybrid Astar 算法剖析和实现(二)_穿越临界点的博客-CSDN博客

2 基于自行车模型拓展

2.1 连续拓展

设当前节点 NodecurrentNode_{current}Nodecurrent​ 中记录着车辆当前的位姿 [x0,y0,θ0][x_0,y_0,\theta_0][x0​,y0​,θ0​] (状态量)。求在控制量[v,ϕ][v,\phi][v,ϕ] 的控制下,ttt时刻后车辆的位姿。

简易自行车模型如下式,其中 LwL_wLw​ 代表wheel base,ϕ\phiϕ 为前轮转角。

ddt[x(t)y(t)θ(t)]=[v(t)⋅cosθ(t)v(t)⋅sinθ(t)v(t)⋅tanϕ(t)/Lw],∀t.(1)\frac{d}{dt} \begin{bmatrix} x(t) \\ y(t) \\ \theta(t) \end{bmatrix} = \begin{bmatrix} v(t)\cdot cos\theta(t) \\ v(t) \cdot sin\theta(t) \\ v(t) \cdot tan\phi(t)/L_w \end{bmatrix} ,\forall t. \tag1 dtd​⎣⎡​x(t)y(t)θ(t)​⎦⎤​=⎣⎡​v(t)⋅cosθ(t)v(t)⋅sinθ(t)v(t)⋅tanϕ(t)/Lw​​⎦⎤​,∀t.(1)

设当前时刻 t=0t=0t=0,则有,
{x(0)=x0y(0)=y0θ(0)=θ0(2)\begin{cases} x(0)=x_0\\ y(0) = y_0 \\ \theta(0) = \theta_0 \end{cases} \tag2 ⎩⎪⎨⎪⎧​x(0)=x0​y(0)=y0​θ(0)=θ0​​(2)
ttt 时刻后有,
{x(t)=x(0)+∫τ=0tv(τ)⋅cosθ(τ)⋅dτ=x0+∫τ=0tv(τ)⋅cosθ(τ)⋅dτy(t)=y(0)+∫τ=0tv(τ)⋅sinθ(τ)⋅dτ=y0+∫τ=0tv(τ)⋅sinθ(τ)⋅dτθ(t)=θ(0)+∫τ=0tv(τ)⋅tanϕ(τ)/Lw⋅dτ=θ0+∫τ=0tv(τ)⋅tanϕ(τ)/Lw⋅dτ(3)\begin{cases} x(t)&=x(0)+\int_{\tau=0}^t v(\tau)\cdot cos\theta(\tau) \cdot d\tau \\[2ex] &=x_0+\int_{\tau=0}^t v(\tau)\cdot cos\theta(\tau) \cdot d\tau\\[3ex] y(t)&=y(0)+\int_{\tau=0}^t v(\tau)\cdot sin\theta(\tau)\cdot d\tau \\[2ex] &=y_0+\int_{\tau=0}^t v(\tau)\cdot sin\theta(\tau)\cdot d\tau \\[3ex] \theta(t) &= \theta(0) +\int_{\tau=0}^t v(\tau) \cdot tan\phi(\tau)/L_w \cdot d\tau \\[2ex] &= \theta_0 +\int_{\tau=0}^t v(\tau) \cdot tan\phi(\tau)/L_w \cdot d\tau \end{cases}\tag3 ⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧​x(t)y(t)θ(t)​=x(0)+∫τ=0t​v(τ)⋅cosθ(τ)⋅dτ=x0​+∫τ=0t​v(τ)⋅cosθ(τ)⋅dτ=y(0)+∫τ=0t​v(τ)⋅sinθ(τ)⋅dτ=y0​+∫τ=0t​v(τ)⋅sinθ(τ)⋅dτ=θ(0)+∫τ=0t​v(τ)⋅tanϕ(τ)/Lw​⋅dτ=θ0​+∫τ=0t​v(τ)⋅tanϕ(τ)/Lw​⋅dτ​(3)

上式中的 [xt,yt,θt][x_t,y_t,\theta_t][xt​,yt​,θt​] 即为t时刻后车辆的位姿,也就是新的状态节点向量。

2.2 离散拓展

实际使用时不可能进行连续的状态节点拓展。需要离散化以便减少计算量。

首先,对前轮转角ϕ\phiϕ进行离散化
ϕi∈{Φ0,Φ1,…,Φm},i∈[0,m−1],i∈Z(4)\phi_i\in\{\Phi_0,\Phi_1,\ldots,\Phi_m\},\quad i\in[0,m-1],i\in Z \tag4 ϕi​∈{Φ0​,Φ1​,…,Φm​},i∈[0,m−1],i∈Z(4)
然后,对速度vvv进行离散化
vj∈{−Vmax,Vmax}(5)v_j\in\{-V_{max},V_{max}\}\tag5 vj​∈{−Vmax​,Vmax​}(5)

最后,对时间ttt进行离散化
tk∈{T0,T1,…,Tn},k∈[0,n−1],k∈Z(6)t_k\in\{T_0,T_1,\ldots,T_n\},\quad k\in[0,n-1],k\in Z \tag6 tk​∈{T0​,T1​,…,Tn​},k∈[0,n−1],k∈Z(6)

根据式(4)-(6)进行离散化之后,每次拓展的节点状态个数为 (m+1)×2(m+1)\times2(m+1)×2。

有同学肯定会提出疑问:拓展的节点个数不应该是 (m+1)×2×(k+1)(m+1)\times2\times(k+1)(m+1)×2×(k+1)吗?这就引出了下个话题——中间节点。

2.3 中间节点

我们之前所说的节点状态指的都是最终节点状态。为什么会有最终节点这个名称出现呢?因为引入了中间节点。

那是怎么引入的中间节点呢?是通过对单次拓展时间ttt进行离散化引入的。所以,每个最终节点包含了k+1k+1k+1 个中间节点。

有人肯定会有新的疑问:不使用中间节点到底行不行?答案是不行,原因有两个。

  1. 如果将每个中间节点的身份都进行“提升”,提升为最终节点,那么产生的问题就是状态栅格分辨率(参看Hybrid Astar 算法剖析和实现(二)_穿越临界点的博客-CSDN博客)要相应的提升,这样会增长搜索时间,并且增加内存使用量。
  2. 每次拓展抛弃中间节点,直接取 t=Tnt=T_nt=Tn​ 可不可以呢?也是不可以的。因为,如果每次拓展距离过长,只对最终的节点进行碰撞检测是不可靠的——小体积的障碍物会被直接跳过去。

因此,为了平衡状态栅格的精度和碰撞检测的可靠性,才不得不引入中间节点的概念。

Tips:中间节点引入的原因对于初学者来说是很难理解的。我认为这也是Hybrid Astar算法与Astar算法最大的不同。那这种思想或技巧来自哪里呢?

她实际上来自于RRT相关算法。这是搜索树中经常遇到的问题。

说到这里,想必大家对Hybrid的理解也更深刻了吧——就是Astar和RRT的混血。


3 总结

本篇主要介绍了节点拓展的核心思想,并给大家揭开了Hybrid这个字的神秘面纱。下一篇,我们对其进行代码实现,敬请期待。

恭喜你又坚持看完了一篇博客,又进步了一点点!如果感觉还不错就点个赞再走吧,你的点赞和关注将是我持续输出的哒哒哒动力~~

Hybrid Astar 算法剖析和实现(五)相关推荐

  1. Hybrid Astar 算法剖析和实现(七)

    在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习.我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直 ...

  2. 商用蓝牙定位算法剖析

    商用蓝牙定位算法剖析 前言 XXX公司定位算法 运用资源 定位算法逻辑 实体蓝牙布置 优点和缺点 XXXX公司定位算法 运用资源 定位算法逻辑 实体蓝牙布置 优点和缺点 前言 目前在做蓝牙定位,找了成 ...

  3. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_【论文研读】路径规划中的Hybrid A*算法...

    本文目的 由于在carla-autoware的示例中使用了hybrid A* 算法,所以本文基于以下两篇文章对hybrid A* 算法过程进行整理:(文中挑选了一些个人认为便于理解算法的图片,均来自于 ...

  4. 深入剖析Redis系列(五) - Redis数据结构之字符串

    前言 字符串类型 是 Redis 最基础的数据结构.字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON.XML).数字(整数.浮点数),甚至是 二进制(图片.音频.视频),但 ...

  5. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  6. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    转载自  JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...

  7. redis源码剖析(十五)——客户端思维导图整理

    redis源码剖析(十五)--客户端执行逻辑结构整理 加载略慢

  8. 孤立森林(Isolation Forest)算法剖析

    之后会持续更新算法剖析系列,力图用最生动的例子演示每一个算法的原理,不稀里糊涂做一个调包侠.欢迎持续关注,指正不足. 孤立森林(Isolation Forest)算法是西瓜书作者周志华老师的团队研究开 ...

  9. 文本比较算法剖析(1)-如何确定最大匹配率

    最近看到有人在找关于文本比较的算法,刚好最近休假,研究了一下,终于找到一个简单有效的算法,和大家分享一下. 算法本身很简单,但是要说清楚思路和原理就比较复杂了,打算分两次发表(明天就要上班拉!),分别 ...

  10. 模糊数学 计算机智能,《常用算法之智能计算 (五) 》:模糊计算

    原标题:<常用算法之智能计算 (五) >:模糊计算 人们常用"模糊计算"(FuzzyComputing)笼统地代表诸如模糊系统.模糊语言.模糊推理.模糊逻辑.模糊控制. ...

最新文章

  1. AssetBundle Workflow
  2. 关于DateTime的一点记录 ToString(yyyy-MM-dd HH:mm:ss)
  3. 小红书再度出拳整治医美 首批处置违规笔记27.9万篇
  4. 日均 61 亿次攻击、挖矿病毒“卫冕”安全威胁之最,云上安全防御如何“战”?...
  5. VMC to Hyper-V Import Tool 简体中文版.VZPEDIA首发
  6. CPU、内存、硬盘、显卡、显示器之间的关系
  7. 《UnityAPI.Transform变换》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Transform+eulerAngles+LookAt+立钻哥哥++OK++)
  8. 2022年(上半年)信息系统项目管理师考试-综合知识真题及解析(一)
  9. java工作经验总结
  10. 美国大学计算机科学专业研究生排名,美国大学计算机科学专业研究生排名介绍...
  11. 【JavaScript】转载:JS高端奇淫技巧
  12. matlab marker太多,关于plot中的markersize问题
  13. 怎么一心多用高效处理工作琐事?用敬业签同时处理多个任务
  14. 软考知识点---10数据库基础
  15. 绝不手软!严厉打击抄袭行为
  16. 我在3G门户工作学到的9句话
  17. MATLAB隐函数绘图 使用隐函数作二维图 使用隐函数作三维图
  18. CentOS 7.0全自动安装光盘制作详解
  19. IDEA从零到精通(12)之用C3P0连接Mysql数据库
  20. ubuntu16.04 matlab2017b 编译caffe的matlab接口 吐血经历 解决几乎所有make mattest问题

热门文章

  1. 数据结构和算法(十三)排序算法
  2. 获取阿里云docker加速器地址
  3. Go语言实战-golang操作redis
  4. 斗鱼基于etcd和ZooKeeper的注册中心实践案例
  5. ipv6电视直播Android,关于高校电视直播(ipv4ipv6)
  6. “华为杯”中国研究生数学建模竞赛 记录
  7. i.MX应用处理器-iMX8系列产品介绍
  8. UEFI shell控制台向.efi文件传入参数--通过protocol实现
  9. 基于网易云API做的一个扫码登录
  10. 工具 | Procexp工具使用及案例说明