1、姿态控制概述:无人机姿态控制的基本概念、控制架构与PID控制原理

大家好,欢迎来到这门实战课程。我是你们的老朋友,一个在飞控领域摸爬滚打了十来年的工程师。

今天咱们聊聊姿态控制。说白了,就是让无人机老老实实听你的话。你让它悬停,它就得纹丝不动;你让它前飞,它就得乖乖低头。嗯,这背后就是姿态控制在起作用。

1.1 姿态控制到底在控制什么?

先问大家一个问题:无人机在空中,有几个自由度?答案是六个——三个位置(x、y、z),三个姿态(横滚、俯仰、偏航)。姿态控制,管的就是后面这三个角度。

我刚开始做飞控时,总觉得姿态控制很简单。不就是调几个PID参数嘛。直到有一次,我调了一整天,飞机还是像喝醉了酒一样晃来晃去。后来才发现,是我对姿态控制的理解太浅了。

姿态控制的核心目标,说白了就三个字:稳、准、快

  • :抗干扰能力强,风来了不慌
  • :角度误差小,指哪打哪
  • :响应迅速,不拖泥带水

但你要知道,这三个目标往往是互相矛盾的。想稳,可能就慢了;想快,可能就抖了。这就是我们做调优时最头疼的地方。

1.2 控制架构:内环与外环

无人机姿态控制,最经典的结构就是串级PID。你想想看,为什么不用单环?

我给大家打个比方。你开车时,想保持车道(外环),你得先控制方向盘的角度(内环)。如果方向盘反应慢半拍,车早就跑偏了。这就是内环要快、外环要准的道理。

具体到飞控里:

  • 外环(姿态角环):输入是期望角度,输出是期望角速度。它负责“指方向”。
  • 内环(角速度环):输入是期望角速度,输出是电机控制量。它负责“执行”。

我个人的习惯是,先调内环,再调外环。为什么?因为内环是基础。内环调不好,外环再努力也是白搭。记得有一次,我在项目里急着赶进度,直接调外环,结果飞机一离地就翻了个跟头。嗯,从那以后我再也不敢跳过内环了。

核心要点:内环角速度环的带宽,至少要达到外环姿态角环的3-5倍。这样才能保证内外环不打架。

1.3 PID控制原理简介

PID,比例-积分-微分。这三个字母,做飞控的没人不知道。但你真的理解它们吗?

我简单说说:

参数 作用 我踩过的坑
P(比例) 根据当前误差,给出即时响应。误差越大,输出越大。 P太大,飞机会高频抖动。我曾经把P调得过高,结果飞机像筛糠一样抖,差点炸机。
I(积分) 消除稳态误差。说白了,就是纠正“差那么一点点”的问题。 I太大,飞机会出现“低频振荡”,也就是慢慢晃。我见过有人把I设得特别大,结果飞机像荡秋千。
D(微分) 预测误差趋势,提供阻尼效果。让系统更“稳”。 D对噪声特别敏感。有一次我用了个便宜的IMU,D一加上去,飞机直接乱跳。后来加了低通滤波才搞定。

你可能会问:这三个参数怎么调?

我的经验是:先P,再D,最后I。具体来说:

  1. 先把I和D设为0,只调P。让飞机能勉强稳住,但会有静差。
  2. 加一点D,消除振荡。你会发现飞机变得“黏糊糊”的,很稳。
  3. 最后加I,消除静差。注意I不要太大,否则会引入低频振荡。

小技巧:调参时,用手轻轻拨动飞机,感受它的“手感”。如果感觉飞机很“硬”,说明P偏大;如果感觉“软绵绵”,说明P偏小。这个手感,我练了两年才找到感觉。

1.4 一个简单的角速度环PID代码示例

光说不练假把式。我给大家看一段实际飞控里的角速度环代码。这是简化版,但核心逻辑都在。

// 角速度环PID计算
float angular_velocity_pid(float target_rate, float current_rate, float dt) {
    float error = target_rate - current_rate;
    
    // 比例项
    float p_term = Kp * error;
    
    // 积分项(带限幅)
    integral += error * dt;
    integral = constrain(integral, -integral_limit, integral_limit);
    float i_term = Ki * integral;
    
    // 微分项(注意:这里用的是测量值的微分,不是误差的微分)
    float derivative = (current_rate - last_rate) / dt;
    float d_term = Kd * derivative;
    
    // 保存上一次值
    last_rate = current_rate;
    
    // 输出限幅
    float output = p_term + i_term - d_term;
    return constrain(output, -output_limit, output_limit);
}

注意看,微分项我用了-Kd * derivative。为什么是负号?因为我们要抑制角速度的变化。如果角速度在增大,我们就得反向输出,把它压下去。这个细节,很多新手会搞反。

警告:积分项一定要加限幅!我曾经在项目里忘了加,结果积分项越积越大,最后电机直接满油门,飞机差点窜上天。嗯,那次之后我养成了检查积分限幅的习惯。

1.5 小结

好了,这一章我们聊了:

  • 姿态控制就是管横滚、俯仰、偏航三个角度
  • 串级PID架构:内环角速度环 + 外环姿态角环
  • PID三个参数的作用和调参顺序

下一章,我会带大家深入角速度环的调优实战。到时候咱们拿真实数据说话,看看怎么把参数调到“手感丝滑”。

记住一句话:飞控调参,七分靠理论,三分靠手感。多动手,多试错,你也能成为老司机。

咱们下章见。