智能车 PID 调试

智能车 PID 调试


学习目的

  • 使电机速度和舵机转向更精准,有利于导航控制。
  • 利用传感器反馈值实现闭环控制,消除不必要的干扰误差。
  • 让整个系统更稳定。

开环控制与闭环控制

开环控制

当操作者启动系统,使之进入运行状态后,系统将操作者的指令一次性输向受控对象。此后,操作者对受控对象的变化便不能作进一步的控制。

闭环控制

当操作者启动系统后,通过系统运行将控制信息输向受控对象,并将受控对象的状态信息反馈到输入中,以修正操作过程,使系统的输出符合预期要求。

小结

小车的控制使用开环控制很容易漂移或者跑偏,也不够灵活,不利于导航系统的运行,所以应当选取闭环控制,PID 就是一种经典闭环控制算法。

PID 概述

简介

将偏差的比例(Proportion)、积分(Integral)和微分(Differential)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称 PID 控制器。

pid
PID 算法应用广泛,多用于自动控制领域,如机器人,小车,洗衣机等,在智能车中广泛用于电机控制。
电机控制

PID 公式:

U ( t ) = K p ∗ e r r ( t ) + T i ∫ e r r ( t ) d t + T d ∗ d e r r ( t ) d t U(t) = K_p * err(t) + T_i \int err(t)d_t + T_d * \frac{derr(t)}{d_t} U(t)=Kperr(t)+Tierr(t)dt+Tddtderr(t)

Kp:控制器的比例系数,对误差信号进行放大或衰减,其大小决定了控制作用的强弱。该系数过大可能导致系统震荡,使得稳定性变差,降低系统的相对稳定性;系数过小会导致控制效果不明显,反应迟钝,不能有效修正干扰的影响;且该系数不能完全消除系统的稳态误差。

Ti : 控制器的积分时间,也称积分系数,通过对误差累积的作用影响控制器的输出,并通过系统给出的负反馈减小偏差,理论上只要时间足够,积分控制可以消除稳态误差。该系数过大可能导致系统积分超调,使得调整时间过长;过小可能导致收敛过长,不能及时克服干扰影响。

Td: 控制器的微分时间,也称微分系数,该系数能够反映出误差信号变化的速度,在误差刚出现时就产生很大的控制作用,具有超前的控制作用,有利于减小调整时间,改善系统动态品质。该系数过大会引起系统震荡,导致系统稳定性下降;过小可能导致改善效果不明显。同时,微分容易引入高频噪声,导致系统不稳定。

总结一下,PID 三个字母,大致可以说是 P 主管响应,I 减小静差,D 抑制震荡,但使用不当会有反作用。

舵机 PID

分析

舵机控制一般选用位置式 PID ,因为舵机本次的控制量输出值与上次控制量输出值关系不大,只与过去状态有关,舵机需要的是快速转到某个角度。而位置式 PID 正好不需要对控制量进行记忆,而是直接对偏差值进行计算得出期望的控制量。
位置式 PID 可由 PID 公式离散化得出,进行离散化是由于计算机控制是一种采样控制,它只能根据采样时刻的偏差计算控制量,而不能像模拟控制那样连续输出控制量量,进行连续控制。由于这一特点,PID 公式中的积分项和微分项不能直接使用,必须进行离散化处理。
离散化后则得到位置式 PID,也称全量式 PID :

u ( k ) = K p ∗ e ( k ) + K i ∗ ∑ i = 0 k e ( i ) + K d ∗ [ e ( k ) − e ( k − 1 ) ] u(k) = K_p * e(k) + K_i * \sum_{i = 0}^ke(i) + K_d * [e(k) - e(k-1)] u(k)=Kpe(k)+Kii=0ke(i)+Kd[e(k)e(k1)]

k ―― 采样序号, k =0,1,2,……;
u(k) ―― 第 k 次采样时刻的计算机输出值;
e(k) ―― 第 k 次采样时刻输入的偏差值;
e(k-1) ―― 第 k -1 次采样时刻输入的偏差值;
K i K_i Ki ――积分系数;
K d K_d Kd ――微分系数;

算法

C语言算法:

//PID 结构体
typedef struct
{
  float Kp;                       //比例系数Proportional
  float Ki;                       //积分系数Integral
  float Kd;                       //微分系数Derivative
 
  float Ek;                       //当前误差
  float Ek1;                      //前一次误差 e(k-1)
  float Ek2;                      //再前一次误差 e(k-2)
  float LocSum;                   //累计积分位置
}PID_TypeDef;

//pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
/************************************************
函数名称 : PID_Loc
功    能 : 位置式PID
参    数 : SetValue ------ 设置值(期望值)
            ActualValue --- 实际值(反馈值)
            PID ----------- PID数据结构
返 回 值 : PWM -------- PWM输出
*************************************************/

float PID_Loc(float SetValue, float ActualValue, PID_TypeDef *PID)
{
    float PWM;                                 //PWM输出
 
    PID->Ek = SetValue - ActualValue;          //计算当前误差
    PID->LocSum += PID->Ek;                    //累计误差
 
     PWM = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd
     * (PID->Ek1 - PID->Ek);                  //位置式 PID 控制
 
    PID->Ek1 = PID->Ek;                       //保存上一次偏差

    if(PWM > Servo_max)
    {
      PWM =  Servo_max;
    }
    else if(PWM < Servo_min)
    {
      PWM =  Servo_min;
    }                                       //限幅

    return PWM;
}

该算法中的反馈值可由陀螺仪所测偏航角提供。

电机 PID

分析

电机一般选用增量式 PID,所谓增量式 PID 是指控制器的输出只是控制量的增量 Δ u ( k ) \Delta u(k) Δu(k)。当执行机构需要的控制量是增量,而不是位置量的绝对数值时,可以使用增量式 PID 控制算法进行控制。
Δ u ( k ) = u ( k ) − u ( k − 1 ) \Delta u(k) = u(k)-u(k-1) Δu(k)=u(k)u(k1)可得增量式 PID :

Δ u ( k ) = K p ∗ [ e ( k ) − e ( k − 1 ) + K i ∗ e ( k ) + K d ∗ [ e ( k ) − 2 ∗ e ( k − 1 ) + e ( k − 2 ) ] ] \Delta u(k)=K_p*[e(k)-e(k-1)+K_i*e(k)+K_d*[e(k)-2*e(k-1)+e(k-2)]] Δu(k)=Kp[e(k)e(k1)+Kie(k)+Kd[e(k)2e(k1)+e(k2)]]

增量式PID根据公式可以很好地看出,一旦确定了 K p , K i , K d K_p, K_i, K_d Kp,Ki,Kd,只要使用前后三次测量值的偏差, 即可由公式求出控制增量。
而得出的控制量 Δ u ( k ) \Delta u(k) Δu(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差,没有误差累加。
也就是说,增量式PID中不需要累加。控制增量Δu(k)的确定仅与最近 3 次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作。
增量式 PID 控制算法与位置式 PID 算法相比,计算量小的多,因此在实际中得到广泛的应用。
而位置式 PID 控制算法也可以通过增量式控制算法推出递推计算公式:
u ( k ) = u ( k − 1 ) + Δ u ( k ) u(k) = u(k-1) + \Delta u(k) u(k)=u(k1)+Δu(k)
也就是目前在计算机控制中广泛应用的数字递推 PID 控制算法。

算法

C语言算法:

//PID 结构体
typedef struct
{
  float Kp;                       //比例系数Proportional
  float Ki;                       //积分系数Integral
  float Kd;                       //微分系数Derivative
 
  float Ek;                       //当前误差
  float Ek1;                      //前一次误差 e(k-1)
  float Ek2;                      //再前一次误差 e(k-2)
  float LocSum;                   //累计积分位置
}PID_TypeDef;

//pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
/************************************************
函数名称 : PID_Inc
功    能 : 增量式PID
参    数 : SetValue ------ 设置值(期望值)
            ActualValue --- 实际值(反馈值)
            PID ----------- PID数据结构
返 回 值 : PWM -------- 本次PID增量(+/-)
*************************************************/
float PID_Inc(float SetValue, float ActualValue, PID_TypeDef *PID)
{
    float PWM;                                  //增量
 
    PID->Ek = SetValue - ActualValue;           //计算当前偏差
    PID->LocSum += PID->Ek;                     //累计误差
    PWM = PID->Kp * (PID->Ek - PID->Ek1) + PID.Ki * EK + 
    PID.Kd * (PID.Ek - 2 * PID.Ek1 + PID.Ek2);                                          
                                                //增量式PID控制器                       
    PID->Ek2 = PID->Ek1;
    PID->Ek1 = PID->Ek;

    if(PWM > motor_Max)
    {
      PWM = motor_Max;
    }
    else if(PWM < motor_Min)
    {
      PWM = motor_Min;
    }                                           //限幅

    return PWM;
}

该算法中的实际值可由编码器等传感器提供。

调试口决

参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低四比一
一看二调多分析,调节质量不会低
------------------------------------------------------(摘取自百度百科)

注意事项

  • 增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值,容易产生较大的累加误差。

  • 增量式算法得出的是控制量的增量,只输出变化部分,影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作。而位置式的输出直接对应对象的输出,因此对系统影响较大。

  • 增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机,而位置式PID适用于执行机构不带积分部件的对象,如舵机。

  • 在进行PID控制时,位置式PID和增量式PID需要输出限幅,不然容易烧毁电机或舵机。

  • 17
    点赞
  • 259
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
智能小车走直线PID调节是通过不断调整小车的速度和转向角度来实现直线行驶的功能。 首先,我们需要传感器来获取小车当前的位置和偏差值。通常可以使用红外线传感器或者摄像头来实现,获取小车与直线路径之间的偏差值。 然后,根据当前的偏差值,我们可以使用PID控制算法来计算小车的速度和转向角度。PID控制算法包括比例(P)、积分(I)和微分(D)三个部分。 比例部分(P)用于根据当前的偏差值来调整小车的转向角度。偏差越大,转向角度的调整就越大,使小车能够快速纠正偏差。 积分部分(I)用于修正长期偏差。它将过去一段时间内的偏差累积起来,然后根据累积的偏差值来进行补偿。这样可以避免小车对于瞬时的偏差过度反应。 微分部分(D)用于预测偏差的变化趋势。通过计算当前偏差与上一次偏差的差值,可以得到偏差的变化速率。然后根据变化速率来调整小车的速度,使其能够更加平滑地行驶。 最后,根据PID控制算法计算出的速度和转向角度,通过电机控制来实现小车的直线行驶。控制电机的PWM信号可以控制小车的速度和转向角度。 通过不断调节PID控制算法参数,如比例系数、积分系数和微分系数,可以使小车在直线行驶过程中更加稳定和准确。 总结起来,智能小车走直线PID调节是将传感器获取的位置偏差值经过PID控制算法计算得到的速度和转向角度来实现的。通过不断调整PID参数,可以使小车能够更加稳定地在直线上行驶。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值