ARTICLE DETAIL

资讯详情

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

asbQuadcopter四旋翼仿真模型详解:从模块拆解到控制调参与工程落地

asbQuadcopter四旋翼仿真模型详解:从模块拆解到控制调参与工程落地 在MATLAB平台里asbQuadcopter一直是航空模块集Aerospace Blockset里绕不开的一个四旋翼仿真参考案例。很多人第一次打开它时第一反应是“模型怎么这么复杂”第二反应是“能不能把这个模型改一改变成我自己想要的控制对象”。我见过不少同学卡在模型梳理这一步要么不知道哪几个模块是关键要么调参时一调就发散最后只能回到文档里逐字翻帮助。这篇东西我想按自己的理解把这个模型里的核心模块、信号流转关系、调试方法整理一下同时把我踩过的坑和优化思路也一并写出来给准备用这个模型做学位课题、比赛或者个人项目开发的朋友一个可以直接参考的清单。先说明一下本文默认你已经能在命令行输入asbQuadcopter并打开Simulink模型。如果还没打开那就先打开边看边读比空泛听我讲要有效得多。整个案例本质上是一个完整的四旋翼六自由度闭环控制仿真内环姿态控制、外环位置控制、电机执行器、刚体动力学、传感器与估计、三维可视化一个都不少。你后面自己做设计其实也是围绕着这条链路去替换和解耦。1. 先把模型骨架看明白asbQuadcopter到底在仿真什么很多人对着模型图第一眼就觉得头晕到处都是S-Function和Bus信号。这里我建议你用“子系统拆分”的眼光去看别被连线的数量吓到。整个模型可以抽象成“控制器给指令执行器出拉力动力学出运动传感器报状态估计器给反馈”这条闭环链。下面我从五个核心模块讲起。1.1 五大核心模块及其职责第一个模块就是最上面的飞行控制器Controller它在模型里决定了四旋翼飞行的响应快慢、稳态精度和抗扰能力。控制器内部其实是两层外环位置控制计算期望的俯仰、滚转角度和总推力内环姿态控制再把这些期望值细化成三个轴的力矩指令。这个结构跟真实飞控完全一致很多穿越机飞控里PID分层也是这个逻辑。第二个模块是执行器组Motor/Gimbal Actuation也就是电调和螺旋桨的等效模型。四旋翼本质上是通过“转速差”来产生俯仰、滚转、偏航力矩的所以这里不能只把电机当成简单的增益模块。asbQuadcopter里执行器模型包含了电机的动态响应和推力、反扭矩系数设置上比较接近真实物理特性这也是它能用来做控制器验证的原因。第三个模块是刚体六自由度动力学模型6DOF Animation/Relative Dynamics这是仿真对象的“本体”。它把合外力和合力矩换算到机体坐标系下然后积分出速度、位置、姿态角。这里用到了NED北-东-地坐标系和机体坐标系的转换关系以及惯量矩阵的设定。姿态更新既可以用欧拉角也可以用四元数模型里根据需求做了折中处理。第四个模块是传感器与状态估计。仿真不能只用理想状态去闭环那样结果太乐观实际飞起来分分钟炸机。asbQuadcopter提供了传感器量测有些版本还用滤波器对噪声和漂移进行抑制然后估计出姿态和位置反馈回控制器。这个模块告诉你控制不能只看控制器反馈路径的时延和噪声也会显著影响飞行品质。第五个模块是三维可视化与数据传输3D Animation/Scope输出主要目的是让你能直观看到飞机是否按航线飞姿态是否超限以及各种信号曲线对比。这个模块对快速验证特别有帮助它能让你在几十秒内判断方案对不对而不是拿着一堆数据去猜。1.2 坐标系、单位制与初始条件最容易踩坑的“小事”很多人在asbQuadcopter上跑出来的结果和预期大相径庭问题往往出在最不起眼的地方。第一是坐标系Aerospace Blockset里默认使用NED坐标系也就是X轴朝北、Z轴朝下这和很多自动控制课本里的“东北天”ENU习惯完全相反。你如果拿别的工程项目的位姿数据直接塞进这个模型会看到俯仰和滚转方向反掉甚至位置控制整个负反馈变正反馈直接失控。第二是单位模型默认通篇采用国际标准单位制也就是米、千克、秒、牛顿角速度是弧度每秒。但很多人在连接自己的电机推力系数时习惯了把转速转每分钟或推力用克力来计算填进去之后油门指令和实际推力差了好几个数量级。我的习惯是每次拿到一个外部参数就先把单位写成注释放旁边避免换算错。第三是初始条件模型初始化时会从工作空间读取一个初始位置和初始姿态如果你把初始高度设成0那么跑悬停任务时控制器要从一个“半埋在地下”的状态开始拉起来这种非线性瞬态很容易让积分项饱和。建议初始位置稍微抬高一点比如初始高度设1米以上给控制器留出合理调整空间。2. 控制器核心链路拆解与调参心得控制链路是整个仿真的大脑。asbQuadcopter的控制器里信号从“位置指令”到“期望姿态”再到“期望角速度”最后转换到“四个电机的油门指令”这条链上的比例-积分-微分参数取值不合适整个仿真就会表现出明显的振荡或缓慢爬坡。我把它拆成两层来聊因为实际调参时也建议分层做。2.1 外环位置控制把航线变成姿态需求位置控制器的输入是一条期望航线可能是一组航路点或者一条直线目标。它内部先把当前位置和期望位置做差乘上比例和积分项得到期望的水平加速度然后通过反解表达式把水平加速度换算成目标俯仰角和目标滚转角。这意味着你如果想让四旋翼向正东飞控制器真正执行的是把机体往东方向倾斜靠水平方向的推力分量产生加速度。这里有个实用的原则外环增益不宜过高。位置误差的响应急剧程度是由物理推力极限约束的你给的外环比例系数太大控制器就会“命令”机体摆出一个非常大角度来追求极短的调节时间但电机推力有限最后反而表现为位置超调和姿态饱和。我在实际调试里倾向把位置环的比例项调到0.3到0.8之间然后观察航线跟踪情况如果出现来回抖就减少外环积分项同时返回来检查内环是否响应过慢。另外一个细节是微分项。位置环里的微分项通常对应期望速度的阻尼作用防止到达目标点附近时速度过大冲过去。它和速度反馈的作用类似但没有独立的测速传感器时只能靠位置差分去估计容易放大噪声。所以如果你发现位置输出抖得厉害可以先看一眼是不是微分增益放大了采样噪声。2.2 内环姿态控制动态品质的关键内环姿态控制器接受外环给出的期望俯仰角和期望滚转角以及任务指定的偏航角通过比例项输出期望的角速度响应再用角速度环去反馈阻尼。asbQuadcopter里这种“角度外环加油门控制高度、角速度内环提供阻尼”的布局是当前多数多旋翼飞控的原型。你调参时最核心的是内环因为它响应更快直接决定整机的稳定裕度。我的调参经验是先固定外环不参与给定一个小的期望角度阶跃然后手动调内环的角速度比例和微分。角速度环的P项影响响应快慢D项影响阻尼。如果P很小飞机角速度建立不起来姿态会“软”如果P很大会出现高频颤振曲线像密密麻麻的梳子。通常先加P让角速度阶跃响应的上升时间在一个合理的范围内例如0.2到0.4秒然后再加D把超调压下去。等内环稳定了再打开外环继续调外环的P和I。整个过程中我踩过最大的坑是把内环P调得过高导致整个仿真以几十赫兹的频率持续振荡当时还以为是解算器步长不够后来把姿态角速度曲线单独拉出来看才确认是控制器增益的问题。所以建议你把Scope并联到角速度反馈信号上先做内环阶跃再做外环阶跃这样做能省掉大量盲目试参的时间。2.3 执行器模型不能为了省事把它简化成纯增益我刚接触asbQuadcopter时觉得电机模型的动态响应那么快会不会直接用一个比例增益代替就行。后来发现这个想法非常危险。四旋翼的力矩变化主要靠电机转速的变化速率而电机转速不是瞬时改变的它有一个近似一阶惯性的过程。如果把这一环去掉你算出来的姿态控制律可能在实际硬件上根本推不动转速变化出现降级甚至失稳。asbQuadcopter里的执行器模型就是专门把这个动态过程保留下来里面有力矩系数、推力系数和转速响应限幅。你在自定义电机时至少要把电机时间常数和推力系数测出来再填进去。常见的电机时间常数按硬件不同差别很大小电机可能只有十几毫秒大一点的无刷电机配上大桨可能到四十毫秒以上。在仿真中这个时间常数如果设置得太小就相当于把一个非常快的执行器放到控制回路里控制器很容易“以为”电机能跟上它的指令实际上真实硬件做不到最终结果就是“仿真特别稳上机就炸”。因此正常情况下不要为了仿真好看去减小时间常数而应尽量贴近真实样机。3. 仿真性能优化与解算器设置仿真模型做得再精美如果每次跑都磨蹭好几十分钟调试体验也不好。asbQuadcopter模型的复杂度和虚拟机差不多涉及到连续积分、离散控制器、传感器更新等多速率采样所以在性能优化上有几件事值得花时间去做。3.1 步长、求解器与多速率设置解算器设置是我在所有优化里最先动手的地方。如果你采用的是默认的可变步长求解器比如ODE45在大部分场景下都能跑得动但对四旋翼这种含有分段线性结构和较快角速度内环的系统可变形步长有时会因为某个数值跳变自动减小步长到非常小然后整个模型越跑越慢。我建议在Simulink配置参数里选择固定步长求解器比如ODE4四阶龙格库塔步长设成0.001秒1kHz再往下就属于离散控制器采样率比较高的场景了一般20kHz以内都能接受别盲目把步长降到1e-5那纯粹是折磨计算资源。其次是多速率问题。控制模型里经常有连续动力学和离散控制器并存的情况动力学在连续域控制律以50Hz、250Hz或者1kHz采样更新。asbQuadcopter示意见控制器部分也是离散化的不然没法直接映射到飞控代码。这时你必须确认离散采样率是否和模型里实际控制周期一致。如果控制器采样率是250Hz你却在仿真里用50Hz去离散运行那很多中间态会被平滑掉出来结果偏乐观。反过来仿真设得太快离散更新的时间间隔太短又会在控制指令里引入高频抖动。我的建议是先按实际飞控的150Hz或300Hz设定控制模块采样时间然后看曲线是否干净再决定要不要调整。3.2 加速模式、代码生成与批处理调参Simulink模型默认跑“Normal”模式时每步都要解释执行一遍模块图开销不小。我强烈建议把仿真模式改成“加速”甚至“快速加速”Simulink会把模型编译成C代码再运行同一个模型经常能快出三到五倍。实际操作是在模型窗口左下角的仿真模式栏里选择Accelerator然后跑一次模型会缓存编译结果。如果是批处理多组参数扫描一次编译能反复复用跑数百组参数时优势巨大。如果你想把调参后的控制律部署到真实的嵌入式飞控上那就要考虑用Simulink Coder生成C代码。asbQuadcopter这种级别的模型不是为生成生产级代码而精心裁剪的但你可以抽取出控制器子系统把传感器、可视化、连续动力学等部分剥离掉专门对控制器部分生成C代码然后烧写到MCU上。这里建议把控制器内部的所有连续性积分都用离散积分器替换因为嵌入式MCU里没有连续积分器全部是按采样周期累加的离散积分很多人在生成C代码那一步才发现离散化没做结果生成的代码逻辑怪异数量庞大修起来非常费劲。3.3 模型简化的边界哪些状态可以去掉哪些不能丢大家对仿真模型总有一种贪多求全的倾向觉得把所有细节都堆上才算真实。但我个人认为仿真的目的是验证控制算法模型保真度只要重点特征保留就够了。举个例子如果只做纯悬停和姿态控制验证气动阻力影响很小可以把那些高阶阻力项注释掉模型跑得会轻快很多但如果你想验证抗风性能就必须把气动阻力和风场模块加上不然控制器在风扰下的真实表现完全看不到。另一个值得简化的是可视化模块。三维动画虽然好看但它消耗的计算资源并不低。如果你要跑几十组参数对比长短我建议做完趋势分析后再开启动画或者干脆用数据流到工作空间里自己画图这样能大幅缩短仿真时长。但注意别把状态估计器也顺手简化掉那会影响闭环反馈路径的真实性会让仿真结果的可靠性打折扣。4. 仿真发散、曲线异常与联调排查任何做四旋翼控制的人都会被“仿真发散”这四个字支配过asbQuadcopter也一样。有的发散是参数不合理有的发散是步长求解器数值问题还有的是控制器结构和初始条件冲突。我在这一节用比较贴近现场的方式整理一份排查手册。4.1 发散问题的定位思路遇到发散我第一步是看输出曲线是在仿真前期瞬间发散的还是逐渐振荡发散。如果是瞬间比如前0.1秒就变成NaN或Inf通常是代数环或初始条件问题。代数环在Simulink里表现为反馈信号没有任何延时地参与计算整个方程组出现代数约束有时候解不出来。解决办法是在反馈回路中明确插入一个单位延时或者Memory模块切断代数环。如果是初始条件问题就检查初始化脚本里所有参数是否匹配像质量、重力加速度、初始高度任何一个设得特别离谱都可能导致“一启动就崩”。如果是逐渐振荡发散那大概率是控制增益或者步长问题。先用更小的步长跑一次如果情况没改善多半是控制器增益过大。这里我把典型现象和排查方向整理成一张表方便快速对照。现象常见原因优先排查手段启动后瞬间NaN/Inf代数环、初始参数相同加Memory模块检查初始化参数高频持续抖动内环P或D过大步长过大减小步长降低内环P/D低频摆动慢悠悠外环P太小或者积分饱和增大外环P/I检查限幅高度一直下降推力系数偏小电机时间常数太大检查油门到推力换算检查电机模型时间常数姿态会突然翻转欧拉角奇异或解算器卡边界改为四元数姿态更新增加初始偏航修正收敛后存在稳态误差积分项不足传感器噪声抬升估计误差增加积分增益配置估算滤波器带宽4.2 噪声、估计器与真值信号的对比技巧asbQuadcopter模型里有状态估计模块它接收包含噪声的传感器测量输出滤波后的姿态和位置估计。这部分在调试中会被很多人忽略因为大家都盯着控制目标看等到控制效果总是差一点时才会回头想是不是反馈信号不干净。我的建议是把模型里的“理想姿态真值”信号和“估计姿态”信号同时通过Scope显示然后对比两者的延迟和波动幅度。如果估计器有明显的滞后比如真值已经变化估计信号还慢悠悠跟着说明滤波器带宽太低可以适当提高滤波增益如果噪声太大导致控制量抖动说明带宽太高需要折中。这个思路在真实飞控联调时也一样适用只不过真实系统没有“真值信号”你只能用上位机观测和解算结果做参考。4.3 接入风场和其他外部扰动来验证鲁棒性Aerospace Blockset里提供了比较完整的风场模型从常值风到Dryden湍流模型都有。很多人在asbQuadcopter上只跑无风悬停这样基本验证不出什么因为控制器只要不是太离谱无风场景下都稳得住。真正常态的是给模型加一个3米每秒的常值风或者叠加一段阵风再看位置误差能不能被抑制回来姿态角会不会打满。加完风场后你会发现控制器如果只按理想刚体模型设计位置会出现持续偏置这是风带来的推力分量被模型忽略了。这时就需要你回到位置外环用抗积分饱和或前馈补偿的方式来解决。我在调风扰响应时有个习惯先把风速设成台阶形状比如5秒以前无风第5秒开始加2米每秒的风观察四旋翼“被吹偏多少再拉回来”的整个过程。这样比直接上湍流风更容易分析因果因为湍流信号本身很随机很难判断控制器是被哪个时刻的扰动打乱的。5. 从asbQuadcopter到你自己的四旋翼模型最后来说说怎么把这个参考案例改造成你自己的项目模型。这是很多人问的最多的一个问题因为比赛或课题里往往不要求做一个完整的通用四旋翼而是基于你自己的飞机参数、任务场景和控制器需求去调整。5.1 参数替换的系统化方法建议你不要在Simulink里双击每个模块去改参数那样既容易漏也难复现。asbQuadcopter把大部分参数都用工作空间中的变量来获取比如机体质量m、臂长L、转动惯量Ixx/Iyy/Izz、重力加速度g、推力系数、扭矩系数等。你可以新建一个自己的初始化脚本把这些变量按你的实际机型重新赋值。如果实际机架是X型布局而原始模型是十字布局那么电机序号对应的力臂方向需要调整否则滚转和俯仰的控制方向会乱。最简单的方法是先在初始化脚本里重新定义每个电机的空间位置再在Simulink的推力到力矩转换矩阵里修改对应项。做参数替换时最麻烦的是惯量。一般除了同轴电机和电池布局对称外其他部件的质量分布都不完全规则导致Ixx、Iyy、Izz的估计值差异很大。我建议先根据机架官方参数或者简单的CAD近似计算出一组初始惯量跑通仿真后再做参数辨识或用手册里的实测值替换。直接用猜的惯量会导致姿态响应带宽明显偏离真实情况后面调参白调。5.2 控制器结构再设计从“能用”到“好用”你拿asbQuadcopter做基础最终还是要面向自己的控制器设计。我建议你保留内环角速度控制和外环位置控制这套分层框架但控制器内部算法可以替换为串级PID、ADRC、滑模控制、模糊PID等。替换时最关键的是保持接口的信号约定外环输出期望角度和油门内环输出期望力矩不能因为改动控制器就破坏了总线结构。以ADRC为例你可以在内环加入扩张状态观测器对面风速和干扰进行实时估计然后把估计值用于前馈补偿。Simulink里做这种改动很容易但你要注意观测器带宽设置成多少观测器带宽太高会把传感器噪声放大。另外控制器的输出最终要映射到四个电机的油门指令这一步在模型里也是一个模块。如果是十字型布局升力和力矩与四个电机转速的乘机关系是固定矩阵如果是X型布局映射矩阵略有差异。很多人改完控制器后发现姿态响应方向反了检查了半天才发现是电机映射矩阵没跟着布局一起改。5.3 高性能计算与批处理参数寻优当你的参数数量多了以后手调已经忙不过来这时可以借助MATLAB的Optimization Toolbox和Parallel Computing Toolbox做批处理参数寻优。常见做法是用sim函数在循环里运行模型并调整工作空间的参数然后用评价函数提取航线误差、超调量、调节时间等指标通过优化算法迭代出最优PID增益。这比自己一遍遍肉眼看Scope要靠谱得多。实操时要注意一个细节每次调用sim之前用“set_param”重置仿真时间避免上一次运行的状态泄漏到下一次。批处理时建议先把可视化动画关掉不然每次迭代都会打开一堆绘图界面拖慢整体速度。我实际遇到过的情况是跑200组参数时每次都把Scope窗口拉出来电脑越来越卡。后来改成在循环里把关键信号记录到MATLAB工作区迭代结束后统一画图整个参数扫描时间缩短了三分之二。因此如果你要长期基于asbQuadcopter做设计我强烈建议把“自动化脚本批量参数扫描指标自动汇总”这套流程尽早搭起来。这个模型还有一个可以继续扩展的方向是硬件在环HIL把Simulink里的控制器部署到实际飞控板把动力学模型保留在Simulink里做实时仿真这样你可以在不接螺旋桨的情况下验证真实飞控代码的运行结果。搭建HIL环境时需要注意实时仿真机的步长和I/O延迟这部分内容和纯软件仿真差别较大但用过之后回到实际飞场试飞时你会明显感觉“摸底比之前轻松得多”。
返回列表