大家一起支持原创,推动机器人使用和发展本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言 本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言
在机器人示教器手动操纵界面,有一个“对准”按钮(所有版本RW均有)。其功能是,可以让机器人当前的TCP可以快速/就近和一个坐标系对齐(通常就是TCP的z和坐标系的z平行),这样能快速调整姿态。 在3D视觉引导等项目中,目标点为3D相机给出。为避免路径上奇异或者机器人旋转过大导致线缆缠绕,放置/抓取 产品目标点的前几个准备点,姿态的z最好能先和坐标系的z对齐,减少过程中姿态的调整(前置点如果姿态和目标点完全一致,有时候会导致不可达)。示教器只提供了手动模式“对准”的功能,未提供“对准”函数让用户使用。本文研究并实现了“对准”功能,测试结果与示教器的“对准”功能一致(本文仅实现了目标点的z方向就近对准参考坐标系的z+/z-负方向,实际示教器的“对准”还有目标点的z就近对准xy平面等,留待读者自行研究) “对准”功能,本质就是将上左图的坐标系A的z方向,要和坐标系B的z方向一致(或者相反),最终坐标系A的xy平面与坐标系B的xy平面平行(坐标系A的x无需和坐标系B的x一致)。坐标系A的z方向(可以将坐标系A的姿态数据转化为旋转矩阵,最后一列即为z方向的单位向量)实质为一个单位向量,坐标系B的z方向也为一个单位向量。可以利用向量的点乘,得到单位向量Az和单位向量Bz的夹角。利用单位向量Az 叉乘单位向量Bz,可以得到垂直于平面AzOBz的向量cross,也就是向量Az绕着cross旋转了Θ°后,到达了Bz。以上这段也就是轴角(旋转矢量)的定义。关于旋转矢量,可以参考以下链接:也就是坐标系A经过变换,坐标系A的z与坐标系B的z对齐。CONSTrobtarget p105:=[[825.0002,1.074095E-06,987.0695],[0.06004369,0.4615303,-0.8591881,-0.2125564],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget p106:=[[825.0001,3.335122E-30,987.0701],[2.208061E-08,-0.4732175,0.8809456,-1.186104E-08],[0,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
PERS robtarget pnew:=[[824.773,-0.0204436,986.792],[0.637121,-0.306924,0.636816,-0.307147],[-1,0,-1,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
PROC test90() pnew:=AlignZ(p105,[[0,0,0],[1,0,0,0]]);
MoveJ p105,v100,fine,tool0\WObj:=wobj0; MoveJ p106,v100,fine,tool0\WObj:=wobj0;
MoveJ p105,v100,fine,tool0\WObj:=wobj0; WaitTime 1; MoveJ pnew,v100,fine,tool0\WObj:=wobj0;
ENDPROC
FUNC robtarget AlignZ(robtarget p,pose frame)
VAR num rotmat_p{3,3};
VAR num rotmat_frame{3,3};
VAR pos v_p_z;
VAR pos v_frame_z;
VAR pos v_cross_vec;
VAR num mag; VAR num pdot; VAR num theta; VAR orient o_delta; VAR robtarget pout; pout:=p; QuatToRotMatrix p.rot,rotmat_p; QuatToRotMatrix frame.rot,rotmat_frame;
v_p_z:=[rotmat_p{1,3},rotmat_p{2,3},rotmat_p{3,3}];
v_frame_z:=[rotmat_frame{1,3},rotmat_frame{2,3},rotmat_frame{3,3}];
pdot:=DotProd(v_p_z,v_frame_z);
theta:=ACos(pdot);
IF theta>90 THEN theta:=theta-180;
ENDIF
v_cross_vec:=CrossProd(v_p_z,v_frame_z);
mag:=VectMagn(v_cross_vec); v_cross_vec.x:=v_cross_vec.x/mag; v_cross_vec.y:=v_cross_vec.y/mag; v_cross_vec.z:=v_cross_vec.z/mag;
o_delta.q1:=Cos(theta/2); o_delta.q2:=Sin(theta/2)*v_cross_vec.x; o_delta.q3:=Sin(theta/2)*v_cross_vec.y; o_delta.q4:=Sin(theta/2)*v_cross_vec.z; pout.rot:=o_delta*pout.rot;
RETURN pout; ENDFUNC
PROC QuatToRotMatrix(orient o,INOUT num m{*,*}) VAR num x2; VAR num y2; VAR num z2; VAR num xy; VAR num xz; VAR num yz; VAR num wx; VAR num wy; VAR num wz;
x2:=o.q2*o.q2; y2:=o.q3*o.q3; z2:=o.q4*o.q4; xy:=o.q2*o.q3; xz:=o.q2*o.q4; yz:=o.q3*o.q4; wx:=o.q1*o.q2; wy:=o.q1*o.q3; wz:=o.q1*o.q4;
m{1,1}:=1.0-2.0*(y2+z2); m{1,2}:=2.0*(xy-wz); m{1,3}:=2.0*(xz+wy); m{2,1}:=2.0*(xy+wz); m{2,2}:=1.0-2.0*(x2+z2); m{2,3}:=2.0*(yz-wx); m{3,1}:=2.0*(xz-wy); m{3,2}:=2.0*(yz+wx); m{3,3}:=1.0-2.0*(x2+y2); ENDPROC
******************************** 如何获取更多经典文章? 关注公众号 ABB机器人实战技巧,点击页面底部的 |