1. 无人机悬停控制系统架构
悬停控制是一个双环 PID 结构:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 位置环 PID │ │ 姿态环 PID │ │ 角速度环PID │ │ 电机混控 │ │ (X/Y/Z) │ │ (Roll/Pitch/Yaw) │ │ (ωx/ωy/ωz) │ │ (Motor1~4) │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ ▼ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 期望位置 │ │ 期望姿态角 │ │ 期望角速度 │ │ PWM 信号输出 │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
- 位置环:输入期望位置(如悬停点)和实际位置(来自 GPS / 光流),输出期望姿态角(Roll/Pitch)和期望高度(油门修正)。
- 姿态环:输入期望姿态角和实际姿态角(来自 MPU-9250),输出期望角速度。
- 角速度环:输入期望角速度和实际角速度(来自陀螺仪),输出电机控制量。
- 电机混控:结合油门和姿态控制量,计算四个电机的 PWM 值。
2. 位置 PID 控制器设计
位置环需要对X、Y、Z三个方向分别控制:
- X/Y 轴:控制无人机在水平面上的位置,输出期望的横滚角(Roll)和俯仰角(Pitch)。
- Z 轴:控制无人机的高度,输出油门修正量。
PID 结构体(扩展到位置控制)
typedef struct {
float Kp, Ki, Kd;
float setpoint;
float feedback;
float error;
float integral;
float derivative;
float prev_error;
float output;
float integral_limit;
float output_limit;
} PID_Controller;
void PID_Init(PID_Controller *pid, float Kp, float Ki, float Kd, float integral_limit, float output_limit) {
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
pid->integral_limit = integral_limit;
pid->output_limit = output_limit;
pid->setpoint = ;
pid->feedback = ;
pid->error = ;
pid->integral = ;
pid->derivative = ;
pid->prev_error = ;
pid->output = ;
}
{
pid->error = pid->setpoint - pid->feedback;
P = pid->Kp * pid->error;
pid->integral += pid->error * dt;
(pid->integral > pid->integral_limit)
pid->integral = pid->integral_limit;
(pid->integral < -pid->integral_limit)
pid->integral = -pid->integral_limit;
I = pid->Ki * pid->integral;
pid->derivative = (pid->error - pid->prev_error) / dt;
D = pid->Kd * pid->derivative;
pid->output = P + I + D;
(pid->output > pid->output_limit)
pid->output = pid->output_limit;
(pid->output < -pid->output_limit)
pid->output = -pid->output_limit;
pid->prev_error = pid->error;
}


