智能车制作——速度环PID

2023-11-04

  做了智能车写这个做个记录,各位大佬勿喷。

PID控制器

  PID 控制器(比例-积分-微分控制器)是一种通过控制系统的偏差来调整输入信号的线性反馈控制算法。通俗的说,它可以给出使执行器(电机)快速准确到达目标的“指导方案”。

反馈

  反馈是指将系统输出量通过恰当的检测装置,返回到输入端,与输入量进行比较,并以某种方式改变输入,进而影响系统功能的过程。

开环与闭环

  在智能车控制中开环意味着电机的PWM是我们自己随便给的一个固定值:而闭环系统的电机PWM是PID控制器的输出。

PID组成

  PID 实际上是一个作用于闭环系统的控制算法,由三个部分组成,分别是 P 比例环节,I 积分环节,D 微分环节。
在这里插入图片描述

比例环节

  PID 比例控制器实际上就是个放大倍数可调的放大器,即△P=Kp×e,式中Kp为比例增益,即Kp可大于1,也可小于1;e为控制器的输入,也就是测量值与给定值之差,又称为偏差。
  PID 比例控制有个缺点,就是会产生余差,要克服余差就必须引入积分作用。

积分环节

  控制器的积分作用就是为了消除自控系统的余差而设置的。所谓积分,就是随时间进行累积的意思,即当有偏差输入e存在时,积分控制器就要将偏差随时间不断累积起来,也就是积分累积的快慢与偏差e的大小和积分速度成正比。只要有偏差e存在,积分控制器的输出就要改变,也就是说积分总是起作用的,只有偏差不存在时,积分才会停止。

微分环节

  微分项主要是用来加快系统反应的,但如果微分作用过强,则可能由于变化太快二引起自身震荡。

PID代码理解

{
本次误差 = 目标值-实际值
P输出 =Kp 本次误差
I输出 += Ki
本次误差
D输出 =Kd *(本次误差-上次误差)
ID输出 = P输出+I输出+D输出
上次误差 = 本次误差
}
  注意要进行 积分限幅,即将积分项做一个最大最小限制

位置式与增量式

  上面的PID理解也就是位置式PID,下面是增量式PID的理解
{
本次误差 = 目标值-实际值
P输出 =Kp (本次误差-上次误差)
I输出 = Ki
本次误差
D输出 =Kd (本次误差-2上次误差+上上次误差)
ID输出 += P输出+I输出+D输出
上上次误差=上次误差
上次误差 = 本次误差
}
即:

void Left_Speed_Control()
{
  float Left_Speed_Erro = 0.0 ;       //左电机误差
  Left_Speed_Erro     = Speed_Goal - Left_Encoder ;   //Left_Encoder :编码器反馈值
  Left_Speed_PID.OUT += (Left_Speed_PID.P * (Left_Speed_Erro - Left_Speed_Lasterro)  +
		  	  	  	  	 Left_Speed_PID.I * Left_Speed_Erro +
						 Left_Speed_PID.D * (Left_Speed_Erro - 2 * Left_Speed_Lasterro + Left_Speed_Preverro));
  Left_Speed_OUT      =  Range_protect((int)Left_Speed_PID.OUT,-9000,9000);   //输出限幅
  Left_Speed_Preverro = Left_Speed_Lasterro ;
  Left_Speed_Lasterro = Left_Speed_Erro ;
}

  增量式与位置式主要区别:
    1、位置式PID的积分项是以前所有的误差和,容易产生大的累积误差,而增量式仅与最近几次有关,影响小
    2、位置式PID需要进行积分限幅和输出限幅,而增量式PID只需要输出限幅。

速度环位置式与增量式调参

  在调位置式速度环时我们先加大Kp值,同时令Ki、Kd为0,查看编码器值和目标值的差值,当反馈回来的编码器值在目标值上下震荡时加入Ki值即可。
  通过上面的代码理解我们可以知道增量式的I就是位置式的P,因此对于增量式我们先加I,再加P,实际现象中当我们的i给很小时电机都能达到目标值。

  我们通过调参要达到的效果是:可以明显看到波形趋于平滑且编码器上下震荡范围小,当我们突然改变目标速度时,编码器值能很快且平滑到达改变后的目标值。

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

智能车制作——速度环PID 的相关文章

  • Video Style Transfer汇总

    Video Style Transfer 非深度方法 Processing images and video for an impressionist effect ACM Press Addison Wesley Publishing C
  • 如何用C语言写一个求离散函数曲率

    要在C语言中求离散函数的曲率 首先需要定义离散函数的数据点 然后使用差分的方法来计算曲率 下面是一个简单的代码示例 include
  • table中嵌套多层table

    因工作业务需求 需要展示一个多层嵌套的数据结构 现整理如下 分享给需要的朋友 应用框架vue2 初始的数据结构如下 new Vue el table1 data table1 order ex 20171006 table2 kind 苹果

随机推荐

  • Linux脚本练习之script063-打印空行的行号

    script063 题目 题目来源于 SHELL5 打印空行的行号 写一个 bash 脚本以输出一个文本文件 nowcoder txt 中空行的行号 可能连续 从1开始 示例 假设 nowcoder txt 内容如下 a b c d e f
  • 我的第一个HBuider项目 ——五子棋

    HBuider是实训老师建议我们使用的 写起代码来感觉很流畅 自动缩进与纠错功能都很不错 之所以做五子棋 也是因为五子棋是一个比较简单的游戏 HBuider上手容易 主要是编写代码有点头大 还好在我的穷追猛打下跟上了老师的节奏 成功完成了我
  • Markdown插入图片

    Markdown 图片语法格式如下 alt 属性文本 图片地址 可选标题 alt 属性文本图片的Alt标签 用来描述图片的关键词 可不填 可用于SEO 方便搜索引擎根据该关键词搜索图片 图片地址 本地图片 网络图片 base64字符串 可选
  • 蓝桥杯:接龙

    蒜头君在玩一种接龙的游戏 蒜头君有 30000张卡片分别放在 30000列 每列依次编号为 1 2 30000 同时 蒜头君也把每张卡片依次编号1 2 30000 游戏开始 蒜头君让让第i张卡片处于第i i 1 2 30000 列 然后蒜头
  • KEIL 调试的 ini 文件有什么用?

    在初学者眼里 调试手段很多 自己平常使用调试手段的具有局限性 单一性 碰到复杂的问题还是很难解决 比如看watch窗口 memory窗口 打断点这些基本的调试手段 就比如新接手中的一个项目 总是会出现串口通信错误 我也知道这是两次数据发送混
  • 轻松拥有美国号码,免费收发短信

    轻松拥有美国号码 免费收发短信 标签 美国 刚刚 国外许多购物 服务 支付等网站注册都需要手机号码验证身份 然而中国的手机号码并不能满足 E g 美区PayPal 在支持PayPal购物的网站利用美区PayPal 可以绕过国卡限制 说道虚拟
  • SQL随机查询

    SQL Server Select TOP N From tablename Order By NewID NewID 函数将创建一个 uniqueidentifier 类型的唯一值 上面的语句实现效果是从Table中随机读取N条记录 Ac
  • React实现插入变量输入框

    React实现变量输入框 组件功能描述 组件效果 组件使用示例 组件实现代码 查看视频效果图代码 组件功能描述 本组件结合antd中的Form和Input组件实现一个变量输入框 该输入框可插入多个变量 其中变量格式为 X1 X2 X3 X4
  • 怎样利用闲鱼赚差价?教你在闲鱼卖货赚钱!

    闲鱼这个二手平台 本质上 是以兴趣鱼塘为媒介 聚拢相同爱好的圈子 让大家彼此交流 出售一些自己用不上的东西 有环保的理念 初衷很好 有需求就有供应 慢慢的很多人以此为主来销售一些产品 相对其他的购物平台来说 他不需要押金 没那么多复杂的规则
  • java 判断输入字符串String 是否为合法数值或两位小数数值double类型

    java 判断输入字符串String 是否为合法数值或两位小数数值double类型 import java util regex Matcher import java util regex Pattern 判断是否为合法 Double类型
  • npm打包失败的原因

    npm打包失败的原因 1 modules依赖安装有没有问题 版本对不对得上 2 node版本不一致 有一些api高版本才有 node v16以上的就兼容了m1芯片的 3 less编译没过 或者其它编译没过 或者将cache loader关掉
  • Opencv2.4.9源码分析——K-Nearest Neighbors

    一 原理 K近邻算法 KNN K NearestNeighbors 是一种非常简单的机器学习方法 它既可以处理分类问题 也可以处理回归问题 而且它的执行效果非常好 KNN是一种懒惰学习算法 lazy learningalgorithm 所谓
  • 动手学深度学习_全卷积网络 FCN

    全卷积网络 fully convolutional network FCN 顾名思义 网络中完全使用卷积而不再使用全联接网络 全卷积网络之所以能把输入图片经过卷积后在进行尺寸上的还原 就是利用转置卷积实现的 因此 输出的类别预测与输入图像在
  • new和delete的底层原理以及模板

    本文主要内容 new和delete的底层原理 什么是模板 模板怎么使用 模板可以声明定义在两个文件里面吗 new和delete的底层原理 前面我们谈了new和delete的使用 以及和C语言里面malloc和free的差别 但是 new和d
  • 密码学理论09:数论和密码学困难问题

    整数模N 符号 Z N Z gt 0 gcd a N 对于 a N Z 令 gcd a N 为最大的 d Z gt 0 使得 d a 和 d N ZN ZN N 除法 余数 模数 令a为整数且令N为正整数 那么存在唯一的整数 q r 其中
  • 计算机丢失disrupt,disrupt造句

    1 In mice the pathogen Citrobacter rodentium can disrupt this layer and cause inflammation and diarrhea 2 Women interrup
  • 指针定义(一级指针和二级指针)以及内存四区

    1 一级指针 1 定义 类型 指针变量名 变量 Int p a 地址 地址是内存的位置编号 是常量不可以修改 指针 一般指指针变量 用来存放地址的 是可以被修改的 2 二级指针 指向一级指针 保存的是一级指针的地址 Int p x int
  • 深搜(dfs)和广搜(bfs)

    深搜 dfs 和广搜 bfs 广搜可以用来解决最小路径问题和连通性问题 深搜可以解决连通性问题 实现方式 深搜用函数递归实现 广搜用队列实现 问题 输入地图判断连通性和最小路径 每次只能走上下左右 S为起点 T为终点 为障碍物 可以走 如以
  • Dart 2.18 正式发布

    互操作性增强 平台特定的网络组件 优化类型推断 以及空安全语言里程碑的近期更新 文 Michael Thomsen Google Flutter Dart 产品经理 Dart 2 18 稳定版也随着 Flutter 3 3 稳定版一起发布
  • 智能车制作——速度环PID

    做了智能车写这个做个记录 各位大佬勿喷 PID控制器 PID 控制器 比例 积分 微分控制器 是一种通过控制系统的偏差来调整输入信号的线性反馈控制算法 通俗的说 它可以给出使执行器 电机 快速准确到达目标的 指导方案 反馈 反馈是指将系统输