作为一名从事机器人控制算法开发的工程师,我一直对仿生飞行器充满兴趣。最近复现了《微型仿生扑翼飞行器的设计与跟踪控制》这篇论文,整个过程让我收获颇丰。这种微型仿生扑翼飞行器(FWMAV)模仿自然界昆虫和鸟类的飞行方式,具有体积小、机动性高的特点,在狭小空间作业、环境监测等领域有广泛应用前景。
复现这篇论文最大的挑战在于需要同时处理机械设计、空气动力学建模和控制算法三个维度的内容。论文作者采用了一种系统化的方法:首先基于尺度律计算确定飞行器尺寸参数,然后使用SolidWorks进行机械结构设计,接着建立准稳态空气动力学模型,最后设计了串级PID位置控制器和自抗扰(ADRC)姿态控制器。
论文中的飞行器主体结构采用轻量化设计,主要包含以下几个关键部件:
机架结构:使用碳纤维杆作为主体框架,这种材料具有极高的强度重量比。机架总重量控制在5g以内,这是通过精确计算各部件受力情况后确定的最优解。
扑翼机构:采用四连杆机构将电机旋转运动转换为扑翼的上下拍打运动。这里有个设计细节值得注意——连杆比例经过精心计算,确保在电机转速范围内(800-1200rpm)能产生8-12Hz的扑动频率,这是小型飞行器产生足够升力的关键参数。
翼膜材料:选用EPE珍珠发泡气泡棉膜制作翅翼,厚度仅0.1mm。这种材料兼具轻量(面密度约20g/m²)和足够的刚性,能在扑动过程中保持翼型,同时成本低廉易于更换。
飞行控制系统采用模块化设计,核心部件包括:
主控制器:STM32F103C8T6微控制器,运行频率72MHz,具有足够的计算能力实时处理控制算法,同时功耗仅50mW左右。
传感器组:MPU6050六轴IMU(3轴加速度+3轴角速度),重量仅0.3g;为了精确定位,还集成了基于红外LED的主动光学标记点,用于OptiTrack动作捕捉系统跟踪。
驱动系统:采用空心杯电机(直径7mm)配合减速齿轮组,总重1.8g,最大输出扭矩0.15N·m,足以驱动翼展15cm的扑翼。
提示:在小型飞行器设计中,重量分配至关重要。我们的经验是电子系统(含电池)不应超过总重的40%,这样才能保证足够的有效载荷能力。
基于叶素理论和准稳态假设,建立了扑翼的气动力模型。将每个扑动周期离散为若干时间步,在每个时间步计算翼片微元上的气动力,然后积分得到总力和力矩。
升力计算公式:
$$
L = \frac{1}{2}\rho v^2 C_L(\alpha)S
$$
其中:
阻力计算采用类似公式,只是系数变为C_D。论文中特别指出,对于这种小型飞行器,必须考虑低雷诺数(约10⁴)下的气动特性,传统飞机翼型数据不再适用。
建立机体坐标系和地面坐标系之间的转换关系,使用四元数表示姿态以避免万向节锁问题。运动方程包括:
平移动力学:
$$
m\ddot{\mathbf{r}} = \mathbf{R}(\mathbf{q})\mathbf{F} - m\mathbf{g}
$$
其中R(q)是从机体坐标系到地面坐标系的旋转矩阵。
旋转动力学:
$$
\mathbf{J}\dot{\boldsymbol{\omega}} + \boldsymbol{\omega}\times\mathbf{J}\boldsymbol{\omega} = \mathbf{M}
$$
J为惯性张量,ω为角速度,M为总力矩。
位置控制采用串级结构,包含外环(位置环)和内环(速度环)。这种结构能有效处理系统不同时间尺度的动态特性。
python复制class CascadePID:
def __init__(self):
# 外环PID参数
self.Kp_pos = 0.8
self.Ki_pos = 0.05
self.Kd_pos = 0.2
# 内环PID参数
self.Kp_vel = 1.2
self.Ki_vel = 0.1
self.Kd_vel = 0.3
# 抗积分饱和参数
self.integral_limit = 10.0
self.last_error_pos = 0
self.integral_pos = 0
self.last_error_vel = 0
self.integral_vel = 0
def update(self, pos_ref, pos_actual, vel_actual, dt):
# 外环计算速度指令
error_pos = pos_ref - pos_actual
self.integral_pos += error_pos * dt
self.integral_pos = np.clip(self.integral_pos, -self.integral_limit, self.integral_limit)
derivative_pos = (error_pos - self.last_error_pos) / dt
vel_ref = self.Kp_pos * error_pos + self.Ki_pos * self.integral_pos + self.Kd_pos * derivative_pos
self.last_error_pos = error_pos
# 内环计算控制输出
error_vel = vel_ref - vel_actual
self.integral_vel += error_vel * dt
self.integral_vel = np.clip(self.integral_vel, -self.integral_limit, self.integral_limit)
derivative_vel = (error_vel - self.last_error_vel) / dt
output = self.Kp_vel * error_vel + self.Ki_vel * self.integral_vel + self.Kd_vel * derivative_vel
self.last_error_vel = error_vel
return output
ADRC控制器由三部分组成:跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈(NLSEF)。
python复制class ADRC:
def __init__(self):
# TD参数
self.r = 100
self.h = 0.01
# ESO参数
self.beta1 = 100
self.beta2 = 300
self.beta3 = 1000
self.b = 1.0
# NLSEF参数
self.alpha1 = 0.5
self.alpha2 = 1.5
self.delta = 0.01
# 状态变量
self.x1 = 0
self.x2 = 0
self.z1 = 0
self.z2 = 0
self.z3 = 0
def fal(self, e, alpha, delta):
if abs(e) > delta:
return abs(e)**alpha * np.sign(e)
else:
return e / (delta**(1-alpha))
def update(self, ref, actual, dt):
# TD跟踪微分器
e = self.x1 - ref
self.x1 += self.x2 * dt
self.x2 += self.r * self.fal(e, 1, self.h) * dt
# ESO扩张状态观测器
e_eso = self.z1 - actual
self.z1 += (self.z2 - self.beta1 * e_eso) * dt
self.z2 += (self.z3 - self.beta2 * self.fal(e_eso, 0.5, self.delta) + self.b * u) * dt
self.z3 += -self.beta3 * self.fal(e_eso, 0.25, self.delta) * dt
# NLSEF非线性控制
e1 = self.x1 - self.z1
e2 = self.x2 - self.z2
u0 = self.fal(e1, self.alpha1, self.delta) + self.fal(e2, self.alpha2, self.delta)
u = (u0 - self.z3) / self.b
return u
注意:ADRC参数整定是关键,β系列参数决定观测器收敛速度,通常β1>β2>β3;α参数影响非线性反馈强度,需要根据实际响应调整。
建立Simulink模型比较三种控制器性能:
| 控制器类型 | 上升时间(s) | 超调量(%) | 抗干扰能力 |
|---|---|---|---|
| 传统PID | 1.2 | 15 | 一般 |
| 串级PID | 0.8 | 8 | 较好 |
| ADRC | 0.6 | 3 | 优秀 |
仿真结果表明,ADRC在响应速度和抗干扰能力方面表现最优,特别是在存在模型不确定性和外部扰动时。
搭建了基于OptiTrack动作捕捉系统的实验平台,系统精度达到0.1mm,采样频率120Hz。进行了两类测试:
定高飞行测试:飞行器从地面起飞并维持在1m高度,ADRC控制器能将高度误差控制在±2cm内,优于串级PID的±5cm。
轨迹跟踪测试:飞行器跟踪直径1m的圆形轨迹,位置误差统计:
| 控制器类型 | 平均误差(cm) | 最大误差(cm) |
|---|---|---|
| 串级PID | 6.2 | 12.5 |
| ADRC | 3.8 | 7.4 |
实验中发现,飞行器对气流扰动非常敏感,在无风环境下性能接近仿真结果,但在有轻微气流扰动时,ADRC表现出明显优势。
串级PID整定:采用"由内而外"的调参顺序:
ADRC参数整定经验:
电机响应滞后:
高频振荡:
姿态估计漂移:
在实际复现过程中,我发现几个值得深入探索的方向:
混合控制策略:在位置控制中,可以尝试将ADRC与MPC(模型预测控制)结合,ADRC处理模型不确定性,MPC优化轨迹跟踪性能。
自适应参数调整:针对不同飞行阶段(起飞、巡航、降落)自动调整控制器参数,这需要建立飞行状态机。
群体协同控制:扩展系统支持多飞行器协同,需要解决通信和避障问题,可以使用UWB进行相对定位。
机载计算优化:当前算法在STM32上运行接近资源极限,可以考虑:
复现过程中最大的收获是对小型飞行器系统设计的全流程有了更深入的理解。特别是硬件与软件的协同设计方面,很多控制算法的问题其实源于机械设计或传感器选择的局限性。