Advertisement

自动驾驶-PID控制器

阅读量:

在自动驾驶中操作车辆需要通过方向盘、刹车及油门来将车辆引导至目标位置。用于控制车辆的基本算法通常被称为控制器,在众多控制系统中PID controller(比例-积分-微分)是最基本也是最常用的类型之一;这个术语源于其英文缩写Proportion–Integration–Differentiation(P-I-D),它分别代表了这一调节系统中的比例环节、积分环节以及差分环节;本章将详细介绍这些组成部分及其在实际系统中的物理意义,并提供相应的编程实现方法

前边在卡尔曼滤波与粒子滤波相关章节中各自讲述了识别其他车辆与定位自身的技术;此外,在获取道路信息的过程中;当接收这些输入时;从而实现车辆在道路上的安全行驶;

  1. 控制器精确控制以确保车辆不偏离预定路径。
  2. 该控制器具备可行性。
  3. 控制器操作平稳以确保乘客舒适度;以免造成不适。

该系统通过地图计算得出的车辆运行轨迹被定义为参考线;此偏差被定义为CTE(Cross Track Error),即Cross Track Error;其中P参数代表比例系数;该参数表明,在一定程度上航向角会跟随CTE的变化而变化;然而实际情况表明(如图所示),实际行驶路线会在参考轨迹附近震荡摆动;因此这种纯比例控制方式不够理想

在这里插入图片描述

D控制器用符号D表示,在控制系统中具有重要地位。差分项相当于在控制器中引入了阻尼作用,在保证系统稳定性的同时降低了控制信号的变化速度;通过引入差分项可以使系统趋于稳定状态(如图所示),车辆的摆幅会随着差分项的引入而显著减小

在这里插入图片描述

PID控制器中的I环节代表积分作用部分,在控制过程中用于消除系统的偏差。具体而言,在车辆转向控制中,当转向角出现偏差时(即失准),通过调节方向盘的位置(即偏移方向),可以使车辆恢复直线行驶状态。积分环节的作用在于对系统中存在的累积误差进行放大处理,并通过反馈机制不断修正直至消除系统中的偏差。

在这里插入图片描述

以下就是PID控制器的C++ 代码实现。

复制代码
    #include "PID.h"
    
    using namespace std;
    
    /* * TODO: Complete the PID class.
    */
    
    PID::PID() {}
    
    PID::~PID() {}
    
    void PID::Init(double Kp, double Ki, double Kd) {
    p_error = 0.0;
    i_error = 0.0;
    d_error = 0.0;
    
    Kp_ = Kp;
    Ki_ = Ki;
    Kd_ = Kd;
    }
    
    void PID::UpdateError(double cte) {
    d_error = cte - p_error;
    i_error +=cte;
    p_error = cte;
    }
    
    
    double PID::TotalError() {
    return -Kp_*p_error-Ki_*i_error-Kd_*d_error;
    }

查看完整的项目代码,请访问这里

全部评论 (0)

还没有任何评论哟~