1. 双回路自动驾驶仪调参概述
作为一名从事飞行控制系统开发多年的工程师,我经常需要处理自动驾驶仪的调参问题。今天要分享的是一个非常典型的双回路自动驾驶仪调参案例,这个案例来自MathWorks官方文档,但我会结合自己多年的实战经验,为大家深入解析其中的技术细节和调参技巧。
这个案例的核心是控制飞行器的俯仰速率(q)和垂直加速度(az)。在实际飞行控制中,这种双回路结构非常常见——内环控制俯仰速率,外环控制垂直加速度。这种架构的优势在于:
- 内环可以快速响应飞行器的动态变化
- 外环则确保飞行器按照预期的轨迹飞行
- 两个回路各司其职,既保证了响应速度,又确保了控制精度
2. 飞行器模型与配平分析
2.1 模型结构解析
打开模型rct_airframe1,我们可以看到完整的飞行器动力学和自动驾驶仪结构。这个模型有几个关键组成部分:
- 飞行器动力学模型:包含了气动力和运动方程
- 自动驾驶仪结构:
- 内环:俯仰速率控制回路(含q Gain模块)
- 外环:垂直加速度控制回路(含az Control PI控制器)
- 输入输出接口:
- 输入:azref(垂直加速度指令)
- 输出:az(实际垂直加速度)和q(俯仰速率)
重要提示:在开始调参前,必须确保模型在正确的配平条件下工作。这个案例中,我们选择α=0(零攻角)和V=984m/s的飞行状态作为基准。
2.2 配平条件计算
配平是飞行控制中至关重要的一步。我们需要找到舵偏角δ,使得在这个飞行状态下:
- 法向加速度为零
- 俯仰力矩为零
- 飞行器处于平衡状态
使用findop函数进行配平计算时,有几个关键设置需要注意:
matlab复制opspec = operspec('rct_airframe1');
% 位置状态:已知但不要求稳态
opspec.States(1).Known = [1;1];
opspec.States(1).SteadyState = [0;0];
% 速度状态:u已知,w已知且要求稳态
opspec.States(3).Known = [1 1];
opspec.States(3).SteadyState = [0 1];
% 俯仰角:已知但不要求稳态
opspec.States(2).Known = 1;
opspec.States(2).SteadyState = 0;
% 俯仰速率:未知但要求稳态
opspec.States(4).Known = 0;
opspec.States(4).SteadyState = 1;
% 积分器状态:不要求稳态
opspec.States(5).SteadyState = 0;
opspec.States(6).SteadyState = 0;
op = findop('rct_airframe1',opspec);
配平完成后,我们可以检查飞行器的极点分布:
matlab复制G = linearize('rct_airframe1','rct_airframe1/Airframe Model',op);
pole(G)
结果显示飞行器有一个不稳定的极点(0.1253),这意味着开环系统是不稳定的,需要通过反馈控制来稳定。
3. 使用LOOPTUNE进行频域调参
3.1 调参设置
looptune是Simulink Control Design中一个强大的工具,可以自动调参多回路控制系统。我们需要:
- 创建slTuner接口
- 指定可调模块
- 设置关注点
matlab复制ST0 = slTuner('rct_airframe1',{'az Control','q Gain'},op);
addPoint(ST0,{'az ref','delta fin','az','q'});
3.2 基本调参
初始调参目标是使系统在delta fin处有5rad/s的增益穿越频率:
matlab复制wc = 5;
Controls = 'delta fin';
Measurements = {'az','q'};
[ST,gam,Info] = looptune(ST0,Controls,Measurements,wc);
调参完成后,gam值接近1表示要求基本满足。我们可以用loopview检查结果:
matlab复制figure('Position',[100,100,560,714])
loopview(ST,Info)
3.3 添加跟踪要求
初始调参后,我们发现az并不能很好地跟踪azref指令。这是因为我们没有明确指定跟踪要求。解决方法:
matlab复制TrackReq = TuningGoal.Tracking('az ref','az',1);
ST = looptune(ST0,Controls,Measurements,[3,12],TrackReq);
现在再检查阶跃响应,可以看到az能很好地跟踪azref了。
3.4 查看调参结果
使用showBlockValue查看最终的控制器参数:
matlab复制showBlockValue(ST)
az_Control =
1
Kp + Ki * -
s
with Kp = 0.00166, Ki = 0.0017
q_Gain =
D =
u1
y1 1.985
可以看到,PI控制器的比例增益为0.00166,积分增益为0.0017,而内环的q增益为1.985。
4. 使用SYSTUNE进行MIMO设计
4.1 MIMO架构介绍
除了级联的双回路结构,我们还可以尝试MIMO(多输入多输出)架构。打开rct_airframe2模型,可以看到:
- 单个MIMO控制器同时接收az和q的反馈
- 直接输出舵面指令delta fin
- 结构更简洁,但调参更复杂
4.2 配平条件计算
同样需要先进行配平计算:
matlab复制opspec = operspec('rct_airframe2');
% 配平条件设置与之前类似
op = findop('rct_airframe2',opspec);
4.3 控制器参数化
我们使用二阶MIMO控制器,并固定D(1)=0:
matlab复制ST0 = slTuner('rct_airframe2','MIMO Controller',op);
C0 = tunableSS('C',2,1,2); % 二阶控制器
C0.D.Value(1) = 0; % 将D(1)固定为零
C0.D.Free(1) = false;
setBlockParam(ST0,'MIMO Controller',C0)
4.4 调参要求设置
设置四个关键要求:
matlab复制% 1. 跟踪要求
Req1 = TuningGoal.Tracking('az ref','az',1);
% 2. 带宽和滚降
Req2 = TuningGoal.MaxLoopGain('delta fin',tf(25,[1 0]));
% 3. 稳定裕度
Req3 = TuningGoal.Margins('delta fin',7,45);
% 4. 抗扰
Freqs = [0 0.001 1];
MinAtt = [100 100 40]; % 单位dB
Req4 = TuningGoal.Rejection('delta fin',frd(db2mag(MinAtt),Freqs));
Req4.Focus = [0 1];
4.5 执行调参
使用systune进行调参,并启用随机初始点:
matlab复制AllReqs = [Req1,Req2,Req3 Req4];
Opt = systuneOptions('RandomStart',3);
rng(0)
[ST,fSoft] = systune(ST0,AllReqs,Opt);
4.6 结果比较
将MIMO设计与之前的级联设计进行比较:
matlab复制T = getIOTransfer(ST,{'az ref','delta fin'},'az');
figure
step(Tr1,'b',T(1),'r',5)
title('跟踪')
legend('级联','2自由度')
step(Td1,'b',T(2),'r',5)
title('抗扰')
legend('级联','2自由度')
结果显示,MIMO设计在抗扰性能上更优,而跟踪性能相当。
5. 实战经验与技巧
5.1 调参中的常见问题
- 调参不收敛:可能是由于要求之间相互冲突,需要适当放宽某些要求
- 响应振荡:可能需要增加稳定裕度要求
- 跟踪性能差:明确指定跟踪要求,并检查是否所有相关信号都被正确标记
5.2 性能优化建议
- 带宽选择:内环带宽通常应比外环高3-5倍
- 增益限制:对控制器增益设置合理限制,避免执行器饱和
- 抗扰设计:低频段需要更高的抗扰能力
5.3 调试技巧
- 使用loopview和viewGoal可视化检查调参结果
- 分阶段调参:先调内环,再调外环
- 使用step和bode等工具验证时域和频域性能
6. 两种架构的比较与选择
6.1 级联架构的优缺点
优点:
- 结构简单,易于理解和实现
- 调参相对简单,可以分步进行
- 内环可以快速抑制干扰
缺点:
- 外环依赖于内环性能
- 可能不是全局最优解
6.2 MIMO架构的优缺点
优点:
- 可能获得更好的全局性能
- 抗扰性能通常更好
- 结构更紧凑
缺点:
- 调参更复杂
- 需要更深入的系统理解
- 计算量可能更大
在实际工程中,我通常会先尝试级联架构,如果性能不能满足要求,再考虑MIMO架构。对于这个飞行器控制案例,两种架构都能满足基本要求,但MIMO在抗扰方面表现更好。