智能驾驶规划控制理论学习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 visited
        if 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问题较难处理 ,并且采样的规则需要精心计算。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3快速上手(十六)Vue3路由传参大全

Vue3路由传参 一、传参的多种方式 1.1 拼接方式 这种方式适合传递单个参数的情况&#xff0c;比如点击查看详情&#xff0c;传个id这样的场景 传参&#xff1a; <RouterLink to"/person?id1" active-class"active">person</RouterLink> …

RabbitMQ相关问题

RabbitMQ相关问题 一、RabbitMQ的核心组件和工作原理&#xff1f;二、如何保证消息可靠投递不丢失的&#xff1f;三、RabbitMQ如何保证消息的幂等性&#xff1f;四、什么是死信队列&#xff1f;死信队列是如何导致的&#xff1f;五、RabbitMQ死信队列是如何导致的&#xff1f;六…

PDF 解析问题调研

说点真实的感受 &#xff1a;网上看啥组件都好&#xff0c;实际测&#xff0c;啥组件都不行。效果好的不开源收费&#xff0c;开源的效果不好。测试下来&#xff0c;发现把组件融合起来&#xff0c;还是能不花钱解决问题的&#xff0c;都是麻烦折腾一些。 这里分享了目前网上能…

数据结构 第3章 栈、队列和数组(一轮习题总结)

第3章 栈、队列和数组 3.1 栈3.2 队列3.3 栈与队列的应用3.4 数组和特殊矩阵 3.1 栈&#xff08;1 10 11 20&#xff09; 3.2 队列&#xff08;6 12 14 17&#xff09; 3.3 栈与队列的应用&#xff08;6 11&#xff09; 3.4 数组和特殊矩阵 3.1 栈 T1 栈和队列具有相同的逻辑…

一周学会Django5 Python Web开发-Django5详细视图DetailView

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计28条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

Linux-信号2

文章目录 前言一、信号是如何保存的&#xff1f;int sigemptyset(sigset_t *set);int sigfillset(sigset_t *set);int sigaddset (sigset_t *set, int signo);int sigdelset(sigset_t *set, int signo);int sigismember&#xff08;const sigset_t *set, int signo);int sigpen…

leetcode 长度最小的子数组

在本题中&#xff0c;我们可以知道&#xff0c;是要求数组中组成和为target的最小子数组的长度。所以&#xff0c;我们肯定可以想到用两层for循环进行遍历&#xff0c;然后枚举所有的结果进行挑选&#xff0c;但这样时间复杂度过高。 我们可以采用滑动窗口&#xff0c;其实就是…

NoSQL--1.虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先&#xff0c;导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作&#xff1a; 1.1.2.1 点击开启虚拟机&#xff1a; 1.1.2.2 默认选择回车CentOS Linux&#xff08;3.10.0-1127.e17.x86_64) 7 …

同样是证书,NPDP和PMP有什么区别?

PMP和NPDP的区别是啥&#xff1f; PMP、NPDP证书考哪个更有用&#xff1f;还是两个都考&#xff1f; PMP和NPDP哪个更适合现在及以后发展&#xff1f; PMP和NPDP这两哪个含金量更高&#xff1f; 一&#xff0c;关于PMP和NPDP PMP和NPDP都是美国PMI/PDMA的专业考试&#xf…

C语言中的分支和循环语句:从入门到精通

分支和循环语句 1. 前言2. 预备知识2.1 getchar函数2.2 putchar函数2.3 计算数组的元素个数2.4 清屏2.5 程序的暂停2.6 字符串的比较 3. 结构化3.1 顺序结构3.2 分支结构3.3 循环结构 4. 真假性5. 分支语句&#xff08;选择结构&#xff09;5.1 if语句5.1.1 语法形式5.1.2 else…

Stable Cascade又升级了,现在只需要两个模型

Stable Cascade这个模型&#xff0c;大家如果还有印象的话&#xff0c;是需要下载三个模型的&#xff0c;分别是Stage_a,Stage_b和Stage_c,如果全都下载下来&#xff0c;需要20多个G&#xff0c;但是最近使用ComfyUI做尝试的时候&#xff0c;发现官方的案例中已经没有用到单独的…

数据审计 -本福德定律 Benford‘s law (sample database classicmodels _No.6)

数据审计 -本福德定律 Benford’s law 准备工作&#xff0c;可以去下载 classicmodels 数据库资源如下 [ 点击&#xff1a;classicmodels] 也可以去我的博客资源下载 文章目录 数据审计 -本福德定律 Benfords law 前言一、什么是 本福德定律&#xff1f;二、数学公式三、应用…

单细胞Seurat - 降维与细胞标记(4)

本系列持续更新Seurat单细胞分析教程&#xff0c;欢迎关注&#xff01; 非线形降维 Seurat 提供了几种非线性降维技术&#xff0c;例如 tSNE 和 UMAP&#xff0c;来可视化和探索这些数据集。这些算法的目标是学习数据集中的底层结构&#xff0c;以便将相似的细胞放在低维空间中…

Grpc项目集成到java方式调用实践

背景&#xff1a;由于项目要对接到grcp 的框架&#xff0c;然后需要对接老外的东西&#xff0c;还有签名和证书刚开始没有接触其实有点懵逼。 gRPC 是由 Google 开发的高性能、开源的远程过程调用&#xff08;RPC&#xff09;框架。它建立在 HTTP/2 协议之上&#xff0c;使用 …

从零开始手写RPC框架(3)——ZooKeeper入门

目录 ZooKeeper简介ZooKeeper中的一些概念 ZooKeeper安装与常用命令常用命令 ZooKeeper Java客户端 Curator入门 ZooKeeper简介 是什么&#xff1f; ZooKeeper 是一个开源的分布式协调服务&#xff0c;本身就是一个分布式程序&#xff08;只要半数以上节点存活&#xff0c;Zo…

django-admin登录窗口添加验证码功能-(替换原有的login.html)captcha插件

需求&#xff1a; 1&#xff1a;更改django框架的admin登录窗口标题 2&#xff1a;在admin登录窗口中添加验证码功能 3&#xff1a;验证码允许点击更换 步骤如下&#xff1a; 1:安装插件以及在安装列表中添加插件 2:自定义表单forms.py 3:创建login.html文件(复制django内置的l…

中国电子学会2020年6月份青少年软件编程Sc ratch图形化等级考试试卷四级真题。

第 1 题 【 单选题 】 1.执行下面程序&#xff0c;输入4和7后&#xff0c;角色说出的内容是&#xff1f; A&#xff1a;4&#xff0c;7 B&#xff1a;7&#xff0c;7 C&#xff1a;7&#xff0c;4 D&#xff1a;4&#xff0c;4 2.执行下面程序&#xff0c;输出是&#xff…

备战蓝桥杯Day22 - 计数排序

计数排序问题描述 对列表进行排序&#xff0c;已知列表中的数范围都在0-100之间。设计时间复杂度为O(n)的算法。 比如列表中有一串数字&#xff0c;2 5 3 1 6 3 2 1 &#xff0c;需要将他们按照从小到大的次序排列&#xff0c;得到1 1 2 2 3 3 5 6 的结果。那么此时计数排序是…

每天一道leetcode:14.最长公共前缀(简单)

⭐今日份题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例1 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl" 示例2 输入&#…