公式和图片需要交叉引用,所以正文用
LaTeX
\LaTeX
LATEX写,一并放到代码仓库里,不适合
LaTeX
\LaTeX
LATEX的动图和链接放到博客里。建模仿真使用 simucpp,仿真效果展示使用 EGE,波形图展示使用 matplotlib。
下文的倒立摆如果不特别说明就指单摆。
代码 https://gitee.com/xd15zhn/inversependular
博客 倒立摆控制与仿真动画展示
视频 https://space.bilibili.com/344268817/channel/seriesdetail?sid=2023589
具体的分析见
LaTeX
\LaTeX
LATEX生成的PDF https://gitee.com/xd15zhn/inversependular/releases
下面是不施加任何输入的情况,建模使用的是原本的非线性模型,全角度都是符合实际的,设计控制器时才线性化。
PID只使用比例控制结果如下。以后我再看看能不能算出来最合适的PID参数。
我在录视频的时候因为做不到先点录屏再开始仿真,所以我把仿真设置成循环的,下面的视频有的一开始是一段循环的末尾,请耐心看完下一个循环。
使用LQR只控制角度时如下,速度和位置不受控制。矩阵都是二维的,可以手算出结果。
倒立摆角度控制
使用LQR同时控制位置和角度结果如下。
倒立摆LQR控制
倒立双摆参考《Robust Adaptive Control》例2.2.1,不施加任何输入的情况如下,出乎意料的是它竟然不像单摆那样形成一个循环,时间再长点就跑出画面了,感觉有点混沌系统或者三体问题的味道。
倒立双摆仿真
这次不控制位置了,只希望稳定时速度为0就行。结果如下
倒立双摆LQR控制
参考链接
其中链接[4]给了一篇求解代数Riccati方程的论文。
- 机器人机械结构之倒立摆模型
- 一阶倒立摆的PID控制和LQR控制
- LQR控制算法推导以及简单分析
- 代数Riccati方程的数值算法
- 当我们谈“最小相位系统”时究竟在谈什么?
- 13. 稳定裕度
- http://www.kostasalexis.com/lqr-control.html
- Linear Quadratic Regulators
- Linear Quadratic Regulator (LQR) With Python Code Example
代码仓库文件结构
├── 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:这篇博客的内容