记录udacity–无人驾驶工程师课程中控制部分。
MPC代码和实践链接https://github.com/udacity/CarND-MPC-Quizzes
- 本文按照对udacity课程的理解和翻译而来
1、PID
P:Proportional 比例项, 用比例项乘以误差;快速缩小误差;
I:积分单元(Integral) 积分单元乘以一定时间内误差的和,用来消除稳态误差;
D:微分单元(Derivative) 微分项乘以误差的差分,防止震荡;
P控制:存在震荡情况;
PD控制:缩小震荡,快速缩小误差,但是不能消除系统误差;system bias.零位不能够达到实际的直行;
PID:在PD的控制基础上,用以消除稳态误差。
调参方法
讲师介绍到一种自动调参数的方法twiddle,即在开始控制前用以标定参数。
代码如下:
def twiddle(tol=0.2):
p = [0, 0, 0]
dp = [1, 1, 1]
robot = make_robot()
x_trajectory, y_trajectory, best_err = run(robot, p)
it = 0
while sum(dp) > tol:
print("Iteration {}, best error = {}".format(it, best_err))
for i in range(len(p)):
p[i] += dp[i]
robot = make_robot()
x_trajectory, y_trajectory, err = run(robot, p)
if err < best_err:
best_err = err
dp[i] *= 1.1
else:
p[i] -= 2 * dp[i]
robot = make_robot()
x_trajectory, y_trajectory, err = run(robot, p)
if err < best_err:
best_err = err
dp[i] *= 1.1
else:
p[i] += dp[i]
dp[i] *= 0.9
it += 1
return p
使用动态的PID参数能够使快速接近,但是容易造成初始的摆震;
首先使用上述方式确定一个PID参数,再进行控制,会使得控制收敛很快。
对各种组合方法的收敛效果示意:
2、MPC
2.1 MPC的主要组成
MPC需要设置的主要参数包括N, dt, and T。
N, dt, and T are hyperparameters you will need to tune for each model predictive controller you build. However, there are some general guidelines. T should be as large as possible, while dt should be as small as possible.
N Dt T(总步数、时间步长、总时域:T=N*Dt)是需要调整的超参数,一般的调整方式T越大越好,dt越小越好。
一般对超参数的设置按照如下原则:
- HORIZON:
用在车上的时域,至少是数秒的级别,在这段时域以内,得到环境的变化,否则预测是毫无意义的。
- Number of timesteps:
MPC的优化目标是优化控制的输入量,通过调整输入,直到找到在这些输入下最低的cost vector。这个向量的长度为N,N就是决定了MPC需要优化的变量,同时也是计算cost的major driver。
- Time Duration时间间隔
MPC是想要通过动作额离散路径的平均来逼近一个连续的参考线,大的时间间隔会导致低频的actuations,难以连续逼近曲线,这种误差被叫做离散误差"discretization error".
基于车辆自行车模型的MPC方法,其中:
初始状态包含车辆的位置、速度、航向;
优化过程中的状态更新是根据自行车模型推算的位置,车辆速度,cte(位置偏差),航向偏差;优化方程不定,主要包含误差变小、速度转角的平滑度;
约束:对转角约束在±25°,纵向约束在±1(表示油门到极限和刹车到极限)
3、方法优劣讨论
对PID和MPC的讨论除了是否运用被控制物体的物理模型外,主要集中在系统延迟能否处理好的问题。
在实际的车辆中,一个动作并不会被立马响应,而是会经过100ms的量级的延迟(主要指线控车辆的执行延迟)。这个延迟会对不同的控制器来讲都是一个挑战。比如PID:会造成overcome(超调);但是MPC能够较好地处理这种延迟,因为其将延迟考虑在模型中了。
- PID controller
PID算法一般不依赖于未来的误差,这是不对的。如果依赖未来的误差,也没有考虑车辆的模型,必然不准确的控制;
- Model predictive controller
延迟的一个重要因素就是执行器的动态特性。例如,从转向角指令下发到实际到达该转向角度的时间。这个可以通过简单的动态系统进行建模,并且整合到车辆模型中去。一种方法就是将使用车辆模型,根据延迟时间推算延迟时间后的车辆状态,这个车辆状态就是MPC计算的新初始状态;
相比之下,MPC能够比PID算法更优地处理延迟问题;