多层多道轨迹实现

[复制链接]
查看143 | 回复0 | 2024-9-25 13:50:12 | 显示全部楼层 |阅读模式

1. 焊接等工艺中,希望在原有轨迹上,进行偏移(注:是沿着轨迹前进方向偏移),即为多层多道工艺。

2. 使用多层多道时,通常会配合电弧跟踪,即第一道焊缝由于变形等问题,轨迹会偏差。实际走轨迹时,通过电弧跟踪,修正轨迹到工件实际。在第一道焊缝执行时,可以将实际纠偏后的轨迹记录下来。

   由于第一层已经填平角焊缝,第二层不方便再进行电弧跟踪。第二层的偏移可以基于第一层实际记录的轨迹进行偏移。

3. 轨迹偏移有以下几个方面需要注意:

1)轨迹需要基于路径坐标系。路径坐标系定义如下:

根据以上定义,基于第一道轨迹记录的若干点(例如采用0.2s等定时中断记录),可以创建每一个点的路径坐标系(假设点与点之间比较接近):

假设记录的点是上图的p10,p11和p12。则p10的路径坐标系如图上的path,若沿着y修正,是沿着path.y进行修正。对于p11同理。

FUNC pose calPathFrame(robtarget P,robtarget NextP)   ! 基于当前点和下一个点,创建当前点的path坐标系    VAR pose pe;    VAR robtarget ptmp;    ptmp:=reltool(p,0,0,100);    pe:=defframe(p,nextP,ptmp);    ptmp.trans:=pe.trans;    ptmp.rot:=pe.rot;    ptmp:=reltool(ptmp,0,0,0\Rx:=90);    RETURN [ptmp.trans,ptmp.rot];ENDFUNC

2) 对于拐角轨迹,尤其拐弯角度大于90°,需要抛弃拐角点,否则会出现下图情况:

     即点3,4,5出现大幅拐弯情况,若4点在路径坐标系(该点路径坐标系的x为4指向5,y方向为垂直x)的y方向进行偏移,会出现偏移后的点出现异常情况。

      对于此类情况,可以计算3-4之间向量和4-5之间的向量夹角并进行判断和去除点。
Frame:=calPathFrame(storeTarget{i},storeTarget{i+1}); ! 获取当前点的路径坐标系p0:=targetInFrame(storeTarget{i},Frame);! compare next point and next next point in path Frame! in case next next point is turn around more than 80 degp1:=targetInFrame(storeTarget{i+1},Frame);p2:=targetInFrame(storeTarget{i+2},Frame);vec1:=p1.trans-p0.trans;vec2:=p2.trans-p1.trans;IF calangle(vec1,vec2)>80 THEN    ! 比较当前点和下一个点,下一个点到再下一个点的向量夹角    ! path turn around more than 80 deg    ! delete point in cornerENDWHILE
机器人完整代码如下:
PERSmpData mdata1:=[2,0]; !y和z的偏移PROC main()    MoveL Target_10,v100,fine,MyTool\WObj:=wobj0;    MpIni;    ! 开始记录轨迹    MoveC Target_20,Target_30,v20,z1,MyTool\WObj:=wobj0;    MoveL Target_40,v20,z1,MyTool\WObj:=wobj0;    MoveC Target_50,Target_60,v20,z1,MyTool\WObj:=wobj0;    MoveL Target_70,v20,fine,MyTool\WObj:=wobj0;    MpEnd;    ! 停止记录    MoveL Target_10,v100,fine,MyTool\WObj:=wobj0;    MPMove mdata1,v20,MyTool;ENDPROC
MODULE mpModuleRECORD mpData    num y;    num z;ENDRECORD
VAR intnum intmp;PERS robtarget storeTarget{1000};PERS num mpStoreCount:=98;
TRAP trMp storeTarget{mpStoreCount}:=CRobT(); Incr mpStoreCount;ENDTRAP
PROC MpIni()    ! 初始化,开始记录原始轨迹 mpStoreCount:=1; IDelete intMp; CONNECT intMp WITH trMp; ITimer 0.2,intMp;ENDPROC
PROC MpEnd() IDelete intMp; storeTarget{mpStoreCount}:=CRobT();ENDPROC
PROC MPMove(mpdata mdata,speeddata v,inout tooldata t\inout wobjdata wobj) VAR robtarget p0; VAR robtarget p1; VAR robtarget p2; VAR robtarget p; VAR pose Frame; VAR pos vec1; VAR pos vec2;    VAR num i:=1; WHILE i<mpStoreCount-1 DO Frame:=calPathFrame(storeTarget{i},storeTarget{i+1}); p0:=targetInFrame(storeTarget{i},Frame); p:=calNewTarget(p0,Frame,mdata);        MoveL p,v,z1,t\WObj?wobj;      ! compare next point and next next point in path Frame ! in case next next point is turn around more than 80 deg p1:=targetInFrame(storeTarget{i+1},Frame); p2:=targetInFrame(storeTarget{i+2},Frame); vec1:=p1.trans-p0.trans; vec2:=p2.trans-p1.trans; IF calangle(vec1,vec2)>80 THEN ! path turn around more than 90 deg ! delete point in corner i:=i+2; ELSE i:=i+1; ENDIF ENDWHILE p:=calNewTarget(p1,Frame,mdata1); MoveL p,v,z1,t\WObj?wobj; p:=calNewTarget(p2,Frame,mdata1); MoveL p,v,fine,t\WObj?wobj; close iodev2;ENDPROC
FUNC pos vectNorm(pos p) VAR num mag; VAR pos p1; mag:=vectmagn(p); p1.x:=p.x/mag; p1.y:=p.y/mag; p1.z:=p.z/mag; RETURN p1;ENDFUNC
FUNC num calAngle(pos p1,pos p2) ! cal two vector angle VAR num angle; p1:=vectNorm(p1); p2:=vectNorm(p2); angle:=acos(dotprod(p1,p2)); RETURN angle;ENDFUNC
FUNC robtarget targetInFrame(robtarget p,pose Frame) ! p is in the wobj, calculate p in Frame VAR pose p1; VAR pose p2; VAR robtarget pOut; pOut:=p; p1:=[p.trans,p.rot]; p2:=posemult(poseinv(frame),p1); pOut.trans:=p2.trans; pOut.rot:=p2.rot; RETURN pOut;ENDFUNC
FUNC robtarget calNewTarget(robtarget p,pose Frame,mpdata m) ! p_data is in Frame ! transfer p_data to workwobj VAR pose p1; VAR robtarget pOut; pOut:=p; p1:=[p.trans,p.rot]; p1.trans.y:=p1.trans.y+m.y; p1.trans.z:=p1.trans.y+m.z; p1:=posemult(frame,p1); pOut.trans:=p1.trans; pOut.rot:=p1.rot; RETURN pOut;ENDFUNC
FUNC pose calPathFrame(robtarget P,robtarget NextP) VAR pose pe; VAR robtarget ptmp; ptmp:=reltool(p,0,0,100); pe:=defframe(p,nextP,ptmp); ptmp.trans:=pe.trans; ptmp.rot:=pe.rot; ptmp:=reltool(ptmp,0,0,0\Rx:=90); RETURN [ptmp.trans,ptmp.rot];ENDFUNCENDMODULE

********************************

如何获取更多经典文章?

关注公众号 ABB机器人实战技巧,点击页面底部的往期经典配置,查看更多经典内容 


点击阅读原文,学习robotstudio仿真,获取完整教学视频

更多内容

★ 如何搜索历史文章

基于pcsdk传输文件到HOME及加载

通过总线发送实数及负整数

★使用定时中断向PLC发送机器人位置

★信号的准确提早触发

★变位机校准

★ABB机器人零位校准的那些秘密

★创建UDP通讯

★旋转姿态的左乘与右乘

通过socket控制机器人启停

上位机仪表盘实时显示机器人速度

机器人画哆啦A梦

上位机实时控制机器人运动之EGM

Python控制ABB机器人运动

通过Excel批量修改EIO文件

带连杆的机器人正运动学计算

制作四连杆机构

机器人PROFINET同时做CONTROLLER和DEVICE

语音控制ABB机器人

★手机访问web控制机器人

★自定义伺服焊枪

★制作输送链抓取搬运码垛工作站

★随机物料产生与抓取

四轴机器人定义TCP

★自定义外部轴-变位机

示教四点完成码垛

★multimove之双机器人与变位机

Robotware6.08碰撞预测启用与关闭

SMB板针脚解释

四六关节耦合限制

求两点间距离

新I/O DSQC1030配置

ABB机器人配置伺服焊枪

转角路径故障不提示设置

外部PLC选择机器人程序

一键回HOME程序

机器人各轴上下限位修改

Wobjdata数据解释

输送链跟踪与视觉的联系

急停与自动停止接线


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则