规划控制如何兼顾安全与舒适性

news2024/12/22 22:42:39

规划控制如何兼顾安全与舒适性

image

附赠自动驾驶学习资料和量产经验:链接

**导读:**自动驾驶技术研发对于“安全第一”的追求是毋庸置疑的,但是这中间可能就忽视了舒适性。

因此,今天我想给大家分享的是,自动驾驶研发如何在兼顾安全性的同时,保证乘客体验的舒适。往细一点说,就是如何通过优化算法在规划和控制模块中找到安全性和舒适性的平衡点。

image

安全性和舒适性的定义

image

安全性的定义其实比较好理解,一般包括不发生碰撞和遵守交通规则(交通灯、停车标志、限速)。

而舒适性则受下面两个指标影响:

  • Jerk,即加速度的变化率。当加速度的变化越小,乘客体感越舒适。

  • Curvature rate,即曲率变化率。当曲率的变化率越小,乘客体感越舒适。

在二者的定义基础上,“安全舒适两不误”也就意味着在遵守交规且不发生碰撞的基础上,控制好行驶时的加加速度和行进路线的曲率变化率

image

规划和控制的定义

规划(Planning)和控制(Control)是自动驾驶最底层的部分,决定了车在路上如何行使

一般来说,规划所需要的输入(Input)信息包括:地图信息,起点终点,障碍物预判,交通标志以及感知信息,即周围的物体位置、大小、速度、方向等。

借助这些输入信息,规划模块可以输出(Output)一段时间的行驶轨迹(Trajectory),即某一个时间无人车行驶到到某个位置的函数(Xt~Yt)。

而规划输出的轨迹正好是控制(Control)模块的两项输入之一,另一项输入是车辆自身的状态,包括车的位置、heading(行驶朝向)、速度、加速度、角速度等信息。

而控制模块会输出以下两类信息:

  • Brake/throttle pedal,刹车和油门

  • Steering angle,转向角

简单来说,控制的目的是让自动驾驶车能够精准实现规划模块给出的行驶指令。

image

上面就是规划和控制的简单定义。当然,这里我也留下一个思考(上图标灰的地方):对于规划模块而言,是否必须知道车辆的实时位置信息?

答案是,有无都是可以。规划和控制模块都能有相对应的做法和方案。

image

规划上,如何实现安全性和舒适性?

安全性

前面已经说到,规划(Planning)为的是输出一个trajectory(时间到位置的函数):X(t)=(x(t),y(t))T,而这个行驶路径需要同时保证安全性和舒适性。

实际上,规划(Planning)是一个优化问题。对于一个优化问题来说,我们需要通过设计 constraints (约束条件) 来保证行驶安全。

image

上图里列举了一些最基本的约束条件。

首先,规划模块不能忽略车的物理特性,比如方向盘的最大角度,对应的就是曲率的最大值、最小值等。

其次,明确车辆刹车和油门的极限,这对应的就是加速度的极限。

第三,当自动驾驶车在道路上行驶时,为了不出现压线的情况,车到左右boundary(车道线)的距离也需要纳入规划中。

第四,自动驾驶肯定不希望车辆发生任何碰撞。我们可以通过取车轴上一系列等半径的圆来覆盖车身,并采用若干个凸的多边形表示车身周围的物体,那么,当车轴上所有的圆心到凸多边形的距离大于半径时,自动驾驶车就不会与凸多边形(障碍物)发生碰撞。

舒适性

介绍完安全性,下面介绍规划模块是如何实现驾驶的舒适性。前面提到过,舒适性越高,意味着加速度变化率越小,以及曲率的变化率越小。那么对应的cost function(代价函数)就比较好设定了,即加速度+加速度变化率+曲率+曲率的变化率。

image

虽然整个模型设计起来比较简单,但是constraints(约束条件)和cost function(代价函数)的求解却比较复杂(如上图),尤其是系统实时求解k(t)和k(t)’的耗时会比较长,解起来也比较难。这时候我们可以换个思路,把问题转换下。

前面也提过,规划问题其实是为了解出一个时间到位置的函数,而L4级自动驾驶车一般会行驶在结构化的道路上,这也意味着规划模块具备地图的信息,那么问题就可以进行转化——把(x,y)坐标系转化为下图的(l,s)坐标系。

image

s沿着道路中线(reference line)的方向,l则是垂直于道路中线的方向。于是,问题就转化成了求解s(t)和l(s)的问题,我们希望得出,自动驾驶车在t时刻应该走到s上的哪个位置;以及走在这个位置时,该车距离s的左右偏离是多大。

最终,一个复杂问题就转化成三个子优化问题:一个横向优化、纵向优化以及中线问题(s方向是车辆的纵向规划,l方向为横向规划)

接下来我想仔细说一说这三个子问题。

子问题一:横向优化

image

上图中右侧展示了一条路,中间的线是reference line(参考线),其中“0”点就是车当前所在的位置,“-1”,“-2”是车之前的坐标位置,接下来的“1,2,3,4”……就是规划模块的输出结果,也就是车未来的位置。

这条路的左右两边是boundary(道路边界/车道线),图中的半圆对应着路面上的障碍物。横向规划求解的是正是每一点的l坐标,也就是到中心线的偏离量。

对于横向优化问题,我们同样可以从安全性和舒适性两方面考虑。

安全性方面,取决于横向优化问题的constraints(约束条件),一般要求l不能太小,也不能太大,即不能压左边线,也不能压右边线,同时不能碰到左右两边的障碍物。

舒适性方面,我们则设计成cost function(代价函数),一般要求路线的曲率越小越好,曲率变化率越小越好。如果我们的参考线是一条完美的参考线,那么曲率就可以用一个相对曲率来表示。

对于一个优化问题来说,cost function(代价函数)变成了标准的二次函数,同时,所有的constraints(约束条件)都是一次的。

那么,这就成了一个标准的QP(Quadratic programming,二次规划)问题,不仅如此,这还是一个box constraint(闭箱约束)的QP问题,我们就能够非常快速求出优化的结果。

子问题二:纵向优化

纵向优化求解的则是t到s的函数。

image

对于纵向规划的来说,安全性要求我们保证车辆不能发生前后方向上的碰撞。以上图右侧为例,此时有个行人正在过马路,规划模块会将行人的行为可以转换成(t,s)坐标,展示在坐标图里(上图)是一个平行四边形。

此时,面对这个行人,如果自动驾驶车选择让路,纵向规划解出来的曲线就应该在平行四边形的下方;如果选择超过这个行人,那么这条曲线应该从上面绕过去。

在纵向规划上,舒适性体现在加速度越小越好,以及加速度的导数越小越好。可见,纵向和横向规划涉及的constraints(约束条件)和 cost function(代价函数)都非常相似。

子问题三:中线生成

同样,中线的生成也是一个优化问题,自然也会涉及到constraints(约束条件)和cost function(代价函数)。

image

中线设定的约束条件首先是不能压边界(车道线),同时要符合曲率的限制。对于cost function(代价函数)来说,希望达到的目标是中线的曲率越小越好,曲率的变化率越小越好。这样来看,中线问题也是求解k(t)和k(t)’的函数问题。

问题似乎又绕回去了,为了舒适性,我们还是需要求解非常复杂的方程吗?

并不是。由于中线是可以离线生成的,所以不需要在线计算,这些问题能放在服务器中进行并行的计算。

这里,我想增加一个值得思考的问题。前面提到,生成中线的前提是具备道路的信息,即道路左右的boundary(车道线边界)。然而当自动驾驶车处在一个路口内,路面并没有车道线,这种环境下应该如何处理参考线呢?欢迎大家留言探讨。

image

控制上,如何实现安全性和舒适性

毕竟自动驾驶控制的是一辆车,而不是一个点,所以在详细介绍自动驾驶控制模块之前,我想先介绍一个模型。

Bicycle model (自行车模型)

控制的模型有很多,而且非常复杂,需要考虑车辆的很多因素,包括引擎,变速箱,轮胎,悬架等等。为了讲好这个问题,我先给大家介绍一个最简单的模型Bicycle model(自行车模型)。

image

首先,假设自动驾驶车辆的车宽为0,可以想象成是两个前轮靠在一起,两个后轮靠在一起(上图)。

这个假设就意味着前轮的转角和转速都是一致的,当然现实中车辆的四个轮子的转角和转速都是不一样的,所以这个模型只是在做一个最简单的假设。基于这个假设,当得知前轮转角转了δ时,我们也可以通过几何关系算出后轴的转弯半径是多大。

前面把车假设成了“自行车”,下图展示了它的行驶轨迹,那么,哪一条是前轮的,哪一条是后轮的?车是往左边行驶还是右边行驶?

image

首先,基于自行车模型的假设,后轮的侧向速度为0,所以后轮永远都是朝向前轮行驶的,在红线上画一条切线,会发现它没有穿过蓝线,所以它不是后轮。在蓝线画一条切线,它穿越了红线,因此蓝线是后轮的轨迹。

车往那边走呢?我们继续在蓝线上画一条切线,这条切线和这条红线还是有两个交点。实际上,交点和切点的距离就是车的轴距,并且由于轴距是固定的,所以这辆行驶的车就如图中黑线所示。这个问题的答案是:红线代表前轮,蓝线代表后轮,以及它是向右行驶的。

image

总结来说,对于只有两个轴并且通过前轮转向的车辆,一般可以转换成Bicycle model(自行车模型)。但在真实路上行驶的往往不只是小汽车,比如还有货车,而货车可以分为两个部分,车头与后挂。

对于货车的控制,如果还是采用自行车模型进行假设(上图),则A1是车头,A2是挂车,F1为车头的前轴,R2认为是挂车的后轴。在这个模型中,我们认为挂车的前轴和车头的后轴是同一个点R1=F2,车头的轴距是L1,挂车的轴距是L2,当得知车头的前轴转了ϕ角度时,控制模块可以得到车头后轴的转弯半径。

那么,挂车的后轴轨迹会呈现出一条什么样的曲线?这个问题也欢迎大家留言讨论,毕竟现实生活中,路面上不止有一种车,自动驾驶从业者可以多思考下,各类车型的运动行为应该是什么样的。

横向控制(Lateral Control)

image

上图中紫色曲线是Planning(规划模块)输出的目标轨迹,图中的蓝点是自动驾驶车此刻的位置,蓝色的箭头是车现在的行驶方向。

可以看到,自动驾驶车辆与规划轨迹存在一个侧向的偏差,因此横向控制的目标就是使车辆实际轨迹和目标轨迹的侧向偏差越小越好,同时车在某个时刻的heading(朝向)与规划轨迹曲线对应点朝向的误差越小越好。

预瞄算法就是横向规划中常用的一种:首先会选定一个预瞄点,横向控制的目标就是到预瞄点时,侧向误差和heading(朝向)的与目标轨迹的误差越小越好。这里的控制变量就是刚才说的曲率,所以横向控制又转化为了一个优化问题。

纵向控制(Longitudinal Control)

同样的,在纵向控制上,我们也可以选一个预瞄点,希望达到的目标是自动驾驶车速(v)与规划轨迹的误差越小越好,位移(s)与规划轨迹的误差越小越好,于是纵向控制也可转为优化问题。

总结来看,不管是对于Planning(规划)还是Control(控制),最终都可以转化为优化问题。

自动驾驶规划模块对舒适性和安全性的探索,重点就在于设计优化问题中的constraints(约束条件)和cost function(代价函数)。

而控制模块则在于预瞄点的选择,控制模块最终的目标就是自动驾驶车更精准地跟随规划轨迹,当预瞄距离越近,控制就越精准,当预瞄距离越远,控制量更加smooth(平滑),体感可能更加舒适,但误差可能越大。

最终,我们都能坐上既安全又舒适的自动驾驶车。今天的分享就到这里,谢谢大家。

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

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

相关文章

探究ThreadLocal的魔数0x61c88647和Entry数组

探究ThreadLocal 下面有一个很重要的HASH_INCREMENT,他的值是0x61c88647 public class ThreadLocal<T> {/***ThreadLocals依赖于附加到每个线程的每线程线性探针哈希映射 (thread.threadLocals和inheritableThreadLocals)。ThreadLocal对象充当键&#xff0c;通过threa…

uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…

Java使用数组实现栈、队列、堆

数组模拟栈&#xff1a; const int N 10010; // ******************** 栈 int stk[N], tt//tt是下标; // 插入 stk[k] x; // 删除 tt--; // 判断栈是否为空 if (tt > 0) not empty else empty // 栈顶 stk[tt]; // ******************** 队列 // 在队尾插入…

可视化图表:关系图,一图分清父子兄弟关系。

Hi&#xff0c;我是贝格前端工场的老司机&#xff0c;本文分享可视化图表设计的关系图设计&#xff0c;欢迎老铁持续关注我们。 在现代信息爆炸的时代&#xff0c;我们需要从庞大的数据中提取有用的信息和洞察。而可视化图表作为数据分析和展示的重要工具之一&#xff0c;被广泛…

《新机器智能》的深度解读与感悟

《新机器智能》的深度解读与感悟 引言[1] 脑科学对于人工智能研发的意义[2] 新皮质建立了世界模型[3] 记忆-预测模型[4] 记忆-预测模型是如何工作的[5] 意识与创造力[6] 智能的未来1.我们能创造人工智能吗&#xff1f;2.我们应该制造智能机器吗&#xff1f;3.智能机器能做些什么…

Node Sass does not yet support your current environment

项目运行时报错&#xff1a;Node Sass does not yet support your current environment 原因是node版本过高。 解决办法&#xff1a; 使用nvm管理node版本&#xff0c;&#xff08;如何安装nvm&#xff1f;请点击跳转&#xff09; 具体步骤如下&#xff1a; 1.查看当前node…

C++中使用虚函数实现多态

虚函数是C中用于实现多态&#xff08;Polymorphism&#xff09;的重要特性。下面是关于虚函数的讲解和代码示例&#xff1a;### 虚函数的定义&#xff1a; 虚函数是在基类中声明为 virtual 的成员函数。 在派生类中重写&#xff08;override&#xff09;这个虚函数&#xff0c;…

Python编码和字符操作

编码和字符操作 .你觉得&#xff0c;迷茫的反义词是什么&#xff1f;有些人可能会说是坚定&#xff0c;但还有另一种说法&#xff1a;迷茫的反义词是具体。当你从一件件具体的事开始着手&#xff0c;焦虑就会一点点退去。——《夜读》 编码操作 UTF8编码 当谈到字符编码时&am…

酷得单片机方案 2.4G儿童遥控漂移车

电子方案开发定制&#xff0c;我们是专业的 东莞酷得智能单片机方案之2.4G遥控玩具童车具有以下比较有特色的特点&#xff1a; 1、内置充电电池&#xff1a;这款小车配备了可充电的电池&#xff0c;无需频繁更换电池&#xff0c;既环保又方便。充电方式可能为USB充电或者专用…

重新温习广软puthon爬虫技术。

下面是我不断试错的一个过程&#xff0c;好多知识点全忘记了&#xff0c;只能不断调实例&#xff0c;不断优化&#xff0c;重构&#xff0c;实现自己的需求。下面是我的运行截图。还是导包的问题。 个人感觉关键的还是这几部&#xff0c;被划了下划线的&#xff0c;存在问题&a…

通知中心架构:打造高效沟通平台,提升信息传递效率

随着信息技术的快速发展&#xff0c;通知中心架构作为一种关键的沟通工具&#xff0c;正逐渐成为各类应用和系统中必不可少的组成部分。本文将深入探讨通知中心架构的意义、设计原则以及在实际场景中的应用。 ### 什么是通知中心架构&#xff1f; 通知中心架构是指通过集中管…

MySQL - 高阶语句(一)

先准备一张表 create table class1 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));insert into class1 values(1,liuyi,80,beijing,2); insert into class1 values(2,wangwu,90,shengzheng,2); insert into class1 …

Linux通过进程组和会话理解守护进程---代码实现一个服务进程

进程组和会话 这一个课程的笔记 概念和特性 进程组 也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念&#xff0c;是为了简化对多个进…

酒店管理系统项目用例图及用例说明

1、系统功能模块图 2、部分系统功能模块说明 &#xff08;1&#xff09;查询房间剩余 模块名称&#xff1a;管理员登录 编号&#xff1a;1-1 主要功能&#xff1a;验证管理员登录用户名及密码 上级调用模块&#xff1a;无 下级调用模块&#xff1a; 约束&#xff1a; &a…

c语言-static

static作用&#xff1a;修饰变量和函数 修饰局部变量-静态局部变量 static未修饰局部变量 #include <stdio.h>void print() {int a 0;a;printf("%d ", a); }int main() {int i 0;for (i 0; i < 10; i){print();}return 0; }运行结果 static修饰局部变…

c++基础学习第八天(stl)

c基础学习第八天&#xff08;stl&#xff09; 文章目录 2.2、 vector容器2.2.1、 vector基本概念2.2.2、 vector构造函数2.2.3、 vector赋值操作2.2.4、 vector容量和大小2.2.5、 vector插入和删除2.2.6、 vector数据存取2.2.7、 vector互换容器2.2.8、 vector预留空间 2.3、 d…

适用于 Linux 的 Windows 子系统安装初体验

1、简述 Windows Subsystem for Linux (WSL) 是 Windows 的一项功能&#xff0c;允许您在 Windows 计算机上运行 Linux 环境&#xff0c;而无需单独的虚拟机或双重启动。 WSL 旨在为想要同时使用 Windows 和 Linux 的开发人员提供无缝且高效的体验。 使用 WSL 安装和运行各种 L…

5G无线接入网和接口协议

**部分笔记** 4.3无线协议架构 NR无线协议分为两个平面&#xff1a;用户面和控制面。 用户面&#xff08;UP&#xff09;:协议栈及用户数据采用的协议 控制面(Control Plane&#xff0c;CP)协议栈即系统的控制信令传输采用的协议簇。 虚线标注的是信令数据的流向。一个UE在…

权限提升-Linux系统权限提升篇VulnhubPATH变量NFS服务Cron任务配合SUID

知识点 1、Web或普通用户到Linux-服务安全配合SUID-NFS 2、普通用户到Linux-环境变量配合SUID-$PATH 3、Web或普通用户到Linux-计划任务权限不当-Cron 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 …

DBeaver Ultimate Edtion 24 for Linux deb (sysin) - 通用数据库工具

DBeaver Ultimate Edtion 24 for Linux deb (sysin) - 通用数据库工具 One tool for all data sources 请访问原文链接&#xff1a;https://sysin.org/blog/dbeaver-linux/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 通用…