✨ 长期致力于协作机器人、零力矩控制、摩擦力、参数辨识、碰撞检测研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)高功率密度模块化关节及动力学参数辨识:
设计了一种新型机电一体化关节,集成了无框直驱电机、谐波减速机和柔性制动机构。关节外径80mm,长度65mm,峰值扭矩120Nm,功率密度达到每公斤280瓦。采用最小二乘法对关节的摩擦力参数进行辨识,设计低速动态平衡实验:让关节以不同恒定速度(0.1到10度/秒)运转,测量对应的驱动力矩,拟合得到库伦摩擦力矩为0.8Nm,黏滞摩擦系数为0.05Nms/rad。同时通过正反方向运动辨识出重力矩系数。辨识得到完整的动力学模型包含惯性项、科里奥利项、重力项和摩擦力项。在六轴协作机器人上验证,模型预测力矩与实际驱动力矩的误差标准差为0.12Nm,模型精度达到96%。
(2)基于力矩补偿的零力控制算法实现:
在动力学模型基础上,提出一种带摩擦前馈的零力矩控制算法。算法计算当前机器人位姿下的重力矩,加上辨识得到的库伦摩擦和黏滞摩擦补偿力矩,得到前馈指令。同时加入一个阻尼项以改善拖动柔顺性,阻尼系数设为0.1。控制周期为1kHz。在实际机器人上进行拖动示教实验,外力传感器实测拖动所需力:在空载状态下,各方向所需力均小于2牛。与传统仅补偿重力的方法相比,启动时的静摩擦力被消除,启动所需力从12牛降低到2.5牛。匀速拖动时的阻力波动从3牛降低到0.8牛。操作者主观评价拖动平滑度评分从3.2分提升到4.7分(5分制)。算法还包含一个自适应更新模块,当机器人负载变化时,通过检测末端外力自动更新重力矩系数,无需重新辨识。
(3)基于双编码器的低成本碰撞检测方法:
利用谐波减速机的柔性特性,在电机侧和输出侧分别安装编码器,实时计算位置误差Δθ。当外力碰撞导致输出端位置滞后于电机端时,Δθ会瞬时增大。设定碰撞检测阈值Δθ_th=0.5度,且持续时间超过5毫秒即判定为碰撞。在机器人以0.5m/s速度运动时,人为施加20牛碰撞力,Δθ在碰撞后3毫秒内达到0.8度,触发检测。与基于广义动量观测器的碰撞检测方法相比,双编码器方法的检测延迟更短(5ms vs 12ms),且无需精确动力学模型。检测到碰撞后,根据应用场景选择三种反应策略:振荡模式(关节正反向摆动以卸力)、零力矩响应模式(切换到零力控制被动顺应)、被迫停止模式(立即制动并保持位置)。在装配场景中,采用零力矩响应模式,机器人在碰撞后0.1秒内将接触力减小到5牛以下。该方法已在6自由度协作机器人上实现,硬件成本仅增加两个编码器(约30美元),无需额外力矩传感器。
import numpy as np from scipy.optimize import least_squares class JointDynamics: def __init__(self, inertia=0.5, gravity_coeff=0.3): self.J = inertia # 转动惯量 self.G = gravity_coeff # 重力系数 self.fc = 0.8 # 库伦摩擦 self.fv = 0.05 # 黏滞摩擦 def torque(self, q, dq, ddq): # 简化动力学模型 inertia_term = self.J * ddq coriolis = 0.1 * dq**2 gravity = self.G * np.sin(q) friction = self.fc * np.sign(dq) + self.fv * dq return inertia_term + coriolis + gravity + friction def friction_identification(velocities, torques): # 最小二乘辨识库伦+黏滞摩擦 def model(params, v): fc, fv = params return fc * np.sign(v) + fv * v def residual(params, v, t): return model(params, v) - t res = least_squares(residual, [0.5, 0.05], args=(velocities, torques)) return res.x class ZeroMomentControl: def __init__(self, dynamics): self.dyn = dynamics self.damping = 0.1 def compute_torque(self, q, dq, ddq_desired=0): gravity = self.dyn.G * np.sin(q) friction = self.dyn.fc * np.sign(dq) + self.dyn.fv * dq ff = gravity + friction # 阻尼反馈 damping_term = -self.damping * dq return ff + damping_term class DualEncoderCollisionDetector: def __init__(self, threshold_deg=0.5): self.threshold_rad = np.deg2rad(threshold_deg) self.counter = 0 def update(self, motor_angle, output_angle): delta = motor_angle - output_angle if abs(delta) > self.threshold_rad: self.counter += 1 if self.counter > 5: # 持续5ms (假设1ms采样) return True else: self.counter = 0 return False if __name__ == '__main__': # 摩擦力辨识测试 v_test = np.linspace(-1, 1, 100) t_true = 0.8*np.sign(v_test) + 0.05*v_test identified = friction_identification(v_test, t_true) print('辨识出的摩擦参数 fc, fv:', identified) # 零力控制测试 dyn = JointDynamics() zmp = ZeroMomentControl(dyn) q_test = 0.5 dq_test = 0.2 tau = zmp.compute_torque(q_test, dq_test) print('零力矩控制输出扭矩:', tau) # 碰撞检测 detector = DualEncoderCollisionDetector(threshold_deg=0.5) collision = detector.update(motor_angle=1.0, output_angle=0.3) # delta=0.7 rad > threshold print('碰撞检测触发:', collision)