Current TCP Mismatch when RobHeld

Options
PFollansbee
edited May 14 in RAPID Programming
The following code has pose1 and pose3 being offset by 1 to 2 mm, but with matching orientations.

Is this code incorrect to produce the desired equivalent targets?
Is this a 24 bit precision issue? If so, can I get CRobT or poseinv to work in dnum?
Is something funny happening in CRobT?

I have motions that must reliably position to 1.3mm spaced objects, so calculation error on this order of magnitude needs to be fixed. For reference, the base frame of the robot is not at [0,0,0],[1,0,0,0], so that's why the target can be at this location.

Hopefully it's just a problem between the keyboard and chair. 

    PERS tooldata tool0_not_held:=[FALSE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]];
    PERS wobjdata wobj0_held:=[TRUE, TRUE, "",[[0,0,0],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];
    PERS pose pose1:=[[0.000420381,-0.000173362,-0.00047082],[6.84647E-8,-2.61491E-8,-1,4.38235E-7]];
    PERS pose pose2:=[[0.0335204,-0.362375,1.27074],[6.84647E-8,2.61491E-8,1,-4.38235E-7]];
    PERS pose pose3:=[[0.0335206,0.362376,1.27074],[6.84647E-8,-2.61491E-8,-1,4.38235E-7]];

    PROC main ()
        pose1 := target_TO_POSE(CRobT(\Tool:= tool0, \WObj:=wobj0));
        pose2 := target_TO_POSE(CRobT(\Tool:= tool0_not_held, \WObj:=wobj0_held));
        pose3 := poseinv(pose2);
    ENDPROC

    FUNC pose target_TO_POSE (robtarget target)
        RETURN [target.trans, target.rot];
    ENDFUNC
Tagged:

Answers

  • DenisFR
    DenisFR ✭✭✭
    Options
    Hello,
    Can you add intermediate data so
        PERS tooldata tool0_not_held:=[FALSE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]];
        PERS wobjdata wobj0_held:=[TRUE, TRUE, "",[[0,0,0],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];
    PERS robtarget p_CRobT1:=[[0,0,0],[0,0,0,0],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]]; PERS robtarget p_CRobT2:=[[0,0,0],[0,0,0,0],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]]; PERS robtarget p_CRobT3:=[[0,0,0],[0,0,0,0],[0,0,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]]; PERS pose pose1:=[[0.000420381,-0.000173362,-0.00047082],[6.84647E-8,-2.61491E-8,-1,4.38235E-7]]; PERS pose pose2:=[[0.0335204,-0.362375,1.27074],[6.84647E-8,2.61491E-8,1,-4.38235E-7]]; PERS pose pose3:=[[0.0335206,0.362376,1.27074],[6.84647E-8,-2.61491E-8,-1,4.38235E-7]]; PROC main ()
    p_CRobT1 := CRobT(\Tool:= tool0, \WObj:=wobj0); pose1 := target_TO_POSE(p_CRobT1); p_CRobT2 := CRobT(\Tool:= tool0, \WObj:=wobj0); p_CRobT3 := CRobT(\Tool:= tool0_not_held, \WObj:=wobj0_held); pose2 := target_TO_POSE(p_CRobT3); pose3 := poseinv(pose2); ENDPROC FUNC pose target_TO_POSE (robtarget target) RETURN [target.trans, target.rot]; ENDFUNC

    So if p_CRobT1=p_CRobT2, then you're sure robot don't move between two lines.

  • PFollansbee
    edited May 14
    Options
    The robot is definitely not moving between lines, as this is a non-motion task and the motion tasks are all set to not run. Re-running the code multiple times produces the same result.

    I did some tests (below) with joint configurations also and I am getting the same weirdness. I thought it might have to do with some load compensation, so I tried setting a GripLoad with the same load as the tool for the work object, but no change resulted (not shown below).


        PERS tooldata tool0_held:=[TRUE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]];
        PERS tooldata tool0_not_held:=[FALSE,[[0,0,0],[1,0,0,0]],[0.001,[0,0,0.001],[1,0,0,0],0,0,0]];
        
        PERS wobjdata wobj0_not_held:=[FALSE, TRUE, "",[[0,0,0],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];
        PERS wobjdata wobj0_held:=[TRUE, TRUE, "",[[0,0,0],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];
        
        PERS robtarget crobt1 := [[0.000420381,-0.000173362,-0.00047082],[6.84647E-8,-2.61491E-8,-1,4.38235E-7],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
        PERS pose pose1 :=       [[0.000420381,-0.000173362,-0.00047082],[6.84647E-8,-2.61491E-8,-1,4.38235E-7]];
        PERS robtarget crobt2 := [[0.0335204,-0.362375,1.27074],[6.84647E-8,2.61491E-8,1,-4.38235E-7],[0,-1,0,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
        PERS pose pose2 :=       [[0.0335204,-0.362375,1.27074],[6.84647E-8,2.61491E-8,1,-4.38235E-7]];
        PERS pose pose3 :=       [[0.0335206,0.362376,1.27074],[6.84647E-8,-2.61491E-8,-1,4.38235E-7]];
        
        PERS jointtarget joints := [[66.08,76.9836,-11.6418,-0.101755,24.6229,80.7455],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
        PERS jointtarget jointpos1 := [[66.0795,76.9842,-11.6434,-0.101754,24.6238,-99.255],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
        PERS jointtarget jointpos2 := [[66.0742,77.0359,-11.6693,-0.101763,24.5981,-99.2603],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
        
        PERS robtarget target1 := [[0.000362654,-0.000178661,-0.000482582],[4.38419E-7,1,-2.19963E-8,-6.85313E-8],[0,-1,-2,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
        PERS robtarget target2 := [[0.137095,0.288492,1.2703],[4.38419E-7,-1,2.19963E-8,6.85313E-8],[0,-1,-2,0],[9E+9,9E+9,9E+9,9E+9,9E+9,9E+9]];
        
        PROC main ()
            VAR robtarget zero_target:=[[0,0,0],[0,-1,0,0],[0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
            
            crobt1 := CRobT(\TaskName:="T_ROB1", \Tool:= tool0_held, \WObj:=wobj0_not_held);
            crobt2 := CRobT(\TaskName:="T_ROB1", \Tool:= tool0_not_held, \WObj:=wobj0_held);
            pose1 := target_TO_POSE(crobt1);
            pose2 := target_TO_POSE(crobt2);
            pose3 := poseinv(pose2);
            
            joints := CJointT(\TaskName:="T_ROB1");
            jointpos1 := CalcJointT(zero_target, tool0_held, \WObj:=wobj0_not_held);
            jointpos2 := CalcJointT(zero_target, tool0_not_held, \WObj:=wobj0_held);
            
            target1 := CalcRobT(jointpos1, tool0_held \WObj:=wobj0_not_held);
            target2 := CalcRobT(jointpos1, tool0_not_held \WObj:=wobj0_held);
        ENDPROC
  • DenisFR
    DenisFR ✭✭✭
    Options
    Very weird...
    Can you give your RobotWare's version and robot type?