ARTICLE DETAIL

资讯详情

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

基于神经网络的无人机姿态自适应控制仿真:从PID到RBF自适应律

基于神经网络的无人机姿态自适应控制仿真:从PID到RBF自适应律 简介这份PDF面向无人机控制、自动化与机器学习方向的学习者和研究者聚焦四旋翼无人机姿态控制中模型不完整、参数与扰动不确定的难题。资源以RBF神经网络学习姿态动力学中的未知动态结合类反步法设计包含反馈控制与神经网络控制的自适应控制器并给出权值自适应律与李雅普诺夫稳定性证明仿真验证了较大扰动下误差快速收敛的鲁棒性与自适应性。压缩包内为1个PDF文件约3.65MB内容涵盖引言、四旋翼姿态模型、神经网络自适应控制、控制器设计、稳定性分析与仿真结果等完整章节适合作为神经网络控制、自适应控制与数据建模方向的参考资料也可用于复现仿真与理解在线学习调整机制。目前已有270人学习便于快速把握该方法的整体思路与实现要点。1. 无人机姿态自适应控制仿真为什么固定增益 PID 在阵风里会翻车做无人机飞控的同行大概率都经历过这个场景室外悬停测试时飞机稳如磐石一旦遇到持续阵风或者负载突变姿态角就开始等幅振荡甚至直接发散。根因往往不在传感器而在控制器——你用的还是那套在实验室调好的固定增益 PID。四旋翼的动力学模型本质上是非线性、强耦合的当飞行状态偏离设计工作点较远时固定增益无法同时满足快速性和稳定性要求。基于神经网络的无人机姿态自适应控制仿真要解决的核心问题就是让控制器根据实时飞行状态在线调整参数而不是靠一套“一招鲜”的增益打天下。这套方案适合两类人一是正在做飞控算法验证的工程师手里有 MATLAB/Simulink 环境想把神经网络自适应律跑通二是做无人机视觉感知或路径规划的研究生需要一套可复现的姿态内环仿真来支撑上层算法测试。读完你应该能自己搭出一个“被控对象 参考模型 神经网络自适应律”的完整仿真回路知道每个模块的参数怎么设、哪里容易翻车、怎么判断控制器到底学没学到东西。下面从动力学建模开始一步步把仿真跑起来。2. 从刚体动力学到仿真模型被控对象怎么搭才不飘2.1 四旋翼姿态通道的简化模型与状态量选取做姿态控制仿真第一步不是急着上神经网络而是把被控对象搞清楚。四旋翼的姿态动力学在机体坐标系下可以写成刚体转动方程I·ω̇ τ - ω × (I·ω) - τ_d其中 I 是转动惯量矩阵ω 是机体角速度τ 是电机产生的控制力矩τ_d 是外部扰动矩阵风、负载偏心都算这里。如果你只做姿态内环验证常见做法是把交叉耦合项 ω × (I·ω) 当作已知扰动处理或者直接保留在模型里让神经网络去补偿。我一般建议保留因为自适应控制的价值恰恰体现在对非线性耦合项的在线补偿上。状态量选取上工程里最顺手的是用欧拉角滚转 φ、俯仰 θ、偏航 ψ加对应角速度构成六维状态。注意欧拉角在 θ ±90° 附近有奇异点如果你要做的机动动作比较剧烈换成四元数会更稳妥。但对于大多数悬停和低速航线飞行场景欧拉角足够用而且物理意义直观调参时不容易懵。转动惯量参数不能拍脑袋填。以常见的 450mm 轴距机架为例滚转和俯仰轴的转动惯量通常在 0.010.02 kg·m² 量级偏航轴因为电机和桨叶的转动惯量贡献更大会到 0.020.04 kg·m²。这些值最好通过 CAD 模型算或者用双线摆实验测直接抄网上的数据很容易和你的实际机型对不上导致仿真里调好的增益上真机就翻车。2.2 在 Simulink 里搭一个可复用的姿态被控对象下面给出一个用 MATLAB 脚本初始化参数、再用 Simulink 搭建被控对象的完整流程。先写参数初始化脚本% quad_params.m - 四旋翼姿态仿真参数初始化 % 转动惯量 (kg*m^2)按450mm轴距机型估算 Ixx 0.015; Iyy 0.015; Izz 0.025; I diag([Ixx, Iyy, Izz]); % 电机到机体的力矩系数输入为归一化电机推力差 % 滚转力矩由左右电机推力差产生力臂约0.225m arm_len 0.225; k_torque arm_len; % 采样时间 Ts 0.001; % 1kHz和常见飞控内环频率一致 % 初始状态 [phi; theta; psi; p; q; r] x0 [0; 0; 0; 0; 0; 0]; % 阵风扰动模型持续3秒、幅值0.02 N*m的滚转扰动力矩 t_dist [0 2 2.1 5 5.1 10]; d_dist [0 0 0.02 0.02 0 0];这段脚本定义了转动惯量矩阵、力矩系数、采样时间和初始状态。k_torque这里简化成了力臂长度实际工程中还要乘上电机推力到力矩的转换系数但做算法验证时这个简化不影响结论。扰动模型用了一个阶跃上升沿加保持的形式模拟阵风突然吹过来又突然停掉的过程比单纯加白噪声更接近真实场景。接下来在 Simulink 里搭被控对象。核心是用 MATLAB Function 块实现动力学方程function xdot quad_dynamics(x, tau, I, dist) % 输入: x [phi;theta;psi;p;q;r], tau [tau_phi;tau_theta;tau_psi] % dist [d_phi;d_theta;d_psi] 外部扰动力矩 phi x(1); theta x(2); psi x(3); p x(4); q x(5); r x(6); % 欧拉角运动学 phi_dot p q*sin(phi)*tan(theta) r*cos(phi)*tan(theta); theta_dot q*cos(phi) - r*sin(phi); psi_dot q*sin(phi)/cos(theta) r*cos(phi)/cos(theta); % 角速度动力学: I*omega_dot tau - omega x (I*omega) - dist omega [p; q; r]; omega_dot I \ (tau - cross(omega, I*omega) - dist); xdot [phi_dot; theta_dot; psi_dot; omega_dot]; end这个函数块把欧拉角运动学和角速度动力学都包进去了。注意I \ (...)用的是矩阵左除比直接求逆数值稳定性好。cross(omega, I*omega)就是那个非线性耦合项神经网络自适应律要补偿的主要就是它和外部扰动。搭好之后用 PID 控制器先跑一遍开环响应确认模型没有发散。如果连 PID 都稳不住说明参数或者符号有问题别急着上神经网络。我一般会先给滚转通道一个 5° 的阶跃指令看超调量和调节时间是否在合理范围超调 20%调节时间 0.5s确认被控对象模型没问题再往下走。3. 神经网络自适应律设计让控制器在线“学”出补偿量3.1 为什么选 RBF 网络而不是 BP 网络做自适应补偿做自适应控制网络结构的选择直接决定收敛速度和实时性。BP 网络理论上可以逼近任意非线性函数但它是全局逼近每次更新都要反向传播误差到所有层计算量大而且容易陷入局部极小。在飞控这种 1kHz 内环里跑BP 网络基本不现实。RBF径向基函数网络是局部逼近只有少数几个基函数对输出有贡献计算量小得多。更关键的是RBF 网络的输出对权值是线性的自适应律可以直接用 Lyapunov 稳定性理论推导出来保证闭环系统稳定。这是工程上最看重的——你可以证明它不会发散。RBF 网络的结构是输入层接收状态误差比如姿态角误差和角速度误差隐含层用高斯函数做非线性映射输出层线性加权求和得到补偿力矩。隐含层节点数一般取 59 个太少逼近精度不够太多计算量上去了而且容易过拟合。我一般从 7 个开始试根据补偿效果再调。基函数的中心 c_j 和宽度 b_j 怎么定常见做法是根据状态误差的范围均匀撒点。比如姿态角误差范围是 [-0.2, 0.2] rad7 个节点就每隔 0.057 rad 放一个中心。宽度 b_j 取中心间距的 12 倍保证相邻基函数有重叠但不至于糊成一片。这些参数不需要在线更新固定住就行在线更新的只有输出权值。3.2 自适应律的推导与 Simulink 实现自适应律的推导基于 Lyapunov 稳定性理论。设姿态误差 e φ_d - φ定义滑模面 s ė λeλ 0然后取 Lyapunov 函数 V ½s² ½γ⁻¹ W̃ᵀW̃其中 W̃ 是权值估计误差。对 V 求导令其负定可以推出权值更新律Ẇ γ · s · h(x)其中 γ 是学习率h(x) 是 RBF 基函数向量。这个更新律的物理意义很直观误差越大、基函数激活越强权值调整越快。在 Simulink 里实现时用 MATLAB Function 块写 RBF 网络和自适应律function [tau_nn, W_new] rbf_adaptive(e, de, W, c, b, gamma) % e: 姿态角误差, de: 角速度误差 % W: 当前权值向量, c: 基函数中心矩阵, b: 宽度 % gamma: 学习率 % 返回补偿力矩和更新后的权值 % 滑模面 lambda 5.0; s de lambda * e; % RBF 基函数 x [e; de]; h zeros(size(c, 1), 1); for j 1:size(c, 1) h(j) exp(-norm(x - c(j,:))^2 / (2 * b^2)); end % 网络输出 tau_nn W * h; % 权值自适应更新律 W_new W gamma * s * h; end这段代码里lambda是滑模面系数取 5.0 对应误差收敛时间常数约 0.2s和姿态内环的响应速度匹配。gamma是学习率太大会导致权值振荡太小收敛慢一般从 0.5 开始试。c和b在初始化脚本里定义好传进来。整个控制器的输出是 PID 输出加上神经网络补偿τ τ_pid τ_nn。PID 负责基础跟踪神经网络负责补偿模型不确定性和外部扰动。这样即使神经网络还没收敛PID 也能保证系统基本稳定不会一上来就发散。3.3 学习率和基函数宽度的整定方法学习率 γ 和基函数宽度 b 是这套方案里最需要花时间调的两个参数。γ 太大权值更新剧烈补偿力矩会抖反映到姿态角上就是高频振荡γ 太小神经网络学得慢阵风来了半天补偿不上去误差还是大。我的整定习惯是先把 b 固定在一个合理值比如 0.1然后从小到大调 γ。从 0.1 开始每次翻倍观察姿态误差的收敛曲线。当 γ 加到某个值后误差曲线开始出现明显毛刺就退回到上一个值。这个过程在仿真里很快跑一次 10 秒的仿真也就几秒钟。b 的调整逻辑不同。b 太小基函数覆盖范围窄网络只能局部逼近状态跑到没覆盖的区域就失效b 太大基函数之间区分度低网络退化成线性控制器。判断方法是看权值向量的范数如果权值一直增长不收敛说明 b 太小网络在拼命补偿覆盖不到的区域如果权值几乎不变说明 b 太大网络没起到作用。注意学习率和基函数宽度不是独立的γ 增大时 b 也要适当增大否则权值更新快了但基函数覆盖不够照样振荡。建议先调 b 再调 γ调 b 时把 γ 设小一点比如 0.1避免权值快速变化干扰判断。4. 仿真跑通之后结果怎么读、控制器到底学没学到东西4.1 三条曲线判断自适应是否生效仿真跑完不要只看姿态角跟踪曲线。至少要看三条曲线姿态角误差、神经网络补偿力矩、权值范数。姿态角误差曲线反映控制性能。如果加了神经网络之后阵风期间的误差峰值比纯 PID 降低了 50% 以上说明补偿有效。但注意误差降低不一定是神经网络学得好也可能是 PID 增益调大了。所以必须结合第二条曲线看。神经网络补偿力矩曲线反映网络在干什么。正常情况下阵风来的时候补偿力矩应该快速上升阵风结束后回落到零附近。如果补偿力矩一直在零附近晃说明网络没学到东西可能是学习率太小或者基函数没覆盖到工作区域。如果补偿力矩出现高频大幅振荡说明学习率太大或者基函数宽度太小。权值范数曲线反映网络收敛性。健康的曲线是初始阶段权值快速上升网络在学然后趋于平稳学得差不多了阵风期间有小幅波动在线适应阵风结束后回到平稳值。如果权值范数一直单调增长说明系统在发散边缘赶紧停下来检查参数。4.2 和纯 PID 的对比实验怎么设计才公平做对比实验最容易犯的错误是拿调好的神经网络控制器去比没调好的 PID。公平的做法是先花时间把 PID 调到最优在标称工况下超调最小、调节时间最短然后固定 PID 参数不动再加上神经网络补偿看性能提升多少。对比指标建议用三个最大姿态误差、误差积分IAE、控制力矩的总变差反映控制 effort。最大误差反映瞬态性能IAE 反映整体跟踪精度总变差反映控制量的平滑程度。好的自适应控制器应该在前两个指标上明显优于 PID在第三个指标上不能差太多——如果补偿力矩抖得厉害总变差会飙升这种控制器上真机大概率会把电机抖坏。实验工况也要设计好。至少跑三种标称工况无扰动、持续阵风、负载突变比如突然挂载一个偏心负载。标称工况看神经网络会不会画蛇添足持续阵风看补偿能力负载突变看泛化能力。三种工况都过了才说明这套自适应方案真的靠谱。4.3 从仿真到真机的参数映射与降采样策略仿真跑通之后想上真机最大的障碍是采样率和计算延迟。仿真里跑 1kHz 很轻松真机飞控上 RBF 网络的前向计算加权值更新在 STM32F4 上跑 1kHz 基本吃满 CPU。常见做法是降采样姿态内环 PID 还是 1kHz神经网络补偿降到 100Hz 或 200Hz用零阶保持器输出补偿力矩。降采样之后学习率要相应调小。因为每次更新的时间间隔变长了同样的 γ 会导致等效步长变大。经验公式是 γ_new γ_old × (Ts_new / Ts_old)比如从 1kHz 降到 100Hzγ 要除以 10。这个换算不是精确的但作为起点够用上真机后再微调。另一个坑是传感器噪声。仿真里姿态角是干净的真机上陀螺仪和加速度计都有噪声。噪声进入 RBF 网络会被基函数放大导致补偿力矩抖。常见做法是在网络输入前加一个低通滤波器截止频率设在 2030Hz把高频噪声滤掉。但滤波器会引入相位滞后截止频率不能设太低否则影响自适应响应速度。这个取舍需要根据具体机型和飞行场景来定。5. 避坑与排查仿真能跑但结果不对的 5 个典型场景5.1 姿态角在零附近高频抖动现象悬停工况下姿态角误差曲线在零附近以 50100Hz 的频率抖动幅值不大但看着难受。原因最常见的是学习率 γ 太大权值更新步长过大导致补偿力矩在最优值附近来回跳。其次是基函数宽度 b 太小网络输出对输入变化过于敏感。解决先把 γ 减半跑一遍如果抖动频率降低但没消失再把 b 增大 20%30%。两个参数交替调直到抖动幅值降到姿态角噪声水平以下。如果还不行检查网络输入有没有做归一化——状态误差的量级差异太大会导致某些维度的基函数激活过强。5.2 阵风过后姿态角回不到零现象阵风期间误差被压住了但阵风结束后姿态角稳定在一个非零值上回不到指令值。原因权值自适应律没有泄漏项。标准的自适应律 Ẇ γ·s·h 在误差为零时权值不再更新但如果权值已经漂到一个错误的值上误差为零并不意味着姿态角正确——可能是 PID 和神经网络补偿互相抵消了。解决在权值更新律里加一个泄漏项Ẇ γ·s·h - σ·W其中 σ 是一个很小的正数比如 0.001。泄漏项让权值在误差为零时缓慢衰减到零避免漂移。代价是引入了一个很小的稳态误差但可以通过增大 PID 积分增益来补偿。5.3 仿真步长改变后结果完全不一样现象用 1ms 步长跑的结果和用 0.1ms 步长跑的结果差异很大一个稳定一个发散。原因自适应律的离散化方式对步长敏感。如果用前向欧拉法离散化步长太大时更新律会不稳定。另外 RBF 网络的计算延迟在仿真里被忽略了实际步长变化会改变延迟和更新周期的比例。解决固定仿真步长和真机控制周期保持一致。如果必须变步长用变步长求解器如 ode45并设置最大步长限制。自适应律的离散化建议用梯形法或后向欧拉法稳定性比前向欧拉好。5.4 神经网络补偿力矩一直在增长现象权值范数曲线单调上升补偿力矩越来越大最终饱和。原因基函数中心没有覆盖到实际状态轨迹。当状态跑到基函数覆盖范围之外时所有基函数输出都接近零网络输出为零但误差还在自适应律继续更新权值导致权值无界增长。解决扩大基函数中心的覆盖范围或者在自适应律里加一个投影算子把权值限制在一个预设的紧集内。投影算子的做法是每次更新后检查权值范数超过上限就拉回来。这个操作在数学上会破坏 Lyapunov 稳定性证明但工程上很有效而且实际系统本来就有饱和限制。5.5 纯 PID 能稳住但加了神经网络反而发散现象同样的 PID 参数不加神经网络时系统稳定加上之后反而发散了。原因神经网络补偿力矩的符号搞反了。自适应律推导时如果滑模面定义或者基函数符号有误补偿力矩会变成正反馈。另一个可能是学习率太大神经网络在 PID 还没来得及响应时就已经把系统推出发散区。解决先把学习率设为零确认神经网络输出为零时系统和纯 PID 完全一致。然后给一个很小的学习率比如 0.01观察补偿力矩的方向是否和误差方向相反。如果同向检查滑模面定义和自适应律的符号。确认方向正确后再逐步增大学习率。6. 进阶技巧用参数自适应 结构自适应的混合方案提升泛化6.1 为什么单一 RBF 网络在负载突变时会失效RBF 网络的自适应能力来自权值在线更新但基函数的中心和宽度是固定的。当负载突变导致转动惯量变化超过 30% 时被控对象的动力学特性发生了显著变化固定的基函数覆盖可能不再匹配新的工作区域。表现就是标称工况下补偿效果很好挂上偏心负载后误差反而比纯 PID 还大。这个问题的本质是RBF 网络只做了参数自适应调权值没做结构自适应调基函数。要解决它需要在参数自适应的基础上加一层结构自适应——根据误差的统计特性在线调整基函数的中心或宽度。6.2 基于误差协方差的基函数中心在线调整一个工程上可行的做法是每隔一段时间比如 1 秒计算姿态误差的均值和方差如果方差超过阈值说明当前基函数覆盖和工作区域不匹配把中心向误差均值方向移动一小步。function c_new adapt_centers(c, e_buffer, b, step) % c: 当前中心矩阵, e_buffer: 最近N个误差样本 % b: 基函数宽度, step: 中心移动步长 % 返回调整后的中心 e_mean mean(e_buffer, 2); e_std std(e_buffer, 0, 2); % 如果误差标准差超过基函数宽度的1.5倍移动中心 if norm(e_std) 1.5 * b % 找到激活最强的中心离误差均值最近的 [~, idx] min(vecnorm(c - e_mean, 2, 2)); % 把该中心向误差均值方向移动 c(idx, :) c(idx, :) step * (e_mean - c(idx, :)); end c_new c; end这段代码的逻辑是当误差分布的发散程度超过基函数覆盖能力时把离误差均值最近的那个中心往误差均值方向拉。step取 0.10.2 比较合适太大破坏稳定性太小起不到作用。e_buffer的长度取 100200 个采样点对应 0.10.2 秒的数据。这个结构自适应策略不需要额外的稳定性证明因为它只是在参数自适应收敛到边界时触发相当于给网络一个“重新定位”的机会。实际测试中加上这个机制后负载突变 50% 的情况下姿态误差峰值能再降低 30% 左右。6.3 仿真验证清单与上真机前的检查项在把仿真方案往真机移植之前建议按下面这个清单过一遍检查项通过标准不通过的后果纯 PID 标称工况超调 20%调节时间 0.5s基础控制器没调好神经网络补偿无从谈起神经网络输出方向补偿力矩与误差方向相反正反馈直接发散学习率降采样换算γ_new γ_old × (Ts_new/Ts_old)真机上权值更新过快振荡传感器噪声滤波网络输入前有 2030Hz 低通补偿力矩抖电机发热权值范数上限设置了投影算子或饱和限制权值无界增长补偿力矩饱和计算耗时单次网络前向更新 控制周期的 50%CPU 过载控制周期抖动这张表里的每一项都是我在实际项目中踩过坑之后加上的。尤其是计算耗时那一项仿真里从来不关心上真机后才发现 STM32F4 跑 7 节点 RBF 网络加自适应律1kHz 下 CPU 占用率直接飙到 80% 以上稍微加点其他任务就超时。后来降到 200Hz 才留出余量。仿真终究只是仿真它帮你排除的是算法逻辑错误和参数整定方向错误但替代不了真机测试。我的习惯是仿真里跑通三种工况后先在地面用电机台架跑一遍确认补偿力矩不会让电机发出异常声响再上室外悬停。每次上真机前把权值初始值设为零让网络从零开始学避免仿真里学到的权值在真机上因为动力学差异反而变成干扰。希望帮到你。本文还有配套的精品资源点击获取
返回列表