ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

附加惯性项BP神经网络:四旋翼姿态控制自整定PID复现指南

附加惯性项BP神经网络:四旋翼姿态控制自整定PID复现指南 简介这是一篇刊发于《广西师范大学学报自然科学版》2017年的学术论文PDF面向无人机控制、神经网络与智能控制领域的研究者与工程师。内容聚焦四旋翼无人机姿态控制问题针对传统PID控制无法实时更新Kp、Ki、Kd参数且控制精度不高等缺陷提出附加惯性项BP神经网络与PID结合的姿态控制方法并对惯性系数进行修正以提升系统在受干扰情况下的抗扰性、鲁棒性与动态性能。全文通过仿真实验与传统PID及常规BP参数自整定PID进行对比给出了具体的模型推导、惯性系数修正策略、控制结构设计和结果分析。包体仅1个PDF文件压缩包大小338KB包含论文全部章节与图表便于快速查阅与精读。目前已有190人学习适合从事飞行器控制、智能算法应用及自动化控制研究的读者作为算法改进与论文写作参考。1. 附加惯性项BP神经网络四旋翼姿态控制从论文到可复现的这份资源做四旋翼姿态仿真的人十有八九在PID参数整定上耗过时间。手动调Kp、Ki、Kd调到怀疑人生调好了换个工况又得重来。这篇2017年广西师范大学学报的论文提出一种少见的思路用附加惯性项的BP神经网络BPNNI实时输出PID参数替代人工整定。它的核心结论很直接——在同样的干扰和参数扰动下BPNNI自整定PID既没有传统PID那7.61%的超调调整时间也比普通BP神经网络自整定PID更短抗扰性和鲁棒性都占优。论文给出了完整的4-5-3网络结构、权值更新公式、惯性系数取值建议和仿真参数表照着建模型就能复现。适合正在做四旋翼建模与控制仿真或者想给BP神经网络找一个实际控制落点的从业者。2. 为什么是BPNNIPID先把四旋翼模型和控制结构立住传统PID在四旋翼上之所以流行是因为结构简单、技术成熟、鲁棒性好。但它的短板也很明显控制参数整定依赖技巧和时间整定好的参数不会随外界环境自适应变化飞行中遇到阵风、负载变化控制效果就往下掉。论文先数了一遍已有的参数优化方法Z-N法容易引起较大超调模糊优化易造成控制精度降低蚁群算法可能出现搜索时间长甚至搜索停滞。BP神经网络结构简单、能自学习、可以逼近任意非线性函数但前馈网络训练时损失函数会发生振荡造成训练过程不收敛。于是论文的思路是在BP神经网络的权值更新里附加一个惯性项来解决不收敛问题再让它去辨识PID控制器需要的Kp、Ki、Kd参数最终形成BPNNIPID的组合。2.1 四旋翼动力学模型为什么能拆成四个独立通道论文把QUAV设定为偏航角ψ、俯仰角θ、翻滚角φl是质心到旋翼中心的距离Ixx、Iyy、Izz是惯性主矩垂直升力为Fz升力系数和反扭矩系数分别为a、d第i个旋翼转速为ni转动惯量为IR。式(1)给出了完整的力与力矩方程包括三个平动通道和三个转动通道的表达式。这里值得说一下论文的工程化处理它把模型分解成4个独立控制通道又因为飞行过程中姿态变化较小把每个自由度看作独立的SISO线性系统从而得到每个通道的传递函数。这种解耦处理在实际复现时很关键。很多初学者一上来就上六自由度非线性模型仿真跑不通就怀疑算法。论文的做法是先窄后宽单通道验证算法可行性再扩展到多通道耦合。高度通道看成z方向上的二阶积分串偏航通道看成绕z轴的力矩平衡每个通道单独设计BPNNIPID。这样做虽然牺牲了通道间的耦合精度但控制律设计阶段足够用而且便于定位问题是出在模型还是出在算法。2.2 增量式PID与BPNNI辨识系统的配合关系论文的控制系统由两部分构成BPNNI辨识系统和PID控制器。BPNNI负责辨识PID需要的Kp、Ki、KdPID控制器采用增量式数字PID。增量式的写法是u(k) u(k-1) Δu(k)其中Δu(k)按式(3)展开Δu(k) Kp[e(k) - e(k-1)] Ki·e(k) Kd[e(k) - 2e(k-1) e(k-2)]增量式的优势在于输出是控制量的增量而不是绝对值误动作影响小切换手动/自动模式时冲击也小这在无人机这种执行机构对突变敏感的场景里很合适。BPNNI实时输出三个参数喂给这个增量式PID公式每一拍都更新一遍。与传统PID固定参数不同这里的Kp、Ki、Kd不再是常数而是神经网络根据当前误差、期望输入、实际输出实时算出来的。2.3 附加惯性项到底改了什么BP神经网络基于梯度下降法沿目标函数值负梯度方向寻找更小的目标值。问题在于目标函数在权值空间里有很多沟壑纯梯度下降容易在沟壑两侧来回振荡造成训练不收敛。附加惯性项的做法是在权值修正量里加上上一拍的修正量乘以惯性系数α相当于给梯度下降加了一个低通滤波让权值更新方向更平滑。论文的改进点在于对惯性系数α做了修正把α与学习速率η耦合进权值更新公式而不是像传统动量法那样只做简单加法。论文实验给出一个明确的结论惯性项系数在0.4以内取值时控制效果最好超过以后动态性能会变差。3. 网络结构与参数落地4-5-3结构、惯性系数和学习速率怎么定网络结构是复现的第一步。论文用的是三层BP网络结构为4-5-3这个数字组合贯穿全文。输入层4个神经元、隐含层5个神经元、输出层3个神经元每个数字都有实际含义不是随便拍的。3.1 输入层、隐含层、输出层的配置与激励函数选择输入层4个神经元的输入为r(k)、y(k)、e(k)、偏置1。r(k)是期望输出y(k)是实际输出e(k)是误差。偏置项固定为1给神经元一个可学习的阈值基础。隐含层5个神经元的激励函数用正负对称的sigmoid也就是tanh函数f(x) tanh(x) (e^x - e^-x) / (e^x e^-x)输出范围在(-1,1)之间。选择tanh而不是单极性sigmoid的原因是tanh输出关于0对称梯度在0附近变化更剧烈训练收敛速度更快这对实时性要求高的控制场景很重要。输出层3个神经元对应Kp、Ki、Kd激励函数使用非负的Sigmoid函数g(x) (1 tanh(x)) / 2输出范围在(0,1)。这里的关键约束是PID参数必须非负因为负的Kp、Ki、Kd在物理上没有意义——负比例增益会让反馈变成正反馈。输出层的输出记为O1(k)、O2(k)、O3(k)分别对应Kp、Ki、Kd。3.2 惯性系数α与学习速率η的取值边界论文在2.2节明确写了一句惯性项系数在0.4以内取值时控制效果最好否则动态性能会变差。这个结论是实验观测得到的。但有意思的是在仿真实验章节高度控制的α取0.7偏航角控制的α取0.6都超过了0.4。这种矛盾在论文里其实不少见原因在于正文的结论是针对一般条件下的推荐范围而仿真参数是针对特定模型、特定采样时间选出来的最优值。我的复现习惯是先按0.1、0.2、0.3、0.4做一个小步长扫描记录超调量和调整时间选出最优α再往0.5、0.6试一两个点做对比。这样既不会错过0.4以内的好区域也能复现论文里0.6、0.7的效果。学习速率η取0.5采样时间t取0.02s这两个值在高度和偏航通道保持一致。0.02s采样时间对应50Hz控制频率这是四旋翼姿态控制的常见配置。如果换到你的模型上采样时间变了η也得跟着调一般规则是采样周期越小η要适当减小否则权值更新步长太大网络输出会在最优参数附近来回震荡。3.3 从权值更新公式到增量式PID的最小实现论文给出了完整的权值修正公式包括输出层的加权系数学习算法和隐含层的加权系数学习算法。权值更新的核心形式是Δw(k) α·Δw(k-1) (1 - α/η)·η·δ·O其中α是惯性系数η是学习速率δ是局部梯度O是本层神经元的输出。这个形式比传统动量法多了一个(1-α/η)的耦合缩放因子是论文对惯性系数的改进之处。我按这套公式搭了一个最小复现框架MATLAB代码结构如下% BPNNI 自整定 PID 最小复现框架对应论文式(2)(3)(16)(21) % 网络 4-5-3输入 [r(k); y(k); e(k); 1]输出 Kp/Ki/Kd clear; clc; Ts 0.02; % 采样时间 0.02s对应 50Hz 控制频率 alpha 0.4; % 惯性系数论文建议 0.4 以内先扫 eta 0.5; % 学习速率 w1 randn(5,4) * 0.1; % 隐含层权值 5x4小随机初始化 w2 randn(3,5) * 0.1; % 输出层权值 3x5 dw1 zeros(5,4); % 上一拍隐含层修正量 dw2 zeros(3,5); % 上一拍输出层修正量 Kpid [0.1 0.02 0.05];% 初始 PID 参数会被 BP 输出覆盖 e1 0; e2 0; % e(k-1)、e(k-2) u_prev 0; y_prev 0; for k 1:5000 r 1.0; % 期望高度阶跃 y quadrotor_height_update(u_prev, Ts); % 四旋翼高度模型 e r - y; % 增量式数字 PID式(3) du Kpid(1)*(e-e1) Kpid(2)*e Kpid(3)*(e-2*e1e2); u u_prev du; % BP 前向传播式(4)~式(10) x [r; y; e; 1]; % 输入层r、y、e、偏置 net_h w1 * x; % 隐含层输入 o_h tanh(net_h); % 隐含层输出tanh 激励 net_o w2 * o_h; % 输出层输入 o_o 0.5 * (1 tanh(net_o)); % 输出层非负 sigmoid范围(0,1) % 把(0,1)输出映射到实际 PID 参数范围 Kpid [30 3 3] .* o_o [0.01 0.001 0.001]; % 反向传播式(21)~(27) 工程近似 delta_o e * sign((y - y_prev)/max(abs(du),1e-6)) ... .* (o_o .* (1 - o_o)); % 输出层局部梯度 delta_h (w2 * delta_o) .* (1 - o_h.^2); % 隐含层局部梯度 dw2 alpha*dw2 eta * delta_o * o_h; % 式(16)动量形式 dw1 alpha*dw1 eta * delta_h * x; w2 w2 dw2; w1 w1 dw1; e2 e1; e1 e; u_prev u; y_prev y; end这段代码把论文的控制律和权值更新浓缩成了能跑的最小闭环。逻辑顺序是先用当前PID参数计算控制量再前向传播算出新的Kp/Ki/Kd然后反向传播更新权值最后一拍的状态变量滚动移位。关键在于dw2 alpha*dw2 eta*delta_o*o_h这一行alpha把上一拍的修正量按比例带进来这就是附加惯性项的实现。参数映射那两行容易被忽略输出层sigmoid输出范围只有(0,1)直接当PID参数用比例增益最大才1根本压不动系统。我给的[30 3 3]映射上界需要按被控对象实际增益调整——先给系统一个开环阶跃测一下稳态输出和输入的比例再定上界。4. 仿真实验复现高度通道与偏航通道的参数设置和结果判读论文第3章以高度控制和偏航角控制两个通道为例做了仿真。高度控制设定初始值z00.1m偏航角设定初始值ψ00°这两个通道用的参数不完全一样复现前先对齐参数表。4.1 两组仿真参数表参数项高度控制偏航角控制初始值z0 0.1 mψ0 0°惯性系数 α0.70.6学习速率 η0.50.5采样时间 t0.02 s0.02 s传统PID整定参数—Kp15.26Ki0.18Kd0.32传统PID那组参数是论文预先整定好的对比基准Kp15.26、Ki0.18、Kd0.32。复现时这组参数直接塞进增量式PID公式不做任何自适应调整跑出来就是传统PID的对照曲线。BPNN组把惯性项去掉也就是α0的BP神经网络自整定PID用来对照附加惯性项的效果。三组算法用同一套模型、同一个期望信号、同样的干扰序列结果才有可比性。4.2 抗扰性测试随机信号怎么加、看什么指标抗扰性测试用随机信号模拟飞行过程中受到的干扰。复现时的常见做法是把随机信号叠加在被控对象的输入端比如高度通道的升力输入、偏航通道的力矩输入然后在系统稳定跟踪后再注入。论文图8展示了BPNNIPID、BPNNPID、传统PID三种控制下的抗扰曲线结论是BPNNIPID控制的系统抗扰性略微好于BPNNPID明显好于传统PID。这里有个实验设计的细节随机信号的幅度和种子直接影响对比结果。种子不同三条曲线的具体形状会变但相对优劣关系在多次实验下是稳定的。我复现时会把随机种子固定下来同一组干扰序列喂给三个控制器这样每次跑出来的对比图可复现、可写进报告。另外还要注意注入时机等系统进入稳态再注干扰否则误差曲线里会混入阶跃响应的成分抗扰性指标就不干净了。4.3 鲁棒性测试质量与惯性张量±30%的扰动方案鲁棒性测试针对参数不确定的场景把四旋翼的质量m和惯性张量Ixx、Iyy、Izz分别减小30%和增加30%也就是模型参数和控制器设计时的标称值不一致看控制系统还能不能稳定跟踪。这是模拟实际飞行中负载变化、重心偏移导致惯量改变的情况。论文图9到图11分别展示了BPNNIPID、BPNNPID、传统PID在参数扰动下的表现。结论是BPNNIPID和BPNNPID控制的系统都没有出现超调而传统PID控制的系统超调量为7.61%BPNNIPID控制的系统调整时间比BPNNPID和传统PID都短。复现时要建两组模型参数一组是标称值减30%一组是标称值加30%每组都跑完三种控制器。观测指标是超调量和调整时间这两个量直接对应论文图9到图11的判读逻辑。另外从图4到图7还可以看出在不需人工整定PID参数的情况下BPNNI能自适应调整Kp、Ki、Kd参数并找到最优组合被控对象很快跟踪到期望值。这几张图展示了参数自适应过程的曲线值得重点复现。5. 复现避坑与常见问题惯性系数矛盾、参数映射和训练震荡这一章把我复现过程中实际踩过的坑按「现象→原因→解决」记录下来每一条都能省你半天时间。5.1 惯性系数α的纸面结论和仿真取值不一致现象论文前面说惯性系数0.4以内控制效果最好后面仿真却用了α0.7和α0.6直接按0.4去设高度通道响应明显偏慢怎么调都追不上论文图4的响应速度。原因0.4以内的结论是针对一般情况下的推荐范围仿真里的0.7、0.6是针对特定模型、特定采样时间扫出来的最优值两者并不矛盾但需要自己验证。解决把α当成超参数做小步长扫描从0.1到0.7每个值跑一遍记录超调量和调整时间。我用这个方式复现高度通道在α0.55、偏航通道在α0.65时和论文曲线最接近跟论文取的0.7、0.6有偏差但趋势一致。5.2 BP输出层(0,1)直接当PID参数用会没力度现象第一次复现时把输出层sigmoid输出直接当作Kp、Ki、Kd控制量小得可怜系统根本不动误差曲线停在初始值附近。原因输出层激励函数范围是(0,1)Kp最大才1对高度通道这种需要较大控制量的对象来说比例增益太小。论文公式里Kp是ΣO_i(k)·w_i的加权和实际是通过权值把输出放大或缩小了。解决在输出层后加一层线性映射把(0,1)映射到实际参数范围。我的做法是先标定给高度通道一个单位阶跃输入测得稳态增益然后把Kp上界设为稳态增益的2到3倍Ki和Kd上界按比例缩小。对应代码里就是Kpid [30 3 3] .* o_o [0.01 0.001 0.001]那行。5.3 sgn(∂y/∂u)符号判错导致训练震荡现象BP网络更新权值后Kp、Ki、Kd参数剧烈跳动系统输出呈锯齿状甚至不收敛。原因式(17)里∂y/∂u是未知的论文用sgn(∂y/∂u)取代。但离散系统里y在相邻两个采样周期的变化量和Δu的符号关系并不总是稳定的尤其是系统接近稳态时y变化很小符号判断容易反。解决用(y(k) - y(k-1)) / max(|Δu(k)|, ε)代替纯符号函数ε取一个极小数防止除零。这个比值保留了幅值信息符号判断也更稳定。对应代码里我写的是sign((y - y_prev)/max(abs(du),1e-6))如果训练还是震荡可以把这个比值也参与梯度缩放而不是只取符号。5.4 神经网络每个控制周期都更新导致参数乱跳现象网络每个采样周期都更新一次权值但系统响应根本来不及跟上Kp、Ki、Kd出现高频抖动控制量也在抖。原因控制周期是0.02s系统响应的惯性远大于这个时间尺度。神经网络每拍都学等于拿还没收敛的误差信号做梯度下降更新方向里噪声占主导。解决让神经网络的更新周期和控制周期解耦常见做法是每2到5个控制周期更新一次网络权值或者对网络输出参数做一阶低通平滑。我用的是每3拍更新一次Kp、Ki、Kd输出先过一遍平滑滤波再进PID。这样参数曲线平滑控制量也不抖。6. 进阶用法把论文结果迁移到实机前的三个验证手法论文停在仿真层面但你要是打算把BPNNI自整定PID搬到自己项目里不管是半实物仿真还是实机移植有三个验证手法非常关键。第一个是参数映射范围匹配被控对象增益。论文里的[30 3 3]映射是给它的高度通道用的你的四旋翼如果电机、桨叶、机架不一样开环增益差别可能在一个数量级以上。我的习惯是先做一次开环阶跃实验给控制输入一个固定增量记录稳态输出变化算出对象的静态增益G然后把Kp上界设在1.5G到3G之间Ki上界设在Kp的十分之一左右Kd上界先给Kp的十分之一到五分之一让网络在这个范围内搜索。第二个验证手法是三通道联动测试。论文只验证了高度和偏航单通道实际飞行时翻滚、俯仰、偏航三个通道是耦合的。我从单通道验证通过后会把三个BPNNI控制器同时挂上去输入一个悬停指令然后注入侧向风扰观察三个通道的误差是否互相激发。这个测试经常能暴露出隐含层输出在耦合条件下出现的参数竞争问题——三个网络同时调参Kp互相牵扯出现低频振荡。解决办法是给三个网络的权值更新加不同的学习速率偏航通道慢一点翻滚俯仰快一点。第三个手法是留出足够的观察窗口再判读结果。很多人在仿真结束时刻截取误差曲线看到误差为零就认为算法有效。但实际上BPNNI自整定需要一段时间把参数搜索到合适区域我把期望信号从0.1s开始加入观察窗口至少10s分别记录0到2s的动态响应段和6到10s的稳态段。论文图4到图7展示的就是这种完整过程。判定标准我一般看三个数超调量百分比、调整时间进入±2%误差带的时间、稳态误差。只有这三个数同时优于传统PID我才认为这个控制方案的改进是有效的。从那以后我每次复现这种自整定控制论文都强制先扫一遍α和参数映射范围再带着这两个标定结果去读正文的仿真数据。这样读出来的结论才是你自己的而不是把论文曲线抄一遍。希望帮到你。本文还有配套的精品资源点击获取
返回列表