智能车 PID 调试

2023-05-16

智能车 PID 调试

文章目录

  • 智能车 PID 调试
    • 学习目的
    • 开环控制与闭环控制
      • 开环控制
      • 闭环控制
      • 小结
    • PID 概述
      • 简介
      • 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)=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需要输出限幅,不然容易烧毁电机或舵机。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

智能车 PID 调试 的相关文章

  • 基于卡尔曼滤波进行四旋翼动力学建模(Simulink&Matlab)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 文献来源 摘要 由于近年来民用和军事领域对
  • 1_simulink简单入门_simulink仿真PID控制

    1 simulink简单入门 simulink仿真PID控制 2 simulink搭建RCL 电阻电感电容模块 毕业前想去做物联网还是或者linux 结果玩了一年多的电机控制 早就深知matlab simulink绕不过的 拖到现在 下班晚
  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • PID控制算法01

    PID控制算法 PID控制算法公式 原理 参数作用 PID算法及改进 两个基本类型 位置型PID控制 增量型PID控制 积分环节改进的PID控制 积分分离的PID控制 变速积分的PID控制 抗积分饱和的PID控制 微分环节改进的PID控制
  • TSI系统测量参数之:轴向振动

    一 TSI系统测量参数 1 轴向位移 2 盖振或瓦振 3 偏心 4 键相 5 零转速 6 轴向振动 7 相对热膨胀 胀差 8 绝对热膨胀 缸胀 二 各参数作用 2 轴向振动 测量的是大轴相对于轴瓦的X向振动和Y向振动 反馈电压量程为 4V至
  • 进程组必须有一个正在运行的领导进程吗?

    在类 Unix 操作系统中 如果一个进程 pid和它的pgid相等 则该进程是进程组的领导者 但是 如果进程领导者已经退出 并且同组中的其他进程仍在运行 那么谁是继任的领导者进程 没有继任领导者 一旦流程组领导者退出 该组就失去了领导权 没
  • copy_from_user() 的任何示例吗?内核和用户空间

    我正在寻找将 PID 值从用户空间复制到内核空间 这是我的代码快照 内核模块 include
  • Java程序如何获得自己的进程ID?

    如何获取我的 Java 进程的 ID 我知道有几种依赖于平台的技巧 但我更喜欢更通用的解决方案 不存在可以保证在所有 jvm 实现中工作的独立于平台的方法 ManagementFactory getRuntimeMXBean getName
  • 如何迭代 PCB 以显示 Linux 内核模块中的信息?

    我想编写一个 Linux 内核模块 它可以显示所有正在运行的进程的 PID 我有以下代码 procInfo c My Kernel Module for process info include
  • 子进程和父进程ID

    只是与子进程块中的父 pid 值混淆了 我的程序如下 int main int argc char argv pid t pid pid fork if pid 1 perror fork failure exit EXIT FAILURE
  • 识别 DNS​​ 请求的 PID 源 (Windows XP)

    我希望确定发出 DNS 请求的进程 查看查询给了我一个线索 但并不能帮助我确定确切的过程 我可以在 Wireshark 中看到本地端口号 但请求太短暂 无法被 TCPView 接收 有没有可以捕获 DNS 请求和 PID 的日志记录工具 过
  • 有没有办法链接linux的线程TID和pthread_t“线程ID”

    在 Linux 上 线程由pthread t或 TID 我正在寻找这两种线程 id 之间的桥梁 given a pthread t我可以得到它吗TID 显然 https stackoverflow com questions 558469
  • 如何查看linux中特定进程每5秒的内存消耗情况

    我只是想知道如何找到特定进程在特定时间 比如5秒 的内存消耗 我是linux新手 因此 详细的步骤将不胜感激 Use top p PID其中 PID 是进程 ID 应显示有关进程的信息 包括使用的系统内存百分比 类型d以及一个以秒为单位的整
  • mysql.server 启动时出现 PID 错误?

    我刚刚尝试使用自制程序 在 Mac OS X 10 6 上 安装 MySQL 但我在第一个障碍时遇到了问题 当尝试手动启动服务器 mysql server start 时 出现以下错误 ERROR Manager of pid file q
  • 如何通过MATLAB命令获取外部程序(由MATLAB调用)的PID?

    我很好奇如何获取 MATLAB 在 Windows 中 调用的外部程序的 PID 例如 我通过命令调用 MATLAB 中的记事本 记事本 exe or 系统 记事本 exe 我想在调用此记事本后立即获取它的PID 由于一台计算机上可能会同时
  • 如何通过VBA获取当前Excel实例的进程ID,而不使用标题?

    如何获取运行 VBA 代码的当前 Excel 实例的进程 ID 我不想通过标题中的名称来请求它 当我有两个或多个具有相同标题的 Excel 实例时 这会导致问题 您可以使用此方法来获取当前进程ID Declare Function GetC
  • docker 容器无法启动,因为现有的 pid 文件

    当我启动 docker 容器时 它会失败 因为现有的 pid 文件 root newhope sergio docker logs sharp shockley httpd pid 1 already running httpd pid 1
  • 如何将文本文件中的变量获取到 Bash 变量中

    简单的问题 在 BASH 中 我试图读取 pid 文件来终止进程 如何将该文件读入变量 我发现的所有示例都试图以多行方式阅读 我只想读取仅包含 PID 的一个文件 bin sh PIDFile var run app to kill pid
  • 如何在 alpine 中使用 ps 命令获取特定 PID 的进程名称

    在基于 ubuntu 的 docker os 中 ps PID USER TIME COMMAND 1 postgres 0 00 postgres 47 postgres 0 00 postgres checkpointer proces
  • 启动 psexec 后获取进程 ID

    我有一个使用 psexec 在远程计算机上调用记事本的脚本 有什么办法可以在启动后获取进程ID吗 这是我所拥有的 PCname MyPC SessionID 2 Program Notepad exe FilePath C temp Fil

随机推荐

  • python的格式str.format

    下面是一些常用的格式化规则 对齐规则 使用 lt 或 gt 分别表示左对齐 居中对齐和右对齐 宽度规则 使用一个整数表示输出结果的宽度 精度规则 使用 加一个整数表示浮点数的小数点后的位数 类型规则 使用一个字符来指定输出结果的类型 常用的
  • apt 和 apt-get 区别

    文章目录 1 apt 的由来2 apt 和 apt get 的区别3 应该使用 apt 还是 apt get xff1f 1 apt 的由来 Ubuntu Linux Mint和elementary OS 等发行版的 Linux 均是基于D
  • 你是我的眼:水哥王昱珩带你重新打量这世界

    水哥 王昱珩在 最强大脑 舞台上凭借着 微观辨水 一战成名 在节目中 xff0c 他以1秒四杯的速度从520杯同质同量同水源的水中 xff0c 迅速找出了之前被随机选中的那杯 xff0c 甚至看出了这杯水从被选中拿起观察再到放回原位 xff
  • 性能优化与内存优化

    性能优化 主要以这四个方向进行优化 xff1a 稳定流畅耗损apk 瘦身 稳定 避免内存溢出异常捕获反馈机制 流畅 卡顿的原因 xff1a 布局复杂动画过多View 的过度绘制UI 耗时操作频繁 GC 耗损 减少没必要的网络访问或合并相关网
  • (2)工作空间

    工作空间 特点创建工作空间编译添加环境变量 特点 1 工作空间的主要作用是存放工程文件和文件代码 xff08 存放工作空间和代码的一个文件夹 xff09 2 ROS的开发依赖于工作空间 3 编写源代码 编译都是在工作空间下完成的 4 一般工
  • 工程伦理 清华大学 MOOC 期末答案 2020冬

    前言 xff1a 答案是本人自己查阅 不保证其完全正确性 xff0c 仅供参考 点个赞再走呗 xff1a xff09 1 单选题 1分 以下不属于安全文化的核心的是 D A 人的安全知识 B 人的安全意识 C 人的安全技能 D 人的安全装备
  • HTML移动端的基本了解

    文章目录 前言 一 PC端与移动端的区别 PC端 xff1a 移动端 xff1a 二 视口 布局视口 视觉视口 理想视口 meta视口标签 三 二倍图 四 移动端开发选择 单独制作移动端页面 主流 响应式页面兼容移动端 其次 总结 前言 分
  • 树莓派4B(armv7l,arm32)buster部署英特尔第二代神经计算棒,示例:运行darknet-yolov4-tiny

    记录整个部署的步骤 英特尔第二代神经计算棒 xff08 Intel NCS2 xff09 的使用需要到OpenVINO官网下载安装某一个版本的软件 xff0c 目前是支持Windows Linux和树莓派的Raspbian OS 下面贴出来
  • 树莓派结合英特尔神经计算棒二代(NCS2)的openvino包部署人工智能应用

    利用树莓派和英特尔神经计算棒二代 xff08 NCS2 xff09 进行边缘端AI硬件平台部署三部曲 xff1a 二 xff09 树莓派4B和NCS2配置时cmake编译报错以及import error can t find moudle
  • 树莓派报错“Cannot currently show the desktop”的完美解决办法

    最近在利用树莓派部署神经网络的时候出现了一些大大小小的问题 xff0c 很多问题都可以在网上直接或间接地找到答案 xff0c 但有个别问题即使按照网上的高赞博客说的去做了仍然没用 笔者根据最近遇到的有关树莓派VNC win10远程桌面连接
  • Nvidia Jetson XAvier NX开发套件从装机到pytorch环境搭建YoloV5+DeepSort+TensorRT

    目录 1 刷机与装机1 1 准备VMware工作站和linux的unbuntu16 04虚拟机 xff1a 1 2 将SD上的系统移动至SSD1 3 SSH配置1 4 查看Jetpack版本1 5 启动风扇 2 深度学习环境配置2 1 py
  • Python+OpenCV+matplotlib+wxPython实现的图像处理程序

    Python 43 OpenCV 43 matplotlib 43 wxPython实现的图像处理程序 背景 xff1a 本学期多媒体技术原理与应用课程的实验部分代码结果截图结语 背景 xff1a 本学期多媒体技术原理与应用课程的实验 本学
  • 按量购买阿里云服务器、k8s集群

    基础配置 创建私有网络 注意这里的交换区必须和服务器的所选区相同 连接测试 ping a 172 31 0 141 172 31 0 143 172 31 0 142 ping一下私有网络 ping 172 32 0 141 设置弹性ip
  • 小米6渲染图曝光 边框惊艳 国产曲面旗舰要发黑色版

    昨天咱们刚刚说过 小米6会有陶瓷版本 并且估计会在四月发布 今天 网友的渲染图又来了 没上车的赶紧上车 别忘了底部打卡 最近 对于小米6的传言很众多 xff0c 但不管怎么说 xff0c 骁龙835处理器 IMX400传感器以及高屏占比等都
  • 时间戳对齐的简单算法(原创)

    实际融合算法过程中常常出现时间戳对不齐的情况 为了解决此问题 xff0c 用了两个队列来解决时间戳匹配问题 时间戳对齐算法实现原理如下下图为插入状态 如图所示共有两个队列 xff0c 有七个状态 xff0c 通过对于轮速递推结果的动态保存
  • java中equals和==的区别(简单介绍)

    java中equals和 61 61 的区别 简单介绍 equals方法是java lang Object类的方法 有两种用法说明 一 对于字符串变量来说 xff0c 使用 61 61 和 equals 方法比较字符串时 xff0c 其比较
  • 如何上传到GitHub的main分支而不是master分支

    由于在2020年10月01日后 xff0c 在 GitHub 上创建的仓库都默认命名为 main 而非原本的 master 所以 有人看了我的 https blog csdn net m0 46419510 article details
  • Python中的Pandas、Matplotlib库详解

    文章目录 Pandas数据分析库Pandas的基本数据结构访问数据算术运算和对齐数据整理 Matplotlib绘图库Matplotlib简介几种常见的图形多图绘制使用Pandas绘图 Pandas数据分析库 1 xff09 Pandas是目
  • 卡尔曼滤波模型及Matlab模型建立

    目录 一 卡尔曼滤波 1 概念解析 xff1a 2 卡尔曼滤波的最优估计模型 3 实例 小车匀加速直线运动 4 Matlab建模 二 扩展卡尔曼滤波 xff08 EKF Extended KAlman Filter xff09 1 非线性系
  • 智能车 PID 调试

    智能车 PID 调试 文章目录 智能车 PID 调试学习目的开环控制与闭环控制开环控制闭环控制小结 PID 概述简介PID 公式 xff1a 舵机 PID分析算法 电机 PID分析算法调试口决 注意事项 学习目的 使电机速度和舵机转向更精准