平衡小车的一些常见问题总结

2023-05-16

文章目录

  • 1、基本理论
  • 2、直立环速度环串级pid
  • 3、代码差异的解释
  • 4、转向环

1、基本理论

PID控制

pid控制值对偏差进行比例,积分和微分的控制,分别是三个部分,对应为比例单元,积分单元和微分单元。
三个单元的作用可以简单的称为:

  • 比例项:提高响应速度,减小净差。
  • 积分项:减小稳态误差,因为只要有误差存在,只要有偏差,就会不断地使得积分作用越来越强。
  • 微分项:减小系统的震荡和超调现象。

2、直立环速度环串级pid

这里要注意一点就是串级pid有一般会有一个环起到比较重要的作用,而另一个环只是辅助这个环的,比如这个系统中的直立环就是这样的。

直立环的理论简单来说就是车子往那边倒下就往那边移动:

在这里插入图片描述
用公式来表达就是:

a = b 1 ∗ θ + b 2 ∗ θ ' a=b1*\theta +b2*\theta \text{'} a=b1θ+b2θ

上面这个是使用到了比例微分控制,在这个系统中误差是角度,角度的变化量正好是角速度,所以这里甚至可以直接将角速度作为输入参数来进行计算,而不用我们去求取微分,当然直接套用经典的pid公式来求微分也没什么问题。

但是这样小车还是不能很好的平衡,因为单独直立环只是让 小车角度趋近0,小车还是可以在水平地面上移动,理论上是可以保持角度为0不变的,因此就需要引入速度环,那么在这个串级系统中的作用就是:

  • 角度环:小车角度趋于0
  • 速度环:电机速度趋于0

最终的控制系统这里用平衡小车之家的一张图来看,如下所示:

在这里插入图片描述

PID串级控制中,最外环是输入是整个控制系统的期望值,外环PID的输出值是内环PID的期望值。,因此在这个系统中速度环是外环,正如图中所展现的,内环为直立环,内环是最核心的一个环。

其中每个环的作用效果如下所示:

速度环输入:1、给定速度 2、速度反馈
输出:角度值(这里注意为什么是角度值,因为他是直立环的期望速度)

直立环输入:1、给定角度(速度环输出) 2.角度反馈
输出:PWM(小车的控制变量)

那么关于这个串级系统(也可以衍生到其他的串级控制系统上来)

速度期望在外环,属于最初需求。角度环是最内环具有决定性作用,速度环的目的只是改变期望角度,以达到“能适应速度=0”的绝对角度的姿态。

对于我们这个系统来说:

假设初始期望为0度,系统运行,手指后推车体(外部扰动),车子首先后退(产生负速度)这个时候速度环起作用,产生负输出,进而角度环动态期望变为负值。又因为当前实际是0度,所以接下来车体会整体前倾,准备向前跑以回正,当向前跑后车体回正,速度此时也为0,故速度环输出也为0,即角度环动态期望也变为0。

3、代码差异的解释

可以看到平衡小车之家的pid用的是两个部分的pid进行直接叠加的方式:

在这里插入图片描述

但是按照我们的理解应该是这样的:
在这里插入图片描述

下面对代码进行一下分析:

单纯直立环输出的情况如下:

V e r t i c a l    o u t = K p 1 ∗ ( θ r − θ e ) + K d ∗ ( θ r − θ e ) ' Vertical\,\,out=Kp1*(\theta _r-\theta _e)+Kd*(\theta _r-\theta _e)\text{'} Verticalout=Kp1(θrθe)+Kd(θrθe)

单独速度环的输出如下:

V e l o c i t y    o u t = K p 2 ∗ ( E r − E e ) + K i ∗ Σ ( E r − E e ) Velocity\,\,out=Kp2*(E_r-E_e)+Ki*\varSigma (E_r-E_e) Velocityout=Kp2(ErEe)+KiΣ(ErEe)

这里假设速度环输出就是目标角度,也就是:

θ e = V e l o c i t y    o u t \theta _e=Velocity\,\,out θe=Velocityout

将上面的式子带入,可得:

V e r t i c a l    o u t = = K p 1 ∗ θ r − [ K p 2 ∗ ( E r − E e ) + K i ∗ Σ ( E r − E e ) ] + K d ∗ ( θ r − θ e ) ' = K p 1 ∗ θ r − K p 1 ∗ K p 2 ∗ ( E r − E e ) − K p 1 ∗ K i ∗ Σ ( E r − E e ) + K d ∗ ( θ r − θ e ) ' = K p 1 ∗ θ r + K d ∗ ( θ r − θ e ) ' − K p 1 ∗ [ K p 2 ∗ ( E r − E e ) + K i ∗ Σ ( E r − E e ) ] Vertical\,\,out=\\=Kp1*\theta _r-[Kp2*(E_r-E_e)+Ki*\varSigma (E_r-E_e)]+Kd*(\theta _r-\theta _e)\text{'}\\=Kp1*\theta _r-Kp1*Kp2*(E_r-E_e)-Kp1*Ki*\varSigma (E_r-E_e)+Kd*(\theta _r-\theta _e)\text{'}\\=Kp1*\theta _r+Kd*(\theta _r-\theta _e)\text{'}-Kp1*[Kp2*(E_r-E_e)+Ki*\varSigma (E_r-E_e)] Verticalout==Kp1θr[Kp2(ErEe)+KiΣ(ErEe)]+Kd(θrθe)=Kp1θrKp1Kp2(ErEe)Kp1KiΣ(ErEe)+Kd(θrθe)=Kp1θr+Kd(θrθe)Kp1[Kp2(ErEe)+KiΣ(ErEe)]

也就是最终的输出为:

K p 1 ∗ 真实角度 + K d ∗ 角度偏差的微分 − K p 1 ∗ [ K p 2 ∗ 编码器偏差 − K i ∗ 编码器偏差的积分] Kp1*\text{真实角度}+Kd*\text{角度偏差的微分}-Kp1*[Kp2*\text{编码器偏差}-Ki*\text{编码器偏差的积分]} Kp1真实角度+Kd角度偏差的微分Kp1[Kp2编码器偏差Ki编码器偏差的积分]

可以再化简一下,就是:

K p 1 ∗ 真实角度 + K d ∗ 角度偏差的微分 − ( K p 1 ∗ K p 2 ) ∗ 编码器偏差 − ( K p 1 ∗ K i ) ∗ 编码器偏差的积分 Kp1*\text{真实角度}+Kd*\text{角度偏差的微分}-\text{(}Kp1*Kp2\text{)}*\text{编码器偏差}-\text{(}Kp1*Ki\text{)}*\text{编码器偏差的积分} Kp1真实角度+Kd角度偏差的微分Kp1Kp2编码器偏差Kp1Ki编码器偏差的积分

这就说明了为什么他们两个可以进行简单叠加,因为这样最后算的结果也是一样的!

在这里插入图片描述

注:上面的部分参考了b站up主视频:

https://www.bilibili.com/video/BV1j7411z7uX?spm_id_from=333.337.search-card.all.click

4、转向环

关于转向环,这是一个独立起来的单环,他的目标仅仅是对转动的角度进行控制,可以看到使用转向环的代码最终也是当成一个叠加量放到了最后,这是多个比较独立的pid一起作用的时候比较常见的方法。

在这里插入图片描述

甚至如果我们对于转向环精度要求不是很高的情况下,转向环甚至只用比例控制即可,都可以不需要使用多个参数进行控制了。

那么为什么转向环没有进入到三个环进行三个环的串级来进行计算呢

这里我们就可以来考虑串级pid的思想,什么时候可以用 串级pid,什么时候不可以,以及这个系统的输入输出是什么的问题,针对这个系统,可以理解为:

  • 既然是串联,必然需要前面和后面有耦合联系,如果只有一条通路,那前面的输出就一定要是后面的输入。
  • 直立环和速度环都是针对一个轴。转向环是最次要闭环并且去掉也不影响最原始目标:直立。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

平衡小车的一些常见问题总结 的相关文章

  • 欧几里得算法的图形化理解

    欧几里得算法用于求两个数的最大公约数 xff0c 这篇博文力求以可视化的图形帮助读者理解欧几里得算法 首先 xff0c 简单介绍一下欧几里得算法 设a b N xff0c 我们规定gcd a b 代表a与b的最大公约数 欧几里得算法的实质是
  • PX4IO刷写BootLoader、固件 PX4IO固件损坏修复

    前两天玩坏了一个飞控的IO芯片 xff0c 具体表现为上电后红灯一直闪或常亮 xff0c 有以下解决办法 xff1a 文章目录 FMU给IO刷写重新烧写BootLoader FMU给IO刷写 先断电 xff0c 按住安全开关 xff0c 上
  • Maven版本3.6.1环境配置安装

    文章目录 前言一 操作步骤 xff1a 总结 前言 注意 xff1a 在换源时保持联网状态 xff0c 才能成功换成 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 操作步骤 xff1a 1 下载maven安装包
  • 蓝桥杯STM32F103RB数码管计时(秒表)

    STM32F103RB数码管定时 xff08 秒表 xff09 硬件单路 96 配置TIM2及其中断代码片如下 示例 96 96 中断执行函数代码片如下 示例 96 96 seg c 数码管 代码片如下 示例 96 完整工程下载 gt gt
  • 第七届蓝桥杯嵌入式(省赛)程序题

    第七届蓝桥杯 xff08 省赛 xff09 解读 43 程序 解读 xff1a 这里自己多读几遍设计任务以及要求再看下面 96 A 先搭总体框架 96 各初始化函数 96 LCD初始化 96 96 按键初始化 96 96 ADC初始化 96
  • STM32普通io口模拟pwm输出的三种方法

    STM32F103RB普通io口模拟pwm输出的第三种方法 xff08 周期占空比可调 xff09 第 xff08 一 xff09 种定时器中断产生pwm 96 第 xff08 一 xff09 种代码片 96 第 xff08 二 xff09
  • STM32 RS232通信实验

    stm32F103 RS232通信实验 什么是RS232 软件设计 完整工程下载 什么是RS232 先来看看UART传输所存在的问题 于是就有了RS232协议 这里注意使用的是负逻辑电平信号 在规定范围内的电平信号代表逻辑1或0 xff0c
  • MDK中变量无法添加到逻辑分析仪中原因

    MDK中变量无法添加到逻辑分析仪中原因 解决方法 去掉static 提示无法将变量添加到逻辑分析仪中 解决方法 去掉static 设置为bit 全速运行
  • 三,FreeRTOS之——动态创建多任务+优先级

    声明 xff1a 本专栏参考韦东山 xff0c 野火 xff0c 正点原子以及其他博主的FreeRTOS教程 xff0c 如若侵权请告知 xff0c 马上删帖致歉 xff0c 个人总结 xff0c 如有不对 xff0c 欢迎指正 动态创建多
  • ESP8266组网+STM32数据传输项目

    ESP8266 43 STM32数据传输项目 实验硬件 xff1a 项目关键词 xff1a 项目描述项目涉及知识 xff1a 1 ESP8266开发2 MQTT协议3 STM32 整体开发流程 xff1a 实验硬件 xff1a ESP826
  • 十一,FreeRTOS之——互斥信号量(优先级反转,优先级继承,递归锁)

    声明 xff1a 本专栏参考韦东山 xff0c 野火 xff0c 正点原子以及其他博主的FreeRTOS教程 xff0c 如若侵权请告知 xff0c 马上删帖致歉 xff0c 个人总结 xff0c 如有不对 xff0c 欢迎指正 互斥量理论
  • (一)裸机开发框架构建之---开发框架思想

    裸机开发框架构建 声明 xff1a 本专栏通过查阅资料以及自己对开发框架的理解所编写 xff0c 如有错误 xff0c 还请指正 为什么要使用框架 xff1f xff1f xff1f 我的框架分层思想体现 声明 xff1a 本专栏通过查阅资
  • PX4添加外置IMU传感器MPU-9250

    使用PX4 v1 13 2代码 xff0c 淘宝购买的MPU 9250传感器 MPU 9250 芯片架构图 实物图 手册 寄存器 https invensense tdk com wp content uploads 2015 02 RM
  • (二)裸机开发框架构建之---点灯大师

    裸机开发框架构建 3 设备管理层抽象出结构体初始化结构体第一种初始化方法 xff08 c89标准 xff09 第二种初始化方法 xff08 C99标准 xff09 2 硬件接口层1 硬件层硬件LED层初始化函数硬件层LED控制函数 4 应用
  • 1.freertos应用系列之cubemx创建freertos

    freertos应用全系列 xff08 写完关联更新 xff09 01 freertos应用系列之cubemx创建freertos 11 freertos应用系列之cubemx创建freertos 02 freertos应用系列之cubem
  • docker中镜像源推荐

    1 xff0c 个人建议使用 网易镜像源 镜像源有以下5种 1 网易 http hub mirror c 163 com 2 Docker中国区官方镜像 https registry docker cn com 3 ustc https d
  • VScode创建C++项目

    VScode创建C 43 43 项目 假设系统已经安装了MinGW64 插件 常用插件 创建Project 配置json文件 需要修改的地方都在下方注释说明 根据MinGW64安装位置进行修改 c cpp properties json s
  • C++的一个问题点,数组作为参数传递到函数之后,不能直接求出长度

    YU 原数组 xff0c 传递参数之后 结果是作为参数传进去之后是作为指针 xff0c 是不能求出长度的 xff0c 所以需要把长度提前求出作为参数传入该函数 反思 xff1a 最近C 43 43 Python xff0c java轮流用
  • 基于from flask import Flask,render_template 上传网页遇到的问题

    我们要上传多个页面形成一个网站 xff0c 首先我们需要在index xff08 一般这个都是首页面 xff09 查看其源码 找到类似 这段代码里面包括了前面的网站 xff0c 所以这时候我们只需要把它变成带使用的状态 xff0c 操作就是
  • 跨交换机的VLAN设置

    实现目标 xff1a 进行多台主机多个vlan接口进行互相通信 需要知识 xff1a 1 不同的vlan接口的是不能进行通信的 2 在要跨越多个交换机进行通信的时候要对进行交互的交换机进行共享vlan端口的设置 3 在设置网络号的时候应该注

随机推荐

  • Wireshark抓取cookie:用户名...,TCP报文等信息实战

    这里我们要先安装Wireshark xff0c 这里要注意的是一些低级版本刚刚下下来的时候是找不到网络接口的 xff0c 所以这时候要更新 xff0c 然后再下应该WinPro xff08 应该是这个 xff09 xff0c 之后就有网络接
  • 计算机网络知识点总结提纲(谢希仁)

    1 IOS OSI对王道书上的缩减总结 清晰pdf xff1a 链接 xff1a https pan baidu com s 1f6DqMsHky4kP8i9WQLvCew pwd 61 the3 提取码 xff1a the3 来自百度网盘
  • C++getline和 cin的探讨

    从结果可以看出 xff0c cin是会把空格部分舍弃的 如果是输入一个 然后空格在输入其他的 xff0c 因为cin默认把空格去调 xff0c 则后面的字符我的理解就是溢出 xff1f 所以报错了 getline功能就比较强大了 xff0c
  • Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk

    文章目录 硬件安装Ubuntu Server20 04下载rpiboot工具下载imager刷写系统配置USB配置WIFI 开机安装桌面配置wifi配置串口安装ROS安装mavros安装MAVSDK PythonInternet设置最后 参
  • docker迁移镜像

    docker迁移本地镜像 本文为docker基本镜像操作之一 查看本镜像 docker images 迁移 xff08 拷贝 xff09 本地镜像到其他设备 1 打包 docker save o 路径 目标包名 tar 源镜像名 标签 2
  • C++Linux服务器学习之路——1

    前言 xff1a 为了让所学的计网知识融合于实际 xff0c 让操作系统里的理论去满足工程需求 xff0c 故通过借鉴30dayMakeServer的路线以及进行相应知识点的学习 part1 首先我们要理解socket 为应用层和传输层提供
  • 计网牛客刷图总结

    久不学忘记了 xff0c 1111 1111 61 255 xff0c ip地址是32位二进制组成 xff0c x 26就是说主机号有26位 xff0c 其他都是网络号 所以后面只有2位主机号 xff0c 234 61 11101010 x
  • C++力扣算法刷题算法分析

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • Invalid bound statement (not found)问题解决

    在网上基本的解决方案就是查看 namespace有没有对应 xff0c 但是我确定我的路径都是正确的 xff0c 如果发现这类问题可以先尝试确定路径的正确 之后如果还不行 xff0c 我们进行解决 xff1a 首先在target文件中查找是
  • C指针基础普及

    https www programiz com c programming c pointers 先放网站 xff0c 等我有时间再来补我的扩展
  • Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异)

    之前在培训新生的时候 xff0c windows环境下配置opencv环境一直教的都是网上主流的vs studio配置属性表 xff0c 但是这个似乎对新生来说难度略高 虽然个人觉得完全是他们自己的问题 xff0c 加之暑假之后对cmake
  • Spring Aop的使用(含示例)

    介绍 在软件业 xff0c AOP为Aspect Oriented Programming的缩写 xff0c 意为 xff1a 面向切面编程 xff0c 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 AOP是OOP的延续
  • 超好用的开发工具-VScode插件EIDE

    EIDE介绍 一款适用于8051 STM8 Cortex M RSCv的单片机开发环境 在 vscode上提供8051 xff0c STM8 Cortex M xff0c RISC V 项目的开发编译烧录等功能 使用文档 xff1a 简介
  • 直流编码电机双闭环(速度+角度)控制

    目录 1 PID框图 2 pid控制器的表达式 3 传感器数据获取 4 硬件设计 5 工程配置 6 软件部分程序配置 7 调参过程记录 本文已更新 xff0c 加上曲线调试 xff0c 更好效果 xff0c 更多内容 xff0c 详情 xf
  • OPENMV配置记录(一)

    文章目录 1 刷写固件2 开始配置openmv3 图像获取与显示4 修改图像 xff0c 获取像素 xff0c 添加元素5 使用图像进行基本操作 颜色追踪6 xff0c 识别码7 模版匹配8 通过比例的方法来求解距离9 组合使用 正好回家带
  • 为什么你的软件编译时没问题,运行时却出错?—— Java 中的异常再复盘

    从开发工具谈起 xff1a 这是我平常用的几个编辑器 记得我刚开始学 C 语言 xff0c 学 Java 的时候 xff0c 还是用 Notepad 43 43 这种文本编辑器写代码 xff0c 老师说是为了打基础 xff0c 加深记忆 后
  • 使用stm32解析富斯i6接收机(IBUS)

    文章目录 1 通信协议解析说明2 驱动程序设计3 实测4 使用串口空闲中断 43 DMA接收5 源码 1 通信协议解析说明 常见的官方遥控器大概如下所示 xff1a 常用的搭配接收机 xff1a 这里需要注意的是 xff1a i6是可以刷十
  • 编码电机PID调试(速度环|位置环|跟随)

    文章目录 1 编码电机认识2 上位机波形显示1 功能介绍2 协议说明 3 速度环调试验证4 位置环调试验证5 实现跟随效果 前面的文章中有讲过编码电机串级PID相关的知识 xff0c 以及一些PID的调试经验 xff0c 这里我最近正好又把
  • 树莓派安装ubuntu mate记录

    文章目录 1 系统下载1 ubuntu下载2 ubuntu mate下载 2 系统安装3 系统使用1 ubuntu系统2 ubuntu mate系统 这个算个失败的记录贴吧 xff0c 这个系统安装过程不太流畅 xff0c 使用起来也有很多
  • 平衡小车的一些常见问题总结

    文章目录 1 基本理论2 直立环速度环串级pid3 代码差异的解释4 转向环 1 基本理论 PID控制 pid控制值对偏差进行比例 xff0c 积分和微分的控制 xff0c 分别是三个部分 xff0c 对应为比例单元 xff0c 积分单元和