当前位置: 首页 > news >正文

智能驾驶规划控制理论学习04-基于车辆运动学的规划方法

目录

一、线性二自由度汽车模型(自行车模型)

1、二自由度模型概述

2、不同参考点下的状态空间方程

3、前向仿真

二、运动基元生成方法

1、杜宾斯曲线(Dubins Curve)

2、Reeds Shepp Curve

三、多项式曲线(Polynomial Curve)

1、五次多项式曲线(Quintic Polynomial)       

五次多项式曲线介绍

 五次多项式曲线应用

 2、螺旋线(Spiral Curve)

三次螺旋线 (Cubic Spiral Curve)

 辛普森方法(Simpson's method)

​编辑 参数重映射        

牛顿求根法(Newton's Method for Root Finding)


一、线性二自由度汽车模型(自行车模型)

1、二自由度模型概述

        如上图所示,左侧为传统的四轮汽车运动学模型,右侧为简化的二自由度汽车模型,仅保留沿着y轴的移动和绕z轴的横摆 。为了简化得到二自由度模型,需要满足一下几个基本假设:

  • 车辆运动在二维平面上;
  • 假设无滑移条件:轮胎没有横向或纵向滑移,因此我们可以假设车轮的速度与车轮的朝向一致。

2、不同参考点下的状态空间方程

         在线性二自由度汽车模型中,可以以后轮中心为参考点,以前轮中心为参考点,或以整车质心为参考点。

①以后轮中心为参考点

        从最后得到的公式可知,若已知车辆起始位置(x,y,θ),前轮偏转角ε和起始速度v就可以预测一定时间△t后的车辆所处的位置;

②以前轮中心为参考点

        以前轮中心为参考点进行分析与以后轮中心为参考点类似,只是角度发生了一些变化; 

③以质心为参考点

        L是汽车的轴距,lr对应汽车后轴距(对应汽车质心到后轮中心的距离),β是汽车的航偏角。

3、前向仿真

        在自动驾驶规划领域中,前向仿真/积分是非常常用的一种方法,如果我们知道一组初始状态量、一组输入量并且给定一段时间就可以通过积分的方式得到下一个时刻汽车的状态量。对应下图所示的过程:

        需要注意的是输入量是车速和方向盘的转速,与前面介绍的微分方程状态量不同,如果直接传入方向盘转速(对应前轮偏转角ε),那么会使转向角瞬间发生变化,这与实际驾驶过程不符。显然用偏转角的变化率作为输入量更合理;

        前面推导出来的微分方程都是连续的,我们通常要利用离散的方法区评估一个连续的积分结果。上图介绍的就是较为经典的处理微分方程的数值方法——欧拉法,大致思想是利用梯形的面积来近似原函数的积分值。

二、运动基元生成方法

1、杜宾斯曲线(Dubins Curve)

        杜宾斯曲线的目的是要求解二维平面上两个位姿之间的最短路径。

        当车辆运动速度恒定时,系统可被简化为:        

       转角u的取值从区间[-tanφmax, tanφmax]中选择,由于在日常生活中车辆的前轮转角大多在[-π/2, π/2]之间,因此为了简化可以取tanφ = 1。

        在任意两个位姿之间,车辆的杜宾斯曲线总是可以被不超过三个运动基元的组合表示出来,分别被记为S(直行)、L(向左以最大转角行驶得到的圆弧)和R(向右以最大转角行驶得到的圆弧)。

         杜宾斯曲线证明了只有一下六种组合能够取得最优解,任意两个位姿之间的最短路径总是可以用其中一个组合来表示。

{LRL, RLR, LSL, LSR, RSL, RSR}

        以下图为例描述车辆沿杜宾斯曲线的运动轨迹:

        以左侧的杜宾斯曲线为例,一开始的Rα表示车辆向右行驶过一段α圆心角的弧长,第二段Sd表示的是在直行过程中行驶出来的距离d,第三段Lγ表示车辆向左行驶过一段γ圆心角的弧长。

        图中还需要注意β的取值与α、γ不同,β的取值不能低于π,因为杜宾斯曲线证明若β的取值低于π,那么一定会有另一种运动基元的组合取得最优解。

        对于给定起始点和终点,利用杜宾斯曲线进行最短路劲求解仍然面临两个问题:

  • 以上六种运动基元的组合哪个能够获得最短路劲?
  • 如何获取下标α、β、γ和d的值?

        对于第一个问题,可以尝试将六种组合一一尝试的方式,或者利用解析解的方式进行求解;

        第二个问题则需要理由各种几何关系进行求解,目前编程上也存在直接可以使用的库函数对杜宾斯曲线的参数进行求解。

2、Reeds Shepp Curve

        Reeds Shepp Curve和Dubins Curve整体上十分类似,唯一的区别是Dubins Curve只允许车辆做正向运动,而Reeds Shepp Curve允许车辆做反向运动。

        体现到微分方程中, Reeds Shepp Curve利用u1和u2两个参数来表示车辆的运动方向,u1表示车辆的前后运动,u2表示车辆的左右运动;

        u1的取值为{-1, 1},分别表示向后和向前,u2的取值为[-tanφmax, tanφmax],为了简化u2依然可以只在区间[-1, 1]之间进行取值。

        Reeds Shepp Curve被证明有不超过48种的组合可以用来描述车辆的最短路径,如下表所示:

三、多项式曲线(Polynomial Curve)

1、五次多项式曲线(Quintic Polynomial)       

五次多项式曲线介绍

        假设在某个时刻t的一维运动x(t)被表述为五次多项式

        在五次多项式中共有六个未知量a0……a5,因此要求解一条五次多项式只需要构造出六个等式方程即可,在自动驾驶中通常将起始点和终点作为边界条件。

        具体来说可假设起始点时t = 0,终点时t = T,那么对于一条五次多项式可以进行如下求解:

 五次多项式曲线应用

        上图左侧是在frenet坐标系中利用五次多项式曲线去描述纵向和侧向运动, 对于侧向和纵向运动,都给定初始的状态量,通过采样的方式取得一系列终点的状态量,利用上述的计算方式获得对应起始点和终止点的五次多项式曲线。

        图中浅灰色的曲线是一些被过滤的不合理的五次多项式曲线,在符合约束条件的五次多项式曲线中按照特定的cost获取最优的曲线(图中用绿色表示)。

        将采样得到的侧向和纵向方向的五次多项式按照cost加权的方式进行组合就能得到如上图右侧所示的综合曲线,然后在合并后的曲线中选择最优的曲线。

         前面讲过在frenet坐标系中规划的方法,车辆的侧向运动有两种参数化的表述形式,第一种是以时间t为参数化l(t),对应上面介绍的应用,还有一种是以弧长s为参数化l(s),下图介绍的是五次多项式在这种自动驾驶场景的应用:

 2、螺旋线(Spiral Curve)

三次螺旋线 (Cubic Spiral Curve)

        三次螺旋线与上面介绍的五次多项式都是用来解决路径边界问题(bvp, Path boundary value problem)的方法,所谓bvp问题就是给定起点和终点约束来获取一条参数化曲线。

        螺旋线是关于曲率对弧长的函数k(s),表示为随着弧长的变化,每一点所对应的曲率大小。本节以三次螺旋线为例进行介绍。

k(s) = ds^{3} + cs^{2} + bs + a

        通过质点的运动学模型可以得到以下表达式:

        对于θ值可以通过上述解析的方式求得,但是对于x和y的值的获取就比较复杂了。在数学上,形如\int_{a}^{b}cos(f(x))dx 的函数叫做菲涅尔积分,无法通过解析的方式获得位置的闭合解

        因此我们需要使用一些数值近似的方法来评估菲涅尔积分的值。一种常用的方法叫做辛普森方法(Simpson's method)。

 辛普森方法(Simpson's method)

        辛普森方法是一种利用二次函数来近似估计定积分值的方法,如下图 所示,辛普森法则可以通过用二次插值函数P(x)逼急被积函数f(x)来推导。

         为了通过辛普森方法获取定积分\int_{a}^{b}f(x)dx的近似值,我们通常会将[a, b]区间划分为偶数个子区间,每一个子区间的宽度为△x = (b - a) / n;

        在每一个连续的子区间上[x_{i-1},x_{i}], [x_{i},x_{i+1}],我们考虑用二次函数y = ax^{2} + bx + c穿过子区间的端点值(x_{i-1},f(x_{i-1})), (x_{i},f(x_{i}))

        对应的计算表达式为:

        辛普森法则计算公式的系数满足一下规律:

         辛普森方法相比于其他简单的数值方法(如中点法、梯形法)更加的精确,因为相比于中点法梯形法那种化曲为直的思想,用二次函数的曲线更加贴合定积分的曲线。 分割得到的子区间个数n会直接影响到积分近似的精确度和效率。

  • 一般来讲,随着n的增大,我们能够得到更加准确的近似值;
  • 与此同时,随着n的增大,计算所消耗的资源也越大,效率降低。

        下面以n=8为例在三次螺旋曲线中应用辛普森方法:

        将辛普森方法应用于x(s)和y(s)的求解

 参数重映射        

       参数重映射的思想是将原函数中的参数转化为p的向量,向量有五个维度组成分别为p0, p1, p2, p3, sf。

        p0,...,p3分别表示在整条曲线上按等弧长取到的四个点,sf则表示整条曲线的弧长,代入重映射后的三次螺旋线中得到:

         最终可以得到新得到的参数关于相邻p中的各维度的表达式:

         虽然原函数中只有四个参数,重映射后增加到了五个参数,但是p0和p3表示的是起点和终点的曲率,是已知量,函数就降到了三维,相比与原函数降低了一个维度。

        重映射后的公式能够确保各参数pi在量级上较为接近,为优化增加了数值稳定性。

        而对于剩下三个参数的求解,又要用到一种新的方法——牛顿求根法(Newton's Method for Root Finding)。

牛顿求根法(Newton's Method for Root Finding)

         先假设出采用参数p在终点处的向量:

        在参数重映射后 ,重点的k(sf)是已知输入量,因此我们要求解的状态输入量只有x、y和θ三个维度,向量p是优化后想要求解的变量。

        整个优化目标是我们希望的终点状态量和期望的状态量相等:

x_{des} - x_{p}(s_{f}) = 0

         再生成雅可比矩阵,使用牛顿寻根法生成p的估计序列:

        式中△x、△p表示梯度下降的方向,Pi+1是下一次迭代。

        下面对牛顿寻根法做一个简要的描述:

       上图是牛顿寻根法在一维函数中应用的一个直观体现。大致思想是:从一个初始的猜测开始,然后用它的切线来近似函数,最后计算这个切线的x轴截距。这个x截距通常会比第一次猜测更接近原始函数的根,迭代直到找到解。

        迭代公式为:

x_{n+1} = x_{n} - \frac{f(x_{n})}{f{}'(x_{n})}

        对于牛顿求根法,初值的选取是比较重要的,它会直接影响到最终求得的解是否为当前周期内的全局最优解,有两个可以采取的策略:

  • 通过查表的方式获取
  • 从上一个规划周期中导出类似位置的端点对。

        利用螺旋线的优点是可以显式地约束曲率以及曲率高阶量的信息,可以使得整条曲线更光滑,但是所消耗的计算资源也是比较大的。

相关文章:

智能驾驶规划控制理论学习04-基于车辆运动学的规划方法

目录 一、线性二自由度汽车模型(自行车模型) 1、二自由度模型概述 2、不同参考点下的状态空间方程 3、前向仿真 二、运动基元生成方法 1、杜宾斯曲线(Dubins Curve) 2、Reeds Shepp Curve 三、多项式曲线(Poly…...

一键查看:大厂网站都用了啥技术栈,有图有真相。

本次我们采用Wappalyzer插件来看下国内大厂的网站都采用了什么技术架构,文章最后由Wappalyzer的安装方法。 今日头条网站 淘宝网站 哔哩哔哩 京东商城 花瓣网 CSDN 国务院 网易 58同城 腾讯网 如何安装Wappalyzer 用Edge浏览器即可...

C语言-指针(下)

文章目录 前言    文章目录 前言 一、指针运算 1.指针-整数 2.指针-指针 3.指针关系运算 二、野指针 1.概念 2.野指针的成因 1.未初始化 2.指针越界访问 3.指针指向的空间释放 3.避免野指针 1.指针初始化 2.小心指针越界 3. 指针变量不再使用时,及时置NULL 总结 …...

尚硅谷JavaScript高级学习笔记

01 准备 JavaScript中函数是对象。我们后续描述构造函数的内存模型时,会将构造函数称为构造函数对象。 02 数据类型 typeof 运算符来查看值的类型,它返回的是类型的字符串值 会做数据转换 03 相关问题 04数据_变量_内存 05相关问题1 06相关问题2 …...

六、长短时记忆网络语言模型(LSTM)

为了解决深度神经网络中的梯度消失问题,提出了一种特殊的RNN模型——长短期记忆网络(Long Short-Term Memory networks, LSTM),能够有效的传递和表达长时间序列中的信息并且不会导致长时间前的有用信息被忽略。 长短时记忆网络原理…...

Filter过滤器+JWT令牌实现登陆验证

一、背景 我们需要在客户端访问服务器的时候给定用户一定的操作权限,比如没有登陆时就不能进行其他操作。如果他需要进行其他操作,而在这之前他没有登陆过,服务端则需要将该请求拦截下来,这就需要用到过滤器,过滤器可以…...

SQL学习十八~十九

...

2024 AI 辅助研发的新纪年

随着人工智能技术的持续发展与突破,2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计,从软件开发到材料科学,AI正逐渐渗透到研发的各个环节,变革着传统的研发模式。在这一背景下,AI辅助研发不仅…...

【牛客】HJ87 密码强度等级 CM62 井字棋

题目一:密码强度等级 题目链接:密码强度等级_牛客题霸_牛客网 (nowcoder.com) 本题主要考察C语言中逻辑分支语句,基本语句以及对各种特殊字符 ,ASCII值以及条件表达中的逻辑运算符关系运算符各自功能的理解,以及基本使用&#x…...

【论文速读】 | DeGPT:通过大语言模型优化反编译器输出

本次分享论文为:DeGPT: Optimizing Decompiler Output with LLM 基本信息 原文作者:Peiwei Hu, Ruigang Liang, Kai Chen 作者单位:中国科学院信息工程研究所;中国科学院大学网络空间安全学院 关键词:反向工程&…...

【DP】蓝桥杯第十三届-费用报销

#include<iostream> #include<algorithm> #include<cstring> #include<set> #include<queue> using namespace std; const int N1010; int dp[N][5010];//dp[i][j]:选到第i个物品是否能取到价值j&#xff1b; int month[13]{0,31,28,31,30,31,30…...

15. C++泛型与符号重载

【泛型编程】 若多组类型不同的数据需要使用相同的代码处理&#xff0c;在C语言中需要编写多组代码分别处理&#xff0c;这样做显然太过繁琐&#xff0c;C增加了虚拟类型&#xff0c;使用虚拟类型可以实现一组代码处理多种类型的数据。 虚拟类型是暂时不确定的数据类型&#…...

老司机都懂的!【打赏】完美运营的最新视频打赏系统

完美运营的最新视频打赏系统优于市面上95%的打赏系统&#xff0c;与其他打赏系统相比&#xff0c;功能更加强大&#xff0c;完美运营且无bug。支付会调、短链接生成、代理后台、价格设置和试看功能等均没有问题。 以上为原简介&#xff0c;经测试验证。成功搭建并可以正常进入…...

JavaWeb笔记 --- 二、Maven

二、Maven Maven概述 所有的IDE创建的Maven项目都可以使用 Maven简介 Maven模型 Maven常用命令 Maven生命周期 Maven坐标 依赖管理 dpendencies&#xff1a;依赖 依赖范围...

【C++】C++11---右值引用和移动语义

目录 1、什么是左值引用和右值引用2、左值引用与右值引用比较3、右值引用使用场景和意义4、右值引用引用左值的分析5、完美转发 1、什么是左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习…...

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码&#xff1a;https://kafka.apache.org/downloads 快速开始&#xff1a;https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程&#xff1a;主线程只负责组织消息&#xff0c;如果是同步发送会阻塞&#xff0c;如果是异…...

机器学习笔记 计算机视觉中的测距任务常见技术路线

一、计算机视觉中的测距任务 测距是计算机视觉中的一项关键任务,涉及测量物体和相机之间的距离。这些信息可用于多种应用,包括机器人、自动驾驶汽车和增强现实。测距技术有很多种,包括主动式和被动式,每种技术都有自己的优点和局限性。主动测距技术,例如飞行时间、结构光和…...

云计算 3月8号 (wordpress的搭建)

项目wordpress 实验目的&#xff1a; 熟悉yum和编译安装操作 锻炼关联性思维&#xff0c;便于以后做项目 nginx 编译安装 1、安装源码包 [rootlinux-server ~]# yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel [rootlinux-server ~]# wget http://nginx.…...

【CSS】(浮动定位)易忘知识点汇总

浮动特性 加了浮动之后的元素,会具有很多特性,需要我们掌握的. 1、浮动元素会脱离标准流(脱标&#xff1a;浮动的盒子不再保留原先的位置) 2、浮动的元素会一行内显示并且元素顶部对齐 注意&#xff1a; 浮动的元素是互相贴靠在一起的&#xff08;不会有缝隙&#xff09;&…...

Vitual Box虚拟机打开后,键盘鼠标失效

Vitual Box虚拟机打开后&#xff0c;键盘鼠标失效 作者在使用Vitual Box虚拟机软件时&#xff0c;偶然发现打开VitualBox后&#xff0c;鼠标和键盘均无法使用。 你以为是“主机热键”引起的&#xff1f;NO&#xff01; 废话少说 直接上干货&#xff1a; 在VitualBox设置下有…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...