news 2026/5/8 15:38:52

双工业机器人避障路径规划碰撞检测【附代码】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
双工业机器人避障路径规划碰撞检测【附代码】

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


(1)MSDT碰撞检测方法:

基于Minkowski Sum与对偶三角形。将工业机器人的每个连杆简化为三角形或四边形,取三个顶点形成主三角形。然后根据连杆轴线构建对偶三角形,对偶三角形由背离原三角形的法向偏移得到。将两个对偶三角形向障碍物(球体或长方体)进行Minkowski Sum膨胀,使得机器人与障碍物间的碰撞检测转化为膨胀体间的距离计算。具体而言,对于球体障碍物,膨胀体为三角形偏移半径;对于另一台机器人的连杆包络长方体,膨胀后为三角形与长方体的Minkowski和。碰撞条件简化为检查膨胀三角形是否包含原点或线段相交。在KUKA和ABB双机器人场景中,节点检测耗时从传统网格方法的每次0.12秒降至0.03秒,效率提升75%。

(2)非线性惯性权重粒子群算法NIW-PSO路径规划:

在关节空间中离散化6个关节的角度序列构成粒子,粒子维度为6×T,T为路径分段数。适应度函数融合路径总长度、与障碍物的MSDT碰撞惩罚以及关节速度变化率平滑项。将惯性权重w设为余弦函数形式w(t)=0.9-0.5(1+cos(πt/Tmax)),初期权重较大以利于全局搜索,后期权重较小以加速收敛。每次迭代中对粒子进行MSDT快速碰撞检测,若碰撞则施加高惩罚值。在双机器人齿轮轴搬运任务中,NIW-PSO在70代内收敛到无碰撞路径,而传统PSO需120代。规划路径成功实现双机从抓取点到放置点的无碰撞协调运动。

(3)紧约束闭环运动链协调与ROS实验验证:

针对双机器人共同搬运同一工件的紧约束条件,建立主从运动学约束方程,主机器人运动轨迹由任务指定,从机器人通过闭环链关系实时解算。利用MSDT检测双机之间可能的碰撞,在迭代过程中排查。基于ROS开发双机器人路径规划软件,提供交互式任务设置界面。在真实KUKA KR6和ABB IRB120实验平台上,设计了从料仓取齿轮轴并搬运至组装台的示范场景,NIW-PSO规划的无碰撞路径使双机总运行时间较手动示教缩短27%。

import numpy as np from scipy.spatial import distance # 对偶三角形与Minkowski和碰撞检测 def dual_triangle(pts): # pts: 3x3 三角形顶点 center = pts.mean(axis=0) dual_pts = pts + (pts - center) # 对偶翻倍 return dual_pts def triangle_sphere_minkowski_sum(tri, sphere_radius): # 膨胀为检查三角形每个边偏移球半径 expanded = [] for i in range(3): edge = tri[(i+1)%3] - tri[i] normal = np.array([-edge[1], edge[0], 0]) # 2D情况 normal = normal / np.linalg.norm(normal) * sphere_radius expanded.append(tri[i] + normal) return np.array(expanded) def check_collision(tri, obs_sphere_center, radius): # 基于MSDT检测碰撞 expanded_tri = triangle_sphere_minkowski_sum(tri, radius) # 检查原点是否在膨胀三角形内(平移至obs_sphere_center) # 采用重心坐标法 def point_in_triangle(pt, v1, v2, v3): d1 = (pt[0]-v2[0])*(v1[1]-v2[1]) - (pt[1]-v2[1])*(v1[0]-v2[0]) d2 = (pt[0]-v3[0])*(v2[1]-v3[1]) - (pt[1]-v3[1])*(v2[0]-v3[0]) d3 = (pt[0]-v1[0])*(v3[1]-v1[1]) - (pt[1]-v1[1])*(v3[0]-v1[0]) return (d1>0 and d2>0 and d3>0) or (d1<0 and d2<0 and d3<0) for i in range(3): if point_in_triangle(obs_sphere_center, expanded_tri[i], expanded_tri[(i+1)%3], tri[i]): return True return False # NIW-PSO算法 def niw_pso(cost_func, dim, bounds, max_iter=100, pop_size=50): w_max, w_min = 0.9, 0.4 c1, c2 = 2.0, 2.0 pos = np.random.uniform(bounds[:,0], bounds[:,1], (pop_size, dim)) vel = np.random.uniform(-1,1, (pop_size, dim)) pbest = pos.copy() pbest_cost = np.array([cost_func(p) for p in pos]) gbest = pbest[np.argmin(pbest_cost)] gbest_cost = min(pbest_cost) for t in range(max_iter): w = w_max - (w_max - w_min) * (1 + np.cos(np.pi * t / max_iter)) / 2.0 for i in range(pop_size): r1, r2 = np.random.rand(dim), np.random.rand(dim) vel[i] = w*vel[i] + c1*r1*(pbest[i]-pos[i]) + c2*r2*(gbest-pos[i]) pos[i] += vel[i] pos[i] = np.clip(pos[i], bounds[:,0], bounds[:,1]) cost = cost_func(pos[i]) if cost < pbest_cost[i]: pbest[i] = pos[i]; pbest_cost[i] = cost if cost < gbest_cost: gbest = pos[i]; gbest_cost = cost return gbest, gbest_cost # 示例适应度函数(含碰撞惩罚) def fitness_dual_robot(x): # 解码为关节序列、正运动学计算连杆位置、调用MSDT collision = check_collision(np.random.rand(3,2), np.array([0.5,0.5]), 0.1) penalty = 1000 if collision else 0 return np.linalg.norm(x) + penalty


如有问题,可以直接沟通

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 15:38:43

STM32 SSD1306 OLED驱动终极指南:5个常见问题与完整解决方案

STM32 SSD1306 OLED驱动终极指南&#xff1a;5个常见问题与完整解决方案 【免费下载链接】stm32-ssd1306 STM32 library for working with OLEDs based on SSD1306, SH1106, SH1107 and SSD1309, supports I2C and SPI 项目地址: https://gitcode.com/gh_mirrors/st/stm32-ss…

作者头像 李华
网站建设 2026/5/8 15:35:52

输入法词库转换终极指南:如何轻松迁移20+输入法个人词库

输入法词库转换终极指南&#xff1a;如何轻松迁移20输入法个人词库 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为更换输入法而苦恼吗&#xff1f;每次更换输…

作者头像 李华