PID智能小车快速入门(一)

这篇具有很好参考价值的文章主要介绍了PID智能小车快速入门(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基本PID原理

        1、什么是PID?

                PID控制器是一种线性控制器,通俗的来讲如人走直线一样,眼睛是观测器,下肢为执行器,当走偏了由眼睛观测得出当前位置和直线的偏差,由人脑根据偏差调整脚步回归直线的过程就是一个负反馈调节的过程,而PID控制器就是得到偏差,然后通过PID算法,将输出作用于被控对象上,使其达到并在给定值附近稳定,如水温的恒温控制,电机转速控制,舵机打角控制。PID作为一种简单的控制算法广为应用。

                以下是典型PID的控制结构图

智能小车走直线pid调节,智能车,单片机,python

偏差err=给定值-测量值。

以小车编码电机为例 偏差=目标值转速(编码器值)-编码器采集值。

        2、PID算法的构成

                网上关于PID的教程以及算法的推导内容丰富,本文章旨在快速部署PID算法于控制器上,所以算法推导不过多讲解。

                以下列出基本公式:

智能小车走直线pid调节,智能车,单片机,python

                可以很明显看出基本PID整体算法由 比例环节(P) : Kp*err(t),积分环节(I) : Ki*每次偏差的累积, 微分环节(D) : Kd*偏差的变化率(当前的偏差-上一次的偏差)。

                 由公式看出式子中含有积分时间常Ti,微分时间常数Td所以通常PID算法应部署在有固定时间周期运行的部分,如有固定周期的中断内。

                 比例环节:比例环节没有时间常数,所以它成比例的反应偏差信号,偏差一旦产生,控制器立即执行,以减少偏差。体现出当前控制。

                 积分环节:积分环节主要作用是消除稳态误差,使得输出更逼近目标值,积分强弱取决于时间常数的大小,由Ki决定,预防偏差累积过大一般需要对积分值做限值处理。体现出历史控制。

                 微分环节:微分环节反应偏差值的变化率,能够估计偏差变化趋势,当过大偏差到来时提前引入一个有效的修正信号,提高系统速度,减少调节时间。体现出将来控制。

                 总结:PID控制过程=给定目标值----->观察实际值----->得出偏差----->当前+历史+预判=下一个时刻应该输出值。

二、算法转换

         1、位置式PID

                公式:输出值=比例常数(Kp)* 偏差值 + 积分常数(Ki)* 累积偏差值 + 微分常数(Kd)* (当前偏差 - 上一次偏差) 

                累积偏差值 + = 当前偏差 

                最小累积偏差<=累积偏差值<=最大累积偏值

        2、增量式PID

                增量式PID实际上表示的是位置PID的变化量化简后得出。

                公式:输出值 + = Kp * ( 当前偏差 - 上一次偏差 ) + Ki * 当前偏差 + Kd * [当前偏差 - 2*上一次偏差 + 上上次偏差(err(k-2))]

        3、总结对比

                输出不同:位置式pid输出为控制值,而增量式pid输出为控制值的变化量。

                积分环节:位置式pid带有积分环节,而增量式只是对前两次偏差进行运算无积分环节。

                应用场合:位置式pid常用于无积分环节执行机构如舵机,电磁阀等。增量式pid常用于有积分环节执行机构如步进电机,直流电机。

                注:还常采用PD、PI控制等可以自己尝试使用。PID控制算法是一种比较常见的控制算法,还有经典的LQR,大林算法等等读者可以自行学习比较优缺点应用场合。下一章会讲解进一步根据控制需要对应变化改进的PID算法。

三、python代码仿真       

text.py

#text.py
import PID #导入上面的PID算法
from time import sleep
#导入绘图
import matplotlib.pyplot as plt
import numpy as np

def test_pid(Kp, Ki , Kd, target, time):
    #位置式PID

    pid = PID.Positional_PID(Kp, Ki, Kd, target)

    #增量式PID

    #pid = PID.Incremental_PID(Kp, Ki, Kd, target)
    
    feedback = 0
    feedback_list = []
    time_list = []
    target_list = []
    
    for i in range(1, 50):
        
        output = pid.PID_OUT(feedback)
        feedback +=output #PID控制系统的函数
        
        feedback_list.append(feedback)
        target_list.append(target)
        time_list.append(i)
        #时间间隔实际没有作用,有时间再加上哈哈
        sleep(time)

    feedback_list[0]=0
    target_list[0]=1.1
    #显示输出曲线
    plt.plot(time_list,feedback_list)
    #显示目标对比折线
    plt.plot(time_list,target_list,color='red',linewidth=1,linestyle='--')
    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    Kp = 1.5
    Ki = 0.002
    Kd = 0.03
    target_value = 100
    time = 0.01
    test_pid(Kp, Ki, Kd, target_value, time)

  PID.py

import time
#位置式PID
class Positional_PID(object):
    
    def __init__(self, P, I, D, Target):
        #对参数值初始化
        self.Target_value = Target  #目标值
        self.last_error = 0.0       #上一次误差
        self.Integral_value_min = -4000  #累积误差的最小限幅
        self.Integral_value_max = 4000   #累积误差的最大限幅
        self.Output_value = 0.0          #输出值
        self.Integral_value = 0.0        #累计值
        self.Kp = P                      #比例常数
        self.Ki = I                      #积分常数
        self.Kd = D                      #微分常数
        
    def PID_OUT(self, Feedback_value):
        #根据给定值和返回值求出偏差
        error = self.Target_value - Feedback_value  
        #求偏差累积值
        self.Integral_value  += error 
        #对累积值进行限幅
        if (self.Integral_value <= self.Integral_value_min):
            self.Integral_value = self.Integral_value_min
        if (self.Integral_value >= self.Integral_value_max):
            self.Integral_value = self.Integral_value_max
        #输出值等于比例部分 + 积分部分 + 微分部分
        self.Output_value=self.Kp * error + self.Ki * self.Integral_value +self.Kd * (error - self.last_error)
        #传递上一次误差
        self.last_error = error
        
        return self.Output_value

#增量式PID
class Incremental_PID(object):
    
    def __init__(self, P, I, D, Target):
        self.Target_value = Target
        self.last_error = 0.0            
        self.last_last_error = 0.0       #上上次误差
        self.Output_value = 0.0

        self.Kp = P
        self.Ki = I
        self.Kd = D
        
    def PID_OUT(self, Feedback_value):
        #根据给定值和返回值求出偏差
        error = self.Target_value - Feedback_value  

        #输出值等于比例部分 + 积分部分 + 微分部分
        self.Output_value +=self.Kp * (error - self.last_error) + self.Ki * error +self.Kd * (error - 2 * self.last_error + self.last_last_error)
        self.last_last_error = self.last_error
        self.last_error = error
        #print(self.Kp * error)
        
        return self.Output_value

效果图:智能小车走直线pid调节,智能车,单片机,python

整定参数后:智能小车走直线pid调节,智能车,单片机,python

 总结:PID算法的构造原理并不难理解,难在调参,调参有经验调参,公式化简的归一化调参,还可以利用Simulink参数自整定等等需要读者自行摸索,由于时间有限程序并未进行图形插值化显示,以及没有体现时间周期对于参数调整的影响,读者自行部署执行机构后尝试后应该可以明白时间常数的影响。由于自身水平有限,第一次编写博客,随时欢迎提出修改意见。文章来源地址https://www.toymoban.com/news/detail-806558.html

到了这里,关于PID智能小车快速入门(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PID控制参数整定(调节方法)原理+图示+MATLAB调试

    原文链接:https://blog.csdn.net/viafcccy/article/details/107988093 首先最重要的是了解每个参数调节了系统响应的那些属性,通过观察响应从而调节参数改变属性。 PID的作用概述: 1、P产生响应速度和力度,过小响应慢,过大会产生振荡,是I和D的基础。 2、I在有系统误差和外力作用时

    2024年02月03日
    浏览(28)
  • ARDUINO NANO 的 PID 循迹小车

    ---------------------------------------------------------------------------------------------------------------------------------  作品展示:     前言:         大多数机电一体化或机器人爱好者可能会通过制作一个 巡线机器人 来开始他们的机器人建造之旅。因为巡线机器人非常容易制作,而且很吸

    2024年02月03日
    浏览(27)
  • ROS仿真gazebo小车寻迹PID【第一期】

    本篇内容为笔者在2022.5.11完成的,与某个比赛相关,所以当时没有发布。 而现在是2023.2.21,当时的一番雄心壮志现在已经熄了大半,此外随着时间推移,笔者需要花更多的时间在准备考研上,因此这可能是一期 没有后续 的文章 即便如此,这一篇也实现了一个挺有趣的功能啦

    2024年02月05日
    浏览(53)
  • 树莓派视觉小车 -- OpenCV巡线(HSL色彩空间、PID)

    目录 试错 试错1:形态学处理 试错2:HSV色彩空间 基础理论 1、HSV与HSL色彩空间 2、PID调节 一、OpenCV图像处理 1、在HSL色彩空间下得到二值图 2、 对二值图形态学处理 3、找出线的轮廓和中心点坐标 二、PID 三、运动控制 总代码 一开始用的形态学处理,自行改变阈值,调试之后

    2024年02月04日
    浏览(28)
  • (六)【平衡小车制作】位置式PID、直立环与速度环编程

    本篇文章我将针对 位置式PID算法 、 直立环 、 速度环 等的编程进行详细的讲解,让每位小伙伴能够对这三个概念的编程逻辑有更加清晰的理解。 1.中文公式  直立环输出=Kp1×角度偏差+Kd×角度偏差的微分  // 角度偏差=真实角度-期望角度 2.英文公式  直立环PD控制器:Kp×

    2024年02月03日
    浏览(35)
  • stm32f103基于pid的蓝牙循迹小车

    目录 前言 一、霍尔编码器以及定时器计数原理 二、使用pwm占空比对电机速度进行控制 三、使用systick的中断函数进行pid和速度的计算,还有oled的显示 四、常用的测速方法:  五、pid原理 六、oled的实现 七、蓝牙通信 八、3路循迹模块 总结   经过一个月对stm32的学习,终于完

    2024年02月16日
    浏览(27)
  • 基于PID算法下STM32控制的坡道行驶电动小车(2020年电赛)

    本题源于2020年TI杯大学生电子设计竞赛C题-----坡道行驶电动小车 由于手上没有MSP430/MSP432 板子,所以本篇采用stm32实现 任务 利用 TI 的 MSP430/MSP432 平台,设计制作一个四轮电动小车。要求小车能沿着指定路线在坡道上自动循迹骑线行驶。小车必须独立运行,车外不能使用任何

    2024年02月16日
    浏览(41)
  • 四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹

    目录 前言: 小车效果展示: 5路数字灰度传感器: 巡线思路: 加入PID调节的代码:         之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当初的学习记录。 STM32RCT6主控,5路灰度寻迹,超声波HC_SR04中断式

    2024年02月03日
    浏览(39)
  • STM32通过K210进行PID巡线,使用蓝牙模块与电脑通信从而进行P,I,D参数的调节

    目录 一.前言部分(废话部分) 二.K210色块识别 1.必要知识 2.色块识别 3.单片机的接收代码 三.通过蓝牙连接在电脑上实现PID的调参 我使用的是HAL库,如果你使用的是标准库的话可以根据对应标准库的函数进行更改即可 因为之前使用灰度传感器进行巡线,即使用上PID,最后的效果也

    2024年02月14日
    浏览(32)
  • 基于单片机PID电机控制系统设计

    ** 单片机设计介绍,基于单片机PID电机控制系统设计   基于单片机PID电机控制系统设计是一个综合性的工程任务,旨在通过单片机实现电机的精确控制。以下是该设计的一个概要: 一、系统概述 基于单片机PID电机控制系统利用PID(比例-积分-微分)控制算法,通过单片机

    2024年04月25日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包