VTOL固定翼的FOC切换逻辑,从悬停模式到平飞模式的电机控制策略
垂直起降固定翼无人机结合了多旋翼的悬停能力和固定翼的长航时优势,但这种混合构型也带来了一个核心挑战:如何让飞机在两个飞行模式之间平滑过渡。在悬停模式下,FOC控制的是多旋翼电机,提供的是垂直升力;在平飞模式下,控制对象可能切换到推力电机或倾转机构,提供的是水平推力。两个模式之间不是简单的"切换",而是一个存在强非线性、气动变化剧烈、控制权限逐渐转移的过渡过程。
过渡过程的物理本质与挑战
过渡阶段是VTOL无人机最脆弱的飞行阶段。从多旋翼模式转换为固定翼模式时,机翼逐渐产生升力,而旋翼的升力贡献逐渐减小。这个过程中,飞行器的动力学模型发生显著变化——气动效应从可忽略变为主导。
从控制角度看,过渡阶段面临几个核心挑战:
控制权限的平滑转移:在纯悬停阶段,姿态控制完全由多旋翼电机完成;在纯平飞阶段,由副翼、升降舵等气动舵面主导。过渡阶段需要两种控制权限的逐步交接。
推力矢量的重新分配:倾转旋翼构型中,电机需要从垂直指向逐渐倾转至水平指向,推力矢量在垂直和水平方向的分量不断变化。
空速的建立与保持:从悬停到平飞的关键是建立足够的前向空速,使机翼产生足够的升力来承担飞机重量。这个过程需要精确的速度控制和姿态协调。
针对这一问题,已有研究提出了基于多级切换的控制方案。通过分析机翼折叠机构的物理特性建立动力学模型,考虑来流对旋翼的影响,分析过渡过程中的动态耦合特性,并在此基础上设计旋翼的动态分配算法。
基于多级切换的控制架构
在ArduPilot等成熟开源飞控中,QuadPlane的过渡控制已经形成了一套相对完善的多级切换架构。
过渡触发与模式切换
过渡的触发方式主要有三种:飞行员通过遥控器通道直接命令、基于空速/姿态/高度的自动触发、以及任务规划器中的预设航点触发。
最简单的触发方式是飞行模式切换。当从悬停模式切换到固定翼模式时:
- 若切换至MANUAL模式,多旋翼电机立即停止
- 若切换至其他固定翼模式,多旋翼电机继续提供升力与稳定性,直到达到最小空速阈值
空速等待阶段
过渡的核心逻辑是:在空速达到安全阈值前,旋翼保持辅助升力输出;达到阈值后,旋翼输出在设定时间内逐渐退出。
这一阶段的控制分配策略为:推力电机由油门杆直接控制(固定翼模式逻辑),同时垂直电机持续维持高度。控制权限的变化遵循以下梯度:当空速低于失速速度时,姿态控制由旋翼主导;空速逐渐增加时,控制面权限随动压增加而增加;空速超过阈值后,旋翼输出按Q_TRANSITION_MS参数设定的时间(默认5000ms)逐渐衰减至零。
程序实现与核心代码
状态机定义
过渡逻辑的核心是一个有限状态机,定义了三种状态:VTOL模式、过渡模式、FW模式。
// 过渡状态定义
typedef enum {
TRANSITION_STATE_VTOL, // 纯悬停模式
TRANSITION_STATE_TRANSITION, // 正在过渡
TRANSITION_STATE_FW // 纯固定翼模式
} transition_state_t;
// 过渡阶段子状态
typedef enum {
TRANSITION_PHASE_WAIT_AIRSPEED, // 等待空速建立
TRANSITION_PHASE_MOTOR_RAMP_DOWN, // 旋翼逐渐退出
TRANSITION_PHASE_COMPLETE // 过渡完成
} transition_phase_t;
过渡主控逻辑
transition_update函数在每个控制周期被调用,根据当前状态执行相应逻辑:
void transition_update(void)
{
float airspeed = get_current_airspeed(); // 当前空速
float min_airspeed = param_get_float(PARAM_ARSPD_FBW_MIN); // 最小空速阈值
float throttle = get_throttle_input(); // 油门输入
switch (transition_state) {
case TRANSITION_STATE_VTOL:
// 检测触发条件:飞行模式切换或空速/高度条件满足
if (should_start_transition()) {
transition_state = TRANSITION_STATE_TRANSITION;
transition_phase = TRANSITION_PHASE_WAIT_AIRSPEED;
transition_start_time = get_sys_time_ms();
}
break;
case TRANSITION_STATE_TRANSITION:
handle_transition_phase(airspeed, min_airspeed, throttle);
break;
case TRANSITION_STATE_FW:
// 反向过渡处理(VTOL <- FW)
if (should_back_transition()) {
transition_state = TRANSITION_STATE_TRANSITION;
transition_phase = TRANSITION_PHASE_WAIT_AIRSPEED;
transition_start_time = get_sys_time_ms();
}
break;
}
}
空速等待阶段处理
在空速未达标时,垂直电机保持稳定控制,推力电机按照固定翼模式控制提供前向推力。
void handle_airspeed_wait_phase(float airspeed, float min_airspeed, float throttle)
{
if (airspeed >= min_airspeed) {
// 空速达标,进入旋翼退出阶段
transition_phase = TRANSITION_PHASE_MOTOR_RAMP_DOWN;
ramp_down_start_time = get_sys_time_ms();
}
// 空速未达标时:
// - 垂直电机:保持悬停模式的高度/姿态控制
// - 推力电机:按固定翼模式逻辑控制,提供前向推力
// 超时保护(如果Q_TRANS_FAIL非零)
if (param_get_int(PARAM_Q_TRANS_FAIL) > 0) {
uint32_t elapsed = get_sys_time_ms() - transition_start_time;
if (elapsed > param_get_int(PARAM_Q_TRANS_FAIL)) {
// 超时处理:取消过渡或紧急处理
handle_transition_timeout();
}
}
}
旋翼权限移交处理
空速达标后,垂直电机输出在设定时间内线性衰减,控制面逐渐接管姿态控制。
void handle_motor_ramp_down_phase(uint32_t current_time)
{
uint32_t elapsed = current_time - ramp_down_start_time;
uint32_t ramp_time = param_get_int(PARAM_Q_TRANSITION_MS);
float ramp_factor;
if (elapsed >= ramp_time) {
// 过渡完成
ramp_factor = 0.0f;
transition_state = TRANSITION_STATE_FW;
transition_phase = TRANSITION_PHASE_COMPLETE;
} else {
// 线性衰减:1.0 → 0.0
ramp_factor = 1.0f - (float)elapsed / ramp_time;
}
// 根据衰减系数重新分配控制输出
control_allocation(ramp_factor);
}
控制分配
control_allocation函数根据过渡阶段和衰减系数,计算最终输出到各个电机的控制量:
void control_allocation(float vtol_mix_factor)
{
float vtol_output[4]; // 垂直电机控制量
float fw_output[3]; // 固定翼舵面/推力电机控制量
float final_output[4];
// 分别计算两种模式的控制量
compute_vtol_control(vtol_output); // 基于悬停姿态控制
compute_fw_control(fw_output); // 基于固定翼控制律
if (transition_state == TRANSITION_STATE_TRANSITION) {
// 过渡阶段:按衰减系数混合两种模式
for (int i = 0; i < 4; i++) {
final_output[i] = vtol_mix_factor * vtol_output[i];
}
// 推力电机单独处理(始终由固定翼逻辑控制)
final_output[THROTTLE_IDX] = fw_output[THROTTLE_IDX];
} else if (transition_state == TRANSITION_STATE_VTOL) {
// 纯悬停模式
memcpy(final_output, vtol_output, sizeof(vtol_output));
} else {
// 纯固定翼模式
final_output[THROTTLE_IDX] = fw_output[THROTTLE_IDX];
// 舵面输出...
}
set_motor_outputs(final_output);
}
反向过渡处理
平飞切回悬停时,前推电机立即停止或倾转回垂直位,舵面保持工作直到空速降低到安全范围。
反向过渡需要额外的减速控制。在位置保持模式下,飞机将计算减速度所需的停止距离并主动减速。倾转旋翼构型中,电机立即倾转回垂直位置,舵面继续提供稳定性直到飞机减速至安全速度。
先进控制策略与前沿方向
传统的过渡控制采用切换式PID结构——悬停阶段用多旋翼PID,平飞阶段用固定翼PID,过渡阶段则是两者的加权混合。这一方法在工程上被广泛验证,但存在固有局限:过渡阶段的动力学模型变化剧烈,线性控制器的鲁棒性不足。
针对这一问题,学术界提出了基于增量非线性动态逆的控制方案。INDI不依赖精确的动力学模型,而是利用传感器的角加速度反馈实时抵消未建模动态和外部扰动。
仿真结果表明,采用INDI的倾转三旋翼VTOL在过渡过程中表现出更小的状态变量超调,对风扰的抑制能力优于传统PID方案。对于倾转机构,控制分配算法还需要解耦前侧电机的倾转角,使其可以独立工作而非机械耦合。
总结
VTOL固定翼的过渡控制本质上是控制权限的动态分配问题。从FOC电机的视角来看,这不仅仅是电调的工作模式切换,更涉及飞行器整体的控制架构设计。
工程实践中的核心参数调试要点包括:最小空速阈值的标定(过渡触发条件,需根据失速速度和安全裕量设定)、旋翼退出时间的优化(过短可能导致空速不足时机翼失速,过长则延长过渡时间增加能耗)、倾转机构/舵面的权限过渡(与旋翼退出同步协调)以及过渡失败的超时保护机制。
过渡控制策略正在从"基于规则的多级切换"向"基于模型的自适应控制"演进。非线性动态逆、无源性控制、模型预测控制等先进算法的引入,使得过渡过程更加平滑、对模型误差和外部扰动的鲁棒性更强。对于实际飞行测试而言,推荐从ArduPilot的参数体系入手,先确保空速可靠、过渡时机合理,再逐步精细化调整,这往往比从零设计的理论算法更易落地。





