自动控制原理学习--平衡小车的控制算法(三)

上一节PID的simulin仿真,这一节用LQR

一、模型

             

二、LQR

LQR属于现代控制理论的一个很重要的点,这里推荐B站的【Advanced控制理论】课程(up主DR_CAN),讲得很好,这里引用了他视频里讲LQR的ppt。

LQR属于lost优化问题,L:Linear ;Q:Quadratic二次型;R:regulater 调制器

主要是优化状态空间下,保证稳定的同时,如何选取状态方程特征值。

Q一般是根据你想控制那些状态给出不同权重的矩阵,就是一个对角矩阵,按顺序对状态量给出权重,给的数值越大,代表你对对应的状态控制要求也高,R是输入是N*1的矩阵,一般只有一维输入的话就一个数,越大表示对输入的控制要求更高。

二、平衡小车LQR

由于需要有状态转移矩阵和输入系数矩阵,所以需要建立动力学模型,建模方法很多(一般常用的是牛顿力分析和拉格朗日方程)

1.牛顿力学分析方程

(1)底盘只有水平方向的移动,故运动方程只有在x方向,

假设小车的摩擦系数为b,由m*a=F公式可得:

m \ddot{x}=F-b \dot{x}-N   其中N为车身(摆杆)对底盘在x方向的反作用力    (1)

(2)车身(摆杆)受力分析:

某一时刻单摆在水平上的位置:

x^{\prime}=x-l \cdot \sin (q)         

单摆在水平方向所收到的力只有N,所以水平方向的运动方程:

\boldsymbol{M} \ddot{\boldsymbol{x}}^{\prime }=\boldsymbol{N}

\boldsymbol{M} \left(\boldsymbol{x}-\boldsymbol{l} \cdot \sin (q)\right)^{\prime \prime}=\boldsymbol{N}

N=M \ddot{x}-M l \ddot{q} \cos (q)+M l \dot{q}^{2} \sin (q)                           (2)

由(2)带入(1)可得第一个运动方程

F=(M+m) \ddot{x}+b \dot{x}-M l \ddot{q} \cos (q)+M l \dot{q}^{2} \sin (q)           (3)

对单摆在垂直方向的受力分析

\begin{array}{l} \boldsymbol{M} \ddot{y}^{\prime }=\boldsymbol{P}-\boldsymbol{M} g \\ y= l cos(q)\\ \ddot{y}^{\prime }=-\ddot{q} \sin (q)-\dot{q}^{2} \cos(q) \\ \boldsymbol{M} l\left(-\ddot{q} \sin (q)-\dot{q}^{2} \cos(q)\right)=\boldsymbol{P}-\boldsymbol{M} g \\ \boldsymbol{P} =M g-M l \ddot{q} \sin (q)-M l \dot{q}^{2} {\cos (q)}\end{array}                               (4)

摆杆质心力矩平衡可得(I是摆杆的转动惯量,规则的物体容易求,但这里我看了人家,尝试去算,但都感觉不对,看过别人的基本设定在0.005左右都可以,后面试了其他值感觉都还可以用,其实有种方法是用实物倒放,让它自由摆动后测出相关的值去推,以后有时间可以试试) :

P l \sin (q)+N l \cos (q)=I \ddot{q}                                                    (5)

把公式(2)、(4)带入(5)可得

\begin{array}{l} M g l \sin (q)-M l \ddot{q} \sin q l \sin q-M l \dot{q}^{2} \cos q l \sin q \\ =M g l \sin q-M l^{2} \ddot{q}+M \ddot{x} l \cos q= I \ddot{q} \end{array}

化简得到第二条运动学方程:

\left(I+M l^{2}\right) \ddot{q}-M g l \sin (q)=M l \ddot{x} \cos(q)                                  (6)

由(3)和(6)得到的方程组:

\left\{\begin{array}{l} F=(M+m) \ddot{x}+b \dot{x}-M l \ddot{q} \cos (q)+M l \dot{q}^{2} \sin (q)\\ \\(I+M l^{2}) \ddot{q}-M g l \sin (q)=M l \ddot{x} \cos(q) \end{array}\right.

线性化, 为小接近的小角度,q为小接近0的小角度,\dot{q} ^2\approx 0, 𝑐𝑜𝑠(q) 为1, 𝑠𝑖𝑛(q) 为0,  F施加给小车的输入,改成u表示:

\left\{\begin{array}{l} u=(M+m) \ddot{x}+b \dot{x}-M l \ddot{q} \\ \\ (I+M l^{2}) \ddot{q}-M g l q=M l \ddot{x} \end{array}\right.                                       (7)

(7)可以改写成

\ddot{x} = \frac {-b(I+M l^2) }{p} \dot{x} +\frac{M^2 g l^2}{p} q +\frac{I+M l^2}{p} u

\ddot{q} = \frac {-b M l }{p} \dot{x} +\frac{M g l (M+m)}{p} q +\frac{M l}{p} u

其中   p=I(M+m)+ Mml^2

 设状态量为   

                          \begin{bmatrix} x \\ \dot x \\ q \\ \dot q \end{bmatrix}

最终的状态空间方程模型为:

\begin{bmatrix} x \\ \dot x \\ q \\ \dot q \end{bmatrix} =\begin{bmatrix} &0 &1 &0 &0 \\ & 0 & \frac{-b(I+M l^2)}{p} & \frac{M^2gl^2}{p} &0 \\ & 0 &0 &0 &1 \\ &0 & \frac{-bMl}{p} & \frac{Mgl(M+m)}{p} &0 \end{bmatrix} * \begin{bmatrix} x \\ \dot x \\ q \\ \dot q \end{bmatrix} +\begin{bmatrix} 0\\ \frac{I+M l^2}{p} \\ 0 \\ \frac{Ml}{p} \end{bmatrix} *u

                                  状态转移矩阵A                                    输入矩阵B

由于状态量与输出反馈一致,故C矩阵为

C=\begin{bmatrix} 1 & 0& 0&0 \\ 0& 1& 0&0 \\ 0& 0& 1&0 \\ 0& 0& 0& 1 \end{bmatrix}      如果你模型里面反馈数据只有平移速度 和角度速度,那C就算2*4的矩阵

D=0

有了A B C D矩阵就可以用LQR求解 (也可以用MPC来求解,套路都一样) ,MATLAB里面有lqr的求解器,一行代码搞定.

不过还有Q  和R 超参的设置, Q可简单设置[10 0 10 0] 顺序对应的水平方向 的x 和速度, 角度q 和角速度,意思是对x 和角度q重点控制,  R=1,对输入要求一般,都可以修改,根据具体情况修改超参。

MALAB 的代码很简单

K = lqr(A,B,Q,R)

会得出K,K 是4*1的向量,然后分别与状态量点乘就得到输入u的值,即F  这就是控制量

由于系统是非时变系统,因此lqr只需求一次K就行了

通过A 和B矩阵,也可以判断系统是否可控

Tc = ctrb(A,B);
if (rank(Tc)==4)fprintf('此系统是可控的!\n');

如果不加外力,系统肯定是不稳定的,直接用

Tc = ctrb(A);
if (rank(Tc)==4)fprintf('此系统是可控的!\n');

  就可以测试,

说白就算去判断它的状态转移矩阵是否满秩,现代控制理论有相关的推导分析

simulink建模跟上一张PID的模型基本一样,只是计算输入控制量这块不一样,简单放个图:

这里的K_LQR就算lar算出来的K,这里是负反馈,因此是负号;

其他的参数主要有l取0.065m;g=9.8,车身质量M=1.25kg,底盘m=0.5kg。

算出的K为

K =[   -1.0000   -2.1447   37.5875    3.2123 ]

三、上面的牛顿力学分析运动方程很繁琐,同样是找状态转移矩阵 A 输入矩阵 B 一般直接用拉格朗日动力学方程,省事些。

这里不想再敲公式了,直接参考使用B站博主(J_H_Li)的小车倒立摆最优控制教程 视频  讲得通俗易懂,推荐去看

拉格朗日方程:

 q_j 是指某个状态量  \tau 是对应q_j 状态量的外力

分别找出系统总动能 和势能 再分别对状态量进行拉格朗日方程  

总动能

因为以底盘质点为原点,只有车身的势能,因此总势能

V=mgl cos(q)

这里的M是底盘的质量,m是摆杆的,

所以拉格朗日量

分别对x和q进行拉格朗日方程得到:

再进行线性化,q为小接近0的小角度,\dot{q} ^2\approx 0, 𝑐𝑜𝑠(q) 为1, 𝑠𝑖𝑛(q) 为0, 得到两条动力方程:

然后退出A B矩阵,F改为u,就得到

可以看到A 和 B 跟上面用牛顿受力分析得出的不一样,这里算出来的k

K =[   -1.0000   -1.9719   36.2409    1.8586 ]

但相差不大,都是可以让系统稳定的

这种方法比牛顿受力分析,找出一大堆公式要友好得多。
 

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

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

相关文章

(三)小程序样式和组件

视频链接:尚硅谷2024最新版微信小程序 文章目录 小程序的样式和组件介绍样式-尺寸单位 rpx样式-全局样式和局部样式组件-组件案例演示组件案例-轮播图区域绘制组件案例-轮播图图片添加组件案例-绘制公司信息区域组件案例-商品导航区域组件案例-跳转到商品列表组件案…

python爬取sci论文等一系列网站---通用教程超详细教程

环境准备 确保安装了Python以及requests和BeautifulSoup库。 pip install requests beautifulsoup4确定爬取目标 选择一个含有SCI论文的网站,了解该网站的内容布局和数据结构。 (1)在浏览器中访问目标网站,右键点击页面并选择…

案例研究|硬之城借助DataEase以数据驱动供应链精细化管理

深圳硬之城信息技术有限公司(以下简称为“硬之城”)成立于2015年,专注电子元件供应链领域,定位于电子产业供应链与智造平台。硬之城通过名为“Allchips”的集成式服务平台,为客户提供一站式的电子元件采购和供应链管理…

VTK 建模方法:建模基础

VTK 建模方法:建模基础 VTK 建模方法:建模基础VTK 中模型的表达实例1:自定义 vtkPolyData实例2:vtkTubeFilter实例3:vtkImplicitModeller实例4:vtkRegularPolygonSource实例5:vtkWarpTo VTK 建模…

如何在mac电脑安装 Android SDK

1、在 Mac 电脑上安装 Android SDK 的步骤如下: 前往 Android 开发者网站下载 Android SDK 打开 Android 开发者网站 (https://developer.android.com/studio) 打开下载好的 Android SDK 安装包 2、解压 Android SDK 安装包 打开下载好的 Android SDK 安装包 将 android-…

[力扣题解]78.子集

题目&#xff1a;子集 思路 回溯法 代码 class Solution { public:vector<vector<int>> result;vector<int> path;void function(vector<int>& nums, int startindex){// 为什么要到这里写? 后面调用递归之前就不对result.push_back(path);//…

深度主动学习(Deep Active Learning)——基于pytorch和ALipy工具包实现双向GRU模型

前言 在ALipy的官网说ALipy只支持sklearn和tensorflow模型&#xff0c;模型对象应符合 scikit-learn api。 但是alipy提供了ToolBox的工具箱&#xff0c;里面包装了多种查询策略&#xff0c;计算指标等工具&#xff0c;几乎具有Alipy的全部功能&#xff0c;虽然不能使用ALipy提…

华为昇腾310B1平台深度学习算法模型转换

目录 1 模型转换(集成nms算子到模型中) 1.1 基础模型说明 1.2 模型转换 1.2.1 设置环境变量 1.2.2 安装yolov5依赖&#xff08;gcc需要>7.5&#xff09; 1.2.3 转换fp16模型 2 模型转换(使用atc&#xff0c;不集成nms算子) 参考文献&#xff1a; 1 模型转换(集成nms…

Pycharm2024版,更换安装源

1、选择Python Packages 2、点击图中的小齿轮 3、点击 号 4、添加源地址 常用源如下&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn…

【3】STM32·FreeRTOS·任务挂起和恢复

目录 一、任务的挂起与恢复的API函数 1.1、任务挂起函数介绍 1.2、任务恢复函数介绍&#xff08;任务中恢复&#xff09; 1.3、任务恢复函数介绍&#xff08;中断中恢复&#xff09; 二、任务挂起与恢复实验 一、任务的挂起与恢复的API函数 API函数描述vTaskSuspend()挂起…

HTML5 Canvas发光Loading动画特效源码

源码介绍 之前我们分享过很多基于CSS3的Loading动画效果&#xff0c;相信大家都很喜欢。今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效。Loading旋转图标是在canvas画布上绘制的&#xff0c;整个loading动画是发光3D的视觉效果&#xff0c;HTML5非常强大。 …

索引失效情况

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 一、索引列上运算操作。 不要在索引列上进行运算操作&#xff0c;否则索引会失效。 在tb_user的phone列加上索引&#xff0c;然后进行条件查询&am…

nginx自动部署-跨操作系统

项目里面有一个需求&#xff0c;就是需要用让nginx进程提供给系统管理一个start,stop和getPid方法&#xff0c;这样系统管理可以自动拉起来nginx&#xff0c;达到自动部署的目的。离线部署同样适用 这样一来&#xff0c;我就需要提供windows版本linux不同版本的nginx源码包&am…

解决Vue devtools插件数据变化不会自动刷新

我们使用devtools插件在监测vuex中表单或自定义组件的数据&#xff0c;发现页面数据发生变化后&#xff0c;但是devtools中还是老数据&#xff0c;必须手动点击devtools刷新才能拿到最新的数据。很烦&#xff01; 解决方案&#xff1a; 打开chrome的设置&#xff0c;向下翻&…

JavaEE企业级开发中常用的Stream流

介绍 在Java编程中&#xff0c;Stream流是Java 8引入的一个重要概念&#xff0c;它提供了一种新的处理集合的方式&#xff0c;可以更加简洁、高效地进行数据操作。Stream流支持各种常见的操作&#xff0c;比如过滤、映射、排序、聚合等&#xff0c;同时也支持并行处理&#xf…

SAP供应商预付款业务

业务理解&#xff1a; 预付账款是企业向供应商预付的款项 应付账款是企业尚未支付的款项。 两者区别&#xff1a; 预付账款属于企业的资产&#xff0c;应计入预付账款科目中&#xff0c;而应付账款属于企业的负债&#xff0c;应计入应付账款科目中。应付账款是提前支付的…

macOS 如何使用Visual Studio Code 编译C++

在 macOS,则默认系统 C++ 编译器是 Clang。 要使用 Visual Studio Code 在 macOS 上的 Clang 中指定 C++ 版本,可以按如下所示修改tasks.json 文件: 在 Visual Studio Code 中打开您的 C++ 项目。按 Ctrl+Shift+P(或 macOS 上的 Cmd+Shift+P)打开命令面板。在命令面板中键…

自学错误合集--MessageSource国际化接口

java后端自学错误总结 一.MessageSource国际化接口总结 一.MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口&#xff0c;提供了国际化信息的能力。MessageSource用于解析 消息&#xff0c;并支持消息的…

字节、进制、字符串格式化

文章目录 1.字节2.不同的进制之间转换数值3.bytes()用法4.struct.unpack()用法5.字符串格式化{:03.2f} 1.字节 字节&#xff08;Byte&#xff09;是计算机存储和处理数据的基本单位之一。一个字节可以存储8个二进制位&#xff08;bit&#xff09;&#xff0c;每个二进制位可以…

【Android】使用Handler实现一个定时器

需求 实现一个定时任务&#xff0c;每隔一秒执行一次 实现 使用Handler实现 private Handler topUIHandler;private void initTopUiHandler() {topUIHandler new Handler(getMainLooper()) {Overridepublic void handleMessage(Message msg) {//执行这个定时任务updateTop…