本项目是多伦多大学在Coursera上提供的自动驾驶汽车入门课程的最终项目作业。“controller2d.py”文件包含一个控制器对象。我在 update_controls 方法中实现了控制器。[视频] https://www.youtube.com/watch?v=Pu3B4sGw5uc&pbjreload=10
自动驾驶汽车纵向和横向控制设计
在这个项目中,我用 Python 实现了一个控制器,并使用它在 Carla Simulator 中自动驾驶汽车绕轨道行驶。控制器的输出将是车辆油门、刹车和转向角指令。油门和刹车来自纵向速度控制,转向来自横向控制。
1.纵向控制
对于纵向控制,我实现了一个 PID 控制器,该 PID 控制器将以所需的速度作为参考并输出油门和刹车。
PID 控制器由三个组件组成。首先,纯增益 Kp 根据速度误差缩放车辆加速度。这确保车辆在正确的方向上加速,其幅度与误差成正比。
其次,在积分项 KI 中,根据累积的过去误差设置输出。这可确保消除斜坡参考的稳态误差。
最后,微分项 KD 抑制了由积分项引起的过冲。
为了完成纵向控制,我们必须将PID控制器的加速度输出转换为油门和刹车指令。为简单起见,正输出将是油门,负输出将对应于刹车。
PID控制器
PID 控制器背后的基本思想是读取传感器,然后通过计算比例、积分和微分响应并将这三个分量相加以计算输出来计算所需的执行器输出。
P - 比例部分
- 比例部分最容易理解:比例部分的输出是增益与测量误差 e 的乘积。因此,比例增益或误差越大,比例部分的输出越大。将比例增益设置得太高会导致控制器反复超过设定值,从而导致振荡。
e = r – y e:误差,r:用户输入参考,y:实际测量输出比例部分 = Kp * e Kp:P 的输入增益 – 调节器(比例调节器)
Proportional = kp * e_current
I - 整体部分
- 将积分视为一个篮子,其中循环将所有测量的误差存储在 E 中。请记住,误差可以是正的也可以是负的,因此有时误差会填满篮子(当正误差添加到正误差或负误差添加到负时)有时它会清空篮子——就像正误差被添加到负误差,反之亦然。
- 随着时间的推移收集所有这些错误(随着时间的推移采取积分)。
积分部分 = Ki * E 其中 E = E + e(current) * ?t ,回路将所有测量误差存储在 E 中
self.vars.E = self.vars.E + e_current * delta_t
integral = ki * self.vars.E
D - 衍生部分
- 导数正在查看误差的变化率。误差变化越大,导数因子就越大。
- Kd 必须小于 1。
- 导数部分 =
Kd * ((e(current) - e(previous)) / ?t)
if delta_t == 0:
derivate = 0
else:
derivate = kd * ((e_current - self.vars.e_previous)/delta_t)
u - 系统输入信号(PID控制器输出信号)
u = Proportional + integral + derivate
if u >= 0:
throttle_output = u
brake_output = 0
elif u < 0:
throttle_output = 0
brake_output = -u
pid 控制器输出图
-
上升时间:达到参考值的90%所需的时间。 -
Th 过冲:输出超过此参考值的最大百分比。 -
稳定时间:稳定到参考值 5% 以内的时间。 -
稳态误差: te 输出与稳态参考值之间的误差。
2. 横向控制
对于横向控制,我实现了 Stanley 控制器。Stanley 方法是斯坦福大学自动驾驶汽车在 DARPA 大挑战赛中使用的路径跟踪方法,Stanley。Stanley 方法是横向误差的非线性反馈函数,从前轴中心到最近的路径点测量。
- e:交叉跟踪误差
- θ_c:车辆的航向(偏航)。
- ψ + θ_c:路径的航向(路径偏航)。
- ψ:航向错误。
- δ:转向角。
- v:当前前进速度(米每秒)。
- x_c:当前 X 位置(米)
- y_c:当前 Y 位置(米)
由此产生的转向控制律给出为 当 e 不为零时,第二项调整 δ 以使预期轨迹与距离前轴 kv(t) 单位的路径切线相交。
参考
https://github.com/ahmedmoawad124/Self-Driving-Vehicle-Control
|