首页 / 资讯中心 / 文章详情

多旋翼无人机PID论文复现:Simulink建模与参数整定全流程解析

多旋翼无人机PID论文复现:Simulink建模与参数整定全流程解析 ★ FEATURED ARTICLE
复现一篇PID相关的多旋翼无人机期刊论文最让人头疼的往往不是PID本身而是动力学建模那段被论文一笔带过的部分——公式8到公式12看着挺完整真要在Simulink里搭出来你会发现坐标系方向搞反了、电机响应没考虑、姿态角速率变换矩阵少乘了个东西然后仿真直接发散。这篇文章把我自己复现这类论文时的完整思路和踩坑记录整理出来覆盖从模型假设、方程落地、控制回路搭建到参数整定的全流程给正在折腾仿真复现的同学作参考。1. 复现论文前先搞清三件事坐标系、假设和状态量1.1 坐标系怎么选决定后面所有公式的方向期刊论文里多旋翼动力学建模第一步永远是定义坐标系。绝大多数论文采用两个坐标系地面惯性坐标系E和机体坐标系B。地面系的原点通常选在起飞点x轴指北或指东都行z轴竖直向上机体系原点在飞行器重心x轴指向机头z轴垂直机体平面向上y轴按右手定则补齐。这个坐标系定义直接决定你后面怎么看公式里的正负号。推力F通常沿机体z轴正方向重力沿地面系z轴负方向而升力使机体上升时机体系z轴和地面系z轴的夹角就是俯仰角、滚转角。论文中旋转矩阵一般用地-机顺序的ZYX欧拉角航向角-俯仰角-滚转角表示也有少数论文用YZX或四元数这个顺序不一致后面所有公式的矩阵元都会变。我在复现前会先把论文里的所有符号和公式抄在一张纸上标清楚每个量的坐标系和单位对应到Simulink的哪个信号线。坐标系搞错轻则姿态反解出来符号反了重则控制器正反馈发散这一步值得花一小时。1.2 假设条件不是废话是建模的地基论文里通常有几条经典假设机体为刚体、质量分布对称、桨叶无扭转、电机响应可近似为一阶惯性环节、空气阻力忽略不计或简化为线性阻尼。这些假设不是学术免责声明它们直接决定动力学方程里保留哪些项、舍掉哪些项。比如刚体假设意味着你可以直接用牛顿欧拉方程不用考虑结构弹性形变对称假设意味着惯性矩阵是对角阵角速度耦合项才能化简电机一阶响应假设意味着从期望油门到实际拉力的动态可以用一个时间常数描述而非瞬间到达。这里有一个复现时非常关键的取舍如果你用论文的模型复现就必须按论文的假设来。别擅自加空气阻力项、别把一阶电机响应改成二阶否则你得到的响应曲线和论文对不上不是论文错了是你私下篡改了模型。1.3 状态量定义12维状态是怎么来的多旋翼完整运动学状态通常是12维位置x, y, z、线速度u, v, w、姿态角φ, θ, ψ、角速度p, q, r。注意位置和线速度的定义坐标系、姿态角和角速度的关系不同论文写法差异很大。有的论文把线速度定义在地面系有的定义在机体系。位置导数等于地面系下的线速度机体系的线速度要乘旋转矩阵才能转成地面系速度。姿态角速率和机体角速度之间的关系是欧拉角速率变换矩阵不是简单相等而且俯仰角接近90度时会出现奇异。Simulink建模时我把12个状态分成四组信号位置、姿态、线速度、角速度每个信号带上明确的单位注释。这样和论文公式一一对应后续PID回路反馈环从哪里取信号也不会乱。2. 从论文公式到Simulink信号流力、力矩与电机模型的落地拆解2.1 刚体运动学方程怎么变成积分器链动力学原理非常直白力改变线速度力矩改变角速度线速度积分得位置角速度积分或变换得姿态。Simulink里就是一组积分器串起来但细节决定成败。位置积分那块地面系下的线速度直接积分就是位置我习惯用三个integrator初值设为起飞点坐标。线速度更新则需要牛顿第二定律加速度等于总外力除以质量总外力包括重力、总推力、空气阻尼。重力常值向下推力方向沿机体z轴必须先经过旋转矩阵转成地面系分量才能加进去。姿态更新相对容易出错。欧拉角速率和机体角速度的关系是角速度向量等于欧拉角速率向量经过一个和欧拉角相关的变换矩阵映射。具体形式论文公式里会给照着搭但是要小心角度单位。Simulink里的三角函数模块默认接受弧度如果你从外部输入角度必须先转成弧度这个坑我踩过不止一次。最后角速度更新用欧拉方程惯性矩阵乘以角速度导数等于总外力矩减去角速度叉乘惯性矩阵乘角速度的陀螺项。Simulink里叉乘用一个Fcn模块或者专门的矩阵运算模块实现陀螺项别漏掉漏掉的话高速旋转时候的响应就失真了。2.2 力和力矩模块总推力与三个力矩的来源多旋翼的动力源是四个或更多电机带动的旋翼。每个旋翼产生沿旋转轴方向的拉力以及和旋转方向相反的反扭矩。四个旋翼的拉力合成总推力方向沿机体z轴拉力差产生滚转和俯仰力矩反扭矩差产生偏航力矩。具体对应关系是滚转力矩由左侧和右侧旋翼拉力差产生俯仰力矩由前侧和后侧旋翼拉力差产生偏航力矩由正向旋转和反向旋转旋翼反扭矩差产生。这个分配关系在控制分配里也用得到。Simulink实现时我拆了两个模块一个是力模块输入四个旋翼的拉力大小输出机体系下的总推力和三个力矩另一个是旋翼布局模块里面是固定的臂长和力矩系数。别把布局参数写死在公式里用增益模块引出来后面参数整定或者换机型时直接改增益数值就够了。2.3 电机模块一阶响应不可省很多新手搭模型直接把期望推力当实际推力输进去把电机动态完全省略。短时间悬停仿真看不出大问题但一旦加阶跃信号或者高频扰动实际响应和理想响应差别很大因为电机和旋翼的动态延迟明显。论文里经常把电机写成实际转速对期望转速的一阶惯性环节时间常数通常取0.01到0.02秒。这个时间常数从哪来要么论文参数表有要么按常见小型四旋翼的电机-电调响应特性估算。我的做法是电机模块单独做成子系统输入期望转速经过一阶惯性环节输出实际转速再通过转速-拉力系数和转速-反扭矩系数转换为拉力和反扭矩。这里有个复现细节值得注意有些论文直接用油门指令不建模转速把油门到拉力的关系写成线性或二次。线性关系在小油门范围误差不大但大机动时二次关系更准确。如果论文给了转速-拉力系数就按转速模型搭如果论文用的是归一化油门就按油门模型搭务必跟论文一致。2.4 用信号总线还是向量我推荐的建模组织方式Simulink模型搭到后面最怕的就是线满屏飞一个信号找不到另一头接哪。我复现这篇论文时改用信号总线和结构体把模型分成五层参考输入层、控制器层、混控分配层、多旋翼模型层、状态输出层。多旋翼模型层里面再用两个子总线一个叫force_torque内存总推力和三轴力矩一个叫motor_state存四个电机的实际转速。控制器层和模型层的接口统一用总线好处是信号名一目了然查找错误方便而且总线信号可以和论文公式的符号直接对应调试时候信号监视器里能看出来哪一路量纲不对。如果你习惯传统单根信号线的接法也行但强烈建议至少把电机转速和力矩作为向量整体传输别拆成四根线来回绕那样改参数和排查问题都痛苦。3. PID控制器回路的搭建顺序位置、姿态、角速度谁内谁外3.1 串级控制的层次关系多旋翼的PID控制几乎都是串级结构从外到内依次是位置环、速度环可选、姿态环、角速度环。最内层是角速度环直接控制电机力矩姿态环给角速度环提供角速度参考位置环给姿态环提供姿态角参考。层级顺序不是随便定的本质上是时间尺度分离。内环响应快、带宽高负责快速抑制扰动外环响应慢、带宽低负责缓慢修正误差。如果内外环顺序搞反内环追不上外环的指令系统就会震荡甚至发散。Simulink实现串级控制时我把每个环封装成独立子系统子系统之间用参考信号和反馈信号连接形成清晰的嵌套结构。这样调参时可以单独断开外环只看内环阶跃响应然后把内环闭环后再调外环。3.2 每个环路的PID结构与限幅各环节PID结构选择有套路角速度环通常用PIP项提供阻尼和刚度I项消除静态偏差姿态环用P或PD主要把姿态误差映射到角速度指令位置环用P或PID输出姿态参考或期望加速度。限幅设置是很多初学者忽略的点。角速度环输出的是力矩指令受电机饱和约束务必加饱和限幅姿态环输出的是角速度指令也要限幅防止大角度误差时内环指令超出生理或物理极限位置环输出姿态角参考限幅通常较小比如前后倾角限制在30度以内。限幅不当积分饱和会让控制品质急剧恶化。我的具体做法是在每个PID控制器输出端加Saturation模块并在积分器上做条件积分——当输出达到限幅值时冻结积分累加避免积分空转。Simulink里可以用PID Controller模块自带的反算积分器选项也可以手工搭积分器加开关逻辑我倾向于后者因为可以更直观地看到限幅和积分的耦合关系。3.3 控制分配从期望力矩到电机油门指令串级控制器输出的期望力矩滚转、俯仰、偏航和期望总推力要经过混控分配矩阵换算成四个电机的期望转速或期望油门。分配矩阵基于电机几何布局和旋翼转向是一个4×4矩阵乘以推力/力矩向量得到四个电机指令。对于标准X型四旋翼分配矩阵形式比较固定总推力四项相加滚转力矩是左减右俯仰力矩是前减后偏航力矩是正反旋翼反扭矩差。这里有个容易踩的坑电机转向定义和力矩正方向必须和动力学模型一致否则你控制器输出正滚转力矩实际飞机却反向滚转整个闭环就是正反馈。我复现时把分配矩阵写成独立的子模块输入控制器输出的推力力矩向量输出四路电机期望值。矩阵系数用Mask参数暴露出来方便调试时修改臂长、反扭矩系数等物理参数。4. 参数整定与论文曲线对标怎么判断复现真的成功4.1 参数初值从哪里来PID参数初值不能完全靠拍脑袋。我的做法是先根据论文给出的物理参数质量、惯量、臂长、拉力系数等算出模型的基本特性时间尺度再按经验带宽比估算控制器增益。比如已知质量m高度方向推力系数可估算高度通道的开环增益范围角速度环根据惯量和力矩系数能算出执行机构能提供的最大角加速度再据此定角速度环增益的量级。初值差距在一到两个数量级内闭环系统稳定可调剩下的交给试凑微调。物理参数本身也影响PID范围。惯量大、臂长长的机型姿态环增益通常要比小型穿越机低一个数量级。直接照抄别人的PID参数是复现大忌因为机型参数不同响应完全不同。4.2 我用的整定顺序先内环后外环串级PID整定必须从内到外逐环闭合绝对不能一上来全环闭合调参不然根本分不清是哪一环在振荡。我的实际整定流程分成五步第一步只闭合角速度环给角速度阶跃指令调P增益直到响应快速且无振荡。第二步在这个基础上加I项消除稳态误差注意观察是否出现超调和低频振荡。第三步闭合姿态环给姿态角阶跃调姿态环P增益此时角速度内环相当于一个高带宽执行器外环只需关注角度跟踪。第四步闭合位置环给位置阶跃调位置环P和I增益。第五步做完整闭环仿真检查多环耦合是否引起振荡必要时从外到内微调。每一步切换时我都把上一组参数记录下来标好阶跃响应的上升时间、超调量和稳态误差。参数整定过程不是线性前进的经常回到上一个环重新调整但整体方向始终是从内到外。4.3 如何和论文曲线对标论文复现成功与否的判断标准不是曲线长得像就行而是量化指标对得上。一般看三件事上升时间比如从0到90%目标值的时间、超调量百分比、稳态误差。对标时还要注意输入信号是否一致。论文给的是阶跃响应还是斜坡响应初始条件是否相同扰动类型和大小是否一致如果论文做的是悬停状态下给俯仰阶跃你的仿真就必须同样从悬停平衡点出发保证初始姿态角和角速度都是零否则对比没有意义。我复现时遇到过一种情况控制系统结构一模一样但我的响应比论文慢了一倍。查了半天发现是电机时间常数取值差了一个数量级论文写0.02秒我用了0.2秒。这类参数差别对稳态几乎无影响但动态响应差距非常大。4.4 一组可参考的整定结果示例以某四旋翼仿真模型为例物理参数质量1.2kg惯量对角线约0.01-0.02 kg·m²臂长0.225m我按上述流程整定得到一组参数环路PID限幅角速度俯仰/滚转3.01.50.05±5 N·m角速度偏航2.00.80.02±3 N·m姿态俯仰/滚转6.000.5±1.2 rad/s位置高度2.50.80.8±8 m/s位置水平1.20.20.5±0.3 rad这个参数下给俯仰角10度阶跃上升时间约0.5秒超调小于5%三个姿态通道表现不错。别直接拿去用我只是举例说明整定结果长什么样你自己机型的物理参数不同增益可能差出三倍以上。5. 仿真中五个容易翻车的细节以及我的排查方法5.1 角度弧度混用复现整篇模型最容易出现的问题就是单位不统一。姿态参考可能是角度三角函数模块要弧度PID增益的量纲可能因为角度单位不同而差57.3倍积分器初值也是。我的排查方法是给每个信号建立量纲检查表角度信号标单位deg/rad角速度信号标单位rad/s增益系数标注量纲。仿真前把所有常量和初值挨个检查一遍凡是角度相关的增益先确认控制器内部用的是弧度还是角度再看和论文公式是否一致。别嫌麻烦这个检查十分钟比仿真发散后满模型找错误省两个小时。5.2 代数环问题把控制器和模型直接连成一个闭环有时Simulink会报代数环Algebraic Loop警告。代数环意味着信号在同一时刻既作为输入又作为输出求解器需要迭代才能解开仿真速度变慢甚至失败。常见的代数环来源是控制器输出直接作用于模型输入而模型输出又直接反馈给控制器输入中间没有任何延迟。解决办法是在反馈回路里插入一个Unit Delay或Memory模块打破瞬时依赖。代价是引入一拍延迟但影响很小。我复现时在角速度反馈处加一个离散单元延迟同时把控制器改成离散PID搭配固定步长求解器就再没出过代数环问题。5.3 数值发散别急着改PID先查物理参数和求解器仿真发散时很多人的第一反应是PID参数不对。但有时候问题根源在物理模型本身惯量参数填错了数量级、电机时间常数过于极端、推力系数和重力配平不一致都会导致状态量指数增长发散后曲线飞上天。我的排查顺序是首先检查平衡点配平——给定悬停油门模型能否维持零姿态角下的匀速或悬停。如果连悬停都稳不住控制器怎么调都没用。其次检查求解器设置Simulink连续模型建议用ode45或固定步长ode4步长不大于最小时间常数的十分之一。电机时间常数0.01秒仿真步长最好取0.001秒。再回头才是PID的稳定性问题。5.4 欧拉角奇异与姿态反解跳变欧拉角在俯仰角接近±90度时会奇异姿态反解出来角度跳变。对大多数论文的仿真场景——悬停、小角度机动、定点跟踪——俯仰角不会跑到90度可以放心用欧拉角。但如果你的复现论文涉及大机动或特技飞行就得考虑用四元数表示姿态。我复现时处理方式是参考信号限幅禁止姿态参考超过70度并在姿态反解模块后面做角度归一化防止弧度角度跨越±π边界时导致PID输出突变。这条经验在普通场景用不上但一旦遇到知道成因能省很多排查时间。5.5 论文里缺失的参数怎么办期刊论文受篇幅限制有些参数藏在图表里或者干脆没写。比如电机时间常数、电调延迟、传感器噪声特性经常需要自己补。我的做法是优先用同级别无人机公开的典型值然后做参数敏感性分析把这个缺失参数在合理范围内改变三倍看仿真结果是否发生质变。如果仿真结果对某参数极敏感那说明这个参数必须精确写论文时也值得在附录里补充如果三倍变化只引起5%的响应差异用估算值没问题。我在复现笔记里专门列出了所有估算参数的来源和影响等级这样可以清楚知道哪些结论可信、哪些结论只是在本参数假设下成立。这也是论文复现区别于单纯跑通Demo的地方——你需要知道自己的复现结论边界在哪。复现这类论文真正花时间的不是把论文公式敲进Simulink而是理解每个公式为什么长这样、每个参数从哪里来、每个简化假设放宽后后果是什么。做完一套完整的复现你能积累的不仅是一个能跑的仿真模型还有从论文公式到实际动态系统之间那道很容易被人跳过的鸿沟的全部细节。
阅读完成 · 觉得有帮助?
咨询建站