# inversependular **Repository Path**: xd15zhn/inversependular ## Basic Information - **Project Name**: inversependular - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-02-03 - **Last Updated**: 2025-05-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 公式和图片需要交叉引用,所以正文用$\LaTeX$写,一并放到代码仓库里,不适合$\LaTeX$的动图和链接放到博客里。建模仿真使用 [simucpp](https://blog.csdn.net/qq_34288751/article/details/117740605),仿真效果展示使用 [EGE](https://xege.org/),波形图展示使用 [matplotlib](https://matplotlib.org/)。 下文的倒立摆如果不特别说明就指单摆。 代码 [https://gitee.com/xd15zhn/inversependular](https://gitee.com/xd15zhn/inversependular) 博客 [倒立摆控制与仿真动画展示](https://blog.csdn.net/qq_34288751/article/details/122640930) 视频 [https://space.bilibili.com/344268817/channel/seriesdetail?sid=2023589](https://space.bilibili.com/344268817/channel/seriesdetail?sid=2023589) 下面是不施加任何输入的情况,建模使用的是原本的非线性模型,全角度都是符合实际的,设计控制器时才线性化。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c83e484dc0014c5992dd383b00e4c2f4.gif#pic_center) PID只使用比例控制结果如下。以后我再看看能不能算出来最合适的PID参数。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/15e5642ef1d04601bac556f492e89443.gif#pic_center) 我在录视频的时候因为做不到先点录屏再开始仿真,所以我把仿真设置成循环的,下面的视频有的一开始是一段循环的末尾,请耐心看完下一个循环。 使用LQR只控制角度时如下,速度和位置不受控制。矩阵都是二维的,可以手算出结果。 [video(video-8e9p1Rg2-1644670332546)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=381412130)(image-https://img-blog.csdnimg.cn/img_convert/5d238896b4f4a02bfcfc2bbaee28da00.png)(title-倒立摆角度控制)] 使用LQR同时控制位置和角度结果如下。 [video(video-LfR2sdaa-1644675010453)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=678901211)(image-https://img-blog.csdnimg.cn/img_convert/5a62f4c2b62922bd7fa5b735a3ed0786.png)(title-倒立摆LQR控制)] 倒立双摆参考《Robust Adaptive Control》例2.2.1,不施加任何输入的情况如下,出乎意料的是它竟然不像单摆那样形成一个循环,时间再长点就跑出画面了,感觉有点混沌系统或者三体问题的味道。 [video(video-kQmoG4nn-1644675064899)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=551467847)(image-https://img-blog.csdnimg.cn/img_convert/2339269ada5b2f667d03f5fcff9627c9.png)(title-倒立双摆仿真)] 这次不控制位置了,只希望稳定时速度为0就行。结果如下 [video(video-4hDOTU7e-1644675104583)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=893970755)(image-https://img-blog.csdnimg.cn/img_convert/fdc02dd23631f898f202645c322c9e5e.png)(title-倒立双摆LQR控制)] # 参考链接 其中链接[4]给了一篇求解代数Riccati方程的论文。 1. [机器人机械结构之倒立摆模型](https://zhuanlan.zhihu.com/p/97064180) 2. [一阶倒立摆的PID控制和LQR控制](https://zhuanlan.zhihu.com/p/54071212) 3. [LQR控制算法推导以及简单分析](https://blog.csdn.net/qq_24649627/article/details/104690279) 4. [代数Riccati方程的数值算法](https://blog.csdn.net/fanhuajames/article/details/7828024) 5. [当我们谈“最小相位系统”时究竟在谈什么?](https://zhuanlan.zhihu.com/p/108053853) # 代码仓库文件结构 ``` ├── cppcode: 仿真程序 │ ├── controller.hpp: PID控制器和LQR控制器 │ ├── pendulum.hpp: 倒立单摆和倒立双摆的数学模型 │ ├── singleip.cpp: 倒立单摆的简易PID控制和LQR控制 │ ├── linear.cpp: 倒立单摆的线性化模型,用于与非线性的数学模型比较确定线性化的计算过程是否正确 │ ├── doubleip.cpp: 倒立双摆的LQR控制 │ └── seriespid.cpp:串级PID控制倒立摆 ├── latexcode: 数学模型与控制算法推导 ├── pythoncode: 计算控制器参数,绘制bode图等 │ ├── riccati.py: 求解Riccati方程函数 │ ├── zhnbodeplot.py: 绘制伯德图函数 │ ├── calc1.py: 计算二阶LQR控制器参数 │ ├── calc2.py: Riccati方程计算四阶LQR控制器参数 │ ├── calc3.py: Riccati方程计算倒立双摆的五阶LQR控制器参数 │ ├── bodeangle.py: 内环PID控制的伯德图 │ └── bodeoutangle.py: 外环PID控制的伯德图 ├── CMakeLists.txt: ├── build.bat: 为了vscode里编译方便 └── README. md:这篇博客的内容 ```