2026/4/6 4:13:04
网站建设
项目流程
做网站商城的小图标软件,网站反链是什么意思,深圳注册公司流程和费用,医院网站建设公司价格目录
1. 无人机姿态控制系统架构
2. PID 控制器设计
PID 结构体与初始化
PID 更新函数
3. 电机混控#xff08;四旋翼 X 模式#xff09;
4. 姿态角到电机控制的完整流程
5. 示例代码#xff08;STM32 HAL 库#xff09;
6. 调试与优化建议 将 MPU-9250 解算出的 欧…目录1. 无人机姿态控制系统架构2. PID 控制器设计PID 结构体与初始化PID 更新函数3. 电机混控四旋翼 X 模式4. 姿态角到电机控制的完整流程5. 示例代码STM32 HAL 库6. 调试与优化建议将 MPU-9250 解算出的欧拉角Pitch、Roll、Yaw作为反馈输入到PID 控制器输出控制信号到四个电机实现姿态稳定控制。我会给你一个模块化的实现方案包括系统控制架构PID 控制器设计电机混控Motor Mixing姿态数据与 PID 输出的结合示例代码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⋅∫0te(τ)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)混控公式简化版Motor1ThrottleRoll−Pitch−YawMotor2Throttle−Roll−PitchYawMotor3Throttle−RollPitch−YawMotor4ThrottleRollPitchYaw其中Throttle油门总升力Roll、Pitch、YawPID 输出的姿态控制量4. 姿态角到电机控制的完整流程读取 MPU-9250 姿态数据Pitch, Roll, Yaw和陀螺仪数据ωx, ωy, ωz。姿态环 PID输入期望姿态角如悬停时为 0°和实际姿态角输出期望角速度。角速度环 PID输入期望角速度和实际角速度输出姿态控制量Roll, Pitch, Yaw。电机混控结合油门和姿态控制量计算四个电机的 PWM 值。输出到电调通过定时器 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. 调试与优化建议PID 参数整定先调角速度环再调姿态环。从较小的 Kp 开始逐步增加直到系统有轻微振荡再加入 Ki 和 Kd。传感器校准MPU-9250 陀螺仪和加速度计必须校准磁力计建议做八位置校准。安全保护加入低电压保护、失控保护如油门低于阈值时自动降落到地面。滤波对姿态角和角速度数据进行滑动平均或卡尔曼滤波减少噪声。仿真可以先用 MATLAB/Simulink 搭建仿真模型验证 PID 参数和控制逻辑。