博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。


(1)自适应权值粒子群优化的NURBS轨迹平滑插值:

针对Delta并联机器人门型轨迹直角过渡导致的加速度突变问题,采用三次NURBS曲线对路径关键点进行插值,将控制点和权重作为优化变量。提出自适应权值粒子群算法(AW-PSO),其惯性权重根据粒子群多样性动态调整:当种群平均适应度方差低于阈值0.08时,权重从0.9非线性衰减至0.4,并引入交叉变异操作以避免早熟。适应度函数融合了轨迹总运动时间、主动臂关节力矩均方根和末端加速度峰值。在优化过程中,NURBS权重的搜索空间被限制在0.3至3.0之间,以保证曲线形态的光滑性。对一碗抓放动作进行了优化,结果使轨迹周期由0.48秒缩短至0.39秒,主动臂最大驱动角速度降低11.7%,且末端残余振动幅值下降约22%。轨迹数据随后被离散为200个等时间间隔点,通过逆运动学解算关节空间指令,作为前馈控制输入。

(2)基于改进蜣螂优化算法的二次轨迹时间最优规划:

在AW-PSO获得理想几何路径后,进一步采用改进蜣螂优化算法(IDBO)对沿路径的关节速度分配进行时间最优规划。原始DBO算法中的滚球蜣螂位置更新引入了莱维飞行扰动,以增强逃脱局部最优的能力;繁育蜣螂的边界收缩策略改为自适应边界,根据当前最优解邻域密度动态缩放。以关节速度、加速度和二阶加速度约束为硬约束,构建了以总时间最小为目标的最优控制问题,通过IDBO直接搜索各路径点的时间间隔矢量。对主动臂和从动臂的驱动扭矩进行计算时,使用了回归获得的简化动力学模型,将计算耗时降低了约62%。仿真对比显示,IDBO优化后整段轨迹的执行时间从0.39秒进一步压缩至0.33秒,驱动总能耗由18.6焦下降至15.2焦。同时,雅可比矩阵条件数监测表明,全路径无奇异位形出现。

(3)Simulink-Simscape联合物理仿真与抓取成功率验证:

在Matlab/Simulink环境中搭建了包含电机模型、减速器间隙和柔性连杆的Delta机器人物理仿真模型,集成了AW-PSO路径与IDBO时间规划模块。设计了10种不同起始和目标位置的抓取测试场景,覆盖工作空间中心与边缘。仿真结果表明,在所有场景下末端重复定位误差均小于0.12毫米,轨迹跟踪延迟约4.8毫秒。基于该控制框架在实际控制器样机中部署,对亚克力薄片进行抓取实验,100次抓取成功率达到97%,平均单次抓取周期0.41秒,验证了联合优化策略的实用性和可靠性。

import numpy as np
from scipy.interpolate import splev
import random

# 自适应权值粒子群优化 (AW-PSO) for NURBS
class AW_PSO_NURBS:
    def __init__(self, n_particles=30, n_cp=5):
        self.n_particles = n_particles
        self.pos = np.random.uniform(0.3, 3.0, (n_particles, n_cp))  # 权重
        self.vel = np.zeros_like(self.pos)
        self.pbest_pos = self.pos.copy()
        self.pbest_cost = np.full(n_particles, np.inf)
        self.gbest_pos = self.pos[0]
        self.gbest_cost = np.inf
        self.w = 0.9
    
    def evaluate(self, weights):
        # 权重评估:生成NURBS轨迹,计算机械臂运动时间、力矩等
        # 简化示意
        time_cost = 0.5 * np.mean(weights)  # 伪计算
        torque_cost = 0.3 * np.std(weights)
        return time_cost + torque_cost
    
    def step(self):
        diversity = np.std(self.pos)
        if diversity < 0.08:
            self.w = max(0.4, self.w * 0.95)  # 动态调整
            # 交叉变异
            idx = random.randrange(self.n_particles)
            self.pos[idx] += np.random.normal(0, 0.1, self.pos.shape[1])
        else:
            self.w = 0.9
        r1, r2 = np.random.rand(2), np.random.rand(2)
        self.vel = (self.w * self.vel + 
                    1.5 * r1 * (self.pbest_pos - self.pos) +
                    1.5 * r2 * (self.gbest_pos - self.pos))
        self.pos += self.vel
        self.pos = np.clip(self.pos, 0.3, 3.0)
        for i in range(self.n_particles):
            cost = self.evaluate(self.pos[i])
            if cost < self.pbest_cost[i]:
                self.pbest_cost[i] = cost
                self.pbest_pos[i] = self.pos[i]
            if cost < self.gbest_cost:
                self.gbest_cost = cost
                self.gbest_pos = self.pos[i]

# 改进蜣螂优化算法 IDBO 时间最优
def idbo_time_opt(path_points, max_iter=100):
    n_points = len(path_points)
    times = np.ones(n_points) * 0.01
    # 莱维飞行扰动
    def levy_flight(scale=0.1):
        return scale * np.random.standard_cauchy(size=n_points)
    best_times = times.copy(); best_cost = np.inf
    for it in range(max_iter):
        # 滚球蜣螂更新
        times = times + levy_flight(0.05)
        times = np.clip(times, 0.005, 0.05)
        # 评估约束(加速度、扭矩等简化)
        acc = np.diff(np.diff(times))
        if np.any(np.abs(acc) > 0.1): continue
        total_time = np.sum(times)
        if total_time < best_cost:
            best_cost = total_time
            best_times = times.copy()
    return best_times, best_cost

# 联合使用
pso = AW_PSO_NURBS()
for _ in range(50): pso.step()
best_weights = pso.gbest_pos
# 生成NURBS路径点...(略)
path_pts = np.linspace(0, 1, 200)  # 示例
opt_times, total_time = idbo_time_opt(path_pts)


如有问题,可以直接沟通

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐