十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32四旋翼飞控实战:从动力学建模到串级PID调参

STM32四旋翼飞控实战:从动力学建模到串级PID调参 简介这份PDF文档面向无人机控制、嵌入式开发方向的学习者与工程人员围绕四旋翼无人机受干扰时姿态控制效果差的问题给出了一套基于STM32与深度学习的控制系统设计方案。内容涵盖系统总体设计、软件功能模块划分、电机驱动、电源管理、无线通信等环节并引入MEMS传感器采集姿态数据、NRF51822芯片实现远距避障同时提出区域卷积神经网络(R-CNN)用于控制算法设计配合仿真实验验证控制效果。资源包共1个PDF文件约301KB下载后可直接查阅完整设计思路与模块实现细节。目前已有294人学习浏览适合希望了解四旋翼飞控架构、深度学习姿态控制方法及硬件选型思路的读者参考对军事侦察、环境监测、森林防火、农业植保等应用场景的控制系统设计具有一定借鉴价值。1. 从一份 PDF 标题说起四旋翼控制系统到底在控什么很多人第一次接触四旋翼是从一份《四旋翼无人机控制系统设计分析.pdf》这类文档开始的。翻开来满屏是欧拉角、PID、卡尔曼滤波合上文档却不知道从哪下手。问题不在数学而在于没搞清楚控制系统的边界它要控的不是“飞机”而是四个电机转速的协同关系通过改变四个旋翼的升力差间接控制姿态和位置。四旋翼是欠驱动系统六个自由度只有四个独立控制量俯仰、横滚、偏航、高度耦合在一起。所以控制系统的核心任务分两层内环用姿态控制把机体稳住外环用位置控制让它飞到该去的地方。内环跑得慢一点外环就发散内环噪声大一点外环就抖。这套分层结构决定了后面所有代码和参数的写法。适合读这篇的人有三类正在做基于 STM32 的四旋翼毕业设计的学生、想从零搭一架能悬停的机架的工程师、以及手上有飞控板但调不出稳定姿态的开发者。下面按“建模—姿态环—位置环—调参排错”的顺序把一份设计分析文档里该有的东西落到能跑的命令和参数上。2. 四旋翼动力学建模与 STM32 控制框架搭建2.1 从牛顿-欧拉方程到可编程的简化模型四旋翼的完整动力学模型包含刚体运动方程和旋翼气动模型直接搬进 STM32 不现实。常见做法是保留姿态动力学把气动效应简化为升力系数和反扭矩系数。姿态角加速度与电机转速平方差的关系可以写成Ixx * p_dot L * kf * (w2^2 w3^2 - w1^2 - w4^2) Iyy * q_dot L * kf * (w1^2 w3^2 - w2^2 - w4^2) Izz * r_dot kd * (w1^2 - w2^2 w3^2 - w4^2)其中L是机臂长度kf是升力系数kd是反扭矩系数w1~w4是四个电机的转速。这个模型的意义在于它把控制问题变成了“给定目标力矩反解四个电机转速”的分配问题。实际写代码时不会真的解这个方程而是用混控矩阵把 PID 输出的三个力矩和油门映射到四个 PWM 通道。注意kf和kd随桨叶和电压变化不要照抄别人的数值。用拉力计测一组“油门-PWM-拉力”数据拟合出系数比任何仿真都准。2.2 STM32 最小系统与外设分配选 STM32F4 系列做飞控是常见方案主频够跑 1kHz 的姿态环浮点单元省去定点换算的麻烦。外设分配上四个电机 PWM 用同一个定时器的四个通道保证更新同步IMU 走 SPI 或 I2CMPU6000/ ICM20602 这类六轴是主流遥控接收机用 UART 或 PPM 输入。下面是一个用 HAL 库初始化 TIM3 四通道 PWM 的片段频率设 400Hz对应电调的标准协议// TIM3 四通道 PWM 初始化400Hz分辨率 2000 步 TIM_HandleTypeDef htim3; htim3.Instance TIM3; htim3.Init.Prescaler 84 - 1; // 84MHz / 84 1MHz 计数时钟 htim3.Init.Period 2500 - 1; // 1MHz / 2500 400Hz htim3.Init.CounterMode TIM_COUNTERMODE_UP; HAL_TIM_PWM_Init(htim3); TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 1000; // 初始 1ms电调解锁最低值 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1); // 通道 2/3/4 同样配置对应四个电机 HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1);逻辑说明预分频把 84MHz 降到 1MHz周期值 2500 得到 400Hz 的 PWM 频率脉宽 1000~2000 对应电调的 1ms~2ms 行程。参数上Pulse的初始值必须设在电调解锁范围的下限否则上电瞬间电机会转。四个通道用同一个定时器是为了让四路 PWM 的更新时刻严格对齐避免混控输出时产生相位差。2.3 传感器数据读取与姿态解算的落地方式姿态解算不用一上来就上卡尔曼。工程上先用互补滤波把陀螺仪和加速度计融合代码短、参数直观跑通了再换 Mahony 或 Madgwick。互补滤波的核心是一行// 互补滤波陀螺积分 加速度计修正 angle 0.98 * (angle gyro * dt) 0.02 * accel_angle;0.98是信任陀螺的权重dt是采样周期。这个系数不是随便定的它决定了高通和低通的截止频率0.98对应大约 0.5Hz 的交叉点适合大多数机架。如果飞机在悬停时缓慢漂移说明加速度计权重太低如果电机振动一大角度就跳说明陀螺权重太高需要先做机械减振再调这个数。3. 姿态控制环的 PID 实现与参数整定3.1 串级 PID 的结构与代码骨架姿态控制用串级 PID外环角度环输入是目标角度和当前角度输出是目标角速度内环角速度环输入是目标角速度和陀螺仪读数输出是力矩。串级的好处是内环把扰动吃掉外环只管跟踪角度两个环的参数可以分开调。// 串级 PID 姿态控制1kHz 调用 float angle_pid(float target, float current, float gyro, float dt) { static float integral 0; float err target - current; integral err * dt; // 外环角度误差 - 目标角速度 float target_rate KP_ANGLE * err KI_ANGLE * integral; // 内环角速度误差 - 力矩 float rate_err target_rate - gyro; return KP_RATE * rate_err; }逻辑说明外环的积分项用来消除角度静差内环只用比例项因为角速度环的积分容易和陀螺零偏打架。参数上KP_ANGLE决定回中力度一般从 4.0 开始试KP_RATE决定阻尼太小会震荡太大响应迟钝。dt必须用实际循环周期不能用标称值否则积分项会累积错误。3.2 三个必调参数与整定顺序姿态环有三个参数必须现场调角度环 P、角速度环 P、角速度环 I。整定顺序是先把角度环 P 设 0只调角速度环 P用手拨动机架感受反作用力直到松手后机架能快速停住但不来回摆。然后加角速度环 I消除匀速转动时的角速度误差。最后加角度环 P让机架能回到水平。参数作用起始值调大后果调小后果KP_ANGLE回中力度4.0高频抖动回中无力KP_RATE角速度阻尼0.15响应迟钝震荡发散KI_RATE消除角速度静差0.02低频摆动匀速漂移注意调参必须在解锁但不起飞的条件下做桨叶拆掉或电机不转。带桨调参一旦参数发散机架会直接翻掉。3.3 混控矩阵与电机输出限幅PID 算出三个力矩后要通过混控矩阵分配到四个电机。X 型机架的混控关系是// X 型混控roll/pitch/yaw 力矩 油门 - 四电机 motor[0] throttle - roll pitch yaw; // 右前 motor[1] throttle - roll - pitch - yaw; // 右后 motor[2] throttle roll - pitch yaw; // 左后 motor[3] throttle roll pitch - yaw; // 左前 // 限幅到 1000~2000 for (int i 0; i 4; i) { if (motor[i] 2000) motor[i] 2000; if (motor[i] 1000) motor[i] 1000; }逻辑说明混控矩阵的符号取决于电机转向和桨叶正反装反一个电机飞机就会往反方向翻。限幅是必须的否则某个电机饱和后另外三个电机的补偿量会失真姿态直接失控。参数上throttle是遥控油门映射到 1000~2000 的值roll/pitch/yaw是 PID 输出经过缩放后的力矩量缩放系数决定了最大修正力度。4. 位置环、定高与 STM32 上的资源分配4.1 高度控制的气压计融合与油门补偿定高用气压计但气压计噪声大、受气流影响明显。常见做法是把气压计高度和加速度计积分高度做互补滤波再用一个单环 PID 控制油门。气压计的数据不能直接用要先做滑动平均窗口取 10~20 个采样点。// 气压计滑动平均 高度 PID #define WIN 15 static float baro_buf[WIN]; static int idx 0; baro_buf[idx] baro_raw; idx (idx 1) % WIN; float baro_avg 0; for (int i 0; i WIN; i) baro_avg baro_buf[i]; baro_avg / WIN; // 高度误差 - 油门补偿 float alt_err target_alt - baro_avg; throttle_comp KP_ALT * alt_err KD_ALT * (alt_err - last_alt_err) / dt;逻辑说明滑动平均抑制气压计的高频噪声但会引入相位滞后所以WIN不能太大。高度环用 PD 不用 I因为油门本身有积分特性再加积分会振荡。参数上KP_ALT从 0.5 开始KD_ALT从 0.2 开始调的时候观察飞机是缓慢下沉还是上下窜。4.2 位置环与光流/ GPS 的接口预留位置环在室内用光流室外用 GPS。STM32 上不需要跑复杂的视觉算法光流模块通过 UART 输出速度GPS 通过 UART 输出经纬度。位置环的输入是水平速度输出是目标俯仰角和横滚角交给姿态环执行。// 位置环速度误差 - 目标角度 float vel_err_x target_vel_x - flow_vel_x; target_pitch KP_POS * vel_err_x; // 限幅防止目标角度过大导致姿态环饱和 if (target_pitch 15.0f) target_pitch 15.0f; if (target_pitch -15.0f) target_pitch -15.0f;逻辑说明位置环的输出是角度所以必须限幅。15度是经验值对应最大水平加速度约 2.5m/s²再大姿态环就跟不上了。参数上KP_POS决定速度跟踪的快慢太大飞机会前后冲太小位置漂移压不住。4.3 STM32 上的任务调度与 CPU 占用1kHz 的姿态环、100Hz 的位置环、50Hz 的遥控解析这三个任务不能放在同一个循环里顺序执行。常见做法是用定时器中断触发姿态环主循环跑位置环和遥控中间用标志位同步。STM32F4 跑 1kHz 浮点 PID 加混控CPU 占用大约 30%留出的余量给日志和通信。注意不要在中断里做浮点除法或打印中断服务函数只置标志位实际计算放到主循环。否则中断执行时间过长PWM 更新会抖动。5. 试飞排错与参数微调的实战技巧5.1 从地面测试到悬停的检查清单第一次试飞前先做三项地面测试电机转向和混控方向是否一致、姿态解算的角度是否跟手转动方向一致、失控保护是否在遥控断连时把油门降到最低。这三项任何一项错了起飞就是炸机。地面测试通过后第一次悬停把油门缓慢推到刚好离地观察飞机是往哪边偏用微调修正不要急着改 PID。5.2 震荡、漂移、翻跟头的故障定位震荡分高频和低频。高频震荡是角速度环 P 太大降 20% 再试低频摆动是角速度环 I 太大降一半。漂移分角度漂移和位置漂移角度漂移是陀螺零偏没校准上电时保持静止重新校准位置漂移是光流或气压计受气流干扰加海绵减振或换安装位置。翻跟头只有两种可能电机转向错或混控符号错对照混控矩阵逐个检查。5.3 用日志回放定位参数问题STM32 的 Flash 或 SD 卡记录姿态环的输入输出试飞后把数据导出来画曲线。目标角度和实际角度的相位差超过 90 度说明角速度环带宽不够实际角速度有周期性尖峰说明电机振动耦合进了陀螺。日志不用记太多姿态角、角速度、四个电机输出四个量足够定位大部分问题。# 用 Python 画姿态日志快速看跟踪效果 import matplotlib.pyplot as plt import numpy as np data np.loadtxt(flight_log.csv, delimiter,) plt.plot(data[:,0], data[:,1], labeltarget_roll) plt.plot(data[:,0], data[:,2], labelactual_roll) plt.legend() plt.show()逻辑说明flight_log.csv每行是时间、目标角度、实际角度、角速度、电机输出。画出来看两条曲线的重合度和相位差比盯着飞机猜参数快得多。参数上采样率至少 200Hz否则角速度的细节会被混叠掉。5.4 从 PID 到 LQR 的过渡时机PID 调到头跟踪效果还是上不去再考虑 LQR。LQR 需要状态空间模型把姿态角和角速度作为状态量解黎卡提方程得到反馈增益。STM32 上跑 LQR 不是问题问题是模型不准增益算出来还不如 PID。常见做法是先用 PID 飞稳采集实际数据辨识模型参数再用辨识结果算 LQR 增益。这一步没有捷径模型辨识的激励信号和数据处理比 LQR 本身更花时间。本文还有配套的精品资源点击获取
返回列表