Defining a TCP with an off centre mounted tool

Dave_TawTech Barnstaple, Devon UK
Hi all,
I'm pretty new to ABB robots.
I am currently working on my 3rd ABB robot and am struggling with integrated vision accuracy.

There is a robot mounted gripper that will pick up fittings from a tray from fixed points. After the fitting has been delivered to a machine gripper, the vision looks for a cap in a separate tray. The camera is robot mounted and uses a suction cup mounted on the side of the gripper to pick up a cap. Everything works apart from the suction cup accuracy varies when picking a cap. This needs to be dead centre every time. I am using Pat Max 1-10 and is detecting the centre of the cap without a problem. The coordinates also seem to match with the camera coordinates.

I have carried out several camera/TCP calibrations and get the same results every time. I'm now think it might be how I'm defining the tool. I have separate tool frames for the gripper (Central to tools mounting flange) and a tool frame for the sucker (About 50mm off-centre from the gripper). 

I have defined the gripper TCP using a gripper mounted pointer and a point at a fixed point on the machine. The sucker I have done the same replacing the suction cup with a pointer and referenced to the same fixed machine pointer.

Because the suction cup is not central to the flange, axis 6 will completely change the centre point of the suction cup, so I carried out a 9-point method and making sure axis 6 was rotated for at least 4 of the points. I used TCP (default orient.) method, but looking in the manual I see this is set the orientation the same as the orientation of the robot’s mounting plate. So I assume this will not work.

Anyone got any ideas on how to define an off-centre tool.

Many thanks for any help



  • graemepaulin
    graemepaulin New Zealand mod

    I notice you say the suction cup accuracy varies - do you mean by this that the pick position on the cap is varying?

    If you have a 'fine' zone in the move instruction and the mass, center of gravity, and if necessary the inertia in the tool data are set correctly, then given the right co-ordinates from the camera the robot will go repeatably to the same position each time.

    These days the easiest way to define the TCP of the tool is to use the data from the CAD system that was used to design and build it.

    Once entered you can check it is accurate by jogging in re-orientate mode - the TCP should stay in the same place  with the tool moving around it.

  • Dave_TawTech
    Dave_TawTech Barnstaple, Devon UK
    Hi Graham

    Yes I did mean the suction cup pickup point varies

    I move in to the target in increments using the reltool function and the final move is using the fine zone.

    Unfortunately I can't use the cad drawing because this is random targets picked up from the camera.

    I'm glad you said about the reorient. I have tried this and for the gripper centre point, I get a perfect orientation around the centre, but for the suction cup I'm getting an ellipse around the centre of the cup. So this is why I think I'm defining the tool frame wrongly.

    I did also run the  loadid routine today in case I forgot to do it.

  • graemepaulin
    graemepaulin New Zealand mod

    Good that you have narrowed down where the issue is.

    The TCP of the tool for the suction cup is static (only the pick target varies according to camera data.

    So you should be able to get a good TCP and orientation from the tool design?

  • nomad5t5
    nomad5t5 ABB Canada ✭✭
    It sounds like you've got the TCP dialed in properly.  So, this could be a function of the height of the objects relative to the calibration plane.  You can compensate for this with the following code:
        ! ---------------------------------------------------------------------------------------------------------------------------------
        ! FUNC ParallaxCor(                                                -  Corrects Parallax Errors Due To Item Height
        ! pose UnCompensated,    
        ! num CamHeight,
        ! num ItemHeight)
        ! ---------------------------------------------------------------------------------------------------------------------------------
        FUNC Pose ParallaxCor(Pose UnCompensated, num CamHeight, num ItemHeight)
             var pose Compensated;

             Return Compensated;