使用MATLAB搭建模型
通过之前的三篇文章
从零开始建模(一)-牛顿欧拉方程
从零开始建模(二)-姿态更新
从零开始建模(三)-控制分配浅析
我们已经对建模的过程有了一定的了解,相信小伙伴们都已经跃跃欲试了,那就让我们开始吧。
我们来简单的实现一个飞行器的高度控制吧。
1.将期望高度和实际高度做差
2.误差进入控制器得到输出
3.输出分配到执行机构(电机)
4.电机产生力
5.模型根据受到的力,得到当前的状态包括实际高度
按照这个步骤我们就可以搭建一个闭环的控制系统了。(熟悉一下这个步骤,这是个通用的步骤哦)
少废话,先看东西!
运行POSHOLD文件,可以看到一个动画过程,显示飞机在空间中的位置,同时四个长条表示飞机受到的力的大小,这样可以很直观的观察飞机的动态。(我这样的新手就爱看动画)
然后是位置控制结果,很快就到达期望位置(0,0,3),没有超调。(我的参数调的还可以吧)
速度环的控制过程
加速度环的控制过程
关于控制器
我也只用过PID,没有用过其他控制器。
PID的好处就是简单高效,给我一个误差,还你一个期望。(来个动图感受下)
我使用的控制器是模仿APM的z轴控制器函数
AC_PosControl::run_z_controller()
简单介绍一下。(做了一点修改去掉了悬停油门,就是单纯的PID)
位置误差乘kp 得到速度期望。
速度误差乘kp 得到加速度期望。
加速度误差经过PID得到占空比。
串级PID外环输出会变成内环的期望,简单的可以理解为当你的周期是固定的,那么1/dt也是个定值,误差/dt就是微分,位置的微分就是速度,所以这里kp=1/dt。
PID的输出有什么单位吗?有什么物理意义吗?
没有单位,这里之所以说输出是占空比,因为我们想控制电机,所以我们期望他是占空比,所以我们在调参的时候要让输出有占空比的性质,所以PID参数要使得输出在0-1之间变化才合适。
如果我们想控制的输出直接就是转速(省略电机模型),那也可以,那么你就的让你的输出像是个电机转速(假设最高2000转),所以你的PID参数得让输出在0-2000之间变化。
所以控制器其实是个很随意的东西,有什么物理意义是取决于你怎么用,所以大胆用,勤思考,控制器没啥大不了。
建模有没有用
如果你问我,这个模型是不是可以直接代替实物?我在仿真里调参直接就可以用?
抱歉,不行。
那这种理想化的模型有没有用呢?
我用这个模型知道了为什么串级PID外环只有P。
越接近力的回内环,速度越快,参数越好调节。
龙格库塔法和直接欧拉角积分的姿态更新区别。
现在还在对比倾转分离的效果。
以后还会有更多有意思的想法可以实现。
对于学习,我觉得有用。
个人微信公众号【无人机干货铺】,欢迎交流。