PID控制器在纵向控制中的应用

在自动驾驶中,我们通常需要对于汽车的纵向运动进行控制,即控制油门、刹车以调整速度。一种常见的方法是PID控制器,全称是比例-积分-微分控制器。我们在使用的时候需要自己定义三个参数:$ K_p, K_i, K_d $。

假如我们有这么一个场景,我们有一个实时更新的期望速度 $ v_e $,以及我们当前的速度 $ v_c $,我们需要求出我们需要踩下多少刹车,多少油门,刹车以及油门的区间都在 $ [0, 1] $之间。为了模拟实时推理,我们假设行车总共的时长为200s,每0.33s为一个sample_time,当过了sample_time个时间之后,就会更新PID控制器的状态,获取最新的输出。

这种场景下,我们会输入到PID控制器一个错误 $ e = v_e - v _c $ ,理想速度与实际速度的差值。如果我们的速度为5 m/s,期望速度为10 m/s,我们就会进行如下计算:
$$
P = K_p \times e \\
I += K_i \times e \times t_s \\
D = K_d \times \frac{\text{d}{e}}{\text{d}{t}} \\
Output = P + I + D
$$

在Python中我们的实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np
import time

class PID(object):
"""
PID Controller
"""
def __init__(self, P=0.2, I=0.0, D=0.0):
self.K_p = P
self.K_i = I
self.K_d = D

self.sample_time = 0.00
self.current_time = time.time()
self.last_time = self.current_time

self.clear()

def clear(self):
self.P = 0.0
self.I = 0.0
self.D = 0.0

self.last_error = 0.0
self.output = 0.0

self.current_time = time.time()
self.last_time = self.current_time

def update(self, error, output_limits=[-1.0, 1.0]):
self.current_time = time.time()
time_dot = self.current_time - self.last_time
error_dot = error - self.last_error

if(time_dot >= self.sample_time):
self.P = self.K_p * error
self.I += error * self.sample_time

self.D = 0.0
if(time_dot > 0):
self.D = error_dot / time_dot

self.last_time = self.current_time
self.last_error = error

self.output = self.P + (self.K_i * self.I) + (self.K_d * self.D)
self.output = np.clip(self.output, output_limits[0], output_limits[1])

def setSampletime(self, sample_time):
self.sample_time = sample_time

不同的参数会导致PID控制器的相应不同,参数对于系统的影响的规律如下:

增加量 上升时间 超调量 安定时间 稳态误差 稳定性
$ K_p $ 减少 ↓ 增加 ↑ 小幅增加 ↗ 减少 ↓ 变差 ↓
$ K_i $ 小幅减少 ↘ 增加↑ 增加 ↑ 大幅减少↓↓ 变差↓
$ K_d $ 小幅减少 ↘ 减少↓ 减少↓ 变动不大→ 变好 ↑

我们将我们编写的PID控制器运用在Carla模拟器中,可以得到如下效果:

参考链接

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 许可协议。转载需要标明作者,并以超链接的方式指向原文。
  • Copyrights © 2020 Kevin Li
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~