news 2026/5/1 11:41:30

四旋翼PID姿态控制实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
四旋翼PID姿态控制实战指南

目录

1. 无人机姿态控制系统架构

2. PID 控制器设计

PID 结构体与初始化

PID 更新函数

3. 电机混控(四旋翼 X 模式)

4. 姿态角到电机控制的完整流程

5. 示例代码(STM32 HAL 库)

6. 调试与优化建议


将 MPU-9250 解算出的欧拉角(Pitch、Roll、Yaw)作为反馈,输入到PID 控制器,输出控制信号到四个电机,实现姿态稳定控制。

我会给你一个模块化的实现方案,包括:

  1. 系统控制架构
  2. PID 控制器设计
  3. 电机混控(Motor Mixing)
  4. 姿态数据与 PID 输出的结合
  5. 示例代码(STM32/CH32 + HAL 库)

1. 无人机姿态控制系统架构

典型四旋翼无人机的姿态控制是一个级联 PID 结构

┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 姿态环 PID │ │ 角速度环PID │ │ 电机混控 │ │ (Pitch/Roll/Yaw) │ │ (ωx/ωy/ωz) │ │ (Motor1~4) │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 期望姿态角 │ │ 期望角速度 │ │ PWM信号输出 │ └─────────────┘ └─────────────┘ └─────────────┘
  • 姿态环:输入期望欧拉角(如悬停时为 0°)和实际欧拉角(来自 MPU-9250 DMP),输出期望角速度。
  • 角速度环:输入期望角速度和实际角速度(来自陀螺仪),输出电机控制量。
  • 电机混控:将姿态控制量映射到四个电机的 PWM 信号。

2. PID 控制器设计

PID 公式:u(t)=Kp​⋅e(t)+Ki​⋅∫0t​e(τ)dτ+Kd​⋅dtde(t)​其中:

  • e(t)=SetPoint−Feedback (误差)
  • Kp​,Ki​,Kd​ 分别为比例、积分、微分系数
  • 输出限幅防止积分饱和和电机超调

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 = 0.0f; pid->feedback = 0.0f; pid->error = 0.0f; pid->integral = 0.0f; pid->derivative = 0.0f; pid->prev_error = 0.0f; pid->output = 0.0f; }

PID 更新函数

void PID_Update(PID_Controller *pid, float dt) { pid->error = pid->setpoint - pid->feedback; // 比例项 float P = pid->Kp * pid->error; // 积分项(带限幅) pid->integral += pid->error * dt; if (pid->integral > pid->integral_limit) pid->integral = pid->integral_limit; if (pid->integral < -pid->integral_limit) pid->integral = -pid->integral_limit; float I = pid->Ki * pid->integral; // 微分项 pid->derivative = (pid->error - pid->prev_error) / dt; float D = pid->Kd * pid->derivative; // 总输出 pid->output = P + I + D; // 输出限幅 if (pid->output > pid->output_limit) pid->output = pid->output_limit; if (pid->output < -pid->output_limit) pid->output = -pid->output_limit; pid->prev_error = pid->error; }

3. 电机混控(四旋翼 X 模式)

四旋翼 X 模式的电机布局:

Motor2 (CCW) ↑ | Motor1 (CW) ←———→ Motor3 (CW) | ↓ Motor4 (CCW)

混控公式(简化版):Motor1=Throttle+Roll−Pitch−YawMotor2=Throttle−Roll−Pitch+YawMotor3=Throttle−Roll+Pitch−YawMotor4=Throttle+Roll+Pitch+Yaw

其中:

  • Throttle:油门(总升力)
  • RollPitchYaw:PID 输出的姿态控制量

4. 姿态角到电机控制的完整流程

  1. 读取 MPU-9250 姿态数据(Pitch, Roll, Yaw)和陀螺仪数据(ωx, ωy, ωz)。
  2. 姿态环 PID:输入期望姿态角(如悬停时为 0°)和实际姿态角,输出期望角速度。
  3. 角速度环 PID:输入期望角速度和实际角速度,输出姿态控制量(Roll, Pitch, Yaw)。
  4. 电机混控:结合油门和姿态控制量,计算四个电机的 PWM 值。
  5. 输出到电调:通过定时器 PWM 输出控制电机转速。

5. 示例代码(STM32 HAL 库)

#include "stm32f1xx_hal.h" #include "mpu9250.h" #include "pid.h" // 定义 PID 控制器 PID_Controller pid_pitch, pid_roll, pid_yaw; PID_Controller pid_rate_pitch, pid_rate_roll, pid_rate_yaw; // 姿态数据 EulerAngles euler; float gyro[3]; // ωx, ωy, ωz (°/s) // 电机 PWM 值(1000~2000us) uint16_t motor1, motor2, motor3, motor4; float throttle = 1000.0f; // 初始油门 // 初始化 void Drone_Init(void) { // 初始化 MPU-9250 mpu_init(); // 初始化姿态环 PID(角度控制) PID_Init(&pid_pitch, 5.0f, 0.1f, 0.2f, 100.0f, 500.0f); PID_Init(&pid_roll, 5.0f, 0.1f, 0.2f, 100.0f, 500.0f); PID_Init(&pid_yaw, 4.0f, 0.05f, 0.1f, 100.0f, 500.0f); // 初始化角速度环 PID(速率控制) PID_Init(&pid_rate_pitch, 2.0f, 0.05f, 0.1f, 100.0f, 500.0f); PID_Init(&pid_rate_roll, 2.0f, 0.05f, 0.1f, 100.0f, 500.0f); PID_Init(&pid_rate_yaw, 1.5f, 0.05f, 0.1f, 100.0f, 500.0f); // 初始化定时器 PWM(如 TIM1 CH1~CH4) HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4); } // 控制循环(100Hz) void Drone_Control_Loop(void) { float dt = 0.01f; // 10ms // 读取姿态和陀螺仪数据 read_dmp_data(&euler, gyro); // 姿态环:输入期望角度(此处为 0° 悬停) pid_pitch.setpoint = 0.0f; pid_roll.setpoint = 0.0f; pid_yaw.setpoint = 0.0f; pid_pitch.feedback = euler.pitch; pid_roll.feedback = euler.roll; pid_yaw.feedback = euler.yaw; PID_Update(&pid_pitch, dt); PID_Update(&pid_roll, dt); PID_Update(&pid_yaw, dt); // 角速度环:输入姿态环输出作为期望角速度 pid_rate_pitch.setpoint = pid_pitch.output; pid_rate_roll.setpoint = pid_roll.output; pid_rate_yaw.setpoint = pid_yaw.output; pid_rate_pitch.feedback = gyro[0]; pid_rate_roll.feedback = gyro[1]; pid_rate_yaw.feedback = gyro[2]; PID_Update(&pid_rate_pitch, dt); PID_Update(&pid_rate_roll, dt); PID_Update(&pid_rate_yaw, dt); // 电机混控 motor1 = throttle + pid_rate_roll.output - pid_rate_pitch.output - pid_rate_yaw.output; motor2 = throttle - pid_rate_roll.output - pid_rate_pitch.output + pid_rate_yaw.output; motor3 = throttle - pid_rate_roll.output + pid_rate_pitch.output - pid_rate_yaw.output; motor4 = throttle + pid_rate_roll.output + pid_rate_pitch.output + pid_rate_yaw.output; // 限幅 motor1 = (motor1 < 1000) ? 1000 : (motor1 > 2000) ? 2000 : motor1; motor2 = (motor2 < 1000) ? 1000 : (motor2 > 2000) ? 2000 : motor2; motor3 = (motor3 < 1000) ? 1000 : (motor3 > 2000) ? 2000 : motor3; motor4 = (motor4 < 1000) ? 1000 : (motor4 > 2000) ? 2000 : motor4; // 输出到电机 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, motor1); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, motor2); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, motor3); __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, motor4); }

6. 调试与优化建议

  1. PID 参数整定
    • 先调角速度环,再调姿态环。
    • 从较小的 Kp 开始,逐步增加,直到系统有轻微振荡,再加入 Ki 和 Kd。
  2. 传感器校准
    • MPU-9250 陀螺仪和加速度计必须校准,磁力计建议做八位置校准。
  3. 安全保护
    • 加入低电压保护、失控保护(如油门低于阈值时自动降落到地面)。
  4. 滤波
    • 对姿态角和角速度数据进行滑动平均或卡尔曼滤波,减少噪声。
  5. 仿真
    • 可以先用 MATLAB/Simulink 搭建仿真模型,验证 PID 参数和控制逻辑。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 7:29:09

无人机双环PID悬停控制全解析

目录 1. 无人机悬停控制系统架构 2. 位置 PID 控制器设计 PID 结构体&#xff08;扩展到位置控制&#xff09; 3. 位置控制与姿态控制结合 位置数据结构 位置环 PID 初始化 4. 位置控制循环 5. 完整控制流程&#xff08;位置 姿态 电机&#xff09; 6. 传感器数据融…

作者头像 李华
网站建设 2026/4/29 12:48:25

YOLOv8 NWD归一化Wasserstein距离损失尝试

YOLOv8 中引入 NWD 损失&#xff1a;从理论到工程落地的完整实践 在现代目标检测系统中&#xff0c;边界框回归的精度往往决定了最终性能的上限。尽管 YOLO 系列模型以速度快、部署便捷著称&#xff0c;但其对小目标、遮挡物体和密集场景的处理仍面临挑战——尤其是在传统 IoU …

作者头像 李华
网站建设 2026/5/1 8:42:21

YOLOv8支持Markdown文档生成,提升项目协作效率

YOLOv8 容器化镜像&#xff1a;重塑AI开发协作的新范式 在智能安防摄像头实时识别行人、工业质检线上自动检测缺陷零件、自动驾驶车辆感知周围障碍物的背后&#xff0c;目标检测技术正以前所未有的速度渗透进现实世界。而在这场视觉革命中&#xff0c;YOLOv8 已成为许多工程师…

作者头像 李华
网站建设 2026/5/1 9:52:29

YOLOv8 ShuffleNet V2高速推理适配尝试

YOLOv8 ShuffleNet V2高速推理适配尝试 在边缘计算设备日益普及的今天&#xff0c;如何让目标检测模型既“跑得动”又“看得准”&#xff0c;成了智能系统设计的核心挑战。尤其是在树莓派、Jetson Nano这类算力有限的硬件上部署YOLOv8时&#xff0c;开发者常常面临内存溢出、帧…

作者头像 李华
网站建设 2026/5/1 6:12:22

PhotoShop新手教学之PS祛除黑眼圈

导入图片 首先先导入需要去除黑眼圈的图片 中性灰 1. 如图所示 新建一个图层 2.选择前景色 设置为一个 中性的灰色 rgb为 128&#xff0c;128&#xff0c;128 3.然后选中图层 按altdel 给他填充一个灰色 如图 混合 首先前景色设置为白色 如图 然后选择画笔工具 模式选择为正…

作者头像 李华
网站建设 2026/5/1 7:29:19

学长亲荐9个AI论文网站,专科生轻松搞定毕业论文!

学长亲荐9个AI论文网站&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何让论文写作不再难 对于继续教育的同学们来说&#xff0c;毕业论文常常是一个令人头疼的问题。尤其是在时间紧张、知识储备有限的情况下&#xff0c;如何高效完成一篇结构严谨、内容充实的论文…

作者头像 李华