智能驾驶规划控制理论学习05-车辆运动学规划案例分析

目录

案例一——Hybrid A*(基于正向运动学)

1、基本思想

2、 实现流程

 3、启发函数设计

4、分析扩张(Analytic Expansions) 

5、分级规划(Hierarchical planning)

案例二——State Lattice Planning(基于逆向运动学)

1、基本思想

2、Conformal Lattice

3、目标状态实例

4、生成路径集合

5、代价值评估与路径选择

案例比较


案例一——Hybrid A*(基于正向运动学)

1、基本思想

        Hybrid A*是A*算法的一种扩展,本质也是一种图搜索算法,Hybrid A*有以下特点:

  • 通过在控制空间中实时构件状态图

        整体思想是在控制空间中采样利用前向积分的方式生成多条运动基元作为状态图的边。以自行车模型为例,输入量有两个,分别是运动速度v和前轮转角φ,为了简化过程可以假设速度恒定,此时只需要考虑φ一个变量,可以假设φ∈[-umax, umax],对其做等距的离散采样(上图采样了三份,实际应用当中会分成跟多份),取得的三个控制量分别为-umax,0和umax,然后对这三个控制量进行前向仿真/积分(给定初始状态量,给定时间△t通过积分得到新的状态);

  • 在网格地图中修剪一些节点,减少图的大小(剪枝)

        若在采样时状态空间取的足够密(采样等距距离足够小),那么会导致图中的节点和边过多,极大地消耗计算资源,因此为了保证整体算法的实时性,Hybrid A*采用剪枝的操作,将状态空间进行离散得到网格,若多个state落入同一个网格中,那么就选择最优的一个state(cost最小)保留;

  • 使用与A*算法相同的方法在状态图上搜索路径

        A*算法与Hybrid A*算法的比较:

  • A*将代价值与网格中心联系,并且只访问与网格中心相对应的状态;
  • Hybrid A*为每一个网格赋予了连续的状态(通过在模型的控制空间中采样并积分得到),每一个网格对应的分数是其关联的连续状态下的代价值。

2、 实现流程

下面用伪代码的方式对Hybrid A*算法的实现流程进行简要描述:

Algorithm Astar(G, start):let open_list be priority queue;g[start] := 0;f[start] := g[start] + h[start];open_list.push(start,f[start]);while (open_list is not empty):current := open_list.pop();mark current as visitedif current is the goal:return current;// 通过从控制空间采样和前向仿真来扩展邻居节点for all unvisited neighbours next of current in Graph G:next_cost := g[current] + cost(current,next);if next is not in open_list:open_list.push(next,next_cost + h[next])    // 合并在离散空间中占用相同单元的连续坐标状态else:if g[next] > next_cost:g[next] := next_cost;f[next] := next_cost + h[next];

        对于Hybrid A*算法,g(n)不单单表示路径距离上的代价值,还包括一些其他方面的代价,比如方向改变(包括前后和左右)的惩罚项;

        而对于启发式函数h(n)的设置,可以用经典的欧几里得距离或和曼哈顿距离,也可以用一些其它的方式使整体的搜索效率更高,这方面会在下面讲解;

 3、启发函数设计

        在Practical search techniques in path planning for autonomous driving. 论文中作者给出了两种启发函数的设计,分别是:

  • Non-holonomic-without-obstacles

        这种启发式函数的估计是基于Reeds Sheep Path的方法,此方法考虑了车辆本身的特性,却忽略了环境;

  • Holonomic-with-obstacles

        这种启发式函数的估计是基于目标节点和当前正在扩展的顶点之间的最短距离,此方法忽略了车辆本身的特性,只考虑了障碍物。

        原论文中给出了两个特定场景下使用不同的启发式函数取得的效果,如下图所示:

        (a)使用最简单的欧几里得距离作为启发式函数

        (b)使用non-holonomic-without-obstacles作为启发式函数

        (c)使用non-holonomic-without-obstacles作为启发式函数

        (d)non-holonomic-without-obstacles和Holonomic-with-obstacles组合使用

        通过(a)图和(b)图的比较,可以得到相比与简单使用欧几里得距离,使用non-holonomic-without-obstacles作为启发式函数使树节点缩小了接近十倍,效率有显著的提升;

        (c)(d)图中是一个更为复杂的场景,(c)图表示在复杂场景下单纯使用non-holonomic-without-obstacles作为启发式函数会导致树的规模很大,因为没有考虑环境障碍物的因素,需要把环境探索完全才能得到可行的路径;

        而将non-holonomic-without-obstacles和Holonomic-with-obstacles组合进行使用就能得到(d)图所示的路径,有前面的学习可知通过一次完整的迪杰斯特拉算法可以实现图中某个节点到其他所有节点啊之间的距离,利用这个性质,在做Hybrid A*算法前,先从终点反向的进行一次迪杰斯特拉算法对整个图进行遍历我们可以得到图中任意节点到终点的最短路劲(考虑障碍物),将节点距离记录在表格中(前期的离线收集过程)。然后在Hybrid A*算法实时的搜索时直接根据当前位置从表格中获取对应的离终点考虑障碍物的最短路径。

4、分析扩张(Analytic Expansions) 

         论文指出离散搜索(前向积分)永远无法达到精确的连续目标状态(整体的精度还取决于A*网格的分辨率),因此文章中使用Reeds Shepp Path解析地连接当前节点和目标节点,利用这种方法可以大大提高障碍物在稀疏环境下的搜索速度。

5、分级规划(Hierarchical planning)

         在一个复杂的状态空间下想要一次性找到两点之间的最优轨迹是比较困难的,分级规划的思想就是利用分布的思路,先利用某种方式(上图是利用Hybrid A*)获得一条初解(全局最优解),再基于初解做局部的平滑得到局部最优解。

        由Hybrid A*得到的路径通常是次优的,主要有两个原因:一是在剪枝的过程中,每一个栅格内都只保留一个state,这种操作会导致在某种层面上不是最优的;二是在控制空间采样时,不管是对前轮转角(方向盘转角)或者是转角变化率进行采样,都无法实现严格意义上的连续,最终的结果可能并不是很平滑。因此需要进一步改善。

        论文中通过采用共轭梯度下降法对Hybrid A*路径进行光滑处理。

案例二——State Lattice Planning(基于逆向运动学)

1、基本思想

        在状态空间中采用获得终点状态(一系列离散的点) ,可以在Frenet坐标系下采样,也可以在Cartesian坐标系下采样,再通过求解边界值(BVP)问题来获得运动基元,通过计算每条路径的成本选择最佳路径。

2、Conformal Lattice

        conformal lattice指的是在结构化道路上定义的一种采样规则,大致是在在横向上获取目标状态沿道路目标点横向偏移采样,在纵向上沿着车道中心线行驶,能够在避开障碍的同时加快规划过程。

3、目标状态实例

        目标状态从目标点沿道路横向偏移采样,具体的采样规则需要根据当前速度和其他因素进行调整。比如在纵向上生成的路径的长度(弧长)往往需要和车速关联,在低速时往往希望弧长短一些,因为在低速时弧长过长会使车辆运动对应位置时失去时效性;而在高速时往往希望弧长长一些,弧长过短不利于下一时间对环境事物的判断。

        另一方面,在侧向方向上的采样也有特定的策略,比如在拥堵场景下,采样距离过大可能会导致无解。

4、生成路径集合

         在采样结束后,要进行边界值问题(BVP)处理,在Frenet坐标系中可以用五次多项式进行处理,在Cartesian坐标系中可以用三次螺旋线进行处理。

5、代价值评估与路径选择

        代价函数的设计往往要考虑多个方面,为了简化问题可以简单考虑安全性、平滑性和对中心线的贴合度三个方面的代价函数考虑:

  • 安全性:

J_{safety}=collision_{-} check()

  • 平滑性:

J_{smooth}=\sum_{i=1}^{N}{l}_{i}'''^{2}

  • 中心线贴合度:

J_{ref}=\sum_{i=1}^{N}l_{i}^{2} 

        将这三个因素进行不同的权重进行组合,计算总的代价函数:

J_{total} = w_{1}*J_{safety} + w_{2}*J_{smooth}+w_{3}*J_{ref}

         得到了代价函数后就可以评估生成的各曲线的代价值进而获得最优路径。

案例比较

        案例一是基于正向运动学的方法,案例二则是基于逆向运动学的方法,下面介绍这两种运动学方法以及它们的对比。

        正向运动学方法对应上图中的在控制空间采样,在知道控制量v、u以及给定时间t通过前向积分的方式得到一系列的轨迹;而逆向运动学对应上图中在状态空间中采样,此时的输入量是起始和终点的状态量,通过起点和终点的状态量反推中间的状态量和输入量。

  • 正向运动学(控制空间采样)

        优点:只要给定初始状态和控制变量,通过运动学/动力学模型进行前向积分的方式即可得到                     整个状态轨迹;

        缺点:缺少对目标点的引导,单纯依靠启发式函数来引导搜索过程。

  • 逆向运动学(状态空间采样)

        优点:具有较强的任务引导性,直接生成朝着目标的采样状态;

        缺点:BVP问题较难处理 ,并且采样的规则需要精心计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

子矩阵的和 刷题笔记 {二维前缀和}

首先我们的目标是让 s[i][j]表示为其左方和上方形成的矩阵所有元素的和 加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重复了所以减去 最后加上a[i][j]即可完成目标 s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; 然后看题目要求 要求x1,y1,x2,y2围成的小正方形内的元素和…

C/C++工程师面试题(数据库篇)

索引的优缺点 索引是一种支持快速查找特定行的数据结构,如果没有索引,就需要遍历整个表进行查找。用于提高数据检索的速度和效率。 好处: 提高检索速度: 索引可以加快数据的检索速度,因为它们允许数据库系统直接定位到…

Revit-二开之立面视图创建FilledRegion-(3)

在上一篇博客中介绍了FilledRegion的创建方法,这种方法通常只在平面视图中适用,在三维视图中也是无法创建的(目前研究的是这样的,如果有其他方法,请赐教)。 本片文章介绍一个下在立面视图中创建FilledRegion的方法,主要操作是在立面视图中拾取一个点,然后以该点为原点,…

YOLOv5 项目:推理代码和参数详细介绍(detect)

1、前言 本章将介绍yolov5项目的推理函数,关于yolov5的下载和配置环境,参考上一篇文章: YOLOv5 项目:环境配置-CSDN博客 pycharm 中打开的推理模块如红框中所示 pycharm将conda新建的虚拟环境导入,参考 :…

简单实现Transformer的自注意力

简单实现Transformer的自注意力 关注{晓理紫|小李子},获取技术推送信息,如感兴趣,请转发给有需要的同学,谢谢支持!! 如果你感觉对你有所帮助,请关注我。 源码获取:VX关注并回复chatg…

二叉树的右视图,力扣

目录 题目: 我们直接看题解吧: 快速理解解题思路小建议: 审题目事例提示: 解题方法: 解题分析: 解题思路: 代码实现(DFS): 代码1: 补充说明: 代码2&#xff1…

AI:148-开发一种智能语音助手,能够理解和执行复杂任务

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

[技巧]Arcgis之图斑四至点批量计算

前言 上一篇介绍了arcgis之图斑四至范围计算,这里介绍的图斑四至点的计算及获取,两者之间还是有差异的。 [技巧]Arcgis之图斑四至范围计算 这里说的四至点指的是图斑最东、最西、最南、最北的四个地理位置点坐标,如下图: 四至点…

STM32进阶笔记——复位、时钟与滴答定时器

本专栏争取每周三更新直到更新完成,期待大家的订阅关注,欢迎互相学习交流。 目录 一、复位1.1 软件复位1.2 低功耗管理复位 二、时钟2.1 系统时钟(SYSCLK)选择2.2 系统时钟初始化 三、滴答定时器(Systick)3.1 SysTick部分寄存器3.…

部署bpmn项目实现activiti流程图的在线绘制

本教程基于centos7.6环境中完成 github开源项目: https://github.com/Yiuman/bpmn-vue-activiti软件:git、docker 1. 下载源代码 git clone https://github.com/Yiuman/bpmn-vue-activiti.git2. 修改Dockerfile文件 声明基础镜像,将项目打包&#xff…

EasyRecovery数据恢复软件有什么优势呢?

EasyRecovery数据恢复软件具有以下优势: 强大的恢复能力:EasyRecovery采用先进的扫描和恢复技术,能够深度扫描存储设备,寻找并恢复因各种原因丢失的数据。无论是误删除、格式化、分区损坏还是病毒感染,它都能提供有效…

设计模式(十一)策略模式

请直接看原文:设计模式(十一)策略模式_某移动支付系统在实现账户资金转入和转出时需要进行身份验证,该系统为用户提供了-CSDN博客 ----------------------------------------------------------------------------------------------------------------…

SpringMVC 学习(十一)之数据校验

目录 1 数据校验介绍 2 普通校验 3 分组校验 4 参考文档 1 数据校验介绍 在实际的项目中,一般会有两种校验数据的方式:客户端校验和服务端校验 客户端校验:这种校验一般是在前端页面使用 JS 代码进行校验,主要是验证输入数据…

文物预防性保护系统方案的需求分析

没有文物保存环境监测,就不能实施有效的文物预防性保护。因此要建立文物预防性保护体系,一定要先有良好的文物状态监测制度,进而进行科学有效的文物保护管理。所以,导入文物预防性保护监测与调控系统,首先就是要针对文物进行全年温度、湿度、光照等关键参…

使用Zint库生成一维码/条形码

下面代码是是使用 Zint 库生成 Code 128 类型的条形码&#xff0c;并将生成的条形码保存为 output.bmp 文件。下面是对代码的详细解释&#xff1a; #include 和 #include <zint.h>&#xff1a;这两行代码包含了所需的头文件&#xff0c;分别是标准输入输出流的头文件和 Z…

LeetCode---【链表的操作】

目录 206反转链表【链表结构基础】21合并两个有序链表【递归】我的答案【错误】自己修改【超出时间限制】在官方那里学到的【然后自己复写,错误】对照官方【自己修改】 160相交链表【未理解题目目的】在b站up那里学到的【然后自己复写,错误】【超出时间限制】对照官方【自己修改…

(C语言)qsort函数模拟实现

前言 我们需先了解qsort函数 qsort函数详解&#xff1a;http://t.csdnimg.cn/rTNv9 qsort函数可以排序多种数据类型&#xff0c;很是神奇&#xff0c;这是为什么&#xff0c;我们在里模拟实现这样的功能 目录 1. qsort函数模拟实现 2. 我们使用bubble_sort函数排序整形数…

Sunshine v0.21.0 安装卡住,闪退的问题解决

上期博客讲了如何利用 Sunshine 和 Moonlight 实现 iPad 当作 Windows 副屏&#xff0c;用官方 Windows installer 安装 Sunshine 过程中&#xff0c;遇到了安装卡住&#xff08;这个是因为需要国外网络环境&#xff09;&#xff0c;安装后运行闪退的问题。 Sunshine 下载地址…

OpenCV 4基础篇| OpenCV图像的裁切

目录 1. Numpy切片1.1 注意事项1.2 代码示例 2. cv2.selectROI()2.1 语法结构2.2 注意事项2.3 代码示例 3. Pillow.crop3.1 语法结构3.2 注意事项3.3 代码示例 4. 扩展示例&#xff1a;单张大图裁切成多张小图5. 总结 1. Numpy切片 语法结构&#xff1a; retval img[y:yh, x…

以目标检测和分类任务为例理解One-Hot Code

在目标检测和分类任务中&#xff0c;每一个类别都需要一个编码来表示&#xff0c;同时&#xff0c;这个编码会用来计算网络的loss。比如有猫&#xff0c;狗&#xff0c;猪三种动物&#xff0c;这三种动物相互独立&#xff0c;在分类中&#xff0c;将其中任意一种分类为其他都同…