ARTICLE DETAIL

资讯详情

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

附加惯性项与BP神经网络的四旋翼姿态控制优化

附加惯性项与BP神经网络的四旋翼姿态控制优化 简介2017年发表于《广西师范大学学报自然科学版》的一篇学术论文PDF聚焦四旋翼无人机的姿态控制问题面向无人机控制、神经网络/深度学习、数据建模及自动化控制的研究者与学习者。论文针对传统PID控制无法实时更新Kp、Ki、Kd参数且控制精度不高的问题提出附加惯性项的BP神经网络与PID相结合的姿态控制方法并对惯性系数进行修正以增强无人机在扰动下的飞行稳定性与动态响应能力。仿真实验表明该方法较BP参数自整定PID控制和传统PID控制抗扰性、鲁棒性与动态性能均更优具有较好的工程参考价值。论文还分析了BP神经网络在机器学习与深度学习领域的应用潜力并附算法流程、参数整定策略及仿真对比曲线便于读者复现和深入理解。资源包仅含1个PDF文件容量约338KB已有190人学习适合需要快速获取该领域改进思路与算法对比数据的读者。1. 这篇研究为什么值得看附加惯性项和BP网络到底解决了什么调试四旋翼姿态环时很多人用简化刚体模型先仿真姿态参数看着都能收敛一带负载或做大机动横滚和俯仰就开始互相串扰调了很久才发现是电机转子高速旋转产生的那一项“小惯性”被忽略了。这篇基于附加惯性项BP神经网络的四旋翼无人机姿态控制研究要解决的就是两件事把旋翼转子角动量引起的陀螺力矩作为附加惯性项补进姿态模型同时用BP神经网络去在线补偿模型里剩余的非线性与扰动。这个方向适合正在做飞控仿真的研究型开发者也适合想把手上的PID姿态环做得更稳的从业者。下面直接讲模型怎么改、BP网络怎么搭、闭环仿真怎么跑以及跳过哪一步最容易翻车。2. 先把姿态模型写对附加惯性项从哪来漏掉它会发生什么对做姿态控制的人来说第一步统一符号比调参数更值得花时间。常见约定是机体坐标系固连在机身上原点取重心x轴指向机头z轴垂直向下右手系导航坐标系取北东地或东北天仿真里一般用欧拉角表示机身相对导航系的姿态。姿态运动学把欧拉角速度和机体角速度联系起来Φ̇ W(Φ)·ω其中 W(Φ) 的展开形式为[1, sinφ·tanθ, cosφ·tanθ; 0, cosφ, -sinφ; 0, sinφ/cosθ, cosφ/cosθ]这个矩阵在小角度下可以近似成单位阵但一旦给BP网络做在线补偿姿态角超过±15°以后近似误差就变成可观的扰动仿真模型里建议保留完整形式。下表给出姿态环的状态变量定义后续所有公式都沿用这套符号。变量含义单位φ, θ, ψ滚转、俯仰、偏航欧拉角radp, q, r机体角速度分量rad/sJxx, Jyy, Jzz机体绕三轴的转动惯量kg·m²J_rp电机转子加旋翼绕转轴的转动惯量kg·m²Ω_i第i个旋翼的转速rad/sτ_ctrl, τ_dist控制力矩、外部扰动力矩N·m这些状态在仿真模型里直接对应一组积分器。后面控制器、BP网络都是围绕这套状态做文章。2.1 附加惯性项的具体来源旋翼转子角动量与陀螺力矩“附加惯性项”在大多数中文文献里指的不是机体质心偏移而是电机-旋翼系统绕电机转轴旋转带来的附加角动量。四旋翼的旋翼转速通常在几百到上千rad/s电机转子和桨盘绕转轴的转动惯量虽然只有机体惯量的百分之一上下但转速高角动量 J_rp·Ω 不能当成零。当机体本身在转动ω不为零时这些转子角动量方向随机体一起改变产生陀螺力矩。把四个旋翼的角动量合起来带符号求和Ω_sum Ω1 - Ω2 Ω3 - Ω4具体正负号看两个对角旋翼的转向定义。陀螺力矩写成τ_gyro -J_rp · (ω × (Ω_sum·e3))这里的 e3 是机体z轴单位矢量。把这一项加进刚体动力学就得到完整姿态动力学方程J·ω̇ -ω×(J·ω) - J_rp·(ω×(Ω_sum·e3)) τ_ctrl τ_dist第一项是刚体本身惯性力矩第二项就是附加惯性项。注意它不是一个常数而是机体角速度与旋翼转速的叉积。横滚和俯仰通道在这里天然耦合想单独滚转力矩分配出来的结果会被俯仰方向的陀螺力矩拽回去。这个耦合在悬停小幅姿态时看着不明显旋翼转速差拉大或做大俯仰滚转机动时会直接限制姿态环带宽。2.2 漏掉附加惯性项的真实后果横滚-俯仰耦合与高频抖动用不含附加惯性项的模型做控制器设计再用完整模型做仿真验证差异集中在三个现象上。第一是耦合串扰给定滚转阶跃俯仰角出现同步扰动跟踪误差曲线产生一个和滚转机动同步的驼峰。第二是带宽受限把不含陀螺项模型上能用的PID增益搬到完整模型上系统刚到边界稳定增大比例增益后最先崩掉的不是目标通道而是另一个通道。第三是高频抖动悬停时如果四个旋翼转速差较大陀螺力矩直接成为持续激励源姿态角速度噪声明显变大。三个现象的本质都一样设计模型漏掉的交叉耦合项被控制器当成了扰动而线性PID对这种与转速相关的时变扰动补偿能力有限。这也是标题把“附加惯性项”放到BP网络前面的原因——先让机理模型贴近物理系统再让神经网络去补偿剩余部分而不是让BP网络从头去学一个包含强耦合的完整黑匣子。下表列一组典型参数量级仿真时可以直接用。参数常用量级/取值说明Jxx, Jyy约1e-2 ~ 2e-2 kg·m²结构近似对称Jxx≈JyyJzz约2e-2 ~ 3e-2 kg·m²偏航惯量通常略大J_rp约1e-5 ~ 1e-4 kg·m²电机转子加桨盘按实物估算Ω_i300 ~ 900 rad/s悬停附近转速范围控制/采样周期2 ~ 5 ms与常见飞控一致提示J_rp 没有通用值最可靠的办法是查电机手册的转子惯量再把桨质量按圆盘近似估算。仿真阶段用量级范围内的值即可后面会讲这个参数对BP训练影响有多大。3. BP神经网络在姿态环里的两种用法结构、输入输出与更新方式BP神经网络用在姿态控制里不需要从通用逼近定理开始推导但至少要把握三点。第一它是多层前馈网络信息从输入层经隐藏层到输出层单向传播第二训练过程用误差反向传播调整权重对应到飞控里就是“看到当前误差计算每个权重该往哪个方向改”第三网络本身是一个连续非线性映射只要输入特征包含足够的状态信息就能逼近姿态动力学里的残差函数。常见的bp神经网络结构图可以画成“4×8×3”输入层4个神经元隐藏层8个输出层3个。在姿态环里输入别直接给原始传感器值而要给出物理量——误差、误差变化率、积分项、参考角加速度——输出则是PID增益增量或补偿力矩。隐藏层层数姿态环场景一层就够了两层隐藏层在实验里没有获得明显收益反而多出几十个需要调的超参数训练数据不够时更容易过拟合。3.1 常规做法是让BP输出PID增量输入特征与更新率最常见的做法是把BP网络嵌在PID控制器旁边输出ΔKp、ΔKi、ΔKdPID参数按在线增量更新。这样做的好处是飞控主回路维持原有PID结构即使BP网络出问题还能退化成固定参数PID继续工作这是工程上非常值得保留的兜底能力。输入特征一般取x [e, ec, ∫e·dt, φ_d_ref]其中 e 是姿态角误差ec 是误差变化率∫e 是带限幅的积分项φ_d_ref 是期望角加速度可对期望角速度做差分得到。最后一个输入不是必须但如果省略网络对动态过程的响应会晚半拍。更新方式有两种。一种是每个控制周期在线更新网络权重适合工况变化大的场景缺点是梯度噪声大必须做梯度裁剪和权重限幅。另一种是离线训练好权重后固定部署只在飞行途中做前向推理实时性好、可解释性强论文和工程都更偏好。我的建议是先离线训练、固定部署确认网络输出稳定后再考虑在线更新顺序不要反。BP网络超参数的初始参考值如下。超参数参考值说明输入层节点4e、ec、∫e、参考角加速度隐藏层节点8 ~ 16飞控算力有限时取8输出层节点3ΔKp、ΔKi、ΔKd 或单个补偿力矩隐藏层激活tansig对称适合正负误差输入输出层激活purelin让ΔK范围不受压缩学习率0.01 ~ 0.05在线更新偏向0.01动量系数0.9抑制振荡加速收敛这些初始值不是玄学是从误差量级反推的。姿态角误差按弧度计通常不超过0.1量级学习率太大第一轮迭代就会把权重打飞。3.2 用BP逼近逆动力学把附加惯性项当作有界的未知补偿对象比“BP调整PID参数”更贴合标题的方案是用BP网络做逆动力学补偿。思路是姿态动力学里除了刚体项和附加惯性项还有气动阻尼、风扰、重心偏移这些没有精确模型的部分。控制器先按机理模型计算理想力矩τ_ref J·a_ref ω×(J·ω) J_rp·(ω×(Ω_sum·e3))其中 a_ref 是期望角加速度由姿态误差换算。没建模的部分交给BP网络逼近网络输出作为附加力矩叠加到 τ_ref 上。这样BP网络学的是“残差”而不是整个动力学学习难度和所需数据量都小一个量级。训练数据可以从仿真模型采集给定一组姿态状态把仿真模型真实需要的补偿力矩和理想公式算出的差值记下来作为网络标签。数据生成用扫频或随机机动都可以。采用这个结构时附加惯性项给BP网络提供了一个“基准答案”。如果模型里完全没有这一项网络输入对应的输出标签里会叠加强耦合成分网络只能凭统计平均去猜姿态一变就露馅。把陀螺力矩显式放进公式后网络只处理气动和扰动残差泛化能力强很多。这正是这类研究和单纯“用BP做黑匣子控制器”的差别所在。4. 把方案搭起来状态方程仿真、bp神经网络python代码训练、闭环验证仿真模型不需要一开始就上Simulink全套先用一个MATLAB函数把状态求导写清楚能大大降低排错成本。以小型四旋翼悬停附近为例核心求解代码如下。function xd attitude_dyn(x, tau, Omega_sum, param) % x [phi; theta; psi; p; q; r] % tau [tau_x; tau_y; tau_z] 控制力矩 % param 包含 Jxx, Jyy, Jzz, Jrp phi x(1); theta x(2); psi x(3); p x(4); q x(5); r x(6); w [p; q; r]; J diag([param.Jxx, param.Jyy, param.Jzz]); % 刚体惯性力矩 附加惯性项(旋翼陀螺力矩) h_gyro param.Jrp * Omega_sum * [0; 0; 1]; wd J \ (tau - cross(w, J*w) - cross(w, h_gyro)); % 完整欧拉角运动学不取小角度近似 Phi [1, sin(phi)*tan(theta), cos(phi)*tan(theta); 0, cos(phi), -sin(phi); 0, sin(phi)/cos(theta), cos(phi)/cos(theta)]; phid Phi * w; xd [phid; wd]; end这一段对应前面2.2节的完整动力学方程。J 是机体转动惯量对角阵h_gyro 是四个旋翼合成转子角动量cross(w,J*w) 是刚体陀螺项cross(w,h_gyro) 就是附加惯性项的陀螺力矩最后运动学部分保留完整 W 矩阵不是小角度近似避免BP网络在较大姿态角下学到错误映射。参数建议按表2的量级初设用固定步长求解器步长1ms先跑通开环再闭合控制。注意在Simulink里对应S函数或积分器组状态初值别设全零给一个5°的初始姿态偏差方便后面看收敛曲线。4.1 用bp神经网络python代码训练残差补偿网络训练数据这样生成在上一节的仿真模型里让姿态角在±20°范围内做随机机动记录每个控制周期的姿态角、角速度、角加速度以及“实际模型所需力矩”和“机理公式计算力矩”的差值。这个差值就是BP网络的标签。数据存成CSV特征和标签分列。训练代码用纯numpy实现三层BP网络避免依赖过重的框架也方便把权重导出到飞控。import numpy as np def load_data(path): # CSV列依次为: phi,theta,psi,p,q,r, tau_residual_x,tau_residual_y,tau_residual_z data np.loadtxt(path, delimiter,, skiprows1) X data[:, :6] # 当前姿态状态 y data[:, -3:] # 残差力矩 return X, y def normalize(X, mu, sigma): return (X - mu) / (sigma 1e-8) # 网络结构6输入-12隐藏-3输出 np.random.seed(0) n_in, n_hidden, n_out 6, 12, 3 W1 np.random.randn(n_in, n_hidden) * 0.1 b1 np.zeros((1, n_hidden)) W2 np.random.randn(n_hidden, n_out) * 0.1 b2 np.zeros((1, n_out)) def forward(X): z1 X W1 b1 a1 np.tanh(z1) # 隐藏层用tanh输出不会饱和 z2 a1 W2 b2 return z2, a1 def train(X, y, lr0.02, epochs500, batch64): mu, sigma X.mean(0), X.std(0) X normalize(X, mu, sigma) for epoch in range(epochs): idx np.random.permutation(len(X)) for i in range(0, len(X), batch): bx X[idx[i:ibatch]] by y[idx[i:ibatch]] out, a1 forward(bx) d2 (out - by) / batch dW2 a1.T d2 db2 d2.sum(0, keepdimsTrue) d1 d2 W2.T * (1 - a1 ** 2) dW1 bx.T d1 db1 d1.sum(0, keepdimsTrue) W1 - lr * dW1; b1 - lr * db1 W2 - lr * dW2; b2 - lr * db2 if epoch % 100 0: pred, _ forward(normalize(X, mu, sigma)) print(fepoch {epoch}, mse {np.mean((pred - y) ** 2):.6f}) return mu, sigma这个实现里关键参数是学习率0.02、批大小64、隐藏层12个节点、tanh激活。残差力矩的量级很小10^-2 N·m输出层直接用线性避免激活函数把输出压到0附近隐藏层用tanh是因为误差有正有负tanh对称且在中间区导数变化平缓比ReLU更适合力矩补偿这类连续回归任务。训练结束后把 W1、b1、W2、b2 连同 mu、sigma 导出成头文件或二进制供Simulink或飞控加载。注意这里只做了标准化没做归一化姿态角、角速度、力矩量纲不同标准化把各列压到零均值单位方差网络输入各维才是同等尺度。4.2 闭环验证参数采样周期、学习率、力矩限幅网络部署回仿真模型推荐参数如下。参数取值说明控制/采样周期2 ms与常见飞控一致姿态环PIDKp120Ki8Kd18参考值先单独跑PID确认稳定再叠加BPBP前向推理周期2 ms每个控制周期都算一次BP输出限幅±0.05 N·m残差补偿不允许覆盖主控制量训练数据规模4万~8万样本覆盖±20°随机机动初始姿态偏差5°~10°用于看收敛过程闭环验证按三个步骤进行。第一步只跑PID记录阶跃响应的超调、调节时间、稳态误差第二步打开BP补偿对比同样工况的曲线第三步在力矩输入处注入持续扰动正弦或阵风模型看稳态误差有没有被BP压下来。判断标准超调小于15%、调节时间小于1s、加入扰动后的稳态误差比纯PID下降30%以上。三条都满足再谈移植真机。5. 必踩的五个坑训练数据、惯性参数、激活函数与验证方法从仿真到真机血泪经验基本集中在下面五条。每一条都按现象、原因、解决的顺序写方便对号入座。5.1 现象训练一切正常一接进闭环模型就高频抖动原因训练数据里没有覆盖控制器输出饱和的情况。BP网络在力矩接近限幅时学习到的映射和线性区完全不同闭环里一旦PID输出饱和网络给出的补偿力矩又叠加在饱和值上形成振荡。解决训练时把控制力矩限幅作为数据生成条件超过限幅的样本要么丢弃要么打上饱和标记网络输出再额外做一次限幅推荐限幅设为主控制力矩的20%以内。5.2 现象滚转角收敛挺好俯仰角出现周期性摆动原因J_rp参数设置偏差过大模型里陀螺力矩方向和实际不符。BP网络补偿了部分耦合但摆动周期对应旋翼转速差变化的周期频率比姿态运动高很多网络学到的只是平均效果。解决先把J_rp的量级校准。让仿真模型悬停给一个滚转阶跃记录俯仰耦合的幅值和相位反过来用陀螺力矩公式反算J_rp再把反算值代入模型重新生成训练数据。这一步做扎实后后面很多“莫名奇异”的现象会一起消失。5.3 现象隐藏层用ReLU网络输出在姿态角过零时出现死区原因ReLU对负输入直接输出0而姿态通道误差正负交替部分神经元权重更新后落入负区间就不再参与学习整个网络输出产生死区。表现就是姿态角过零附近补偿力矩突然消失曲线出现一个“平台”。解决回归类任务不要用ReLU隐藏层换tanh或sigmoid输出层保持线性。如果必须用ReLU至少加LeakyReLU且leak系数不小于0.01。姿态控制是连续回归问题选择激活函数时优先考虑对称性和导数连续性。5.4 现象仿真指标很好看一移植到飞控就翻车原因训练和验证用了同一批数据或验证数据里混入了训练样本。BP网络记住了数据而不是学到残差规律真机飞行时的噪声、时延和仿真完全不匹配一换工况就暴露。解决数据按时间顺序切分成训练、验证、测试三份。不能随机切分否则相邻样本高度相关验证结果会“看起来”更好测试集必须用一段完全没参与训练的机动轨迹。网络隐藏层尽量小能拟合训练集就够不要在训练集上追求极小的MSE那基本是过拟合的信号。5.5 现象网络推理加入后飞控CPU占用飙升控制周期不稳定原因在线更新权重或前向推理放在中断里执行矩阵运算耗时超过控制周期角度更新滞后让网络输入和实际状态差了多个采样周期。解决固定部署时把网络推理拆到主循环权重更新只在空闲时做输入信号先做一阶低通滤波再给网络时间常数取2~3个采样周期。这一步常被当成“玄学”其实是采样和执行时序不对齐导致的相位滞后滤波后网络稳定性能明显提升。6. 更省事的验证捷径先加扰动通道再谈真机如果暂时不想把J_rp标定得很准可以换一个验证思路在Simulink模型或你的飞控仿真环境的姿态力矩总和点加一个扰动信号扰动形式和陀螺力矩接近——频率与旋翼转速相关、幅值随角速度变化。这样在没有真实硬件的条件下也能检验BP网络是否具备对抗这类耦合的能力。具体做法在τ_dist通道注入d A·sin(2π·f·t)·[1; 1; 0.5]A从0.02 N·m起步f取悬停旋翼转速对应的基频量级观察BP开启前后的跟踪误差变化。如果BP开启后误差明显回落说明网络学到的是有效残差模型如果误差反而变大先别急着调网络回去检查耦合的方向符号是不是反了。三个判定指标能帮你快速决定“值不值得继续投入”姿态角超调小于15%调节时间小于1s阶跃5°到10°BP补偿后稳态误差降幅不低于30%。三条都满足再上真机。如果达不到先不要怀疑BP网络回到4.1节的模型——多半是附加惯性项符号定义反了或者训练标签里包含了饱和样本。这个方向本身是值得做的机理模型补偿主耦合神经网络拟合残差正好互补。但它的收益上限取决于前两步建模和训练数据的质量。这套流程我每次都先跑“纯PID→加扰动→开BP”三步已经成了习惯。养成这个习惯前后踩坑率差很多希望帮到你。本文还有配套的精品资源点击获取
返回列表