写在前面,本文为研一下智能控制课程的课程作业报告,主要为基于无人车侧向运动模型的PID控制器设计,控制器设计比较简单,主要是对阿克曼转向模型进行搭建,PI参数调节部分的研究。设计内容分为两部分,分别是简单的转向角单闭环控制,以及基于其设计的位置规划控制。
源程序Simulink仿真模型链接(我是使用Matlab r2023b搭建,如果打开遇到版本过低提示,可以找到身边有2023b版本的同学帮忙导出低版本的格式)
链接:https://pan.baidu.com/s/1uauJ-Chik6FjqC-HoXsuew?pwd=a8qj
提取码:a8qj
这个报告一开始还是想着好好写的,但是到后面模型搭完以后反而懒得折腾报告了,后面做的有点不太好,多多包涵啦
欢迎关注评论留言点赞哦,模型我就不在这里发了,收费不好下载,有需要的私聊即可,不过我文中说的基本也比较清楚了,照着做应该就行。
1 横摆角速度控制
1.1 模型搭建
首先根据PPT中的如式所示的横向运动的状态方程,搭建Simulink模型如下图 1所示:
图 1 横向运动的Simulink仿真模型
模型中的所有给定参数,使用模型设置中的初始化回调函数进行参数初始化,界面如图 2所示:
图 2 初始化回调函数界面
再根据补充的x、y轴速度和位置的计算公式建立速度计算和位置计算方程如下图 3所示:
图 3位置与速度计算的Simulink仿真模型
这里其实有个小问题,就是对于横向运动而言,物体的前进速度应该是一个给定的量,并不作为系统的输入或是控制量进行考虑。但是在模型的理解上,究竟是Vx作为给定量,再通过角度β计算V和Vy,还是以V作为给定量,再计算Vx和Vy,这里我是有个疑问的,询问了无人所教研室得一位同学,也没有得到确切得答案。
若是前一种情况则相对较简单,上面涉及到的状态方程可以直接通过Simulink中的state-space模块生成,因为状态空间方程中ABCD这四个矩阵均为定值;而当情况为后一种时,则相对更为复杂,无法通过状态空间模块直接构建系统模型,需要通过积分等模块按照计算公式搭建。因此考虑到前面的两种分歧,我还是选择了更为全面考虑的完整搭建的方式,方便实现两种不同情况。
最终通过给定转向角观察角速度输出的开环系统仿真,我发现在本道题小角度低速运动的两种情况下,两种不同的考虑并没有太大的差别,最后我选择了前面的给定Vx的方案进行下一步的闭环程序设计,横摆角速度单环系统的框图如下图 4所示:
图 4 横摆角速度单环控制框图
通过Simulink搭建角速环如下图 5所示:
图 5 角速度外环Simulink仿真模型
1.2 PID参数对控制性能的影响
为了验证控制器的控制性能,调节合适的PID控制器参数,角速度输入采用幅值为0.1的方波信号,仿真模型截图和实验结果如下。
首先仅考虑P环节,取kp=1,得到输出如下图 6所示:
图 6 kp=1,仿真波形
可以看出波形上总体稳定且无超调,但存在较大静态误差。继续增加kp的取值,分别取1,10,100,1000得到仿真波形如下图 7所示:
| |
(a)kp=1 | (b)kp=10 |
| |
(c)kp=100 | (d)kp=1000 |
图 7 不同kp下的仿真波形
从仿真结果可以看出随着kp参数的增大,静差逐渐减小,因此理论上仅设计P环节就可以达到比较好的控制效果,但是在实际仿真中我发现kp增大也会使系统的仿真时间大大增加。
进一步观察kp=1和kp=1000两种情况下,导向角控制量的输出波形,可以看出,kp增大时会使导向角控制量的波动增加。因为我在仿真中采用的是连续系统仿真的方式,并没有考虑到实际控制系统的离散情况,而且实际控制器也存在控制频率的限制,过高频率的震荡会导致控制性能不佳,甚至会使系统发散。
| |
(a)kp=10 | (b)kp=1000 |
图 8 不同kp下导向角的输出波形
因此实际控制系统设计时,为了减小静态误差量,kp不宜取得过大,应通过设计积分I环节来进一步调整静态误差。
接下来进行I环节的设计,为了更清楚的观察ki对于控制性能的影响,下面我选择kp=50,存在适量稳态误差的情况进行ki参数的设计。
设分别取ki=0,1,10,100,得到如所示的四个输出:
| |
(a)kp=50,ki=0 | (b)kp=50,ki=1 |
| |
(c)kp=50,ki=10 | (d)kp=50,ki=100 |
图 9 不同kp下导向角的输出波形
可以看出,I环节的加入可以有效的改善稳态误差,系统响应迅速,且此时导向角输入的抖振也不大。
控制系统设计中,D环节一般很少使用,其主要用于减少系统输出的超调和振荡,在此系统中此问题并不明显。通过仿真也可以看出D参数对于系统的输出确实没有很大的影响。且加入D参数之后,控制器的计算量大大增加,仿真时长也随之变长。因此在该模型中,不使用D环节。
综上所述,对于角速度而言,使用单个P环节就可以实现较好的跟踪效果,但是由于在实际控制系统设计中,单个P环节可能会导致系统输出的超调和振动。结合我的课题背景,在我所接触到的控制器设计中,磁浮列车悬浮控制器的电流环为了追求更快的响应速度,采用单个P环节的电流内环,而直线电机控制的电流环则采用PI环节,I环节的存在就是为了实现更小的静差,进而减小电机输出的推力波动。
结合本系统的实际应用,在低速运动下对于系统的响应速度要求不是很高,所以我还是加上了一个相对较小的I环节调节静差,虽然在实际控制器中这有可能会导致控制器计算速度的下降。在我所搭建Simulink连续系统仿真模型中,选择角速度环控制参数为kp=100,ki=10,可以达到比较好的控制效果,最终的仿真结果如下图 10所示。
图 10 最终调参后的仿真结果
2 位置规划控制
位置外环的构建上我一开始是没有什么头绪,最后也是请教了无人所的一位同学才搞明白位置规划控制的方式,具体实现如下。当然这里的“位置外环”的理解是我根据电机控制中的双闭环矢量控制给出的自己的理解,这里实际上只是完成了内环给定量的寻优计算,并没有实质上的控制的过程。
首先我在程序的初始化回调函数InitFcn中加入我所需要的初始化位置规划函数如图 11所示:
图 11 位置规划的初始化函数
可以看到,我在初始化函数中一些基本参数的基础上,将规划轨迹离散成多个目标点,其中直线轨迹为等步长的离散点,圆形规划则为沿2π角度的等角度离散点。外环控制器采用for循环遍历所有目标点和当前位置的距离,选取其中最小,也即距离当前位置最近的目标点作为位置期望,并计算此时角速度内环的给定值,最终实现双闭环完成控制。
双闭环控制器和位置规划的程序如下图所示:
function [r_ref,x_ref,y_ref] = fcn(X_ref,Y_ref,x,y,phi)
Err = [];
for i = 1:length(X_ref)
Err = [Err, sqrt((X_ref(i)-x)^2+(Y_ref(i)-y)^2)];
end
[l_d,j] = min(Err);
x_ref = X_ref(j);
y_ref = Y_ref(j);
alpha = atan2(y_ref-y,x_ref-x);
theta_e = alpha - phi;
r_ref = l_d*sin(theta_e);
完整实现位置规划的仿真模型如下图所示:
得到直线规划下的位置跟踪情况,其中左图为XY坐标图,右图为位移时间图:
分别得到两种圆形规划下的位置跟踪情况,如所示,其中左图为XY坐标图,右图为位移时间图,下方为InitFcn的规划函数:
可以看出内环的参数调节合理后,位置规划的控制效果较好,系统响应速度较快。
但是仿真后也发现了几个挺有意思的问题,就是采用这种位置规划的方法进行位置控制时,直线规划并不会存在这个问题,但在圆形规划中,会出现绕圆运动方向不可控的情况,以上仿真仅仅实现了对于圆形位置规划的简单控制,但没人实现方向的进一步判断,由于时间问题我也没有进一步做出改进,我猜想简单的改进方式就是在位置规划时加入更多的判断和限制条件,应该可以改善绕圆方向不可控的问题。