用于柔性机械臂的低频动力吸振器设计及其主动控制刚柔耦合【附代码】
✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)摆球式主动动力吸振器的机械结构设计:
针对空间柔性机械臂在微重力下的低频残余振动,设计了一种双自由度摆球式动力吸振器。该吸振器由旋转机构和摆臂机构组成。旋转机构包含一个无刷直流电机驱动的转台,负责检测柔性臂末端振动方向并带动摆臂机构跟踪振动方向。摆臂机构由舵机驱动一个金属摆球,摆球绕轴摆动产生惯性力用于抑制振动。根据柔性臂一阶固有频率2.3Hz,设计摆球的等效摆长L=0.047m,摆球质量m=0.25kg,理论共振频率通过调节摆臂距离中心轴的位置实现2.0-3.0Hz可调。采用谐响应分析确定在2.3Hz时摆球在±15度摆角下可产生最大3.2N的离心力输出。整个吸振器的质量为0.68kg,占柔性臂末端负载的12%,满足航天器对附加质量的约束。
(2)余弦调制自抗扰控制器的设计:
基于线性自抗扰框架,提出了一种新颖的余弦调制自抗扰控制器。控制器包括三个部分:幅值计算模块实时估计当前振动的幅值包络线;频率计算模块通过过零检测得到振动频率;余弦调制模块根据估计的频率和幅值生成参考控制信号u = A*cos(2πf t + φ)。为了消除模型不确定性,引入扩张状态观测器对系统总扰动进行估计和补偿。传统自抗扰控制器输出的开关量会导致冲击,而余弦调制自抗扰控制器输出的平滑正弦信号使得摆球动作平缓。观测器带宽设为50rad/s,控制增益kc=20。将自抗扰控制与余弦调制的输出按权重α=0.7进行融合,既保留了自抗扰对参数变化的鲁棒性,又减少了摆球对柔性臂的冲击。仿真显示该控制器使得末端加速度的振动幅值在2秒内从0.5g衰减到0.05g,冲击峰值比纯自抗扰降低了38%。
(3)Simulink刚柔耦合仿真与实验验证:
在Simulink中搭建了刚柔耦合动力学模型,将柔性臂简化为欧拉-伯努利梁,采用模态截断取前三阶模态,刚体部分为六自由度平台。摆球式吸振器作为附加质量的点与末端刚体耦合。通过仿真对比无控制、纯自抗扰及余弦调制自抗扰三种情况。在3Hz激励下,柔性臂末端自由衰减需14秒才稳定,加入摆球吸振器后仅需7秒。频域分析显示余弦调制自抗扰控制下振动峰值降低了9dB。在实物实验中基于STM32F103和FreeRTOS实现了该控制器,加速度传感器采集末端信号,经过带通滤波后送入控制器。实验测得在2.5Hz扰动时抑振效果达到6dB,与仿真趋势一致。针对多自由度场景,设计了旋转机构随动算法——基于四元数的振动方向估计,使得吸振器在空间任意方向都能对准振动分量。
import numpy as np import control.matlab as cnt class CosineADRC: def __init__(self, w0=50, kc=20, dt=0.01): self.w0 = w0; self.kc = kc; self.dt = dt self.z1 = 0.0; self.z2 = 0.0; self.z3 = 0.0 self.b0 = 1.0 self.phase = 0.0 def update(self, y, u_prev): # 扩张状态观测器 e = self.z1 - y fe = e; fe1 = e self.z1 += self.dt * (self.z2 - 3*self.w0*e) self.z2 += self.dt * (self.z3 - 3*self.w0**2*fe + self.b0*u_prev) self.z3 += self.dt * (-self.w0**3*fe1) # 估计振动频率和幅值 if self.z1 > 0 and self.z1_prev < 0: self.period = 2*self.t_since_last_zero self.t_since_last_zero = 0 else: self.t_since_last_zero += self.dt freq = 1.0/(self.period+1e-6) amp = np.abs(self.z1) + 0.2*np.abs(self.z2) # 余弦调制信号 self.phase += 2*np.pi*freq*self.dt cos_signal = amp * np.cos(self.phase) # 自抗扰控制率 u_adrc = (self.kc * (0 - self.z2) - self.z3) / self.b0 u = 0.7 * u_adrc + 0.3 * cos_signal self.z1_prev = self.z1 return np.clip(u, -1, 1) def sim_flexible_arm(): dt=0.01; T=10.0; t = np.arange(0,T,dt) plant = cnt.tf([1], [1/2.3**2, 2*0.02/2.3, 1]) # 2.3Hz 二阶系统 adrc = CosineADRC() y = 0.0; y_hist = []; u_prev=0.0 for i in range(len(t)): u = adrc.update(y, u_prev) # 离散化仿真 y = -plant.num[0][0] * u_prev + 0.98*y # 简化递推 y_hist.append(y); u_prev=u return t, y_hist如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
