草庐IT

Pid算法总结笔记(平衡小车部分)

小_の猫酱 2023-06-17 原文

Pid的三种形式,直立环,速度环,转向环,这三种环代表了小车的三种不同动作,直立,转向,和运行速度,三种不同的构造,三种不同的控制函数,最终的思想都是通过pid算法来控制。

一.Pid算法简介,什么是pid

Pid总共有三个字符,分别是p,i,d,分别代表比例,积分,微分三种不同的计算方式,p可以更快的让控制的点到达所要到达值附近,而d可以快速的来让到达目标值附近的变量快速冷静下来,稳定在目标值附近,而i可以解决偏离目标值过远的情况的局部最优解情况。,至此pid算法也就是说要对于某一变量到达目标值所做的操作函数,也就是一种方法,它包含三个部分,多个函数。

二.平衡小车里面的pid

在平衡小车里面的pid取决于小车也就是该系统下面对于外界的加速度,和各种角度变化的探查能力,也就是在单片机系统中一边就是mpu6050/mpu6090,通过这个东西可以探查到外界的三给roll(角)的变化情况,和及加速度的变化情况以及。所以我们对于控制算法pid也只能用这几个东西来控制。

1.小车的直立环pid

在直立过程中平衡小车之所以叫做平衡小车,是因为小车一开始平衡不了,只有不断地控制小车的轮子的转动才能让小车平衡,在这里引入负反馈可以让小车处于一个平衡状态。

 所以这个函数就是这个样子,通过小车的角度差和相乘,以及角速度和延迟相乘,最后来控制这个小车的pwm的变化过程,所以这个平衡状态可以说很好理解。

公式:【直立环】pwm=kp1*角度偏差+kd*角度微分

/****************************************************
输入参数:角度,平衡角度,角加速度
功能:直立环的控制函数
****************************************************/
int pwm_zhili(float angle,float balance,float Gyro)
{int pwm,Encode,Encode_last;
float kp,kd;//自己设计定义
Encode=angle-balance;
pwm=kp*Encode+kd*Gyro;
return pwm;
}

2.小车的速度环

何为速度环,比如小车他自己突然收到了要向前前进的指令,而一开始速度为0,要快速达到那个指定的速度的变换控制函数叫做速度环,要得到速度环必须要知道当前的速度为多少,这个才是速度环控制的关键,所以要选取那种编码器马达。在得到数据方面可以用一阶滤波公式

Y=a*x+(1-a)*Y_last

Y是本次输出,x是本次输入,Y_last是上一次输出

a是滤波系数,1-a越大,惯性(滞后)越大,说明本次的输出和上一次的输出关系越大

为什么要滤波是因为数据中存在噪音,所以我们滤波可以很高效的得到准确值。

在速度换里面还是用速度*Kp+速度变化*kd,从而来快速到达结果

公式【速度环】 pwm=kp2*速度偏差+kd*速度微分

/****************************************************
输入参数:目标速度,左轮速度,右轮速度
功能:速度环控制函数
****************************************************/
int speed_last=0,speed=0;
int pwm_speed(int speed,int now_left,int now_right)
{
int Encode_speed=(now_left+now_right)/2-speed;///速度偏差
int a=0.2;//(低通滤波)
int kp,kd;
speed=(now_left+now_right)/2;
pwm=kp*Encode_speed+kd*(speed-speed_last);
speed_last=speed;
return pwm;
}

其中speed和speed_last是全局变量可以得到前后的差。

3.小车的转向环

转向环故名思意,是控制转向活动的环所以我们照样沿用上述思路,使用PD算法,

【转向环】公式:pwm=kp*左右速度差和预订速度差的差+kd*转向角速度微分

左右速度差可以使用编码转向器来得到左右速度从而得到转向速度差

转向角速度微分可以参考z轴角加速度,这样子就可以很轻松的解决转向环问题

/****************************************************
输入参数:左轮速度,右轮速度,偏转速度差(预定值),z轴角加速度
功能:转向环控制函数
****************************************************/
int pwm_zhuanxiang(int left,int right,int turn,int z_groy)
{int turn_now=left-right;//这里姑且算作这样
int Encode=turn_last-turn;
int kp,kd;
pwm=kp*Encode+kd*z_groy;
return pwm;
}

4.最终的组合串行pid

在之前的pid算法中会出现一个问题,就是小车前进或者转向的时候小车不包吃平衡,所以有必要把小车的直立环,速度环,转向环综合起来形成串行pid。

【串行pid】公式:pwm=a*直立环值+b*速度环值+(1-a-b)*转向环

其中a,b都是参数,这样子虽然有点简单粗暴,但是可以实现。

有关Pid算法总结笔记(平衡小车部分)的更多相关文章

  1. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  5. ruby - 如何使用部分字符串搜索数组并返回索引? - 2

    我想使用部分字符串搜索数组,然后获取找到该字符串的索引。例如:a=["Thisisline1","Wehaveline2here","andfinallyline3","potato"]a.index("potato")#thisreturns3a.index("Wehave")#thisreturnsnil使用a.grep将返回完整的字符串,使用a.any?将返回正确的true/false语句,但都不会返回匹配的索引找到了,或者至少我不知道该怎么做。我正在编写一段代码,该代码读取文件、查找特定header,然后返回该header的索引,以便它可以将其用作future搜索的偏移量。如果

  6. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  7. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  8. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  9. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  10. ruby-on-rails - 如何将数据传递给部分? - 2

    K伙计们,所以我创建了这个赞成/反对的投票脚本(基本上就像stackoverflow上的那个),我试图向其中添加一些Ajax,这样页面就不会在您每次投票时都重新加载。我有两个Controller,一个叫grinder,一个叫votes。(磨床基本都是帖子)所以这是所有研磨机的索引(看起来像这样)这是该页面的代码。Listinggrinders"grinders/grinders")%>这就是我在views/grinders/_grinders.erb中的内容true)do|u|%>grinder.id%>"up"%>'create')%>true)do|d|%>grinder.id%>

随机推荐