Apollo9.0 PNC源码学习之Control模块(六)—— 百度Apollo控制前置知识

本文主要整理了B站大佬老王的控制讲解,看完本文,你会对控制模块有一个全新的认识

1 三个坐标系与运动学方程

throttle/brake => 力 => 加速度 => 速度 => 位置(纵向控制)
方向盘 => 前轮转角 => 横向位移/航向角(横向控制)

1.1 三个坐标系

在这里插入图片描述

X-Y:大地坐标系
x-y:车身坐标系
τ-n:Frenet坐标系

Frenet坐标系优点:把横向控制和纵向控制解耦,减少计算量
车身坐标系与自然坐标系转换会难一些

1.2 自行车模型的运动学方程

在这里插入图片描述
一般后轮不转向,在低速条件下,认为 δ r = 0 \delta_r=0 δr=0 β = 0 \beta=0 β=0,建立运动学方程:
X ˙ = v cos ⁡ φ Y ˙ = v sin ⁡ φ φ ˙ = v tan ⁡ δ f L \begin{array}{l} \dot{X}=v \cos \varphi \\ \dot{Y}=v \sin \varphi \\ \dot{\varphi}=\frac{v \tan \delta_f}{L} \end{array} X˙=vcosφY˙=vsinφφ˙=Lvtanδf

运动学模型适用于低速转弯半径大的情况,简化过多,高速情况不适用

考虑道路几何: t a n δ = L R tan\delta = \frac{L}{R} tanδ=RL

2 车辆动力学方程

动力学方程:考虑轮胎特性
在这里插入图片描述

考虑轮胎侧偏特性的自行车模型
在这里插入图片描述
注意 α f , α r \alpha_f,\alpha_r αf,αrαr都是负的,根据受力分析得到:
在这里插入图片描述假设 δ \delta δ比较小,有 c o s δ ≈ 1 cos\delta≈1 cosδ1,L为轴距,约等于3m;R为转弯半径,一般8-12m;
a y a_y ay与y的关系:
v y = y ˙ a y = y ¨ + v x φ ˙ v_{y}=\dot{y} \\ \quad a_{y}=\ddot{y}+v_{x} \dot{\varphi} vy=y˙ay=y¨+vxφ˙
在这里插入图片描述即可得到状态空间方程

3 坐标变换与横向误差微分方程

控制的目标:汽车当前状态和规划的状态接近(误差尽可能最小)
规划:
在这里插入图片描述
误差 = 真实的 - 规划的
在这里插入图片描述
定义代价函数
在这里插入图片描述
根据投影法定义5个误差,将速度v在自然坐标系下投影到规划的位置的切向与法向得到 s ˙ \dot{s} s˙和d
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
得到误差线性微分方程
在这里插入图片描述

三个问题:

  • 缺少质心侧偏角
  • 如何计算最后一项
  • 去掉最后一项小尾巴可以用LQR计算,加上后怎么控制

4 连续方程的离散化与离散LQR原理

(1)离散化(2)求解优化问题

4.1 离散化模型

离散化:可以使用向前欧拉法或者中点欧拉法,apollo是两者的混合
在这里插入图片描述

4.2 求解LQR

在这里插入图片描述
先让J从0计算到n,然后再让n趋于无穷。这里拆分成0到n-1和第n项。(这一步我的理解是,因为要推导出第n和n-1步之间的递推关系,所以要这么分解)
在这里插入图片描述
写出约束
在这里插入图片描述约束刚好完全覆盖自变量,如果把第n个约束添加进去,会多加一项 x n + 1 x_{n+1} xn+1
在这里插入图片描述
使用拉格朗日乘子法,把J写成
在这里插入图片描述
在这里插入图片描述
分别对自变量求导得到
在这里插入图片描述
再把刚才化简得Hk求偏导带入上面的式子中
在这里插入图片描述
得到以下式子(注意这里笔误:这里③式k是从0开始),一共是3n-2个式子
在这里插入图片描述下面基于上式求出递推式
在这里插入图片描述
将⑧与④进行对比
在这里插入图片描述
在这里插入图片描述
得到 P n = Q P_n=Q Pn=Q以及 P k − 1 P_{k-1} Pk1的表达式:
在这里插入图片描述
基于这两个式子,可以以 P n = Q P_n=Q Pn=Q为初始值,一直从k=n推导到k=0
在这里插入图片描述
在这里插入图片描述
注意这里的 x k x_k xk,一般可以用误差来表示,根据上面对状态空间方程的定义有 x k = e r r x_k=e_{rr} xk=err
err可以通过定位和规划得到:
在这里插入图片描述
所以 u k u_k uk可以由已知量算出

4.3 黎卡缇方程

对于黎卡缇方程,如果n区域无穷大,那么黎卡缇方程要迭代无数次,但是实际情况是 P k P_k Pk迭代几十次后就会收敛,即从 P k P_k Pk一直到 P 0 P_0 P0均相等,这个性质非常好,可以帮助我们处理无穷时间
在这里插入图片描述
在这里插入图片描述解黎卡缇方程的步骤为先给P取初值,然后迭代求出P,然后再根据P求出u
在这里插入图片描述总结

在这里插入图片描述

5 前馈控制与航向误差

再加一个输入量 δ f \delta_f δf,变成前馈控制
在这里插入图片描述
解决小尾巴问题
如果只用LQR:在这里插入图片描述

无论k取何值, e r r e_{rr} err e r r ˙ \dot{e_{rr}} err˙不可能永远为0,所以引入前馈控制: u = − k x + δ f u=-kx+\delta_f u=kx+δf,其中-kx是由LQR计算出的反馈控制, δ f \delta_f δf是前馈控制,引入这个是为了消除稳态误差

LQR最终会导致 e r r ˙ = 0 , e r r ≠ 0 \dot{e_{rr}}=0,e_{rr}≠0 err˙=0err=0,稳态误差可以计算得到:
在这里插入图片描述引入前馈控制后,有
在这里插入图片描述
稳定后的
在这里插入图片描述
目标:
选取合适的 δ f \delta_f δf,使得 e r r = − ( A − B k ) − 1 ⋅ ( B δ f + C θ ˙ r ) e_{r r}=-(A-B k)^{-1} \cdot\left(B \delta_{f}+C\dot{\theta}_{r})\right. err=(ABk)1(Bδf+Cθ˙r)尽可能为零

在这里插入图片描述
把ABC带入,用软件Mathmatica计算得到err的表达式
在这里插入图片描述
θ ˙ r \dot{\theta}_r θ˙r e r r e_{rr} err的影响:
在这里插入图片描述
先算反馈K,再算前馈
在这里插入图片描述
无论前馈反馈取何值, e ϕ ≠ 0 e_\phi≠0 eϕ=0
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中, m a y ma_y may为总侧向力, C r C_r Cr为后轮侧偏刚度
将车辆等效成前后两部分,分别计算出前后质量
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
虽然 e ϕ e_\phi eϕ不可能通过 δ f \delta_f δf和K调节,但是我们不用理会,因为最终目的是 θ − θ r = 0 \theta-\theta_r=0 θθr=0,即 e ϕ = − β e_\phi=-\beta eϕ=β,而 e ϕ = − β e_\phi=-\beta eϕ=β,所以不用管
在这里插入图片描述
至此,得到u的表达式
在这里插入图片描述
其中K是通过lqr计算得到, δ f \delta_f δf通过前馈控制得到
在这里插入图片描述

6 离散规划轨迹的误差计算

若曲线是连续的,不仅仅是投影麻烦,而且要处理多值问题,因此要离散
离散的轨迹点的误差计算
将轨迹离散成一些点,每个点都有四个信息(x,y,θ,k)
在这里插入图片描述
如何计算基于离散的误差:
(1) 找到离散轨迹规划点中与真实位置(x,y)最近的点
在这里插入图片描述
这个点在Apollo里面称之为match-point(匹配点)
(2) 匹配点代替投影点的前提:规划的点很密
在这里插入图片描述
现实情况是规划不能很密,否则计算量过大,所以需要通过匹配点近似算出投影点
在这里插入图片描述
假设:从匹配到投影点的曲率k不变。即认为匹配点和投影点的轨迹近似用圆弧代替
在这里插入图片描述
匹配点的切向向量和法向向量
在这里插入图片描述
匹配点与车实际点的向量:
在这里插入图片描述
(3) 求出 e d e_d ed(有正负:左为正,右为负)
在这里插入图片描述
(4) 求出 e s e_s es:匹配点与投影点的弧长(es有正负)
在这里插入图片描述
(5) θ r = θ m \theta_r=\theta_m θr=θm(apollo)
在这里插入图片描述
(6) 算出误差
在这里插入图片描述
这样就可以算出离散的err,再使用离散LQR计算出K,进而计算出 u = − K e r r + δ f u=-K e_{r r}+\delta_{f} u=Kerr+δf

7 横向控制算法流程

(1)算法输入输出过程
在这里插入图片描述
在这里插入图片描述
(2)流程图
在这里插入图片描述
(3)具体算法
① A,B计算模块
在这里插入图片描述
要考虑当 v x = 0 v_x= 0 vx=0时的奇异性
② LQR模块
因为A,B只与整车参数和 v x v_x vx有关,整车参数近似认为不变

情况1:如果加速度非常大,惯性力就比较大,这个时候前轮垂向力减少很多,后轮加大,侧偏刚度改变。此时仍然可以使用自行车模型,只是侧偏刚度改变
在这里插入图片描述

情况2:急速过弯时,左右轮不对称,导致自行车模型不适用,所以在路径规划的时候要极力避免急速过弯的情况
在这里插入图片描述
每个 v x v_x vx都有唯一的一个K与之对应,所以可以离线算出 v x v_x vx与K的对应表,实际应用中不需求解Riccati方程,直接查表
在这里插入图片描述

优点:速度大大加快
缺点:耗费储存空间(空间换时间)

针对每个vx,可以求出对应的AB,对于每个AB都可以迭代算出P,然后算出对应的K

e r r , k e_{rr},k errk计算模块
首先要有离散的规划点
在这里插入图片描述
遍历规划点找到距离当前车的位置最近的规划点,该点的序列(index)记为dmin
写出匹配点的切向向量与法向向量
在这里插入图片描述
写出误差距离向量,d_err为匹配点与车实际位置之间的位矢
在这里插入图片描述
算出误差 e d e_d ed e s e_s es
在这里插入图片描述
算出 θ r \theta_r θr,匹配点的曲率在这里插入图片描述
算出其他误差和变量
在这里插入图片描述
输出
在这里插入图片描述
④ 前馈控制计算模块
在这里插入图片描述

⑤ 最终控制计算模块
在这里插入图片描述
(4) 预测模块
车有惯性,所以要提前控制,要增加一个预测模块
在这里插入图片描述
在这里插入图片描述
如果当前点在路径上,算法不会打方向盘,但是人知道要转弯
在这里插入图片描述
算法控制具有滞后性,所以要加上预测模块,让算法有预见性
解决办法:使用预测点 x p r e x_{pre} xpre代替真实点去计算误差
在这里插入图片描述

预测算法写法:
(1) 首先有个预测时间,记为ts,可以使用速度×时间得到位置

(2) 根据运动计算出预测点的全部信息
在这里插入图片描述

8 控制基础以及面试问题

8.1 控制基础

(1)控制系统:消除物理模型和数学模型差异性的过程
对于无人车
稳定性:对于任何环境都需要稳定(安全)
稳态误差:尽可能小,保证执行上层命令【控制实际运行的偏差范围】
动态误差:在动态工程中也需要保证很多性能
在这里插入图片描述
y(t)表示控制系统的输出;虚线表示控制系统理想状态下达到的位置(我们期望的);t表示时间
图(b)是我们追求的控制效果,(a)比较慢,©波动但是不收敛,(d)波动呈发散属于最不好的控制
(2)控制基础

  1. 时间域

超调量:目标值与可达到的最高位置的范围
超调时间:到达最高超调量所花时间
稳态调整时间(整定时间):最初到达稳定在一定范围内所花的时间
上升时间:初次到达目标位置所花的时间,参与衡量上升速度大小
一般来说,希望超调量尽量小;超调时间尽量快;稳态调整时间越快越好;上升时间越快越好

  1. 频率域

通过频率(pass band):通过(增益大于一定程度)对应的频率
停止频率(stop band):增益下降到一定值所对应的频率
带宽:增益上升和增益下降对应的频率范围大小
截止频率:表示增益达到给定的截止值时所对应的频率
时间域可通过傅里叶和拉普拉斯变换变成频率域

  1. 离散域(z变换)

在这里插入图片描述

频域、时域、离散域是可以相互转换的;时间函数相对比较常用,Google或百度搜索拉氏变换应该就用了

MPCLQR
研究对象线性和非线性系统线性系统
状态方程:离散化对非线性的状态方程进行线性化,对线性方程离散化对线性方程离散化
目标函数MPC目标函数一个是累计和LQR目标函数一个是积分
求解方法转化为二次规划问题,利用求解器进行求解,生成控制序列采用变分法,通过求解黎卡提方程进行逼近,最终获取控制序列
工作时域是求解预测时间段Np内的控制序列 ,并在下个周期后进行滚动优化求解预测时间段内的控制序列 ,只求解一次,每个周期下取对应的控制量
LQR和MPC的优缺点计算量大,实时性差,对于算力要求高,硬件成本较高① LQR不滚动优化,预测时间段内的控制序列只求解一次,没有考虑实际与规划的误差② LQR求解整个预测时域内的控制序列,而MPC可在更小的时间窗口中求解优化问题,获得次优解,可大大提升求解速度③ 无约束,假设对控制量无约束

调试PID的经验:
在这里插入图片描述

8.2 控制算法面试问题整理

(1)现在企业里的控制都是用什么做呢?

控制的话可能更多还是二自由度动力学模型+求解线性化后的QP问题

(2)为什么规划需要给控制输出一条尽可能平滑的曲线,控制不也是根据离散点来做的,比如纯跟踪这种做法,不也是选取预瞄点去跟踪?

车辆运动是连续性的动作,假如规划的曲线不平滑,这里的不平滑更多的值这曲线不符合车辆运动学,那控制跟踪计算的转角可能不连续。 比如纯跟踪,上一帧选取的参考点计算出一个对应转角,下一帧的曲线上有个跳点(不平滑),计算出的转角较上一帧有较大变化,造成不舒适。
规划轨迹当然越平滑越好 但实车运行需要考虑耗时 平滑会耗费几十到上百毫秒,另一方面要参考控制是单点还是多点预瞄 多点预瞄对规划轨迹的平滑程度要求相对来说不高 其连续性约束相当于做了一次平滑 能有效解决期望输出跳变的问题。
希望规划平滑的另一个原因是:控制模块做的是个轨迹跟踪的功能,一般不会去施加额外的安全性约束,因此规划给出的轨迹是否足够好的标准之一就是控制是否能跟得上,如果轨迹不平滑导致控制根本跟踪不上,那整个安全性假设就不成立了。预瞄点一般要跟车速关联,车速高的时候要相对预瞄地远一点,保证整体控制的稳定性,但相应地控制误差可能会大一点。

(3)实车控制问题若采用mpc 做,中间产生无解或是违反约束的情况怎么解决

可能要看下是违反了什么约束,如果是碰撞或者动力学上限这类的硬约束导致了无解,那可能需要额外的备份规划器来输出应急行为了,如果是速度限制这种约束导致无解可以考虑把他变成高权重的软约束,可以缓解无解的情况。备份规划器一般来说就是AES和AEB的领域了,方法都是类似的,不过设计目标是可以牺牲一定舒适性来消除短时域内的碰撞风险(1~2s)。你所应用的赛车控制问题应该不需要这个,还是检查检查有没有约束设计的不合理吧

(4)mpc做控制或者局部路径规划,这两者的区别

mpc优化问题的形式本身就可以理解为是一个规划问题,优化求解出来的最优状态序列可以理解为一条轨迹,而作为控制器使用的时候就只执行第一个周期内的控制指令,这是主要区别。

(5)MPC在低速场景(0.1m/s),进行路径跟踪,是否无法进行?

适用的,只是车辆动力学在低速场景下表现不好,如果是运动学模型+MPC没问题

(6)基于mpc方法能做泊车场景吗?跟图搜索和随机采样的方法有什么不同?为什么很多泊车场景很少用mpc去做?

搜索和采样只是分辨率下最优和概率最优,而优化可以做到连续空间下的最优,但问题就在于非凸问题的优化没那么好做,很容易陷入不好的局部最优解。理论上说肯定是mpc这种优化方法效果更好且理论更完备。

(7)经典控制理论:PID、ACC
现代控制理论:LQR、轨迹跟踪

(8)纵向的油门刹车标定表如何建立

理想的测试地点是平坦的长直路,且两边没有高大的建筑物遮挡。保证定位精度,这样标定的准确度才够。
标定目的:找到油门,速度,加速度之间的一个对应关系

参考:(八)实践出真知——apollo刹车油门标定

(9)误差状态方程的右边还有一项关于参考路径的航向角速率,但是 LQR 控制器中并没有考虑他对状态量的影响,那应该如何解决呢

增加前馈

(10)线控转向系统的控制延迟如何处理

引入预瞄,在偏差计算不计算当前时刻的偏差,而是计算当前时刻0.1-0.2s之后的偏差

(11)讲一讲自动驾驶中的一些坐标系以及转换关系
笛卡尔
Frenet
转换关系见:Apollo基础 - Frenet坐标系
(12)LQR怎么处理非线性目标和约束

将非线性系统线性化,约束的处理需要使用扩展的LQR方法:NMPC、NLQR

(13)自行车模型中具体是如何实现的?
在这里插入图片描述
(14)在实际问题中,应该根据什么去选择不同的控制算法进行控制器的设计?

首先要考虑的是系统的类型、性能要求、稳定性要求、精度要求、成本要求等。具体可以考虑以下几个方面:
系统的类型:线性系统还是非线性系统,连续系统还是离散系统,是否有时间延迟等。
稳定性要求:对于一些对稳定性要求较高的系统,可能需要使用更为复杂但具有更好稳定性的控制算法,如LQR、PID等。
性能要求:考虑系统动态性能的要求,如指标响应时间、超调量大小等。如果要求响应速度快,需要考虑如状态反馈,模型预测控制等方式;对超调量有严格限制的,可能会比较适合使用比例-积分-微分方式的PID控制器。
精度要求:对于需要高精度控制的系统,可能需要使用更为精细的控制方法。
成本要求:对于需要考虑成本的应用,可能需要选择能满足需求但成本较低的算法。高级控制策略(如模型预测控制)可能会提供更好的控制性能,但可能需要更高的计算资源。
实施的难易程度:有的控制算法可能理论上很优秀,但实施起来特别困难,这种情况下需要权衡其操作难度和收益。
最终,选择哪种控制算法需要根据具体系统的特性和对系统性能的要求来进行综合考虑和权衡。

(15)什么是自动控制?为什么要进行频域和时域的分析?各自的分析方法有哪些?

自动控制通常涉及到一些作用元件(即控制器)能按照一定的策略自动地调整控制输入,以使得系统的输出达到预期的目标。
频域和时域的分析是观察系统行为的不同角度
时域分析:主要研究系统对单位阶跃、单位冲激等时间函数的响应,求解系统的时间响应并分析系统的稳定性、快速性、超调等性能指标。一般方法包括微分方程求解、根轨迹法、极点零点法等。
频域分析:主要研究系统在各个频率下的响应特性,如振幅特性和相位特性等,并用来分析和设计控制系统的稳定性、鲁棒性。常用的方法有频率响应法、Nyquist稳定判据、Bode图法等。

为什么要进行这两种分析,主要是因为它们各自关注了系统的不同特性:时域分析关注系统响应随时间如何变化、系统能否在有限时间内达到稳定状态频域分析关注系统对不同频率信号的响应特性,使我们能深入理解系统对输入信号的灵敏度以及在不同频率下的系统性能。通过时域和频域分析,可以全面了解系统的动态行为,为系统的设计和调整提供依据。

(16)QP一定是凸问题吗?

QP问题不一定是凸问题。判断QP是不是凸的关键在于Hessian矩阵,如果Hessian矩阵半正定,那么QP是凸问题,否则是非凸问题。

(17)车辆是如何进行执行横向或者纵向控制的,如何匹配使得车辆跟踪上目标点?

(18)简述MPC开发过程

模型预测控制在k时刻共有三步:
① 获取系统当前状态
② 基于u(k),u(k+1),u(k+2),…,u(k+m)进行最优化处理
③ 只取u(k)作为控制输入施加在系统上
在下一时刻重复上面三步,在下一步进行预测时使用的就是下一步的状态值

(19)简述MPC算法原理

在每一个采用时刻,根据获得的当前测量信息,在线求解一个有限时间开环优化问题,并将得到的控制序列的第一个元素作用于被控对象。在下一个采样时刻,重复上述过程:用新的测量值作为此时预测系统未来动态的初始条件,刷新优化问题并重新求解 。

(20)讲一讲LQR和MPC的不同点,以及相应的应用场景

主要不同在于MPC有很多约束,求解的方法更加复杂。在应用上MPC多用于纵向控制,LQR多用于横向控制。

(21)自动驾驶中车辆有哪些模型,是如何建模的?

自动驾驶中通常考虑车辆的运动学模型和动力学模型,运动学模型中有自行车模型,分为前轮,后轮和质心模型。

(22)控制模块的输入输出是什么?和规划是什么关系

输入:轨迹线、地图信息、定位信息、车辆反馈信息
输出:刹车、油门、转向
规划和控制是上下游的关系

(23)你的算法在实际测试中发现的三个头部问题是什么,然后你是怎么解决的

(24)常见的碰撞检测方法
常见的碰撞检测方法
碰撞检测的向量实现
外接圆碰撞检测、AABC、OBB、GJK、EPA、比较面积的方法
(25)自己运用强化学习算法多点还是传统控制算法多点

传统算法多点,PID、LQR、MPC、Pure pursuit、Stanley

(26)在巡航控制算法中用的PID算法,如何根据被控对象设计算法,思路是什么

巡航控制算法使用PID思路:
(1)确定被控对象
(2)确定控制目标
(3)建立数学模型
(4)设计PID算法
(5)实现算法
(6)调试与优化

(27)你做的都是时间域上的控制,频域上的控制了解吗

频域控制通过调整系统的频率响应来实现对系统的控制,在实际应用中,需要根据系统的特性和性能要求,选择合适的频域控制策略,并对其进行实现和优化

(28)控制算法最看重的指标是什么,如何衡量这个指标

我觉得控制算法最看重的指标是控制精度,纵向控制看是否到达预定的位置和速度,横向控制看横向误差,航向误差是否到达预想的目标

(29)给出一个定义好的类,请用多态调用的方式调用这个类,写出一个PD位置控制算法
(30)在工程上经常会出现电机突然不转的情况,这时候会出现积分饱和,请问如何抵抗积分饱和,说出你的思路,并写代码解决
(31)假设一辆车沿一条直路向前行驶,初始位置为0m,速度为0m/s,每一秒该车都可以选择一次加速度: + 2 m / s 2 +2m/s^2 +2m/s2 − 2 m / s 2 -2m/s^2 2m/s2,或者 0 m / s 2 0m/s^2 0m/s2。该车在1秒内开过的路程是(v(t)+v(t+1))/2m。终点在1000m处, 且到达终点时速度恰好为0m/s。路上有若干处限速,请问如何加减速才能保证最快到达终点且到达终点时速度为0m/s。

思路:编一个类似仿真的环境,一步=1秒;每一步都依次考察+1,0,-1 三种加速度是否满足限速要求。一旦找到满足要求的加速度,就不用再考察更慢的决策了,直接执行既可。
在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <unordered_map>
#include <math.h>
#include <array>
 
 
int main()
{
    std::unordered_map<int, int> v_limit_vec{ {100,5}, {405,20} ,{1000,2} }; //<speed limit position, speed limit value>
    int pos = 0; //initial position
    int t = 0;//time
    int v = 0;//initial speed
    int v_next = 0; //next step speed
    int p_next = 0; //next step position
    std::array<int,3> a_vec{ 1,0,-1 };// three actions
    while (pos<1000){
        for (int a : a_vec){ //start with +1, then 0, then -1
            v_next = v + a;
            if (v_next < 0) {
                v_next = 0;
            }
            p_next = (v_next + v) / 2 + pos;
 
            bool action_good = true; //once find good action, break action loop
            for (std::pair<int,int> the_pair : v_limit_vec) {//loop over speed limits
                int v_lim_pos=the_pair.first; //get speed limit position
                if (v_lim_pos - pos <= 0)  {
                    continue;
                }
                int v_lim_v=the_pair.second; //get speed limit speed
                if (v_lim_pos - p_next > 0) { //if potential speeding at future step
 
                    //compute the acc of constant deceleration to satisfy speed limit
                    float acc = (static_cast<float>(v_lim_v) * v_lim_v - v_next * v_next) / (2 * (v_lim_pos - p_next));
                    if (acc < -1) {
                        action_good = false;
                    }
                } 
                else { //if speeding at current step
                    if (v_next > v_lim_v) {
                        action_good = false;
                    }
                }
                if (!action_good) { 
                    break; //this action does not satisfy this speed limit, no need to check other speed limits.
                }
            }
            if (action_good) {
                break;
            }
        }
        //simulate one step
        t = t + 1;
        v = v_next;
        pos = p_next;
    }
    std::cout << t <<std::endl;
    std::cout << v << std::endl;
    std::cout << pos << std::endl;
}

(32)轮胎的侧偏特性,侧偏角产生的原因

轮胎的侧偏特性是指当轮胎在行驶过程中,由于外部因素(如道路不平、车辆转向等)的影响,使得轮胎的侧面与地面之间的接触点产生相对滑动的现象。这种现象会导致轮胎的侧偏角产生,进而影响车辆的行驶稳定性和操控性能。

(33)当车辆上下乘客(车重发生变化时)对模型参数辨识带来的困难

当车辆上下乘客时,车辆的重量会发生变化,这可能会对模型参数的辨识带来一定的困难。具体表现在以下几个方面:

  • 车辆动态特性的变化:车辆的重量变化会直接影响车辆的动态特性,如车辆的悬挂系统、刹车系统等。这将导致模型参数的变化,从而影响模型的预测精度和稳定性。
  • 模型参数的不稳定性:当车辆上下乘客时,车辆的重量会发生变化,这可能导致模型参数的不稳定。例如,车辆的质心位置、悬挂系统的刚度等参数可能会随着车辆重量的变化而发生变化,从而影响模型的参数辨识。
  • 参数辨识的复杂性:当车辆上下乘客时,车辆的动态特性可能会发生显著的变化,这将使得参数辨识问题变得更加复杂。例如,在车辆重量变化的情况下,需要更大量的实测数据来准确辨识模型参数,以保证模型的预测精度和稳定性。
    为了克服这些困难,可以采取以下一些措施:
  1. 在模型设计和参数辨识过程中,考虑车辆重量变化对模型参数的影响,以提高模型的鲁棒性和稳定性。
  2. 采用在线参数辨识方法,根据实测数据动态调整模型参数,以适应车辆重量的变化。
  3. 通过合理的实验设计和数据处理方法,减小车辆重量变化对参数辨识的影响,提高参数辨识的准确性和稳定性。

控制算法前置知识介绍到这里,希望对读者有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apollo 9.0是一个自动驾驶开发平台,它提供了一套完整的软硬件解决方案,用于开发和部署自动驾驶系统。交叉编译是在一种平台上生成在另一种平台上运行的可执行文件的过程。在Apollo 9.0中,交叉编译通常用于将代码从开发主机编译为目标平台上的可执行文件。 要进行Apollo 9.0的交叉编译,您需要按照以下步骤进行操作: 1. 配交叉编译环境:首先,您需要安装目标平台的交叉编译工具链。这些工具链包括交叉编译器、链接器和库文件。您可以从目标平台的官方网站或开发者社区获取这些工具链。 2. 设环境变量:将交叉编译工具链的路径添加到系统的环境变量中,以便在编译过程中能够正确地找到这些工具。 3. 配构建系统:Apollo 9.0使用Bazel作为构建系统。您需要根据目标平台的要求,配Bazel的构建规则和选项。这包括指定目标平台的架构、操作系统和其他相关参数。 4. 编译代码:使用Bazel命令行工具执行编译命令,将代码编译为目标平台上的可执行文件。根据您的需求,您可以选择编译整个Apollo 9.0系统,或者只编译特定的模块或组件。 5. 部署和测试:将编译生成的可执行文件部署到目标平台上,并进行测试和验证。确保代码在目标平台上能够正常运行,并满足性能和功能要求。 请注意,具体的交叉编译步骤可能因为您使用的目标平台和开发环境而有所不同。建议您参考Apollo 9.0的官方文档和开发者社区,以获取更详细和准确的交叉编译指南。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值