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

ops/2024/9/23 10:24:19/

基于单片机STM32的两轮平衡小车,单片机的各种IO、定时器、通讯等等一大堆要理解、编程,但这些都是琐碎的文档知识,需要花时间看各个模块的接口文档进而编程,需要良好的编程逻辑思维,去获取相关的传感模块信息,以及输出数据给相关的模块,核心其实是怎么处理这些数据,怎么去控制相关的对象,这个没有文档可查,平衡小车其控制算法就是系统的核心,结合自控原理的学习,通过matlab来模拟平衡车可用的控制算法,以便方面各种调参。

一、模型

整个系统是源于实验室里的平衡小车,小车带奥比中光的深度摄像头,树莓派,不过这里只关注怎么控制平衡,所以在matlab建模里面把这部分去掉,就参考着大致的尺寸,弄一个简单模型,如下图:

                         

1.建模:平衡小车的分析可以近似倒立摆,为简化分为车身和底盘,轮子质量忽略不计

相关的动力学或力学建模在相关的算法再描述。

注意:matlab建模一定要注意转角和F的正向,否则后面PID可能有负数的比例系数,还有lqr崩掉。

如不会在matlab建模,可参考下面步骤:

1.创建simulink模型(slx文件);

2.添加世界坐标系3个模块,如下图,(打开新建的slx文件,在空白处右键 弹出搜索模块,输入模块名称选择即可)

3.为简化这里没有做方向环,所以增加了一个平移轴,限定平衡车的平动,还有一个转动轴(车身的摆动),然后在通过brick solid 模块(矩形块 三个平板和电池块加一个轮轴)和Cylindcrical solid模块(两个电机,轮子也可以用这个模块,不过我有轮子的3d模型,两个轮子直接用模型导入) ,rigid transform模块去搭建底盘和车身,rigid transform就算坐标变换方便模型搭建的朝向,这个坐标变换只针对搭建模型的,跟计算无关的),这里太多模块了,可以直接下载模型进去自己看,matlab2023a版

注:因为F 和转角有正向和负向,因此平移轴的施加力的方向(一般是Z)应该是跟上图一致朝右,转动轴的Z(转动轴已经指定为Z轴了)应该是里朝外,保证转角逆时针为正向,这点很重要,之前就算matlab建模这两个方向不对,导致浪费很多时间排错!

4.为好看和添加写地面摩擦因素,也可以加一个模拟地面的brick solid 模块 和Spatial
Contact Force模块。

基本的模块图如下:

body(车身):

搭建matlab模型时刻通过ctrl+D健或者点击run按钮到仿真环境查看环境搭建情况,也可以看看所建的轴的坐标系是否正确等。如下图:

这样就在matlab里面搭建好了仿真环境。

放下载链接:平衡小车matlab仿真建模


http://www.ppmy.cn/ops/32191.html

相关文章

小程序wx.getlocation接口如何开通?

小程序地理位置接口有什么功能? 随着小程序生态的发展,越来越多的小程序开发者会通过官方提供的自带接口来给用户提供便捷的服务。但是当涉及到地理位置接口时,却经常遇到申请驳回的问题,反复修改也无法通过,给的理由…

STM32的TIM输入捕获和PWMI详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. IC输入捕获 2. 频率测量 3. 主模式、从模式、触发源选择 4. 输入捕获基本结构 5. PWMI模式 6. 代码示例 6.1 PWM.c 6.2 PWM.h 6.3 IC.c 6.4 IC.h 6.5 完整工程文件 输出比较可以看下面这篇…

C语言之数据结构之栈和队列的运用

目录 1. 用队列实现栈1.1 思路讲解1.2 代码实现 2. 用栈实现队列1.1 思路讲解1.2 代码实现 总结 •͈ᴗ•͈ 个人主页:御翮 •͈ᴗ•͈ 个人专栏:C语言数据结构 •͈ᴗ•͈ 欢迎大家关注和订阅!!! 1. 用队列实现栈 题目描述: 请你仅使用两个…

python学习笔记B-20:序列实战--处理千年虫

将2位数表达的年份,转换为用4位数表达: print("将列表中的2位数年份转换为4位数年份") lst[88,89,90,00,99] print(lst) for index in range(len(lst)):if len(str(lst[index]))2:lst[index] 1900int(lst[index])elif len(str(lst[index]))1…

Git的基本操作和使用

git分支指令 列出所有本地分支 git branchmaster是绿的 前面有个 表示当前分支是master* 列出所有远程分支 git branch -r列出所有本地分支和远程分支 git branch -a新建一个分支,但依然停留在当前分支 git branch [branch-name]新建一个分支,并切…

【C++并发编程】(二)线程的创建、分离和连接

文章目录 (二)线程的创建、分离和链接创建线程:示例线程的分离(detach)和连接(join)。 (二)线程的创建、分离和链接 创建线程:示例 线程(Thread…

高频面试题:在浏览器搜索框中输入一个URL的完整请求过程?

相信很多小伙伴在校招或者社招面试中都遇到过这个问题 面试官:小伙子,了解 在浏览器搜索框中输入一个URL的完整请求过程吗?详细说说我:eeemm,不太清出具体的过程。整体过程应该是HTTP请求的过程。 如果在面试中不能很…

2024年---蓝桥杯网络安全赛道部分WP

一、题目名称:packet 1、下载附件是一个流量包 2、用wireshark分析,看到了一个cat flag的字样 3、追踪http数据流,在下面一行看到了base64编码。 4、解码之后得到flag 二、题目名称:cc 1、下载附件,打开是一个html …