简介:《仿生蝴蝶扑翼无人机设计方案详解》PDF共429页、41个大章节,面向扑翼飞行器研发工程师、高校师生与相关方向研究者,用于打通从生物原型解析、气动优化到嵌入式驱动落地的完整技术链路。资源包仅1个PDF文件,约13.91MB,支持目录章节跳转与阅读器书签大纲定位,公式、图表均显示正常。
内容分三条主线展开:低雷诺数气动部分含纳维-斯托克斯方程简化、CFD应用流程、混合网格与动网格对比、k-ε到DES湍流模型选型,以及傅里叶级数运动分解、遗传算法翼型多目标优化、翅脉仿生与柔性翼面材料;气弹耦合部分基于ANSYS Workbench搭建流固耦合仿真;嵌入式部分以STM32H7为核心,覆盖BLDC选型计算、FOC矢量控制与SVPWM电流环、霍尔与编码器融合定位、MOSFET H桥驱动、热阻网络散热设计及MAX17043电量监测与超级电容能量回收。已有428人学习,可供系统研读或按章节查漏补缺。
1. 从一只 12 Hz 的翅膀说起
把一只 8 克的仿生蝴蝶扑翼无人机放到台架上,给它 12 Hz 的扑动指令,翼尖速度不到 3 m/s,按平均气动弦长 0.03 m 折算,雷诺数落在 3000 到 6000 这个区间。这个量级恰好是气动上最难受的一段:升力线斜率比常规飞机低三成以上,层流分离泡让失速攻角提前到 8 度左右,前缘涡一旦脱落,推力和升力就会在同一周期内来回摆。
更麻烦的是驱动侧。12 Hz 意味着电机每 83 ms 就要完成一次正反换向,负载转矩在周期内剧烈波动,如果嵌入式电机驱动系统的电流环带宽不够,指令下去翅膀跟不上,整机的动态响应就会出现明显的相位滞后再叠加大幅超调。
对做微小型扑翼平台的人来说,气动和驱动这两块从来不是分开的:翼面形状决定负载转矩曲线,负载转矩曲线决定驱动参数怎么配。这篇按「先把雷诺数量级算对,再选翼型,再定驱动硬件,最后解动态响应」的顺序,把低雷诺数气动优化设计与嵌入式电机驱动系统这两条线并到一张图上看。
2. 低雷诺数气动优化设计:先把流动量级算对
2.1 仿生蝴蝶扑翼无人机的雷诺数到底落在哪个区间
很多人一上手就打开仿真软件画网格,结果算出来的升力比实测高一倍,问题往往出在雷诺数没算准。扑翼的来流速度不是一个常数,沿展向从翼根到翼尖线性增长,用翼尖速度代入会把雷诺数抬高 40% 以上。工程上常用的做法是按面积二次矩等效半径取均方根速度,也就是把展向分布按 r² 加权积分后的等效点。
import numpy as np RHO = 1.225 # 空气密度 kg/m^3 MU = 1.81e-5 # 动力粘度 Pa·s def flapping_reynolds(span, chord, freq, amp_deg): """span: 单侧翼展(m) chord: 平均气动弦长(m) freq: 扑动频率(Hz) amp_deg: 单侧半幅角(deg)""" r2 = span / np.sqrt(2.0) # 面积二次矩等效半径 omega = 2.0 * np.pi * freq u_ref = omega * r2 * np.sin(np.deg2rad(amp_deg)) # 等效来流速度 return RHO * u_ref * chord / MU, u_ref for f in (8, 10, 12, 15): Re, u = flapping_reynolds(0.06, 0.03, f, 60) print(f"f={f:>4.0f} Hz u_ref={u:.2f} m/s Re={Re:,.0f}")第一段代码里RHO和MU取 15 摄氏度标准大气值,span/sqrt(2)是均方根速度对应的等效半径,sin(amp_deg)做小角近似下的幅值折算。跑出来 12 Hz 对应 Re 约 5600、来流 2.8 m/s,和台架实测的粒子图像测速结果能对上。
参数怎么改:弦长从 0.03 加到 0.04,Re 线性涨 33%,但结构重量涨得更多,微型平台通常卡在 0.025 到 0.035 m 之间。真正有调空间的是频率和半幅角,两者对 Re 都是线性贡献,而频率还同时影响驱动带宽,所以调参优先级上频率要慎重。
| 参数 | 典型区间 | 对 Re 的贡献 | 调参优先级 |
|---|---|---|---|
| 扑动频率 f | 8 到 15 Hz | 线性 | 高,但受驱动器带宽约束 |
| 半幅角 Φ | 45 到 80 度 | sinΦ 线性 | 高,先加幅角再考虑提频 |
| 平均弦长 c | 0.025 到 0.035 m | 线性 | 中,受结构重量约束 |
| 单侧翼展 R | 0.04 到 0.08 m | 线性(等效半径正比 R) | 中,受整机尺寸约束 |
2.2 翼型与平面形状选型:薄板翼为什么在 Re<10⁴ 反而更合适
常规翼型的设计点在高雷诺数,靠前缘半径和后缘恢复段把压差维持住。到了几千的雷诺数,边界层太厚,厚翼型的分离反而更早。所以我一般推荐的做法是先用 2% 到 4% 相对厚度的薄板翼配 3% 到 5% 弯度,把分离泡控制在弦长 20% 到 30% 的位置,形成一个稳定的附着涡。
平面形状上,仿生蝴蝶扑翼无人机常见的两类方案差别很大:
- 椭圆翼:展弦比 3 到 4,翼尖诱导阻力小,适合悬停和低速前飞,但滚转惯量分布均匀,转向响应偏慢。
- 蝶形分叉翼:前后翼独立或半独立,能通过前后翼相位差调节涡的合并位置,推力更大,代价是气动中心随攻角漂移明显。
提示:如果第一版样机只是验证扑动机构能不能转起来,先用椭圆翼把结构做简单,别一上来就上分叉翼,气动中心漂移会让姿态环反复整定。
2.3 扑动参数扫参:用准稳态模型先圈出可行域
全 CFD 扫参在几毫米尺度上做一次三维非定常算例要跑几个小时,方案阶段不现实。可行的做法是先上准稳态叶素模型,把失速前的趋势扫出来,再用少量 CFD 或实测点做修正。
def quasi_steady_force(freq, amp_deg, chord, span, aoa_deg): """准稳态叶素模型 + 低雷诺数升力线斜率修正""" Re, u = flapping_reynolds(span, chord, freq, amp_deg) # 经验拟合: Re 越低, 升力线斜率相对 2π 衰减越多 cl_alpha = 2 * np.pi / (1 + 3.0 / np.sqrt(Re)) # 1/rad cl = cl_alpha * np.deg2rad(aoa_deg) * np.cos(np.deg2rad(aoa_deg)) q = 0.5 * RHO * u ** 2 S = 0.55 * span * chord # 单侧有效面积 return Re, cl, q * S * cl best = None for f in np.arange(8, 16, 1.0): for amp in np.arange(45, 85, 5.0): for aoa in np.arange(2, 12, 1.0): Re, cl, F = quasi_steady_force(f, amp, 0.03, 0.06, aoa) if cl < 0.9 and (best is None or F > best[3]): best = (f, amp, aoa, F) print(best)cl_alpha那一行是经验拟合项,Re 越低修正越强,Re=5000 时升力线斜率大约是理论值的 0.87 倍。0.55*span*chord是单侧翼的有效面积折算,取值来自对面积分布做积分后的经验系数,实测偏差在 10% 以内。扫出来通常是 10 到 12 Hz、幅角 65 到 75 度、攻角 6 到 10 度的组合,cl控制在 0.9 以下是为了留失速余量,别贴着临界点设计。
2.4 前缘涡与反卡门涡街:怎么判断推力真的出来了
低雷诺数扑翼的推力主要来自前缘涡在翼面上方维持的负压区,以及下扑行程尾部形成的反卡门涡街。判断设计是否有效,不用看整场流谱,看两个量就够:一是前缘涡从生成到脱落的无量纲时间,落在 0.3 到 0.5 个扑动周期说明附着良好;二是尾迹中反卡门涡街的涡间距与涡强度比,比值稳定说明推力波动小。
常见的误用是只看平均推力,不看周期内的波动。平均推力够但波动大的方案,装到整机上表现为 12 Hz 附近的机体振动,加速度计频谱上在 24 Hz 和 36 Hz 有明显谐波,这时候回去看涡结构,基本都是前后翼相位差没配好。
3. 嵌入式电机驱动系统:扭矩带宽比峰值扭矩更重要
3.1 驱动拓扑选型:为什么很少用舵机方案
扑翼负载的特点是高频交变、峰值高、均值为零附近的摆动。把常见四种方案摆在一起,选型逻辑就很清楚了。
| 方案 | 扭矩密度 | 可用带宽 | 效率 | 适用场景 |
|---|---|---|---|---|
| 有刷直流 + 齿轮减速 | 中 | 低,5 到 10 Hz | 低 | 早期机构验证样机 |
| 无刷 + FOC 驱动 | 高 | 高,100 Hz 以上 | 高 | 主推方案 |
| 空心杯直驱 | 低 | 高 | 中 | 5 克以下微型平台 |
| 舵机改造 | 中 | 很低,3 Hz 以内 | 中 | 静态姿态演示 |
舵机内部的位置环是低速设计,指令更新率通常 50 Hz 以下,给一个 12 Hz 正弦轨迹进去,输出形状会严重失真,这不是调参能救的,是拓扑本身不合适。主推无刷加磁场定向控制,核心原因是电流环能做到 1 kHz 以上,电流响应快过机械时间常数一个数量级以上,可以近似认为转矩是即时的。
3.2 电流环与位置环的双环参数整定
FOC 的电流环是内环,位置或摆角环是外环。内环整定的原则是把带宽做到外环的 5 到 10 倍,这样外环设计时可以忽略内环动态。PI 参数的解析式来自电机的电学模型:kp 由目标带宽和电感决定,ki 用来抵消电阻造成的稳态误差。
typedef struct { float kp, ki; float integ, out_min, out_max; } pi_ctrl_t; /* 电流环一步计算: err 为电流误差(A), dt 为控制周期(s) */ float pi_step(pi_ctrl_t *c, float err, float dt) { c->integ += c->ki * err * dt; /* 积分累加 */ if (c->integ > c->out_max) c->integ = c->out_max; /* 抗积分饱和 */ if (c->integ < c->out_min) c->integ = c->out_min; float u = c->kp * err + c->integ; return u < c->out_min ? c->out_min : (u > c->out_max ? c->out_max : u); }kp按2π·fc·L取值,fc是目标电流环带宽,L是相电感;ki按kp·R/L取值,R是相电阻。举例:L=120 µH、R=0.8 Ω、目标 fc=2 kHz,算出来 kp≈1.5、ki≈10000。抗积分饱和是必须的,扑翼换向瞬间的电流指令会撞限幅,不夹住积分项,反向时会拖出几十毫秒的滞后。整定顺序是先内环后外环,给内环灌一个阶跃电流指令,用示波器看电流探头上升时间,调kp直到接近目标带宽且不振荡。
3.3 用定时器 DMA 生成扑翼正弦驱动波形
扑翼轨迹一般是正弦或带谐波修正的类正弦。不要在主循环里算 sin,用定时器触发 DMA 循环搬运波形表,CPU 完全不参与。为了能在线改频率和幅值,用相位累加器的 DDS 结构比固定表更好。
#define TBL_N 256 static uint16_t pwm_buf[TBL_N]; /* 初始化波形表: arr 为定时器自动重装值, mod 为调制深度 0~1 */ void flap_wave_init(uint16_t arr, float mod_depth) { for (int i = 0; i < TBL_N; i++) { float s = sinf(2.0f * (float)M_PI * i / TBL_N); pwm_buf[i] = (uint16_t)((float)arr * 0.5f * (1.0f + mod_depth * s)); } } /* 相位累加器: 输出频率 = f_update * step / 2^32 */ static uint32_t phase = 0; static uint32_t phase_step = (uint32_t)(4294967296.0 * 12.0 / 20000.0); /* 12 Hz @ 20 kHz 更新率 */pwm_buf存的是占空比计数值,mod_depth控制调制深度,不要给到 1.0,留 5% 到 10% 余量给换向死区和电流环的瞬时调整。phase_step按目标频率和目标更新率算出来,想改频率只改这一个常量,不用重算表。更新率的选择上,20 kHz 对 12 Hz 扑动是每秒 1667 个点,完全够用;如果只有 1 kHz 更新率,每个扑动周期只有 83 个点,谐波会明显上去。
注意:表里存的是占空比,不是电流。实际转矩由电流环决定,波形表给的是位置或速度参考,两者不要混在一条链路上。
3.4 齿槽转矩与死区:实测驱动侧的真实输出
齿槽转矩在微小型无刷电机上占比能到额定转矩的 5% 到 15%,在扑翼这种负载本身就在零附近摆动的场合,齿槽转矩会直接表现为摆角抖动。测法很直接:断开电流环,三相短接或开路,手动匀速拖动输出轴,用高分辨率编码器记录转矩波动,得到的峰峰值就是齿槽转矩加轴承摩擦。
死区补偿是另一个容易被忽略的点。逆变桥上下管切换时为了避免直通会插入死区,死区期间输出电压不受控,低速小电流工况下表现为电流过零附近的平台,波形上看起来像正弦被削平了一块。补偿做法是按电流方向给一个固定偏置,偏置量用实测电流过零波形反推。
4. 动态响应解析:把气动阻尼折算到电机轴
4.1 气动阻尼折算成等效粘滞系数
气动力矩对摆角速度的偏导数就是气动阻尼系数。准稳态下,单侧翼的气动力矩可以用0.5·ρ·u²·S·c·C_M表示,其中C_M是力矩系数,对速度求导后得到的阻尼项与等效半径的三次方成正比。折到电机轴还要乘减速比的平方。这一步不折算清楚,后面所有动态响应计算都是错的。
实测的做法是分两次辨识:先空载(不装翼)跑扫频,测出电机和机构的机械时间常数;再装上翼跑同样的扫频,两条幅频曲线在扑动频率附近的差值就是气动附加阻尼。这个差值对同一种翼型基本稳定,可以直接复用。
4.2 二阶模型:从阶跃响应读出带宽、阻尼比和超调
把等效转动惯量、总粘滞阻尼和等效回复刚度三项凑齐,系统可以近似成二阶形式。这个模型虽然粗,但对判断「驱动带宽够不够」非常有效。
import numpy as np from scipy import signal J = 1.8e-6 # 折算到电机轴的等效转动惯量 kg·m^2 b = 4.2e-6 # 总粘滞阻尼(气动 + 轴承) N·m·s/rad k = 2.0e-4 # 等效回复刚度 N·m/rad (扭簧或磁弹簧) Kt = 0.0135 # 转矩常数 N·m/A sys_tf = signal.TransferFunction([Kt], [J, b, k]) wn = np.sqrt(k / J) zeta = b / (2 * np.sqrt(k * J)) print(f"wn = {wn:.1f} rad/s ({wn/2/np.pi:.2f} Hz), zeta = {zeta:.3f}") t, y = signal.step(sys_tf) print(f"超调 {(y.max()-y[-1])/y[-1]*100:.1f}%, 稳态增益 {y[-1]:.3f} rad/A")代入上面这组数会看到wn只有约 1.7 Hz、zeta约 0.11,超调接近 70%。这说明机构本身的自然频率远低于 12 Hz 的驱动频率,系统工作在惯性主导区,回复刚度的作用几乎可以忽略,电流产生的转矩绝大部分用来加速惯量,而不是维持位置。相位滞后在 12 Hz 处接近 90 度,光靠提高电流环增益压不下去。
4.3 扑动频率附近的相位滞后怎么补
既然机构被动特性改不了多少,补偿就得靠前馈。最直接的做法是把参考轨迹做二阶微分,算出惯性项和阻尼项需要的电流,直接叠加到电流环指令上,位置环只负责修正模型误差。
def feedforward_current(theta_ref, dt, J, b, Kt): """由参考轨迹直接算出前馈电流(A),位置环只需输出残差修正""" th = np.asarray(theta_ref) dth = np.gradient(th, dt) # 一阶导: 角速度 ddth = np.gradient(dth, dt) # 二阶导: 角加速度 return (J * ddth + b * dth) / Ktdt要和轨迹生成周期一致,不要用控制周期,否则微分噪声会被放大。J和b用 4.1 里辨识出来的值,偏 20% 以内前馈仍然有效,位置环能补掉残差。前馈加进去以后,位置环的kp可以往下调,避免为了压相位滞后而把增益推高,反而激起机构的高频模态。
4.4 参数敏感性排查表
不同参数对动态响应的影响差别很大,按下面这张表排优先级能少走弯路。
| 参数 | 变化 | 对 ζ 的影响 | 对 ωn 的影响 | 处理建议 |
|---|---|---|---|---|
| 翼面质量 | 减 20% | 基本不变 | 升约 12% | 优先减重,收益直接 |
| 回复刚度 k | 加倍 | 降约 30% | 升约 41% | 谨慎,ζ 掉太多会振荡 |
| 气动阻尼 b | 升 50% | 升 50% | 不变 | 靠翼型设计,不可控 |
| 电流环带宽 | 升一倍 | 不变 | 不变 | 只影响内环跟随,不改机构相位 |
5. 联调阶段:用扫频把气动和驱动的模型对齐
模型算完只是拿到起点,整机联调阶段最容易出问题的不是参数本身,而是气动侧和驱动侧的模型对不上。我一般按下面的顺序做标定。
先做空载扫频。给摆臂一个 1 Hz 到 30 Hz 的对数扫频位置指令,幅值压到 3 度以内,避免进非线性区,用编码器采实际摆角,和指令做 FFT 求幅频和相频,得到机构本身的频率响应。这一步要在装翼之前做完,否则分不清是电机带宽不够还是气动阻尼在起作用。
再装翼重测。同一组扫频信号跑一遍,两条曲线的幅值差就是气动附加阻尼,相位差就是气动引入的额外滞后。12 Hz 附近相位差通常在 15 到 25 度之间,如果测出来超过 40 度,多半是翼面在扑动中发生了被动扭转,柔性变形把相位拖后了。这时候要么提高翼面抗扭刚度,要么把前馈模型里的阻尼项调大。
最后验证前馈效果。把 4.3 的前馈电流加进去,同样扫频,看相位滞后有没有压回 10 度以内,同时看 24 Hz 和 36 Hz 的谐波幅值有没有下降。下降说明前馈确实作用在了主频上,没下降说明J和b的折算系数不对,回去重算一遍等效半径和减速比。
| 现象 | 可能原因 | 排查动作 |
|---|---|---|
| 12 Hz 处相位滞后大于 40 度 | 翼面被动扭转 | 加抗扭加强筋,重测空载与带载曲线 |
| 24/36 Hz 谐波明显 | 前后翼相位差失配 | 调相位步进值,查波形表更新率 |
| 摆角在零位附近抖动 | 齿槽转矩或死区 | 断开电流环手动拖轴,测齿槽峰峰值 |
| 幅频曲线在 5 Hz 有凹陷 | 机构共振 | 检查连杆间隙和轴承预紧 |
扫频时把指令幅值控制在 5 度以内,并把扫频时长拉到 5 秒以上。幅值一大,攻角直接跨过失速临界点,测出来的频响里混进非线性成分,后面拿它做前馈标定就会越调越偏。
本文还有配套的精品资源,点击获取