08-障碍物检测与避障逻辑:视觉辅助安全运动

📅 2026/8/11 0:24:43
08-障碍物检测与避障逻辑:视觉辅助安全运动
障碍物检测与避障逻辑:视觉辅助安全运动作者:黒漂技术佬场景:工控产线人机协作、无人售货柜内部维护、机械臂共享工作空间一、机械臂撞了,赔的不止是钱机械臂不是玩具。一台工业六轴机械臂以最高速度运动时,末端动能足以砸碎摄像头、撞变形铝型材、甚至伤到人。在工控和协作场景中,安全运动比"抓得准"优先级更高。无人售货柜内部空间狭小,货架、玻璃门、补货口都是硬障碍。机械臂在里面转身,稍不留神就"哐"一声。所以这一篇不讲怎么抓,讲怎么不撞。二、障碍物检测:用YOLO找"别碰的东西"前面几篇用YOLO检测抓取目标,这里换个思路:同时检测障碍物。# 模型同时输出"目标"和"障碍物"两类results=model(frame,verbose=False)targets=[]obstacles=[]forboxinresults[0].boxes:cls=int(box.cls[0])x1,y1,x2,y2=box.xyxy[0].tolist()ifcls==0:# 抓取目标targets.append((x1,y1,x2,y2))elifcls==1:# 障碍物(人手、工具、异物)obstacles.append((x1,y1,x2,y2))为什么要单独训练障碍物类?通用YOLO模型不认识"售货柜里的用户手伸进来了"。你得自己采数据训练,把"手"“杯子”"工具"等标成障碍物。如果不想训练,也可以用运动检测兜底——两帧做差分,画面中有动的东西就报警:defdetect_motion(prev_frame,curr_frame,threshold=25):"""帧差法检测运动物体,作为障碍物检测的兜底"""diff=cv2.absdiff(prev_frame,curr_frame)gray=cv2.cvtColor(diff,cv2.COLOR_BGR2GRAY)_,mask=cv2.threshold(gray,threshold,255,cv2.THRESH_BINARY)contours,_=cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)motion_boxes=[cv2.boundingRect(c)forcincontoursifcv2.contourArea(c)500]returnmotion_boxes帧差法简单粗暴但有效,适合人手突然伸入这种突发场景。三、工作空间划分:把安全量化光知道障碍物在哪不够,得把空间分层管理,每层有不同的响应策略。┌─────────────────────────────────┐ │ 自由区 (200mm) │ 正常运动 │ ┌───────────────────────────┐ │ │ │ 安全区 (100~200mm) │ │ 减速运动 │ │ ┌─────────────────────┐ │ │ │ │ │ 警告区 (50~100mm) │ │ │ 大幅减速+告警 │ │ │ ┌───────────────┐ │ │ │ │ │ │ │ 危险区 (50mm) │ │ │ │ 立即急停 │ │ │ └───────────────┘ │ │ │ │ │ └─────────────────────┘ │ │ │ └───────────────────────────┘ │ └─────────────────────────────────┘importnumpyasnpclassSafetyZone:SAFE=200# mmWARN=100# mmDANGER=50# mm@classmethoddefevaluate(cls,distance):"""根据末端到障碍物的距离返回安全等级"""ifdistancecls.DANGER:return"DANGER"elifdistancecls.WARN:return"WARN"elifdistancecls.SAFE:return"SAFE"return"FREE"@classmethod