✨ 长期致力于下肢康复机器人、逆系统解耦、鲁棒PID控制、步态轨迹自适应、Youla-Kucera参数化、自适应调节器、跑步机速度协调控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)基于逆系统解耦与阻抗控制的步态轨迹自适应协调算法:
针对下肢外骨骼与人腿组成的强耦合非线性系统,先通过逆系统方法将多输入多输出系统解耦为四个独立的单变量子系统(髋关节屈伸、膝关节屈伸、踝关节跖屈/背屈)。在每个子系统中,设计一个阻抗控制器,其目标阻抗参数(惯量、阻尼、刚度)根据患者的主动参与度实时调整。主动参与度由一个基于表面肌电信号和关节力矩的模糊推理系统估计。当检测到患者试图主动发力时,阻抗参数中的阻尼减小,使机器人更容易被带动。步态参考轨迹则根据历史步态周期和患侧与健侧的相位差在线调整,采用动态时间规整算法对齐步态相位。在5名偏瘫患者的临床试验中,该控制策略使患侧与健侧的步态对称性指数从0.68提升至0.87,患者主动发力贡献度平均提高了32%。
(2)鲁棒PID与Youla-Kucera参数化自适应调节器混合控制:
在患者康复后期,肌肉力量恢复明显,需要从机器人主动带动过渡到患者主动训练模式。为此设计一个双层控制器:内层为鲁棒PID控制器,使用线性矩阵不等式优化其参数,保证在模型参数摄动±20%和外部干扰下的稳定性。外层为一个基于Youla-Kucera参数化的自适应调节器,在线调整一个稳定滤波器的参数,实现对参考轨迹的精确跟踪。当患者施加的力矩超过阈值时,外层的调节器会自动将参考轨迹向患者期望方向偏移,偏移量与患者力矩积分成正比。在一台下肢康复机器人样机上测试,患者从完全被动到完全主动的过渡平滑,跟踪误差始终小于±1.5°,且无震荡。与传统PID相比,Youla-Kucera调节器使主动模式下的能量消耗(患者做功与机器人做功之比)降低了40%。
(3)基于人机相互作用力的跑步机速度跟随协调控制:
为保证患者在跑步机上步行时的安全性,设计一个跑步机速度协调控制器。该控制器由一个力传感器(安装在腰部支撑带)检测患者与机器人之间的前后方向相互作用力。采用一个带有加速度抑制模块的PI控制器:目标速度增量 = Kp * F_int + Ki * ∫F_int dt,其中F_int为相互作用力。加速度抑制模块监控速度变化率,当加速度超过1.5 m/s²时,自动降低比例增益,防止患者因速度突变而摔倒。同时,引入一个基于卡尔曼滤波的步态相位检测器,仅在支撑相末期允许速度增加,摆动相禁止加速。在实验验证中,患者可以自由控制跑步机速度在0.5-1.5 m/s范围内连续变化,速度波动小于0.05 m/s,且未发生任何失稳事件。
import numpy as np from scipy.signal import cont2discrete import cvxpy as cp class InverseDecoupling: def __init__(self, G): # G is 4x4 transfer matrix self.G = G self.decoupled = None def design(self): # compute decoupling matrix D = G^{-1} at nominal frequency G0 = self.G(0.5) # evaluate at 0.5 Hz self.D = np.linalg.inv(G0) return self.D class ImpedanceAdaptive: def __init__(self, M=5.0, B=20.0, K=100.0): self.M = M self.B = B self.K = K def update_by_emg(self, emg_level): # emg_level from 0 to 1 self.B = 20.0 * (1 - 0.8 * emg_level) self.K = 100.0 * (1 - 0.3 * emg_level) def compute_force(self, x_ref, x, xd_ref, xd, xdd_ref, xdd): # F = M*(xdd_ref-xdd) + B*(xd_ref-xd) + K*(x_ref-x) return self.M*(xdd_ref-xdd) + self.B*(xd_ref-xd) + self.K*(x_ref-x) class RobustPID: def __init__(self, sys_nominal, delta=0.2): # sys_nominal: state-space model self.A, self.B = sys_nominal self.delta = delta self.Kp, self.Ki, self.Kd = self.optimize_lmi() def optimize_lmi(self): # solve LMI for robust PID (simplified using cvxpy) K = cp.Variable(3) # placeholders for stability constraints constraints = [] prob = cp.Problem(cp.Minimize(1), constraints) prob.solve(solver=cp.SCS) return K.value class YoulaKuceraAdaptive: def __init__(self, Q_init): self.Q = Q_init # stable filter def adapt(self, y, r, u, torque_patient): if np.abs(torque_patient) > 5.0: # modify reference trajectory r_new = r + 0.001 * torque_patient # update Q using recursive least squares self.Q = self.Q + 0.01 * (y - r_new) * np.sign(u) return self.Q class TreadmillCoordinator: def __init__(self, Kp=0.5, Ki=0.1, amax=1.5): self.Kp, self.Ki, self.amax = Kp, Ki, amax self.integral = 0.0 self.v_prev = 0.0 def compute(self, F_int, dt, stance_phase): if not stance_phase: return self.v_prev # no speed change in swing err = F_int self.integral += err * dt v_cmd = self.v_prev + self.Kp * err + self.Ki * self.integral # acceleration limiting a = (v_cmd - self.v_prev) / dt if np.abs(a) > self.amax: v_cmd = self.v_prev + np.sign(a) * self.amax * dt self.v_prev = v_cmd return np.clip(v_cmd, 0.5, 1.5)