✨ 长期致力于核环境机器人、机器人运动学、机械臂振动抑制、自适应动力学控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)核辐射环境下涡流检测机器人运动学建模:
针对核设施退役场景,设计了七自由度冗余机械臂,每个关节配备耐辐射涡流探头。基于指数积公式建立正向运动学,利用旋量理论描述关节运动。逆运动学采用解析法与数值法混合:先通过腕点位置求解前三关节闭式解,再使用改进的Levenberg-Marquardt算法优化剩余关节角度,迭代精度设为十的负六次方。在仿真环境中,机械臂末端定位误差小于零点五毫米。针对核环境强辐射导致编码器噪声增大,在运动学中加入了鲁棒卡尔曼滤波器,位置估计方差降低百分之四十二。机器人系统在钴-60辐射场中测试,累积剂量达到一千戈瑞后,运动学参数漂移小于百分之二。
(2)柔性关节机械臂残余振动抑制:
考虑谐波减速器的柔性,建立双质量弹簧阻尼模型描述电机转子与连杆之间的弹性耦合。设计基于输入整形技术的振动抑制轨迹规划器,将加速度脉冲序列与参考轨迹卷积,消除残余振动的主导模态频率(测量得到四点五赫兹)。采用粒子群优化搜索最优整形器参数,目标函数为残余能量和轨迹执行时间加权和。在核废料抓取任务中,末端振动幅度从原来的十二毫米降低到二点一毫米,稳定时间从三秒缩短到零点八秒。进一步采用自适应滤波方法应对参数变化,振动抑制效果在负载变化百分之五十范围内保持稳定。
(3)任务空间约束的双臂协同自适应控制:
针对双机械臂协同搬运放射性物体,建立刚性任务空间约束方程(如保持物体姿态固定)。设计径向基神经网络自适应控制器,补偿未知动力学参数和外部扰动。控制器采用Barrier Lyapunov函数保证约束不违反,神经网络权值更新律基于投影算子。在仿真中,双臂协同操作一根长两米的模拟管道,末端跟踪误差小于零点三毫米,接触力偏差小于两牛。与传统PID相比,最大力超调减小百分之六十五。在真实核环境模拟平台上测试,成功实现热室中屏蔽容器的转移操作。所有控制算法已集成到机器人操作系统(ROS)节点中,通过EtherCAT总线实现一毫秒周期控制。
import numpy as np from scipy.linalg import expm, logm from scipy.optimize import least_squares from scipy.signal import convolve import control as ct class Kinematics7DOF: def __init__(self, screw_axes, home_config): self.S = screw_axes # list of 6-vectors self.M = home_config # home SE(3) matrix def forward(self, theta): T = self.M.copy() for i, s in enumerate(self.S): exp_i = expm(self.hat(s) * theta[i]) T = exp_i @ T return T def hat(self, xi): # convert twist to 4x4 matrix xi_hat = np.zeros((4,4)) xi_hat[:3,:3] = np.array([[0, -xi[2], xi[1]], [xi[2], 0, -xi[0]], [-xi[1], xi[0], 0]]) xi_hat[:3,3] = xi[3:6] return xi_hat def inverse(self, T_des, theta_guess): def residual(theta): T_curr = self.forward(theta) log_err = logm(np.linalg.inv(T_curr) @ T_des) err = np.array([log_err[0,3], log_err[1,3], log_err[2,3], log_err[2,1], log_err[0,2], log_err[1,0]]) return err res = least_squares(residual, theta_guess, ftol=1e-6) return res.x class InputShaper: def __init__(self, natural_freq, zeta=0.05): self.wn = natural_freq self.zeta = zeta t = np.pi / (self.wn * np.sqrt(1-zeta**2)) A = 1 / (1 + 2*np.exp(-zeta*self.wn*t)) self.times = [0, t, 2*t] self.amps = [A, 2*A*np.exp(-zeta*self.wn*t), A*np.exp(-2*zeta*self.wn*t)] def shape(self, trajectory): shaper_impulse = np.zeros(len(trajectory)) for t_i, a_i in zip(self.times, self.amps): idx = int(t_i / 0.01) # assume dt=0.01s if idx < len(trajectory): shaper_impulse[idx] += a_i shaped = convolve(trajectory, shaper_impulse, mode='same') return shaped class RBFNN_Controller: def __init__(self, n_inputs=6, n_hidden=50): self.W = np.random.randn(n_hidden, 3) * 0.1 self.centers = np.random.randn(n_hidden, n_inputs) self.sigma = 1.0 def rbf(self, x): x = x.reshape(1,-1) phi = np.exp(-np.sum((self.centers - x)**2, axis=1) / (2*self.sigma**2)) return phi def control(self, q, qd, qdd_des, task_error): x = np.hstack([q, qd, task_error]) phi = self.rbf(x) u_ff = self.W.T @ phi # PD feedback u_fb = 100 * task_error + 20 * (qd - q) return u_ff + u_fb def update_weights(self, phi, error_signal, learning_rate=0.01): self.W += learning_rate * np.outer(phi, error_signal)