自动驾驶入门:控制

news2025/8/7 13:15:29

目录

概念

控制流程

PID控制

PID 的优劣势

LQR 线性二次调节器

模型控制预测

总结


概念

控制是驱使车辆前行的策略。对于汽车而言,最基本的控制输入为转向、加速和制动。通常,控制器使用一系列路径点来接收轨迹。

控制器的任务是使用控制输入让车辆通过这些路径点。

首先,控制器必须准确,这意味着它应避免偏离目标轨迹。这对于安全来说,尤为重要。即使路 面潮湿或者道路比较陡峭,控制器任需要准确地执行轨迹。其次,控制策略对汽车应该具备可 行 性。例如,如果你的汽车向北行驶,而你希望它立即向东转。你可以在游戏中做到这一点,但在现实中无法实现。最后,需要考虑的是平稳度。舒适的驾驶非常重要。如果车辆行驶得不规律,那乘客永远不会想再次乘坐它了。要使控制顺利进行,驱动必须是连续的。这意味着你应避免突然转向、加速或制动。

总之,我们的目标是使用可行的控制输入,最大限度地降低与目标轨迹的偏差、最大限度地提供 乘客的舒适度。有三种可用于实现这些目标的控制策略:比例积分微分控制(或PID)线性二次调节器(或LQR)模型预测控制(或MPC)

控制流程

控制器预计有两种输⼊:⽬标轨迹 与⻋辆状态

⽬标轨迹来⾃规划模块,在每个轨迹点,规划模块指定⼀个位置和参考速度。在每个时间戳都对轨迹进⾏更新。我们还需要了解⻋辆状态,⻋辆状态包括:通过本地化模块来计算的⻋辆位置、从⻋辆内部传感器获取的数据(如速度、转向和加速度)。我们使⽤这两个输⼊来计算⽬标轨迹与实际⾏进轨迹之间的偏差。

控制器的输出是控制输⼊(转向、加速和制动)的值。当偏离⽬标轨迹时,我们希望采取⾏动来 纠正这种偏差。对于普通汽⻋,我们使⽤⽅向盘控制⾏驶⽅向(即转向)、使⽤油⻔加速、使⽤ 刹⻋减速(即制动)。这也是⽆⼈驾驶汽⻋所做的。⼀旦将这三个值传递给⻋辆,汽⻋实际上已 经开始⽆⼈驾驶了。

PID控制

⾸先介绍的算法为PID控制,这个控制器的优点在于它⾮常简单,只需要知道与⽬标轨迹有多⼤ 的偏离。PID的第⼀组件为P代表⽐例(Proportional)。设想⼀辆⻋正试图遵循⽬标轨迹,P控 制器在⻋辆开始偏离时⽴即将其拉回⽬标轨迹。⽐例控制意味着,⻋辆偏离越远,控制器越难将 其拉回⽬标轨迹。

在实践中P控制器的一个问题在于,它很容易超出参考轨迹。当车辆越来越接近目标轨迹时,我 们 需 要 控 制 器 更 加 稳 定 。 PID 控 制 器 中 的 D 项 致 力 于 使 运 动 处 于 稳 定 状 态 , D 代 表 “ 微 分”(Derivative)。PD控制器类似于P控制器,它增加了一个阻尼项,可最大限度地减少控制 器输出的变化速度。

PID控制器中的最后一项I代表积分(Integral),该项负责纠正车辆的任何系统性偏差。例如, 转向可能失准,这可能造成恒定的转向偏移。在这种情况下,我们需要稍微向一侧转向以保持直 行。为解决这一问题,控制器会对系统的累积误差进行惩罚。我们可以将P、I和D组件结合构成PID控制器。

PID 的优劣势

PID控制器很简单,但它在很多情况下的效果很好。对于PID控制器,你只需要知道你的车辆与 目标轨迹之间的偏差。但是PID控制器只是一种线性算法,对于非常复杂的系统而言,这是不够的。例如,为控制具有多个关节的四轴飞行器或机器人,我们需要建立机器人的物理模型。

对无人驾驶而言,我们需要应用不同的PID控制器来控制转向和加速,这意味着很难将横向和纵向控制结合起来。另一个问题在于PID控制器依赖于实时误差测量,这意味着受到测量延迟限制时可能会失效。

LQR 线性二次调节器

它使用车辆的状态来使误差最小化。Apollo使用LQR进行横向控制。横向控制包含四个组件:横向误差、 横向误差的变化率、朝向误差和朝向误差的变化率。变化率与导数相同,我们用变量名上面的一个点来代表。我们称这四个组件的集合为X,这个集合X捕获车辆的状态。除了状态之外,该车有三个控制输入:转向、加速和制动。我们将这个控制输入集合称为U

LQR 处 理 线 性 控 制 , 这 种 类 型 的 模 型 可 以 用 等 式 来 表 示 ( 详 见 下 图 ) 。 x ( 上 方 带 点 )=Ax+Bu,x(上方带点)向量是导数,或X向量的变化率。所以x点的每个分量只是x对应分量 的导数。等式x点=Ax+Bu,该等式捕捉状态里的变化,即x点是如何受当前状态 x 和控制输入u 的影响的。

这个等式是线性的,因为我们用∆x来改变x时,并用∆u来改变u。x点的变化也会让这个等式成 立(见下图等式)。现在我们了解了LQR中的L。

接下来我们学习LQR中的Q。这里的目标是为了让误差最小化,但我们也希望尽可能少地使用控 制输入。由于使用这些会有成本,例如:耗费气体或电力。为了尽量减少这些因素,我们可以保 持误差的运行总和和控制输入的运行总和。当车往右转的特别厉害之际,添加到误差总和中。当 控制输入将汽车往左侧转时,从控制输入总和中减去一点。然而,这种方法会导致问题。因为右 侧的正误差只需将左侧的负误差消除即可。对控制输入来说也是如此。相反,我们可以让x和u与 自身相乘,这样负值也会产生正平方,我们称这些为二次项。我们为这些项分配权重,并将它们加在一起。

最优的u应该最小化二次项的和随时间的积分。在数学中我们将这个积分值称为成本函数(形式见下图)。我们经常以紧凑的矩阵形式表示加权二次项的总和。

这里的Q和R代表x和u的权重集合。xT和uT是转置矩阵,这意味着它们几乎与x和u相同,只是重 新排列以便矩阵相乘。x乘以xT,u乘以uT,实质上是将每个矩阵乘以它自己。最小化成本函数 是一个复杂的过程,但通常我们可以依靠数值计算器为我们找到解决方案。Apollo就提供了一 个这样的求解方案。在LQR中,控制方法被描述为u=-Kx。其中,K代表一个复杂的skeme,代 表如何从x计算出u。所以找到一个最优的u就是找到一个最优的K。许多工具都可以轻松地用来解决K,尤其当你提供了模拟车辆物理特征的A、B,以及x和u的权重Q、R。

模型控制预测

模型预测控制(或MPC)是一种更复杂的控制器,它非常依赖于数学优化,但基本上可以将 MPC归结为三个步骤:1、建立车辆模型。2、使用优化引擎计算有限时间范围内的控制输入。 3、执行第一组控制输入。MPC是一个重复过程,它着眼未来,计算一系列控制输入,并优化该 序列。但控制器实际上只实现了序列中的第一组控制输入,然后控制器再次重复该循环。为什么我们不执行整个控制输入序列呢?那是因为我们只采用了近似测量与计算。如果实现了整个控制 输入序列,实际产生的车辆状态与我们的模型有很大差异,最好在每个时间步不断地重新评估控制输入的最优序列。

MPC的第一步为定义车辆模型,该模型近似于汽车的物理特性,该模型估计了假如将一组控制输入应用于车辆时会发生什么。接下来,我们决定MPC预测未来的能力。预测越深入,控制器就越精确,不过需要的时间也越长。所以,我们需要在准确度与快速获取结果之间做出取舍。获取结果的速度越快,越能快速地将控制输入应用到实际车辆中。

下一步是将模型发送到搜索最佳控制输入的优化引擎。该优化引擎的工作原理是通过搜索密集数学空间来寻求最佳解决方案。为缩小搜索范围,优化引擎依赖于车辆模型的约束条件。

优化引擎可间接评估控制输入,它通过使用以下方法对车辆轨迹进行建模:通过成本函数对轨迹 进行评估。成本函数主要基于与目标轨迹的偏差;其次,基于其他因素,如加速度和提升旅客舒适度的措施。

为使乘客感觉更舒适,对控制输入的调整应该很小。因为动作变化幅度过大会让乘客感到不舒服。根据具体情况,我们可能需要为其考虑进一步的成本,并设计成本函数。模型、约束和成本函数合并在一起,并作为优化问题加以解决。我们可以在不同的优化引擎中,选择一种来寻找最佳解决方案。

总结

控制实际上是无人驾驶汽车实现自动移动的方式。在控制中,我们使用转向、加速和制动来运行我们的目标轨迹。我们研究了几种不同类型的控制器。PID控制是一种简单而强大的控制算法,线性二次调节器和模型预测控制是另外两种类型的控制器,它们更复杂,但也更强大、更准确。Apollo支持所有这三种控制器,而你也可以选择最适合自己的控制器!

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

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

相关文章

Flask微服务注册到Nacos

目录一、前言二、手写实现Flask注册到Nacos1. 服务注册2. 心跳检测三、使用nacos-sdk-python完成注册四、SpringBoot远程调用1. 添加 Python 端业务逻辑2. SpringBoot 的远程调用五、SpringGateway网关转发一、前言 最近有一个使用 SpringCloud 的微服务项目,需要使…

[附源码]java毕业设计面向服装集群企业的个性化定制服务系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C++ 异常处理 重新throw变量时的事件

直接说结论:throw的表达式创建出来的变量会被拷贝下来【通过拷贝构造函数,后面会证实这一点,且是放在堆里的】,然后沿着调用路径去搜索最近匹配异常的catch语句,在沿途,传递给catch语句的是堆中的异常变量的…

2022年数维杯国际大学生数学建模挑战赛D题三重拉尼娜事件下极端气候灾害损失评估与应对策略研究解题过程

2022年数维杯国际大学生数学建模挑战赛 D题 三重拉尼娜事件下极端气候灾害损失评估与应对策略研究 原题再现: 2022年7月至8月,中国南方许多城市经历了多天的炎热天气,而北方部分地区也出现了大面积强降水。此外,许多欧洲国家也经…

GEE开发之Modis_NDVI数据分析获取大总结

GEE开发之Modis_NDVI数据分析获取大总结0. 之前的博客链接1. MYD13Q1(250米/16天)2. MOD09GA_006_NDVI(500米/1天)3. MOD13Q1(250米/16天)4. MOD13A1(500米/16天)5. MOD13A2(1000米/16天)6. 日数据下载(以MYD13Q1为例子)7. 月数据下载(以MYD13Q1为例子)7.1 代码一7.2 代码二&am…

博途1200PLC轴控功能块(脉冲轴)

1200选择晶体管输出的型号,本体支持脉冲发送,利用工艺对象可以组态脉冲轴。利用1200和1500PN总线可以进行总线伺服的控制,具体请参看下面的博客: 博途1200/1500PLC V90 PN通信控制 (FB284功能块)_RXXW_Dor的博客-CSDN博客_fb284功能块先简单说下如何获取FB284,一般有2种方…

redirs非关系型数据库使用

非关系型数据库是将不经常使用的数据保存到redis缓存中,当前端访问redis缓存数据,如果没有查到该数据,则从数据库中查询,并将数据缓存到redis里。 数据结构介绍: redis的存储主要是key,value的数据格式,其…

Node.js 是如何做 GC (垃圾回收)的?

大家好,我是前端西瓜哥。今天我们来研究一下 Node.js 是如何做 GC 的。 GC,Garbage Collection,垃圾回收。在编程中,一般指的是内存自动回收机制,会定时将不需要用到的数据进行清除。 Node.js 底层使用了 V8 引擎。V…

Android入门第31天-Android里的ViewFlipper翻转视图的使用

介绍 本篇给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放! 和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和ViewPager一样,很多时候&…

Vivado在Linux下的安装与运行

一. Vivado安装步骤 下载解压安装包后,并进入安装包路径运行终端 cd Downloads/Xilinx_Vivado_SDK_2017.4运行 sudo apt install libncurses5 安装ncurses库 sudo apt install libncurses5 运行 sudo chmod x setup 添加可执行权限 sudo chmod x setup运行 sudo .…

PHP反序列化漏洞解析

序列化 所谓序列化就是将原数据对象转换为具有一定格式的数据 举一个最简单的例子,在C中,若要开发一个数据库,那么一定涉及到数据的存储,要将内存中的数据持久化的保存在磁盘中,这就要对数据的存储格式进行优化&…

[附源码]java毕业设计企业信息网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

网关及其分类

1. 介绍 大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的…

深度探究多线程的效率以及多线程的使用建议

随着时代发展,电脑的核心数慢慢增多,在开发程序的过程中,是否选择使用多线程这是个比较大的问题,下面我通过一个程序去深入理解多线程对程序速度的影响到底有多大 计算亿级别个数的累加和: 单线程模型运行程序&#…

SNMP(二)

♥️作者:小刘在C站 ♥️每天分享云计算网络运维课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 一.SNMP是什么 二.SolarWinds 网管软件使用 步骤1 步骤2 步骤3 步骤4 三.SNMP命令…

使用go pprof进行golang程序内存分析

引言 日常项目,有时会出现oom的情况,这时候我们光依靠code review进行问题定位是很困难的。这里我们需要一个排查工具,来定位是哪里的代码导致内存溢出的,这个工具就是pprof前提 如果是非http(s)服务类的,需要在代码…

基于PHP+MySQL的宠物领养救助社交网站

当前很多的宠物被抛弃和虐杀,它们没有选择权,我们强制性的把狗带进人类的生活中,然后又无情的抛弃,让它们无家可归,变成流浪狗,它们做错了什么?流浪动物被主人遗弃之后居无定所,时刻面对着严寒、酷暑、生病、死亡,饥饿、等一系列威胁它们生命的存在为了能够让这些。…

BlenderGIS插件 城市建筑3D模型自动生成 教程

目录 一、下载Blender和BlenderGIS 二、解决 No imaging library...报错 三、生成城市3D模型 四、导出模型 本文所需文件可在如下链接下载,或者直接按照博文下载步骤下载 https://download.csdn.net/download/ChaoChao66666/87071901?spm1001.2014.3001.550…

Node的Web编程

一、node的事件处理 1、node采用的事件驱动模式来进行事件处理的:只有当事件被触发时才执行相关程序 2、node是单线程运行的:采用事件轮询方式,不断的查询事件队列中的消息,然后根据消息执行对应的回调函数 3、node事件机制中的…

ASEMI代理艾赛斯DSP25-12A,整流二极管DSP25-12A

编辑-Z 艾赛斯整流二极管DSP25-12A参数: 型号:DSP25-12A 最大重复反向阻断电压(VRRM):1200V 反向电流、漏极电流(IR):40uA 正向电压降(VF):1…