倾转旋翼控制算法工作原理初探

一、倾转旋翼飞行器概述与控制算法核心要点

倾转旋翼飞行器作为一种独特的飞行器类型,融合了直升机与固定翼飞行器的优势特性。其控制算法的复杂性关键体现在两个主要方面:一是在直升机模式与固定翼模式之间达成平滑且无缝的过渡;二是能够同时对推力、升力以及姿态稳定性进行精准有效的管理。以下将深入解析倾转旋翼控制的核心细节内容。

二、控制核心概念

(一)飞行模式

  1. 垂直模式
    • 在垂直模式下,飞行器主要依赖旋翼的变距操作,也就是改变桨叶角度来实现升力的产生与姿态的控制。通过调整桨叶角度,能够改变旋翼产生的升力大小以及方向,从而实现诸如悬停、垂直上升与下降等飞行动作。例如,当需要增加升力时,可以增大桨叶的角度,使旋翼对空气产生更大的向下作用力,根据牛顿第三定律,空气会对旋翼产生向上的反作用力,即升力增大,进而使飞行器上升。
  2. 水平模式
    • 当旋翼倾转至特定角度后,倾转旋翼飞行器的飞行模式类似于固定翼飞机。此时,主要的推力来源用于实现水平方向的飞行推进,而机翼则承担起产生升力的主要任务。在这种模式下,飞行器的飞行原理与传统固定翼飞机相似,依靠机翼上下表面的空气流速差产生升力,同时通过发动机产生的推力克服空气阻力,实现向前飞行。
  3. 过渡模式
    • 过渡模式是倾转旋翼飞行器控制的关键难点之一。在这个过程中,旋翼角度从垂直状态逐渐倾转至水平状态,在此期间,必须要维持升力、推力以及姿态的动态平衡。这意味着在旋翼倾转过程中,既要保证飞行器有足够的升力来维持高度,又要确保有合适的推力来实现水平方向的加速或减速,同时还要精确控制飞行器的姿态,防止出现翻滚、偏航等不稳定情况。例如,随着旋翼逐渐倾转,升力的产生机制会逐渐从主要由旋翼变距控制向机翼产生升力过渡,推力的方向也会从垂直向上逐渐转变为水平向前,这就需要精确的控制算法来协调各个部件的工作,确保整个过渡过程平稳、安全。

(二)控制变量

  1. 旋翼倾转角度 (θ)
    • 该变量明确地决定了旋翼的方向,其取值范围涵盖从垂直(0 度或特定的初始垂直角度)到水平(90 度或相应的目标水平角度)。例如,当θ = 0 度时,旋翼处于纯粹的垂直状态,主要提供垂直方向的升力;而当θ = 90 度时,旋翼则完全倾转为水平方向,主要提供水平方向的推力。在过渡模式中,θ 的精确控制是实现平稳过渡的关键因素之一,它直接影响着升力与推力的分配以及飞行器的姿态变化。
  2. 旋翼推力 (T)
    • 旋翼推力的大小主要由旋翼的转速以及桨叶变距共同决定。转速越高,在其他条件不变的情况下,旋翼对空气的作用力越大,产生的推力也就越大;同时,桨叶变距的改变也会影响推力的大小与方向。例如,增大桨叶的螺距角,在相同转速下,旋翼对空气的"抓取"能力增强,推力会相应增大。在飞行控制中,根据不同的飞行模式与任务需求,需要精确调整旋翼推力,如在垂直起飞时需要较大的垂直推力,而在水平飞行时则需要合适的水平推力分量。
  3. 姿态角(俯仰 φ、横滚 ψ、偏航 γ)
    • 姿态角是描述飞行器在空中姿态的重要参数。俯仰角 φ 控制飞行器的机头上下俯仰动作,例如当 φ 增大时,飞行器机头向上抬起;横滚角 ψ 决定飞行器绕机身纵轴的翻滚动作,若 ψ 不为 0,则飞行器会出现一侧机翼高一侧机翼低的横滚姿态;偏航角 γ 则控制飞行器绕垂直轴的旋转方向,改变 γ 可使飞行器向左或向右转向。这些姿态角通过差动控制进行调整,即通过不同旋翼之间的推力差异或其他控制手段来实现姿态的精确控制。例如,要实现飞行器向右横滚,可以适当增加右侧旋翼的推力,同时减小左侧旋翼的推力,使右侧机翼上升,左侧机翼下降,从而产生向右的横滚力矩。

(三)控制公式

  1. 升力控制
    L = 1 2 ρ V 2 A C L L=\frac{1}{2}\rho V^{2}A C_{L} L=21ρV2ACL
    • 其中 L L L 表示升力。 ρ \rho ρ 为空气密度,空气密度越大,在相同条件下旋翼产生的升力越大,例如在海拔较低的地区,空气密度相对较高,飞行器更容易获得较大升力; V V V 是旋翼下洗流速,它与旋翼的转速、桨叶形状等因素有关,一般来说,旋翼转速越快,下洗流速越大,升力也会相应增加; A A A 代表旋翼盘面积,面积越大,在其他条件相同的情况下能够"推动"的空气量越多,升力也就越大; C L C_{L} CL 是升力系数,它与桨叶的形状、角度以及飞行状态等多种因素相关,通过调整桨叶角度等方式可以改变 C L C_{L} CL 的值,进而调整升力大小。
  2. 倾转力矩控制
    M = T × r × sin ⁡ θ M = T\times r\times\sin\theta M=T×r×sinθ
    • 这里 M M M表示倾转力矩。 T T T 是旋翼总推力,总推力越大,在相同的倾转角和力臂 r r r情况下,产生的倾转力矩越大; r r r 是力臂长度,它与旋翼在飞行器上的布局位置有关; θ \theta θ 为旋翼倾转角,当倾转角为 0 或 90 度时,倾转力矩为 0,在过渡模式中,随着倾转角的变化,倾转力矩也会相应改变,从而实现旋翼的倾转动作。
  3. 推力分解
    T h = T cos ⁡ θ T_{h}=T\cos\theta Th=Tcosθ
    T v = T sin ⁡ θ T_{v}=T\sin\theta Tv=Tsinθ
    • T h T_{h} Th 表示水平推力, T v T_{v} Tv表示垂直推力。通过这两个公式,可以根据旋翼总推力 T T T 和倾转角 θ \theta θ将总推力分解为水平和垂直两个方向的分量。在飞行过程中,根据不同的飞行模式和姿态需求,精确控制水平推力和垂直推力的大小,例如在水平飞行时,需要较大的水平推力分量来克服空气阻力,而在垂直起飞或降落时,则需要较大的垂直推力分量来维持高度。

(四)PID 控制在倾转旋翼中的作用

  1. PID 控制在倾转旋翼控制中起着至关重要的作用,它被用于对旋翼倾转角 θ \theta θ、旋翼推力 T T T 以及飞行姿态(俯仰角 φ、横滚角 ψ、偏航角 γ)进行精确调整。
  2. 例如倾转角的 PID 方程:
    u ( t ) = K P e ( t ) + K I ∫ 0 t e ( τ ) d τ + K D d e ( t ) d t u(t)=K_{P}e(t)+K_{I}\int_{0}^{t}e(\tau)d\tau + K_{D}\frac{de(t)}{dt} u(t)=KPe(t)+KI∫0te(τ)dτ+KDdtde(t)
    其中 e ( t ) e(t) e(t)是目标倾转角与当前倾转角的误差。比例项 K P e ( t ) K_{P}e(t) KPe(t)根据当前误差的大小直接产生控制输出,误差越大,调整力度越大;积分项 K I ∫ 0 t e ( τ ) d τ K_{I}\int_{0}^{t}e(\tau)d\tau KI∫0te(τ)dτ对误差进行累计积分,用于消除长期存在的稳态误差,确保倾转角最终能精确达到目标值;微分项 K D d e ( t ) d t K_{D}\frac{de(t)}{dt} KDdtde(t)依据误差的变化率进行调整,能够提前预判倾转角的变化趋势,减少超调和振荡,使倾转角的调整更加平稳、快速。通过合理调整 PID 控制器的比例增益 K P K_{P} KP、积分增益 K I K_{I} KI和微分增益 K D K_{D} KD,可以实现对倾转旋翼飞行器倾转角的高精度控制,进而保障整个飞行过程的稳定性和安全性。

三、C 语言实现原理

(一)PID 控制器相关代码

  1. 结构体定义
c 复制代码
// PID 控制器结构体
typedef struct {
    double Kp;
    double Ki;
    double Kd;
    double prev_error;
    double integral;
} PIDController;

这里定义了一个名为 PIDController 的结构体,用于存储 PID 控制器的相关参数。其中 KpKiKd 分别为比例、积分、微分增益系数,这些系数将直接影响 PID 控制的效果。prev_error 用于记录上一次的误差值,在计算微分项时会用到;integral 则是积分项的累积值,用于存储误差的累计积分。

  1. 初始化函数 initPID
c 复制代码
// 初始化 PID 控制器
void initPID(PIDController *pid, double Kp, double Ki, double Kd) {
    pid->Kp = Kp;
    pid->Ki = Ki;
    pid->Kd = Kd;
    pid->prev_error = 0.0;
    pid->integral = 0.0;
}

该函数接受一个指向 PIDController 结构体的指针 pid 以及比例、积分、微分增益系数作为参数。在函数内部,将传入的增益系数分别赋值给结构体成员,并将 prev_error 初始化为 0.0,integral 初始化为 0.0,为后续的 PID 计算做好初始化准备工作。

  1. 计算 PID 输出函数 computePID
c 复制代码
// 计算 PID 输出
double computePID(PIDController *pid, double target, double current, double dt) {
    double error = target - current;
    pid->integral += error * dt;
    double derivative = (error - pid->prev_error) / dt;
    pid->prev_error = error;
    return pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;
}

此函数实现了经典的 PID 控制算法计算。首先计算当前的误差 error,即目标值 target 与当前值 current 的差值。然后将误差乘以时间间隔 dt 累加到积分项 integral 中。接着计算误差的变化率 derivative,即当前误差与上一次误差的差值除以时间间隔。之后更新上一次误差 prev_error 为当前误差。最后根据 PID 算法公式,将比例项(Kp * error)、积分项(Ki * integral)和微分项(Kd * derivative)相加并返回计算结果,该结果即为基于当前误差状态的 PID 控制输出量,这个输出量可以用于调整倾转旋翼的相关控制变量,如倾转角、旋翼推力等。

(二)倾转旋翼控制函数

c 复制代码
// 模拟倾转旋翼控制
void controlTiltRotor(double target_angle, double *current_angle, double *thrust, PIDController *pid, double dt) {
    // 计算倾转角度 PID 控制
    double tilt_correction = computePID(pid, target_angle, *current_angle, dt);
    *current_angle += tilt_correction * dt; // 更新当前倾转角度

    // 根据当前倾转角度计算推力分解
    double horizontal_thrust = *thrust * cos(*current_angle);
    double vertical_thrust = *thrust * sin(*current_angle);

    printf("Current Angle: %.2f, Horizontal Thrust: %.2f, Vertical Thrust: %.2f\n",
           *current_angle, horizontal_thrust, vertical_thrust);
}

这个函数是倾转旋翼控制的核心函数之一。它接受目标倾转角 target_angle、指向当前倾转角的指针 current_angle、指向总推力的指针 thrust、PID 控制器结构体指针 pid 以及时间步长 dt 作为参数。首先,通过调用 computePID 函数计算倾转角度的 PID 控制修正量 tilt_correction,然后根据时间步长 dt 更新当前倾转角 *current_angle。接着,根据更新后的当前倾转角,利用三角函数 cossin 分别计算总推力 *thrust 在水平和垂直方向的分量 horizontal_thrustvertical_thrust。最后,将当前倾转角、水平推力和垂直推力的值打印输出,以便观察和分析倾转旋翼的控制状态变化。

(三)主函数

c 复制代码
int main() {
    PIDController tilt_pid;
    initPID(&tilt_pid, 1.0, 0.5, 0.1); // 初始化 PID 参数

    double current_angle = 0.0; // 当前倾转角度(弧度)
    double target_angle = M_PI / 4; // 目标倾转角度(45 度)
    double thrust = 100.0; // 总推力
    double dt = 0.1; // 时间步长(秒)

    for (int i = 0; i < 50; i++) {
        controlTiltRotor(target_angle, &current_angle, &thrust, &tilt_pid, dt);
    }

    return 0;
}

在主函数中,首先创建了一个 PIDController 结构体实例 tilt_pid,并使用 initPID 函数对其进行初始化,设置比例增益 Kp 为 1.0、积分增益 Ki 为 0.5、微分增益 Kd 为 0.1。然后定义了当前倾转角度 current_angle 初始值为 0.0(弧度),目标倾转角度 target_angle 为 (M_PI / 4)(即 45 度),总推力 thrust 为 100.0,并设定时间步长 dt 为 0.1 秒。接着通过一个循环 50 次调用 controlTiltRror 函数,模拟倾转旋翼在一定时间内的控制过程,在每次循环中,根据目标倾转角、当前倾转角、总推力、PID 控制器参数和时间步长来调整倾转角并计算推力分解,同时打印出当前的控制状态信息。

四、代码解析

(一)PID 控制部分

computePID 函数是整个 PID 控制的核心计算部分。它通过不断地计算目标值与当前值之间的误差,并根据误差计算比例、积分和微分项,然后将这三项相加得到最终的控制输出。在倾转旋翼控制中,这个函数用于平滑地调整倾转角度。例如,当目标倾转角与当前倾转角存在较大误差时,比例项会产生较大的修正力,使倾转角快速向目标值靠近;积分项则会逐渐累积误差,确保在长期运行中能够消除稳态误差,使倾转角最终稳定在目标值;微分项根据误差变化率提前调整,避免倾转角调整过程中出现超调或振荡现象,从而实现倾转角度的精确、稳定控制。

(二)倾转控制逻辑

controlTiltRotor 函数实现了倾转旋翼的主要控制逻辑。它首先利用 computePID 函数对倾转角度进行控制,得到倾转角度的修正量并更新当前倾转角度。然后根据当前倾转角度,通过三角函数关系计算总推力在水平和垂直方向的分量。这样就实现了在倾转过程中,既能够精确控制倾转角,又能够根据倾转角的变化合理分配推力,保证飞行器在垂直和水平飞行模式之间的平稳过渡以及飞行姿态的稳定。例如,在从垂直起飞向水平飞行过渡时,随着倾转角逐渐增大,垂直推力分量逐渐减小,水平推力分量逐渐增大,同时倾转角的调整也在 PID 控制下平稳进行,确保整个过渡过程中飞行器的升力、推力和姿态始终处于可控状态。

(三)模拟输出

主函数中的循环部分通过多次调用 controlTiltRotor 函数,模拟了倾转旋翼在一段时间内的控制过程。在每次调用后,都会打印出当前的倾转角、水平推力和垂直推力的值。通过这些输出信息,可以直观地观察到倾转旋翼在控制过程中的状态变化,包括倾转角是如何逐渐接近目标值的,水平推力和垂直推力是如何随着倾转角的变化而变化的。这有助于调试和分析倾转旋翼控制算法的性能,例如判断是否存在超调、振荡等不稳定现象,以及评估控制算法对目标值的跟踪效果等。

五、总结

倾转旋翼控制算法通过精确且巧妙地调整旋翼倾转角以及对推力进行合理的分解,成功地在垂直飞行模式与水平飞行模式之间实现了平滑、稳定的切换。在这个过程中,PID 控制器无疑是整个控制体系的核心关键所在,它能够动态地对各种误差(如倾转角误差、姿态误差等)进行调整,有效地确保了整个系统的稳定性和可靠性。上述所展示的 C 语言代码清晰地演示了倾转旋翼控制的核心原理,然而在实际的应用场景中,还会涉及到更多复杂的因素,例如来自各种传感器(如姿态传感器、速度传感器、位置传感器等)的大量输入数据需要进行处理和融合,以及多轴之间的协调控制(如多个旋翼之间的协同工作、不同飞行模式下各轴控制的优先级和耦合关系等),这些都需要进一步深入研究和优化,以满足倾转旋翼飞行器在不同任务需求和复杂环境下的高效、安全飞行要求。

相关推荐
lll...lll6 个月前
龙国南方航空滑块acw_v2+cookie+风控处理+type后缀
java·python·go·node·航空·滑块·acw_sc__v2
地理探险家10 个月前
遥感、航拍、影像等用于深度学习的数据集集合
人工智能·深度学习·分类·遥感·数据·航空·卫星
CoreShare科享学术交流中心1 年前
IET独立出版 | EI检索 | 2023年第三届机械、航空航天与汽车工程国际会议
汽车·航空·机械工程
上海控安1 年前
鉴源论坛 · 观模丨形式化方法的工业应用:航空领域
形式化方法·航空