IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 智能车 PID 调试 -> 正文阅读

[人工智能]智能车 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)=Kp??err(t)+Ti?err(t)dt?+Td??dt?derr(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)=Kp??e(k)+Ki??i=0k?e(i)+Kd??[e(k)?e(k?1)]

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(k?1)可得增量式 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(k?1)+Ki??e(k)+Kd??[e(k)?2?e(k?1)+e(k?2)]]

增量式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(k?1)+Δ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需要输出限幅,不然容易烧毁电机或舵机。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:47:25  更:2022-03-13 21:48:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 6:16:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码