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

2023-11-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都是参数,这样子虽然有点简单粗暴,但是可以实现。

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

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

  • 显示器颜色不正常的原因是什么

    显示器是电脑的重要部件之一 显示器颜色不正常 会对我们看电脑造成很大影响 也很容易感觉到眼睛疲劳 显示器颜色不正常是怎么回事 应该怎么处理呢 下面为大家一一道来 显示器颜色不正常的根源 显示器是属于电脑的I O设备 即输入输出设备 它可以分
  • echarts之饼图制作+标示线

    1 安装echarts组件 npm install echarts s 2 在main js中全局引入以及挂载 import echarts from echarts 引入 Vue prototype echarts echarts 挂载

随机推荐

  • 对于Scanner类中next()和nextLine()的区别

    对于键盘录入对象Scanner对象的两个录入字符串方法的区别 Scanner sc new Scanner System in sc next 和 sc nextLine 的区别 next 对于录入的字符串碰到空格就会停止录入 nextLi
  • CentOS7 yum源修改为阿里,配置阿里epel源

    一 概念 区分 yum源 什么是yum源 yum是一个在CentOS RedHat和Fedora操作系统中使用的Shell前端软件包管理器 yum主要管理基于rpm的软件包 Centos先将发布的软件放置到YUM服务器内 然后分析这些软件的
  • 自定义分页标签

    原文地址 http blog csdn net wjt1989wjt article details 4720350 步骤一 编写分页标签处理类 分页标签处理类 public class PagerTag extends TagSuppor
  • vue使用的百度地图的天气查询功能

    首先需要在 Vue js 项目中安装百度地图 JavaScript API SDK 并获取相应的密钥 ak 然后 可以按照以下步骤使用百度地图的天气查询功能并使用 Axios 进行请求 官网文档 https lbsyun baidu com
  • Vue3 Cannot read properties of undefined (reading ‘use‘)

    在用vue3脚手架搭建项目的时候 配置路由 一直报错 错误代码不显示了 正确代码 min js import createApp from vue import App from App vue import Router from rou
  • Linux系统使用 NetworkManager 工具来管理网络

    使用 NetworkManager 工具来管理网络 其在命令行下对应的命令是 nmcli 要连接WiFi 相关的命令如下 1 查看网络设备列表 sudo nmcli dev 注意 如果列出的设备状态全部是 unmanaged 的 说明这些网
  • 单纯记录一下主题色样式——笔记

    单纯想 记录一下这个主题样式的设置 HTML代码
  • Prometheus: 通过ConfigMap来添加Grafana仪表盘

    如果你通过kube prometheus stack部署了Prometheus Grafana 那么Grafana中的仪表盘就是通过边车 sidecar 来动态获取的 Sidecar的观察对象是ConfigMap 当ConfigMap中配置
  • JavaFx如何打成exe包并设置exe的图标

    JavaFx如何打成exe包并设置exe的图标 javaFx在本地运行没问题后 想打成exe包 并在没有jdk的环境下使用 可参考以下操作 在pom中添加如下maven插件
  • 利用qt 信号槽传递自定义结构体--借助QVariant

    在前面的博客里 我介绍了利用Q DECLARE METATYPE和qRegsterMetaType来传递自定义的结构体 但是这样做有个缺点 qRegisterMetaType 只能在main 函数里才能发挥作用 https blog csd
  • Towards Open Set Deep Networks:开放世界的目标检测

    文章发表于2016年 文章链接 1 概述 随着深度网络在目标检测领域的发展 网络的性能和准确率都在不断提升 但是存在的一个问题 深度网络很容易被一些图片 在人类看来没有意义 所欺骗 即使我们觉得该图像并不属于某一类别 但是深度网络还是会以高
  • yii2+ueditor百度富文本编辑器+七牛云单图多图均可

    ueditor百度富文本版本 1 4 3 yii2七牛云SDK yii2安装及使用七牛云文件上传 第一步 打开 web ueditor php Uploader class php文件在最顶部引入 yii2安装及使用七牛云文件上传 内com
  • SQL Server 列转行函数 UNPIVOT(大数据)

    SQL Server 列转行函数 UNPIVOT 大数据 在 SQL Server 中 UNPIVOT 是一种用于将列转换为行的函数 它可以帮助我们重新组织和分析数据 本文将详细介绍 UNPIVOT 函数的使用方法以及如何在处理大数据时进行
  • Kafka/Spark消费topic到写出到topic

    1 Kafka的工具类 1 1 从kafka消费数据的方法 消费者代码 def getKafkaDStream ssc StreamingContext topic String groupId String consumerConfigs
  • Git merge并push到远程分支,但又要回滚到merge之前的代码

    1 使用git reflog 查看所有HEAD历史 2 观察日志列表内容 找到这次merge 之前 git log 例 ce7397d8 HEAD 36 commit merge Merge branch develop into rele
  • 编译失败:内部java编译器错误

    idea编译java报错 信息 Eclipse编译器4 6 2用于编译java源 信息 模块sinoWeb由于项目配置 依赖项更改而完全重建 信息 2017 3 23 11 44 编译完成 1个错误 0个警告 5分32秒949ms 错误 j
  • 力扣 - 102、二叉树的层序遍历(剑指Offer - 面试题32:从上到下打印二叉树)

    题目 给你一个二叉树 请你返回其按 层序遍历 得到的节点值 即逐层地 从左到右访问所有节点 示例 二叉树 3 9 20 null null 15 7 3 9 20 15 7 输出层序遍历的结果 3 9 20 15 7 分析 迭代法 用一个队
  • 数据结构——第六章 图

    知识框架 主要掌握深度优先搜索和广度优先搜索 图的基本概念及基本性质 图的存储结构 邻接矩阵 邻接表 邻接多重表和十字链表 及其特性 存储结构之间的转化 基于存储结构上的遍历操作和各种应用 拓扑排序 最小生成树 最短路径和关键路径 等 通常
  • npm 常用操纵

    以下操作均已 mkdirp 模块为例 npm模块库查询 1 远程仓库查询 a 查询仓库中模块的信息 npm info mkdirp 查看大图 b 查询仓库中模块的所有版本 npm view mkdirp versions 查看大图 c 查看
  • Pid算法总结笔记(平衡小车部分)

    Pid的三种形式 直立环 速度环 转向环 这三种环代表了小车的三种不同动作 直立 转向 和运行速度 三种不同的构造 三种不同的控制函数 最终的思想都是通过pid算法来控制 一 Pid算法简介 什么是pid Pid总共有三个字符 分别是p i