【Arduino小车实践】PID应用之四驱小车

news/2024/5/20 21:07:36/文章来源:https://blog.csdn.net/weixin_62403234/article/details/131686786

一、 PID公式

二、 PID应用的必要性

1. 四驱小车运动

左边两个驱动轮和右边两个驱动轮的速度相同直线
右边轮子的速度大于左边轮子的速度左偏
右边轮子的速度小于左边轮子的速度

右偏

2. 产生多种运动的原因

        小车的4个电机,减速箱以及车轮在物理层面上存在误差,虽然给4个轮子通了相同pwm(电流),但是却没办法保证运行时车子的4个轮子的转速相同。

        我们只知道通过改变电流让电机旋转起来,却不知道轮子的实际转速,所以没法保证小车跑直线。这就是开环控制

3. 解决方案分析

        小车跑偏就是因为小车现在的控制系统是开环的,只能用pwm控制电机让它旋转,并不知道轮子的实际速度是多少。

        只有知道了方向是否发生了偏转,才能进一步对小车的运动方向进行控制调整。例如,往左偏了,我们就把右边的轮子速度降低一点。如果往右边偏了,我们就把边的轮子速度升高一点。

4. 解决方案

        引入反馈信号:如果我们能得知车子的运动方向,就可以对车子的方向加以纠正,控制小车跑直线(闭环控制)。

(1)给小车安装电子陀螺仪

        用它来测量小车运行的方向信号,从而控制单片机pwm的输出值(input)去修正电机的工作电流,从而修改轮子的实际速度(output),从而纠正小车的跑偏的问题,从而使用PID技术实现方向对小车方向的闭环控制。

        闭环比开环多了反馈信号feedback。我们这里的feedback信号选用了电子陀螺仪的偏转角(yaw值)。根据闭环控制,设计一个小车的实际控制方案,例如,保持左边的轮子速度不变,当车子向右发生偏转时,我就加快右边轮子的转速。当车子向左偏的时候,我就降低右边轮子的转速。

(2)确定反馈信号量和控制量之间的比例关系

方向没有发生改变反馈为0输出变化为0 ,不需要改变输出值
车子往右偏改变右轮的速度输入变化是?输出应该改变?
车子往左偏改变左轮的速度输入变化是?输出应该改变?

        输入信号和输出信号存在一种比例关系,即传感器的值yaw驱动电机的pwm的值存在一种比例关系(比例P)。方向偏的越多,那么右轮的pwm应该越大,方向偏的越少,右轮的pwm应该越少。方向偏的多少(偏差error)就是[yaw的目标值]-[yaw的当前值]

        出现的问题原因:左轮输入的Input和右轮驱动输入的Input是一样的,但是由于左轮和右轮的执行器有差异,导致左轮的Output1和右轮的Output2的值不一样。于是我们保持左轮依然使用开环系统,而把右轮系统改成可以调整转速的闭环系统。这样使得输入右轮系统的数值就不仅仅是Input了,还增加了电子陀螺仪反馈回来的偏转角(jaw)的误差值error。把这两个数值通过控制器处理后,再输入到执行器,让右轮最终产生的Output2等于左轮的Output1

(3)在系统的Controller部分引用PID比例部分

pwm=error*Kp+input

error=yaw的目标值-yaw的当前值

根据error的值的大小设定一个比例系数Kp,Kp是一个系数常数,需要根据系统的性能手动设定。然后加上原来input,形成新的pwm值。

当小车发生右偏时当小车发生左偏时
偏转角测量出来的当前测量值就会跟初始方向产生一个误差error偏转值跟初始方向同样产生一个error
假设初始方向是1
第一次测量测出来是0.2第一次测量测出来是1.2
error = 1-0.2=0.8,pwm就不等于input了,而是input+0.8Kperror = 1 - 1.2 = - 0.2,pwm就不等于input了,而是input-0.2Kp
由于0.8Kp是一个正数,所以最总pwm也就是升高由于-0.2Kp是一个负数,所以最终pwm也就是降低
右轮的速度就会增加,小车开始往左,纠正小车右偏右轮的速度就会减小,小车开始往右偏,纠正小车左偏

        因为电子陀螺仪的采样率大概为100ms一次。所以需要在计算机里每100ms 采样一次得到yaw的值:error = [yaw的目标值]-[yaw的当前值]。新的pwm=error*Kp+input,用来驱动右轮的电机。

        Kp值的选取:只有在Kp选取到一个合适的值,小车才能保持直线。

Kp过大震荡,小车会摇摆行驶
Kp过小纠正的不够,产生稳态误差

        稳态误差产生的原因:纠正的过程中,当前的测量值会跟目标值越来越小,那么error就会变得很小,使得error*Kp 也会变得很小; error*Kp 由于过小就会失去纠正的作用,离目标值始终存在一个误差,称之为稳态误差

(4)在系统的Controller部分引用PID积分部分

        问题:合适的Kp是很难找的,我们可以引入E*Ki(误差的积分)。当 error*Kp 部分的量纠正不够的时候,可以靠 I 部分的量(对每100ms测量出来的误差进行累加)来补充上去。

        假设:a. 开始向右偏转,只要不向左偏转,I 值是一直增加的。b. P 的输出一开始是比较猛的,但是当越来越靠近目标。c. 当 P 因误差 error 过小失去调整作用时,可以用 I 积分部分来弥补比例部分的稳态误差。

pwm = error * Kp + E * Ki + input

E = 每次测量的error 的累加和,系统每100ms测量一次jaw的值,每次测量的jaw的值和jaw的目标值有一个差值,我称之为err,把每次测量的err累加在一起就是E。

E*Ki 过大会出现积分饱和,系统依然会振荡
E*Ki 过小纠正不够

(5)在系统的Controller部分引用PID微分部分

        我们可以通过限制 I 的最大值的方法,来进行限制。也可以再增加一个微分量 D*Kd,Kd为系数常数。每100ms测量一次jaw偏转角,而D指的就是这一次的误差和上一次测量的误差之间的差值,是一个反映误差纠正快慢的量,重点是负值。

        在图上看,就是图像变化陡峭的部分。当Input加上这个值以后,系统可以有效抑制运行过程中变化过快的部分,比如振荡期。而对变化缓慢的部分,比如稳定期,微分部分几乎就不起作用。有点像起一个柔和的缓冲作用。

pwm = error * Kp + E * Ki + D * Kd + input

D=当前一次测量的error - 上一次测量的error,每100ms测量一次jaw,并计算出err,D反应的是系统的err变化率。所以err变化剧烈的区域,D会对总的输出值进行抑制,防止剧烈的振荡,而稳定之后的区域,D对输出值的影响就很小了。

三、程序编写

1. 核心公式

pwm = error * Kp + E * Ki + D * Kd + input

2. 相关参数及说明

pwm控制左边轮子和右边轮子的速度在650-899的范围内,pwm的值越大,轮子的速度越快。低于650时 小车不运动了。
E每次测量的error加到一起电子陀螺仪PDU6050测量的偏转角值为jaw。按下小车启动按键时,测量到的 jaw 就为目标值。之后每100ms测量出来的 jaw 值为当前值,用目标值减去当前值为每次测量的误差error
D0/

        最后每100ms 计算一次公式 pwm = error * Kp + E*Ki + D * Kd + input ,把计算出来的pwm值作为右轮的电机驱动的参数,代入电机的驱动程序里,根据实际场景调整一下系统参数Kp,Ki。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_330205.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【文章系列解读】Nerf

1. Nerf NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 2020年8月3日 (0)总结 NeRF工作的过程可以分成两部分:三维重建和渲染。(1)三维重建部分本质上是一个2D到3D的建模过程&#xff…

两种传输层协议TCP和UDP【图解TCP/IP(笔记十二)】

文章目录 两种传输层协议TCP和UDPTCP与UDP区分UDP的特点及其目的TCP的特点及其目的 两种传输层协议TCP和UDP 在TCP/IP中能够实现传输层功能的、具有代表性的协议是TCP和UDP。 ■ TCP TCP是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排…

排序算法笔记-归并排序

归并排序 简介 通过找到中间值,然后递归分别从左区间和右区间找中间值,最终将所给的值划分为单个块,然后进行一步一步回溯,分块由两个单个分区排序后合成一个,以此类推,最后实现有序排序 时间复杂度 最…

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网?网关地址是谁定的,是配置路由的人随意定的吗?(配置人员定的)如何正确设置网关地址(路…

[MySQL]MySQL内置函数

[MySQL]MySQL内置函数 文章目录 [MySQL]MySQL内置函数1. 日期函数2. 字符串函数3. 数学函数4. 其他函数 1. 日期函数 常用日期函数如下: 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时…

无法将“pip“识别为cmdlet、函数、脚本文件或可运行程序的名称。

出现问题如下: 出现问题原因: 没有添加pip对应的安装目录进入环境变量里面的系统变量。 解决方案: 1.确定python的安装路径 将python的路径添加到系统变量中 2.输入pip所在的安装路径: python路径\Lib\site-packages 3.添加…

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

程序员,到美国!赚美元!!!

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Python 和 RabbitMQ 进行消息传递和处理

一、RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件,它实现了高级消息队列协议(AMQP)标准。它的官方客户端提供了多种编程语言的接口,包括 Python、Java 和 Ruby 等。它支持消息的持久化、多种交换机类型、消息通知机制、灵活…

Orange pi3初调试

因为树莓派沦为理财产品1年前出手殆尽后,现在唯一一个B性能不足一直没动力调试,沦为吃灰工具。 偶然之间多多给推了个orange产品预售,看了下pi3的参数,这不和赚了差价的3B一个性能吗?果断定了个预售款,在差…

2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】

🎈前言 为了方便大家可以重点复习某个模块,所以将各方面的知识点进行了拆分并更新整理了新的内容,并对之前的版本中有些模糊的地方进行了纠正。此篇文章为Unity所有面试题模块的目录导航文章,全网最全的 Unity 面试题 都在这里了…

反转链表 (反转整个链表+反转部分链表)

简单问题:反转整个链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 解题思路: 1.因为反转后链表的末尾节点是原链表的头节点,所以一开始将头节点的后驱保存起来; 2.将头节…

漏洞攻击 --- TCP -- 半开攻击、RST攻击

TCP半开攻击(半连接攻击) --- syn攻击 (1)定义: sys 攻击数据是DOS攻击的一种,利用TCP协议缺陷,发送大量的半连接请求,耗费CPU和内存资源,发生在TCP三次握手中。 A向B…

计算机视觉的图像标注与视觉任务

1 ​计算机视觉应用 计算机视觉是一种利用计算机和数学算法来模拟人类视觉的技术,可以应用于许多领域。以下是计算机视觉的八大应用: 图像识别:利用计算机视觉技术,可以对图像进行分类、识别和分割,从而实现自动化的…

AI + 电力、大模型主题师资培训落地,飞桨持续赋能AI人才培养

随着数字浪潮袭来,人工智能的发展声势浩大,高校人工智能专业建设以及AI的人才培养已经提上日程。如何夯实产教融合,加快人工智能研究创新,培养具备AI系统能力和电力行业知识的拔尖人才,是推进电力产业智能化升级的迫切…

uniapp 封装公共方法(无需每个页面引用,直接调用)

封装方法: 1. 在根目录下建立common文件夹 创建com.js 2.在main.js中挂载(写在定义vue之后) import $com from /common/com.js Vue.prototype.$com $com 3.在com.js中按照以下格式定义方法 export default {//定义需要的方法 } 4.使用 click"$com.已经定义的方法名&q…

分布式ELK 企业级日志分析系统

一、ELK的相关知识 1.ELK简介 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch:是基于Lucene(一个全文检…

Flutter入门教程(一),2023最新版包含安装,初始化!简单易懂!

Flutter入门教程(一),2023最新版包含安装,初始化!简单易懂! Flutter介绍 首先,在一切的开始之前我们来介绍一下什么是Flutter,Flutter 是一个由 Google 开发的开源移动应用程序开发…

永久区和元空间的区别

一文搞懂JVM之 方法区、永久代、元空间三者的区别 - 知乎 元空间和永久代的区别-腾讯云开发者社区-腾讯云 方法区和永久区/元空间之间的关系 - 简书 方法区(Method Area),是JVM规范中提出的一个(概念),用于存储类信息、常量池、静态变量、JIT编译后的代码等。 Th…

大模型基础知识 - 语言模型及其演进 公开版

本文为作者内部分享文档,由于不涉敏可以公开,分享本身是课程形式,有什么疑问欢迎在评论区留言。 开场白 人工智能发展到现在,在2个重要领域取得了重大突破,有望达到人类水平: 计算机视觉 (Com…