资讯动态

eVTOL混合飞行器建模与Simulink仿真:从动力学到嵌入式部署

发布时间:2026/9/10 13:30:18 来源:尧图企业网站定制
简介面向航空航天领域的研究人员、工程师及有兴趣的学生这份压缩包专注于eVTOL电动垂直起降飞行器中固定翼与四旋翼的集成控制问题系统阐述了两类飞行器过渡过程中的切换控制、姿态与速度调控以及面向能耗最小化的滑翔和操控优化策略。资源共590个文件主体为481个m脚本、26个mat数据文件、20个fig图形文件另附PDF说明、C/C辅助接口与mex动态库等压缩包大小7.24MB适合在Matlab中直接开展模型仿真与二次开发。目前已有228人学习可服务于高校相关课程教学、科研机构课题验证或企业团队内部技术讨论。借助附带的代码和实验步骤读者能够复现eVTOL飞行控制核心流程深入研究垂直起降与固定翼巡航模式间的切换机制、姿态速度调控细节及能耗优化方法为控制算法的稳定性改进和绿色航空产品化落地提供有价值的参考。1. 从遥控飞机到eVTOL混控为什么MATLAB仿真比直接上嵌入式系统更快一台遥控飞机同时具备固定翼巡航和四旋翼悬停能力飞行包线就不再是单一线性模型能覆盖的。悬停时四个旋翼提供全部升力巡航时机翼承担主要载荷两段之间还有一个攻角、速度和推力矢量同时剧烈的过渡段。任何一环的控制器参数不对试飞现场都会以摔机为代价。常见做法是先用matlab把动力学方程写进状态空间在Simulink里跑数千次虚拟飞行验证模式切换逻辑和增益边界再生成C代码部署到嵌入式飞控。这个过程能在不烧一个电机的条件下提前暴露振荡、耦合和切换跳变问题。适合正在做固定翼或四旋翼项目、准备把两者集成到一套飞控且愿意从模型出发而不是靠调遥控器手感的学生和工程师。本文完整走一遍建模、控制分配、模式切换、代码生成和硬件在环验证路径。这套方法不依赖特定飞控硬件落地到STM32或SoC平台时只需改外设驱动接口。2. 固定翼与四旋翼混合的动力学建模与MATLAB状态方程2.1 从牛顿-欧拉方程拆出力矩与升力面贡献eVTOL混控飞行器的机身坐标系定义需要同时考虑低速悬停和高速巡航两种受力状态。低速时四个旋翼的推力直接作用在机身上螺旋桨滑流会冲刷机翼带来额外升力和洗流阻力。巡航时机翼产生升力舵面产生气动力矩旋翼只承担部分巡航推力或完全停止。为了在matlab里同时表达这些力最直接的是用牛顿-欧拉方程把线运动方程写在机体轴系下m * v_dot omega × (m * v) F_g F_aero F_prop J * omega_dot omega × (J * omega) M_aero M_prop这里的F_prop是四个旋翼推力矢量F_aero是机翼、机身和舵面产生的气动力F_g是重力在机体系下的投影。姿态用四元数传递避免欧拉角在90度俯仰时产生奇异性。状态向量我一般取[x, y, z, vx, vy, vz, q0, q1, q2, q3, wx, wy, wz]共13维没有把舵机状态纳入刚体方程而是把旋翼和舵机的响应简化为一阶惯性环节放到输入侧。这个阶段的关键是把机翼气动力和旋翼推力分开建模而不是合成一个黑箱力系。机翼升力用0.5 * rho * v^2 * S * CL计算阻力用CD表达。旋翼推力则直接以电机油门比例映射假设拉力与油门指令之间有一个延迟环节延迟由电调响应时间决定。这样在低空速时气动力逐渐消失旋翼力不会因为速度计算异常而突变混合状态下的数值稳定性能得到保证。2.2 在MATLAB里写可复用的eVTOL状态方程函数用一个函数文件封装整套动力学输入是当前时间t、状态向量x、控制输入u和参数结构体p。控制输入u定义为[u_throttle, u_elev, u_ail, u_rud, u_thrust_left, u_thrust_right]前四个对应常规舵面通道后两个对应左右前旋翼、左右后旋翼合成后的总推力指令实际分配在控制分配层完成。function [x_dot, y] eVTOL_dynamics(t, x, u, p) % x: [13x1] 位置3 速度3 四元数4 角速度3 % u: [6x1] 舵面通道与混合推力通道 % p: 参数结构体包含质量、惯量、机翼面积等 q x(8:11); R quat_to_rot(q); % 四元数转旋转矩阵 v_b x(5:7); omega x(12:14); % 计算空速假设无风空速等于位置速度 v_inertial x(5:7); v_aero R * v_inertial; airspeed norm(v_aero); alpha atan2(v_aero(3), v_aero(1)); beta asin(v_aero(2) / max(airspeed, 1e-6)); % 气动力与力矩系数从风洞或参考机型的datcom数据近似 F_aero_b 0.5 * p.rho * airspeed^2 * p.S * ... [-p.CD0 * cos(alpha), p.CY * beta, -p.CL0 - p.CL_alpha * alpha]; M_aero_b 0.5 * p.rho * airspeed^2 * p.S * ... [p.Cm0 p.Cm_alpha * alpha p.Cm_q * omega(2), ... p.Cn_beta * beta, p.Cl_beta * beta]; % 旋翼推力u(5), u(6)为混合后的垂向推力与前后差动推力 F_prop_b [0; 0; -u(5)*p.max_thrust;] [u(6)*p.mix_ratio; 0; 0]; M_prop_b [u(6)*p.arm_ratio; u(5)*p.lateral_coupling; u(5)*p.vertical_coupling]; % 重力 g_vec R * [0; 0; p.g]; F_g_b p.mass * g_vec; % 牛顿-欧拉 v_dot (F_aero_b F_prop_b F_g_b) / p.mass - cross(omega, v_b); omega_dot p.J \ (M_aero_b M_prop_b - cross(omega, p.J * omega)); q_dot 0.5 * quatmultiply(q, [0, omega]); x_dot [v_b; v_dot; q_dot; omega_dot]; end这段代码的核心是把不同速度段的作用力分开计算空速很小时alpha计算可能会抖所以分母加了1e-6保护。F_prop_b的第三个分量是负值表示旋翼推力沿机体Z轴负方向向上。mix_ratio和arm_ratio是自定义耦合系数用来模拟四旋翼在过渡段前后拉力差产生的俯仰力矩这个耦合是混控系统最难调的部分。第一次运行前把p.mass、p.J、p.S、p.rho、p.max_thrust都列成参数表便于之后做批量扫参。模型中暂时忽略螺旋桨滑流对机翼动压的增强等悬停仿真稳定后再加回来。2.3 将模型接入Simulink做开环响应测试有了状态方程函数后在Simulink里用MATLAB Function模块调用即可不需要手搭几十个积分器。新建一个模型拖入MATLAB Function模块在模块内部直接调用上面的eVTOL_dynamics输入端口连接[t, x, u]输出端口接积分器组。积分器模块初始值设为悬停状态输入u用常量表达先跑一秒悬停观察姿态是否发散。% 在MATLAB命令窗口定义初始状态与参数 p.mass 3.5; % 千克 p.J diag([0.09, 0.12, 0.15]); % 惯量矩阵 p.S 0.35; % 机翼面积 平方米 p.rho 1.225; p.g 9.81; p.max_thrust 18; % 每个旋翼最大推力 牛 x0 [0;0;0; 0;0;0; 1;0;0;0; 0;0;0]; u0 [0.1; 0; 0; 0; 2.45; 0]; % 升降舵微调四旋翼总推力约2.45牛每通道 simOut sim(evtol_openloop.slx, StopTime, 2);simOut可以从日志里读角速度和速度量主要看是否有高频振荡发散。如果omega在几秒内冲到几百度每秒一般是旋翼力矩耦合符号反了或者惯量矩阵大小不对。开环响应不要追求稳只要数值不发散控制器设计就可以开始。这个阶段的重点是确认配平点把u_thrust换成重力除以四旋翼通道数舵面置零仿真后如果漂移量小于预设值说明模型的力平衡方程写对了。3. 集成控制架构与模式切换悬停、过渡与巡航的控制器重构3.1 把期望力矩分配到四个旋翼与舵面的加权伪逆混控飞行器的执行器数量比刚体自由度多四个旋翼、两个副翼、一个升降舵和一个方向舵共八个有效通道需要分配的目标是三个方向力矩加一个总推力。常见做法是每个执行器设定权重用加权伪逆求最小范数解。定义分配矩阵B把期望力F_sp和期望力矩M_sp映射到各执行器行程delta。% 控制分配矩阵行对应 Fz, Mx, My, Mz % 列对应 左前旋翼, 右前旋翼, 左后旋翼, 右后旋翼, 升降舵, 副翼1, 副翼2, 方向舵 B [1 1 1 1 0 0 0 0; ... 0 0 0 0 0 1 -1 0; ... 1 -1 -1 1 0 0 0 0; ... 1 -1 1 -1 0 0 0 1]; W diag([1;1;1;1;0.5;0.2;0.2;0.4]); % 旋翼权重大于舵面 % 在悬停模式只使用前4列 B_hover B(:, 1:4); W_hover W(1:4, 1:4); delta_hover W_hover^(-0.5) * ... pinv(B_hover * W_hover^(-0.5)) * [F_sp; M_sp];加权伪逆的好处是可以在线调整权重过渡段时间让升降舵权重提高减少旋翼差动载荷高速巡航时甚至可以忽略旋翼的差动力矩让副翼承担滚转。pinv函数在matlab里对奇异的B_hover也能给出一组解但会出现负油门所以实际使用时要把delta_hover限制在0到1之间然后把负值置零并用正指令重新归一化。这一步不处理好旋翼转速会出现高频切换电调很快过热。3.2 三个飞行状态的控制策略与切换条件整个飞行包线分为悬停、过渡和巡航三个状态每个状态使用不同的控制结构。悬停状态按四旋翼方式控制位置环输出期望倾角姿态环输出力矩巡航状态按固定翼逻辑控制速度环控油门姿态环控制舵面过渡状态采用加权融合旋翼和舵面同时工作目标攻角由空速查表得到。飞行状态位置/速度控制外环姿态控制内环主要执行器悬停位置环PID输出期望姿态角四元数姿态环角速度内环四个旋翼过渡垂直速度与水平速度按比例分配目标姿态角指令由期望升力倾角决定旋翼升降舵副翼巡航速度环控制油门高度环控制升降舵角速度阻尼改平坡度限制升降舵副翼方向舵小油门切换条件不建议只用空速一个阈值容易在阵风时频繁抖动。我一般加一组滞回判断从悬停切过渡前需要垂直速度小于0.5 m/s且空速大于12 m/s持续0.8秒从巡航切回悬停需要空速小于10 m/s或遥控拨杆切换到垂直位置保持。滞回区间避免模式切换在边界点反复跳动这个逻辑写在地面站脚本里可以仿真验证再用状态机部署到嵌入式实时任务。3.3 过渡段的“互保”逻辑控制权限的倒手过渡段最危险的不是某一个控制器发散而是两个控制器同时争抢同一个执行器。例如升降舵在低速时几乎无效但固定翼控制器仍会给出大偏转导致旋翼需要额外力矩对抗舵面。常见做法是在过渡段引入控制权限系数lambda它从0到1线性变化旋翼的控制量乘以(1-lambda)舵面控制量乘以lambda。% 过渡段控制权限融合lambda由空速查表得到 lambda min(max((v_airspeed - v_lower)/(v_upper - v_lower), 0), 1); delta_cmd (1-lambda) * delta_hover lambda * delta_cruise; % 同时限制旋翼差动宽度防止舵面突然卸载 delta_cmd(1:4) delta_cmd(1:4) * (1 - 0.5*lambda);这样处理的好处是执行器行程平滑不会出现因为模式切换带来的阶跃跳变。lambda的上升速率也要限制一般设置在0.5/s到1/s之间对应整个过渡过程持续1到2秒。如果发现过渡阶段高度掉得多就把lambda上升速率调慢让旋翼保留更多控制权限直到机翼升力足够支撑重力。这个参数也是之后试飞中第一优先调整的数据。4. 用matlab和Simulink调参并生成嵌入式飞控代码4.1 必调的三个控制器参数与其取值范围悬停模式的内环角速度增益、过渡阶段的权限切换速率和巡航模式的速度环前馈系数是三个必须手动调的点。角速度增益决定姿态响应快慢太大会引起电机饱和太小让飞机像喝醉酒一样晃。先给一个初始范围再用Simulink的tune命令配合线性化工具直接整定。% 在Simulink控制模型中使用整定后的PID控制器 Kp_omega [3.5; 3.5; 2.8]; % 滚转/俯仰/偏航角速度比例 Ki_omega [0.8; 0.8; 0.5]; Kd_omega [0.12; 0.12; 0.08]; % 通常不用给一点阻尼 % 角速度环输出限幅 omega_lim deg2rad([180; 180; 360]);仿真中如果电机指令出现快速正负交替说明微分项增益太大。把Kd_omega清零后仍振荡则可能是时间延迟过大需要在控制环路里加入一个相位裕度补偿。巡航模式下速度环用前馈能大幅减少稳态误差前馈系数取1/Kf_idle其中Kf_idle是平飞时的推力-速度曲线斜率一般用扫频法获得不需要精确模型。4.2 用Simulink Coder把模型部署到嵌入式飞控模型验证完成后用Simulink自带的代码生成工具把控制器打包成嵌入式C代码然后集成到运行在STM32上的飞控框架里。常见做法是设置一个固定步长求解器步长取0.005秒对应200Hz控制频率与大多数嵌入式系统一致。生成代码时勾选ERT目标禁用动态内存分配保证代码可预测执行。set_param(evtol_ctrl, SolverType, Fixed-step); set_param(evtol_ctrl, Solver, ode4); set_param(evtol_ctrl, StopTime, inf); slbuild(evtol_ctrl);生成的代码里主要函数是evtol_ctrl_step输入是传感器估计出的状态量和遥控指令输出是八个执行器PWM映射值。在嵌入式主循环里定时调用该函数不需要理解内部状态机只需把外设采集数据通过结构体指针传入。这样控制器和硬件层完全隔离后续修改控制器参数只需要重新生成代码而不用改底层驱动。嵌入式系统这块的坑主要在数据对齐如果编译时结构体出现字节对齐问题传感器值会莫名其妙跳变。解决方法是在代码生成配置中开启Pack结构体字节对齐选项。4.3 硬件在环测试时怎么制造传感器长尾故障硬件在环测试的价值是让嵌入式代码跑在真实MCU上同时把传感器数据替换为simulink仿真的虚拟值。为了暴露控制器的鲁棒性问题我一般会主动注入传感器延迟、噪声和掉帧。% 模拟IMU数据延迟与噪声 delay_samples 2; % 对应10ms延迟 noise 0.02 * randn(size(imu_measured)); imu_measured_now imu_bus.delay(delay_samples) noise; imu_bus.delay [imu_bus.delay(2:end); imu_true];把这路信号接到生成的代码函数前嵌入系统完全不知道数据来自虚拟传感器。连续跑一小时观察是否有累计漂移或角速度饱和记录。掉帧模拟可以用随机丢包模块每200个采样点随机丢弃1个丢包后持锁存上一次值观察控制器是否还能保持姿态稳定。这类长尾故障在纯仿真里很难复现但在地面测试阶段就能提前暴露避免到外场炸机。5. 外场试飞调参遥控手感与自动模式之间的临界点外场试飞不能直接切换自动过渡需要先在地面站日志里验证各模式激活信号是否与仿真一致。第一步遥控器拨到手动模式缓慢推油门让飞机低空悬停观察悬停状态下四个旋翼的PWM输出是否平稳。如果输出频繁振荡把角速度环比例增益下降20%同时检查加速度计值有没有高频噪声。第二步是悬停状态保持稳定后往前推横滚杆模拟前飞速度命令观察机身倾角和空速计测量值是否同步增长。这个过程中遥控器要切回自稳模式但始终准备拿回控制权。过渡段的入口条件在试飞时要重新确认一次。自动过渡激活后用遥控器上的第二段拨杆作为权限收回开关一旦发现姿态角超过预设保护限幅立刻切换回四旋翼优先模式。保护逻辑可以做成如下形式放在嵌入式主循环里优先于控制器的模式状态机。if (abs(euler_angle(2)) deg2rad(30)) (flight_state STATE_TRANS) control_authority 0.2; % 旋翼拿回80%权限 mode_override STATE_HOVER; safety_warning 1; end这个保护逻辑不能只在simulink模型里实现嵌入式系统里要单独写一遍因为它不属于控制器设计而是失效降级逻辑。降级后遥控器的横滚杆不再映射到舵面而是直接映射到旋翼差动力矩这样即使自动过渡逻辑失算操作员也能通过杆量强制救机。最后检查两组数据对比一组是仿真日志中过渡段的俯仰角速率峰值和高度变化量另一组是试飞日志中的实际值。两者相差如果超过30%通常说明气动参数偏差大而不是控制器问题。把p.mass修正为实测起飞重量p.S按实际机翼投影面积换算再重新仿真一次。期望爬升率从-2 m/s改到-1.5 m/s后重新执行第五节中的日志回放脚本看旋翼总出力曲线是否平滑然后才允许下一次全自动过渡试飞。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价