# MToolTCPCalib

**URL:** <https://tech-community.robotics.abb.com/t/mtooltcpcalib/3112>\
**Category:** Robot Controller\
**Created:** [October 15, 2009, 8:03pm UTC](https://tech-community.robotics.abb.com/t/mtooltcpcalib/3112 "2009-10-15T20:03:24Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![RoboRob](https://avatars.discourse-cdn.com/v4/letter/r/4da419/32.png) [@RoboRob](https://tech-community.robotics.abb.com/u/RoboRob)\
**Post date:** [October 15, 2009, 8:03pm UTC](https://tech-community.robotics.abb.com/t/mtooltcpcalib/3112/1 "2009-10-15T20:03:24Z")

</div>

Does anyone know if it’s possible to TPWrite the max\_TCPerr,mean\_TCPerr to the flex pendant when using this command in a routine?

---

<div class="post-metadata">

**Author:** ![system](https://dub1.discourse-cdn.com/flex005/user_avatar/tech-community.robotics.abb.com/system/32/6_2.png) [@system](https://tech-community.robotics.abb.com/u/system)\
**Post date:** [April 13, 2010, 12:42am UTC](https://tech-community.robotics.abb.com/t/mtooltcpcalib/3112/2 "2010-04-13T00:42:52Z")

</div>

Here is a routine I wrote that writes the max and mean error.

MODULE TCP\_Aid(SYSMODULE)

TASK PERS robtarget p1:=[[-616.395,-1682.85,1416.17],[0.220333,0.672182,0.231325,-0.667916],[-2,-1,-2,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

TASK PERS tooldata TCP\_Old:=[TRUE,[[365.401,-97.6168,246.953],[0.092296,0.701057,-0.092296,0.701057]],[34.7,[38.4,18,131.6],[1,0,0,0],1.086,1.348,1.362]];  
TASK PERS tooldata TCP\_TCP:=[TRUE,[[365.401,-97.6168,246.953],[0.092296,0.701057,-0.092296,0.701057]],[34.7,[38.4,18,131.6],[1,0,0,0],1.086,1.348,1.362]];  
TASK PERS wobjdata TCP\_Wobj:=[FALSE,TRUE,“”,[[0,0,0],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];

PERS jointtarget TCP\_Clr:=[[-93.3922,16.7899,25.8387,0.191803,65.699,-113.72],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];  
PERS jointtarget TCP\_j1:=[[-102.187,28.3068,21.9536,-0.170654,68.9885,-124.376],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];  
PERS jointtarget TCP\_j2:=[[-107.323,25.9101,51.1249,128.832,36.6304,-247.551],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];  
PERS jointtarget TCP\_j3:=[[-112.807,21.5585,28.9757,5.6044,53.7068,-176.337],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];  
PERS jointtarget TCP\_j4:=[[-105.805,24.2599,24.3025,46.9949,41.881,-126.237],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];  
PERS jointtarget TCP\_jZ:=[[-100.881,25.8255,23.0675,-0.144653,67.8854,-123.088],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

LOCAL PERS pos MyPos:=[0,0,0];  
LOCAL VAR num max\_TCPerr:=1;  
LOCAL VAR num mean\_TCPerr:=1;  
LOCAL VAR num Xi:=0;  
LOCAL VAR num Yi:=0;  
LOCAL VAR num Zi:=0;  
LOCAL VAR bool inDebug:=TRUE;

PROC ACALIB\_TCP()

TPErase;  
GetEEInterface;  
TCP\_TCP:=EEtooldata;  
TCP\_TCP.tload:=EEtooldata.tload;  
TCP\_TCP:=TCP\_Old;  
TCP\_Wobj := Wobj0;  
MyPos := [0,0,0];  
!.. clearance move  
MoveAbsJ TCP\_ClrNoEOffs, v200, z50, TCP\_TCPWObj:=TCP\_Wobj;  
!.. move to position-1  
!.. and update position-1  
MoveAbsJ TCP\_j1NoEOffs, v200, fine, TCP\_TCPWObj:=TCP\_Wobj;  
TPWrite “Move your TOOL to desired location . Press PLAY when ready.”;  
StopNoRegain;  
TPReadFK reg1, “Continue?”, stEmpty, stEmpty, stEmpty, stEmpty, “Yes”;  
TPErase;  
WaitTime 0.3;  
TCP\_j1:=CJointT();  
MoveAbsJ TCP\_ClrNoEOffs, v200, z50, TCP\_TCPWObj:=TCP\_Wobj;

!.. move to position-2  
!.. and update position-2  
MoveAbsJ TCP\_j2NoEOffs, v200, fine, TCP\_TCPWObj:=TCP\_Wobj;  
TPWrite “Move your TOOL to desired location . Press PLAY when ready.”;  
StopNoRegain;  
TPReadFK reg1, “Continue?”, stEmpty, stEmpty, stEmpty, stEmpty, “Yes”;  
TPErase;  
WaitTime 0.3;  
TCP\_j2:=CJointT();  
MoveAbsJ TCP\_ClrNoEOffs, v200, z50, TCP\_TCPWObj:=TCP\_Wobj;

!.. move to position-2  
!.. and update position-3  
MoveAbsJ TCP\_j3NoEOffs, v200, fine, TCP\_TCPWObj:=TCP\_Wobj;  
TPWrite “Move your TOOL to desired location . Press PLAY when ready.”;  
StopNoRegain;  
TPReadFK reg1, “Continue?”, stEmpty, stEmpty, stEmpty, stEmpty, “Yes”;  
TPErase;  
WaitTime 0.3;  
TCP\_j3:=CJointT();  
MoveAbsJ TCP\_ClrNoEOffs, v200, z50, TCP\_TCPWObj:=TCP\_Wobj;

!.. move to position-2  
!.. and update position-4  
MoveAbsJ TCP\_j4NoEOffs, v200, fine, TCP\_TCPWObj:=TCP\_Wobj;  
TPWrite “Move your TOOL to desired location . Press PLAY when ready.”;  
StopNoRegain;  
TPReadFK reg1, “Continue?”, stEmpty, stEmpty, stEmpty, stEmpty, “Yes”;  
TPErase;  
WaitTime 0.3;  
TCP\_j4:=CJointT();  
MoveAbsJ TCP\_ClrNoEOffs, v200, z50, TCP\_TCPWObj:=TCP\_Wobj;

!.. refine Z-Elongator and X-Elongator jointtargets for TCP orientation  
!.. and update position-5  
p1:=CalcRobT(TCP\_j1, TCP\_TCPWObj:=TCP\_Wobj);  
MoveL RelTool(p1,0,0,-50), v200, fine,TCP\_TCPWObj:=TCP\_Wobj;  
TCP\_jz:=CJointT();  
MoveAbsJ TCP\_jzNoEOffs, v200, z50, TCP\_TCPWObj:=TCP\_Wobj;  
!.. Define the TCP\_TCP as the 4-point calibrated position  
!.. Define the Z-Elongator of TCP\_TCP between TCP\_j1 and TCP\_jZ  
!MToolRotCalib TCP\_j1, TCP\_jZ, TCP\_TCP;  
MToolTCPCalib TCP\_j1,TCP\_j2,TCP\_j3,TCP\_j4,TCP\_TCP,max\_TCPerr,mean\_TCPerr;  
IF inDebug THEN  
TPErase;  
tpwrite “–[TCP DEFINITION..]----------”;  
Xi:=TCP\_TCP.tframe.trans.x;  
Yi:=TCP\_TCP.tframe.trans.y;  
Zi:=TCP\_TCP.tframe.trans.z;  
tpwrite "Transl := "Pos:=[Xi,Yi,Zi];  
Xi:=EulerZYX(X,TCP\_TCP.tframe.rot);  
Yi:=EulerZYX(Y,TCP\_TCP.tframe.rot);  
Zi:=EulerZYX(,TCP\_TCP.tframe.rot);  
tpwrite "Rotatn := "Pos:=[Xi,Yi,Zi];  
tpwrite “--------------------------------”;  
Tpwrite "TCP Max Error = "Num:=max\_TCPerr;  
Tpwrite "TCP Mean Error = "Num:=mean\_TCPerr;  
ELSE  
TPErase;  
Xi:=EulerZYX(X,TCP\_TCP.tframe.rot);  
Yi:=EulerZYX(Y,TCP\_TCP.tframe.rot);  
Zi:=EulerZYX(,TCP\_TCP.tframe.rot);  
ENDIF

IF max\_TCPerr \> .8 THEN  
TpWrite “Put on your glasses on and try again”;  
ELSE  
IF ActiveEEconfig.EEtooldataname = “CIH1tool” THEN  
CIH1tool.tframe:=TCP\_TCP.tframe;  
CIH1tool.tload:=TCP\_TCP.tload;  
ENDIF  
ENDIF  
!.. clearance move  
MoveAbsJ TCP\_ClrNoEOffs, v500, z50, TCP\_TCPWObj:=TCP\_Wobj;  
Park;

ENDPROC  
ENDMODULE
