PSO优化PID双闭环四旋翼轨迹跟踪Simulink仿真
1. 四旋翼轨迹跟踪的核心痛点与双闭环控制思路四旋翼无人机从能飞到飞得稳、飞得准中间隔着一整套控制架构的设计。很多人第一次接触四旋翼仿真第一反应是直接搭一个PID把期望位置和实际位置做差输出电机转速跑一遍Simulink发现曲线勉强能看但一旦加入风扰、模型参数摄动或者期望轨迹变成螺旋爬升姿态环立刻开始振荡位置跟踪误差能飙到米级。这不是PID不行而是单环PID在处理四旋翼这种欠驱动、强耦合、非线性系统时天生就存在带宽分配和抗扰能力的矛盾。我最早做四旋翼仿真的时候也踩过这个坑。当时用单环PID控制位置姿态角作为中间变量直接由位置环输出结果发现位置环为了快速消除误差把增益调得很高姿态响应跟不上电机输出饱和整个系统进入极限环振荡。后来改成双闭环结构——外环位置控制、内环姿态控制——问题才从根本上缓解。外环负责把位置误差转化为期望姿态角内环负责快速跟踪期望姿态角两个环各司其职带宽拉开耦合减弱轨迹跟踪精度直接提升一个数量级。但双闭环PID的参数整定又成了新问题。四旋翼有四个控制通道高度、滚转、俯仰、偏航每个通道至少三个PID参数双闭环就是二十多个参数。手动调参不仅耗时而且很难找到全局最优解。这时候粒子群算法PSO就派上用场了。PSO是一种群体智能优化算法模拟鸟群觅食行为每个粒子代表一组PID参数通过迭代更新速度和位置最终收敛到使目标函数最小的参数组合。相比遗传算法PSO没有交叉和变异操作参数少、收敛快、容易实现特别适合PID参数这种连续变量的优化问题。这套“PSO优化PID双闭环控制”的方案核心价值在于用双闭环解决四旋翼的控制结构问题用PSO解决参数整定问题两者结合既保证了控制架构的合理性又保证了参数的最优性。适合谁看如果你正在做四旋翼轨迹跟踪仿真或者对PSO优化PID感兴趣又或者想系统学习Simulink下的无人机控制建模这套内容可以直接参考复现。2. 四旋翼动力学建模与双闭环控制架构拆解2.1 为什么必须用双闭环而不是单环四旋翼的动力学模型可以拆成两部分位置动力学和姿态动力学。位置动力学描述质心运动输入是总升力和姿态角姿态动力学描述绕质心的转动输入是三轴力矩。注意这里的关键——位置环的控制输出是姿态角而姿态角本身又是姿态环的被控量。如果只用单环位置环直接输出电机转速那么位置误差和姿态误差混在一起控制器无法区分“我现在位置偏了是因为姿态不对还是推力不够”导致控制效果大打折扣。双闭环的结构逻辑是外环位置控制器根据位置误差和速度误差计算出期望的滚转角和俯仰角同时输出总推力内环姿态控制器根据期望姿态角和实际姿态角的误差计算出三轴力矩再通过混控矩阵分配到四个电机。这样外环只管位置内环只管姿态两个环的带宽可以独立设计。通常内环带宽是外环的5到10倍保证姿态响应足够快位置环的指令能够被及时执行。从数学上看四旋翼的位置动力学可以写成m * p_ddot R * [0, 0, T]^T - [0, 0, m*g]^T F_dist其中p是位置向量R是旋转矩阵T是总推力F_dist是外部扰动。姿态动力学可以写成J * omega_dot tau - omega × (J * omega)其中J是转动惯量矩阵omega是角速度tau是力矩。双闭环的设计就是把这两个方程解耦处理外环产生期望姿态角内环产生力矩。2.2 位置环和姿态环的PID结构设计位置环通常采用PD控制因为位置误差的积分项容易在悬停时产生漂移。具体来说水平位置环输出期望加速度再反解出期望姿态角a_des Kp_pos * (p_des - p_act) Kd_pos * (v_des - v_act) theta_des asin((a_des_x * cos(psi) a_des_y * sin(psi)) / g) phi_des asin((a_des_x * sin(psi) - a_des_y * cos(psi)) / g)高度环采用PID控制因为高度通道存在重力补偿积分项可以消除稳态误差T m * (g Kp_z * (z_des - z_act) Ki_z * integral_z Kd_z * (vz_des - vz_act))姿态环采用PID控制输入是期望姿态角和实际姿态角的误差输出是三轴力矩tau_phi Kp_phi * (phi_des - phi_act) Ki_phi * integral_phi Kd_phi * (p_des - p_act) tau_theta Kp_theta * (theta_des - theta_act) Ki_theta * integral_theta Kd_theta * (q_des - q_act) tau_psi Kp_psi * (psi_des - psi_act) Ki_psi * integral_psi Kd_psi * (r_des - r_act)这里p、q、r是机体角速度积分项用于消除稳态误差微分项用于增加阻尼。姿态环的积分项很重要因为四旋翼在悬停时如果存在常值扰动比如重心偏移没有积分项就无法消除姿态偏差。2.3 混控矩阵与电机分配逻辑四旋翼有四个电机通常呈X型布局。混控矩阵的作用是把总推力T和三轴力矩tau分配到四个电机的转速上。对于X型四旋翼混控矩阵可以写成[T] [1 1 1 1] [F1] [tau_phi] [0 -l 0 l] * [F2] [tau_theta] [-l 0 l 0] * [F3] [tau_psi] [c -c c -c] [F4]其中l是电机到质心的距离c是反扭矩系数。这个矩阵的逆矩阵就是电机分配矩阵。实际实现时需要先计算期望的T和tau然后通过逆矩阵求出四个电机的期望推力再根据推力-转速关系F k * omega^2反解出期望转速最后输出给电机模型。这里有个细节需要注意混控矩阵的逆矩阵可能不是方阵需要用伪逆。另外电机推力有饱和限制如果计算出的期望推力超过最大值需要做限幅处理否则仿真会发散。我在Simulink里通常会在混控模块后面加一个Saturation模块上限设为电机最大推力下限设为零。3. 粒子群算法优化PID参数的完整实现3.1 PSO的基本原理与参数选择粒子群算法的核心思想是每个粒子在搜索空间中飞行根据自己的历史最优位置和群体的历史最优位置调整飞行速度和方向。标准PSO的更新公式为v_i(t1) w * v_i(t) c1 * r1 * (pbest_i - x_i(t)) c2 * r2 * (gbest - x_i(t)) x_i(t1) x_i(t) v_i(t1)其中v是速度x是位置pbest是粒子历史最优gbest是群体历史最优w是惯性权重c1和c2是学习因子r1和r2是0到1之间的随机数。参数选择对PSO的收敛性能影响很大。惯性权重w控制全局搜索和局部搜索的平衡通常从0.9线性递减到0.4前期侧重全局搜索后期侧重局部收敛。学习因子c1和c2一般取2.0也有取1.5到2.5之间的。粒子数量一般取20到50迭代次数取50到200。对于PID参数优化搜索空间维度等于待优化参数个数比如双闭环有12个PID参数位置环3个PD 高度环3个PID 姿态环3个PID 偏航环3个PID搜索空间就是12维。这里有个经验PSO的初始粒子位置不要完全随机最好在经验值附近均匀分布。比如位置环Kp的经验值是2到10Kd是1到5那么初始粒子就在这个范围内随机生成。完全随机的初始位置可能导致粒子飞到不合理的区域增加收敛时间。3.2 目标函数的设计与权重分配PSO优化PID的关键在于目标函数的设计。目标函数决定了PSO往哪个方向优化如果设计不合理优化出来的参数可能在某些场景下表现很好但在其他场景下很差。常用的目标函数有ISE积分平方误差、IAE积分绝对误差、ITAE积分时间加权绝对误差等。对于四旋翼轨迹跟踪我推荐使用ITAE作为基础再加上控制量惩罚项和超调惩罚项J ∫ t * |e(t)| dt w1 * ∫ |u(t)| dt w2 * max(0, overshoot - threshold)其中e(t)是轨迹跟踪误差u(t)是控制量overshoot是超调量。第一项保证跟踪误差快速收敛第二项抑制控制量过大第三项惩罚超调。权重w1和w2需要根据实际需求调整一般w1取0.01到0.1w2取10到100。为什么用ITAE而不是ISE因为ITAE对初始误差的权重较小对后期误差的权重较大这样优化出来的参数更注重稳态精度而不是一味追求快速响应。对于四旋翼轨迹跟踪稳态精度往往比响应速度更重要所以ITAE更合适。3.3 PSO与Simulink的联合仿真框架PSO优化PID需要反复调用Simulink模型进行仿真每次仿真返回目标函数值。实现方式有两种一种是用MATLAB脚本直接调用sim命令另一种是用Simulink的Fast Restart模式加速仿真。第一种方式的代码框架如下% 初始化PSO参数 n_particles 30; n_iterations 100; w_max 0.9; w_min 0.4; c1 2.0; c2 2.0; % 初始化粒子位置和速度 for i 1:n_particles x(i,:) lb (ub - lb) .* rand(1, dim); v(i,:) zeros(1, dim); pbest(i,:) x(i,:); pbest_fitness(i) inf; end % PSO主循环 for iter 1:n_iterations w w_max - (w_max - w_min) * iter / n_iterations; for i 1:n_particles % 更新速度 v(i,:) w * v(i,:) c1 * rand * (pbest(i,:) - x(i,:)) c2 * rand * (gbest - x(i,:)); % 更新位置 x(i,:) x(i,:) v(i,:); % 边界处理 x(i,:) max(x(i,:), lb); x(i,:) min(x(i,:), ub); % 仿真并计算适应度 fitness run_simulation(x(i,:)); % 更新pbest和gbest if fitness pbest_fitness(i) pbest(i,:) x(i,:); pbest_fitness(i) fitness; end if fitness gbest_fitness gbest x(i,:); gbest_fitness fitness; end end end其中run_simulation函数负责把PID参数写入Simulink模型的工作区变量然后调用sim命令运行仿真最后从仿真输出中计算目标函数值。第二种方式是用Fast Restart模式可以在不重新编译模型的情况下多次运行仿真速度提升非常明显。设置方法是在Simulink模型配置中勾选“Fast Restart”然后在脚本中用set_param命令控制仿真启动和停止。实测下来Fast Restart模式比普通模式快5到10倍对于PSO这种需要几百次仿真的场景加速效果非常显著。4. Simulink仿真模型搭建与关键模块配置4.1 四旋翼动力学模型的Simulink实现四旋翼动力学模型可以用Simulink的Level-2 S-Function实现也可以用基本的积分器和代数运算模块搭建。我推荐用后者因为更直观便于调试。位置动力学部分输入是总推力T和三个姿态角输出是位置和速度。核心模块包括旋转矩阵计算、重力补偿、积分器。旋转矩阵用MATLAB Function模块实现输入是三个欧拉角输出是3x3矩阵。重力补偿就是一个常数减去T/m。积分器用Integrator模块初值设为期望的初始位置。姿态动力学部分输入是三轴力矩输出是姿态角和角速度。核心模块包括转动惯量矩阵、叉乘运算、积分器。叉乘运算用MATLAB Function模块实现输入是角速度和Jomega输出是omega × (Jomega)。积分器同样用Integrator模块初值设为零。电机模型部分输入是期望转速输出是实际推力和反扭矩。可以用一阶惯性环节模拟电机响应时间常数取0.02到0.05秒。推力用转速平方乘以推力系数反扭矩用转速平方乘以反扭矩系数。4.2 PID控制器模块的参数化配置Simulink自带的PID Controller模块支持参数化配置可以把P、I、D参数设为工作区变量这样PSO每次迭代只需要更新工作区变量不需要修改模型。具体操作是在PID模块参数对话框中把P、I、D分别设为Kp、Ki、Kd然后在MATLAB工作区中定义这些变量。对于双闭环需要四个PID模块位置环PD、高度环PID、姿态环PID、偏航环PID。位置环PD只需要P和DI设为0。高度环和姿态环需要完整的PID。每个模块的采样时间设为0.001秒和仿真步长一致。这里有个细节PID模块的微分项容易受到噪声影响建议在微分项前面加一个低通滤波器截止频率设为10到20赫兹。Simulink的PID模块自带滤波器选项勾选“Use filtered derivative”即可。4.3 轨迹生成模块与参考信号设计轨迹生成模块负责产生期望的位置和偏航角。对于四旋翼轨迹跟踪仿真常用的轨迹有阶跃轨迹、正弦轨迹、螺旋爬升轨迹、圆形轨迹等。我建议至少测试三种轨迹阶跃响应测试稳态精度正弦响应测试跟踪带宽螺旋爬升测试耦合特性。轨迹生成可以用MATLAB Function模块实现输入是时间t输出是期望位置和期望偏航角。比如圆形轨迹function [x_des, y_des, z_des, psi_des] trajectory(t) radius 5; omega 0.5; x_des radius * cos(omega * t); y_des radius * sin(omega * t); z_des 1 0.5 * sin(0.2 * t); psi_des 0; end这个轨迹同时测试了水平跟踪、高度跟踪和偏航保持。如果PSO优化出来的参数能在这个轨迹上表现良好基本可以认为参数是可靠的。4.4 仿真参数配置与求解器选择Simulink的求解器选择对仿真精度和速度影响很大。对于四旋翼这种连续系统推荐用ode4Runge-Kutta定步长求解器步长设为0.001秒。变步长求解器虽然精度高但每次仿真时间不固定不利于PSO优化。定步长求解器每次仿真时间固定目标函数计算更稳定。仿真时间根据轨迹周期设定一般取10到20秒。太短了看不出稳态性能太长了PSO优化时间太长。我通常取15秒前5秒用于过渡后10秒用于计算目标函数。另外仿真输出需要保存位置、姿态、控制量等信号用于计算目标函数。可以在Simulink中添加To Workspace模块把信号保存为数组。注意要设置保存格式为Array采样时间设为0.001秒和仿真步长一致。5. 参数整定实录与常见问题排查5.1 PSO优化前后的参数对比与性能分析我拿一组实测数据来说明PSO优化的效果。优化前手动整定的PID参数为位置环Kp3.5Kd2.0高度环Kp8.0Ki0.5Kd4.0姿态环Kp6.0Ki0.1Kd1.5偏航环Kp2.0Ki0.05Kd0.5。在圆形轨迹下位置跟踪误差RMS为0.35米最大误差0.82米。用PSO优化后参数变为位置环Kp5.2Kd3.1高度环Kp12.5Ki0.8Kd6.2姿态环Kp9.8Ki0.15Kd2.4偏航环Kp3.5Ki0.08Kd0.9。同样的轨迹下位置跟踪误差RMS降到0.12米最大误差0.28米。提升非常明显。从参数变化可以看出PSO倾向于增大比例增益和微分增益同时适当增大积分增益。这是因为四旋翼的轨迹跟踪需要快速响应和足够的阻尼手动整定时往往偏保守PSO能够找到更激进的参数组合。5.2 仿真中常见的发散与振荡问题排查四旋翼仿真中最常见的问题是发散和振荡。发散通常是因为控制量饱和或者积分项累积过大。排查方法是先检查电机推力是否超过上限如果超过说明控制量过大需要降低PID增益或者增加限幅。再检查积分项是否累积到很大值如果是说明积分时间常数太小需要增大积分时间或者加抗积分饱和。振荡通常是因为微分增益过大或者相位滞后。排查方法是先降低微分增益看振荡是否减弱。如果减弱说明微分增益过大。如果没变化检查姿态环和位置环的带宽比如果姿态环带宽不够位置环的指令无法被及时执行也会导致振荡。这时候需要增大姿态环增益或者降低位置环增益。还有一个隐蔽的问题混控矩阵的符号错误。如果某个电机的推力方向反了四旋翼会往相反方向飞仿真立刻发散。排查方法是单独给每个电机一个常值推力看四旋翼的响应是否符合预期。比如只给前电机推力四旋翼应该往前倾如果往后倾说明符号反了。5.3 PSO收敛速度慢的优化技巧PSO收敛速度慢通常是因为参数选择不当或者目标函数设计不合理。优化技巧包括第一调整惯性权重。如果收敛太慢可以增大初始惯性权重比如从0.9增加到1.2让粒子在前期探索更大范围。如果后期收敛不稳定可以减小最终惯性权重比如从0.4降到0.2让粒子在后期精细搜索。第二调整学习因子。c1控制粒子向自身历史最优学习c2控制粒子向群体历史最优学习。如果c1太大粒子容易陷入局部最优如果c2太大粒子容易早熟收敛。一般c1和c2取2.0比较平衡也可以尝试c12.5c21.5增加全局搜索能力。第三增加粒子数量。如果搜索空间维度高粒子数量太少会导致搜索不充分。对于12维的PID参数优化粒子数量至少取30最好取50。第四使用自适应PSO。在迭代过程中动态调整惯性权重和学习因子比如根据粒子的聚集程度调整。如果粒子聚集在一起增大惯性权重让粒子散开如果粒子分散减小惯性权重让粒子聚集。5.4 常见问题速查表问题现象可能原因排查方法解决方案仿真发散控制量饱和检查电机推力是否超限降低PID增益或增加限幅仿真发散积分项累积过大检查积分项数值增大积分时间或加抗积分饱和姿态振荡微分增益过大降低微分增益观察减小微分增益或加低通滤波姿态振荡带宽比不合理检查姿态环和位置环带宽调整增益使内环带宽为外环5-10倍位置跟踪误差大位置环增益不足增大位置环增益观察增大位置环Kp或Kd高度漂移高度环积分不足检查高度环积分项增大高度环KiPSO收敛慢惯性权重不当观察粒子分布调整惯性权重范围PSO早熟学习因子不当观察gbest变化调整c1和c2混控异常符号错误单独测试每个电机检查混控矩阵符号6. 从仿真到实机的参数迁移与扩展思路6.1 仿真参数到实机的映射关系仿真优化出来的PID参数不能直接用到实机上因为仿真模型和实际系统存在差异。主要差异包括电机响应时间、传感器噪声、气动阻尼、电池电压下降等。仿真中电机时间常数取0.02秒实际可能0.05秒仿真中没有传感器噪声实际陀螺仪有零偏和噪声仿真中气动阻尼是线性的实际是非线性的。迁移方法是先把仿真参数按比例缩小比如缩小到原来的0.5到0.7倍然后在实际系统上逐步增大直到出现轻微振荡再回调10%到20%。姿态环参数通常需要缩小更多因为实际陀螺仪噪声会放大微分项。位置环参数可以保留较大值因为位置测量噪声相对较小。另外实机上需要加抗积分饱和和微分滤波。抗积分饱和可以用积分限幅或者反计算法。微分滤波可以用一阶低通截止频率根据传感器噪声水平设定一般10到20赫兹。6.2 不同轨迹场景下的参数适应性PSO优化出来的参数是针对特定轨迹的换一个轨迹可能性能下降。比如针对圆形轨迹优化的参数用在阶跃轨迹上可能超调很大。解决方法是在目标函数中加入多种轨迹的加权误差让PSO优化出一组折中参数。或者用自适应PID根据轨迹特征在线调整参数。我通常的做法是先用圆形轨迹优化一组基础参数然后在阶跃轨迹和螺旋轨迹上测试如果性能下降不超过20%就认为参数是可接受的。如果下降太多就在目标函数中加入阶跃轨迹的误差项重新优化。6.3 后续扩展方向从PID到LQR和MPCPSO优化PID是一个很好的起点但不是终点。如果对性能要求更高可以考虑LQR或者MPC。LQR需要求解Riccati方程得到最优状态反馈增益本质上是一种线性最优控制。MPC需要在线求解优化问题计算量大但能处理约束和非线性。从PID到LQR的扩展路径是先用PSO优化PID得到一组基础参数然后用这组参数作为LQR的初始权重矩阵再用PSO优化LQR的权重矩阵。这样既能利用PID的经验又能发挥LQR的最优性。从LQR到MPC的扩展路径类似用LQR的权重矩阵作为MPC的初始权重再用PSO优化MPC的预测时域和控制时域。我个人在实际操作中的体会是PSO优化PID双闭环这套方案最大的价值不是优化出来的那组参数而是整个优化框架。有了这个框架你可以把任何控制器的参数优化问题都套进去只需要改目标函数和仿真模型。这个框架的复用性非常强值得花时间搭好。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →