Definición y Calibrado del TCP en Robots ABB

Guía: Definición y Calibrado del TCP en Robots ABB (IRC5)

Ya hemos publicado la "Guía: Definición y Calibrado del TCP en Robots Colaborativos AUBO", en esta ocasión explicaremos la definición y calibración del TCP para los robots ABB. 
Una mala definición de la herramienta provocará desviaciones al reorientar el robot, imprecisiones en los puntos programados y posibles colisiones.
En este artículo explicaremos en detalle los dos métodos para referenciar y calibrar una herramienta en un controlador ABB IRC5: el método directo desde la FlexPendant y el método mediante código e instrucciones RAPID.

1. Conceptos Fundamentales: ¿Qué es la tooldata?

En la programación RAPID de ABB, la herramienta se define mediante una variable de tipo tooldata. Esta estructura contiene tres partes principales:

 1. robhold:

Define si el robot es el que está sosteniendo la herramienta:

    • TRUE: El robot sostiene la herramienta.
    • FALSE: El robot no sostiene la herramienta, sino que se trata de una herramienta estacionaria.

1. tframe (Marco de la herramienta):

  • trans: Coordenadas cartesianas (X, Y, Z) del TCP referidas al centro de la brida del robot en milímetros (mm).
  • rot: Orientación del sistema de coordenadas expresado en cuaterniones (q_1, q_2, q_3, q_4).

2. tload (Datos de carga):

  • mass: La masa (el peso) de la carga en kilos.
  • cog (Centro de gravedad): El centro de gravedad de la carga útil expresada en mm en el sistema de coordenadas de la herramienta si el robot es el que sujeta la herramienta.
  • aom (La orientación de los ejes de momento): Se trata de los ejes principales del momento de inercia de la carga útil, con origen en cog.
  • Inercia (ix, iy, iz): son tres datos que definen el momento de inercia de la carga alrededor de cada uno de los ejes (x, y, z) del momento, expresado en Kgm2. La definición correcta de los momentos de inercia permitirá una utilización óptima del planificador de trayectorias y un mejor control de los ejes. Esto puede resultar especialmente importante a la hora de manejar grandes planchas de metal, etc. Todos los momentos de inercia ix, iy e iz iguales a 0 kgm2 implican una masa puntual.
    • Normalmente, sólo es necesario definir momentos de inercia cuando la distancia existente entre la brida de montaje y el centro de gravedad es menor que el tamaño máximo de la carga (consulte la figura que aparece a continuación).

Ejemplo:

PERS tooldata gripper := [ TRUE, [[97.4, 0, 223.1], [0.924, 0, 0.383 ,0]], [5, [23, 0, 75], [1, 0, 0, 0], 0, 0, 0]];

Explicación de cada uno de los valores:

  • El robot sostiene la herramienta.
  • El TCP está situado en un punto a 223,1 mm en línea recta de la brida de montaje y a 97,4 mm a lo largo del eje X del sistema de coordenadas de la muñeca.
  • Las direcciones X y Z de la herramienta se giran 45° en relación con la dirección Y en el sistema de coordenadas de la muñeca.
  • La masa de la herramienta es de 5 kg.
  • El centro de gravedad está situado en un punto a 75 mm en línea recta de la brida de montaje y 23 mm a lo largo del eje X del sistema de coordenadas de la muñeca.
  • Es posible considerar la carga como una masa puntual, es decir, sin ningún momento de inercia.

La herramienta por defecto: tool0

Por defecto, todo robot ABB cuenta con la herramienta tool0. Su TCP se ubica exactamente en el centro de la brida de montaje de la muñeca (eje 6) y su sistema de coordenadas comparte la orientación de la base del robot cuando se encuentra en posición neutra.
Al crear una nueva herramienta personalizada, tomamos como origen físico de medición el punto central de tool0.

2. Método 1: Referenciado Directo desde la FlexPendant (Método GUI)

Es el método preferido y más habitual a pie de planta para realizar la calibración concreta del TCP en el robot.

Paso 1: Creación de la variable tooldata

  1. En la FlexPendant, accede al Menú ABB -> Datos de programa -> tooldata.
  2. Presiona Nuevo para declarar la nueva herramienta.
  3. Ajusta los parámetros iniciales:
    • Nombre: Asigna un nombre descriptivo (ej. t_Pistola, t_Pinza, t_Antorcha).
    • Ámbito: Global (recomendado para usarla en cualquier módulo).
    • Tipo de almacenamiento: Persistente (MANDATORIO para variables tooldata).

Paso 2: Selección del Método de Calibración

Selecciona la herramienta creada, pulsa Editar -> Definir y elige uno de los 3 métodos disponibles según tus necesidades de orientación:
Método Seleccionado ¿Qué define? Descripción de Orientación
TCP (orient. predet.) Solo la posición (X, Y, Z) Hereda la orientación de tool0 (brida de montaje).
TCP&Z Posición (X, Y, Z) + Eje Z Modifica la orientación del eje +Z de la herramienta.
TCP&Z,X Posición (X, Y, Z) + Ejes Z y X Modifica la orientación completa (ejes +Z y +X).

⚠️ IMPORTANTE: La Herencia de Orientación en "TCP (orient. predet.)"
Si seleccionas el método TCP (orient. predet.), el algoritmo calculará únicamente las coordenadas del punto de contacto físico (X, Y, Z). La orientación del sistema de coordenadas de la herramienta no cambia y hereda directamente la orientación del eje de la brida de tool0. Usa este método cuando la dirección de trabajo de la herramienta coincida naturalmente con la brida del robot.

Paso 3: Toma de Puntos de Posición (Puntos de Aproximación)

Para calcular las coordenadas del TCP se requieren normalmente 4 puntos de aproximación (Punto 1 a Punto 4):
  1. Instala una punta de referencia fija en el entorno de trabajo dentro del área del robot. (puedes ver como hacerlo en la publicación "Sistemas de Referenciado Esenciales en Robótica Industrial".
  2. Lleva la punta física de la herramienta del robot hasta tocar con máxima exactitud la punta de referencia fija.
  3. Memoriza la posición con Modificar posición.
  4. Modifica sustancialmente la orientación del robot (reorientando la muñeca y los ejes principales) y vuelve a tocar la punta fija de referencia para memorizar los puntos 2, 3 y 4.
Regla de Oro: Para obtener la máxima precisión, las 4 posiciones deben tener orientaciones lo más distantes y variadas posible entre sí. No te limites a pequeños giros.

Paso 4: Definición de la Orientación con Elongadores (Métodos TCP&Z y TCP&Z,X)

Si necesitas cambiar la orientación de los ejes cartesianos de la herramienta, el sistema te pedirá definir puntos de elongador.

¿En qué sentido mover el robot para definir el +Z o +X positivo?

  1. Definición del Eje +Z (Métodos TCP&Z o TCP&Z,X):
    • Tras guardar el origen TCP en la punta de referencia fija, desplaza el robot linealmente SIN CAMBIAR LA ORIENTACIÓN DE LA HERRAMIENTA.
    • Mueve el robot de forma que la punta de referencia fija del entorno pase a estar alineada apuntando hacia la dirección donde quieres que apunte el eje Z positivo (+Z) de tu herramienta.
    • Ejemplo: Si quieres que el eje +Z salga disparado hacia la punta de una antorcha, desplaza el robot hacia atrás manteniendo la antorcha alineada con la punta fija. Memoriza la posición como punto de elongador Z.
  2. Definición del Eje +X (Método TCP&Z,X):
    • De forma análoga, vuelve al punto de contacto y desplaza el robot linealmente sin modificar la orientación, alineando la punta fija en la dirección donde deseas definir el eje X positivo (+X).
    • Memoriza la posición como punto de elongador X.

3. Método 2: Referenciado y Cálculo mediante RAPID

ABB permite automatizar o calcular de forma transparente el TCP y su rotación usando rutinas de programa mediante dos instrucciones clave del sistema: MToolTCPCalib y MToolRotCalib.

1. Instrucción MToolTCPCalib

Calcula y actualiza las coordenadas cartesianas (X, Y, Z) de la variable tooldata (componente tframe.trans).
  • Sintaxis: MToolTCPCalib Pos1, Pos2, Pos3, Pos4, Tool, MaxErr, MeanErr;
  • Parámetros: Requiere 4 datos de tipo jointtarget (posiciones de cada eje) previamente guardados, para tocar la punta de referencia fija con orientaciones distintas. Devuelve el error máximo (MaxErr) y el error medio (MeanErr).

2. Instrucción MToolRotCalib

Calcula y actualiza la rotación/orientación (componente tframe.rot).
  • Sintaxis: MToolRotCalib RefTip, ZPos [\XPos], Tool;
  • Parámetros:
    • RefTip (jointtarget): Posición de la herramienta tocando la punta de referencia fija.
    • ZPos (jointtarget): Posición tras mover la herramienta a lo largo del eje +Z deseado.
    • \XPos (jointtarget, opcional): Posición a lo largo del eje +X deseado.

Ejemplo Completo de Código RAPID Comentado

    !
    !==================================================================================
    ! 1. PUNTOS DE LA RUTINA DE REFERENCIA TBOX1
    !==================================================================================
    ! Puntos para el TCP (Posición)
    PERS jointtarget p1_TBOX1_TCP_p1:=[[90,-14.3739,45.596,0,38.7779,-0.000000626],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    PERS jointtarget p1_TBOX1_TCP_p2:=[[97.6736,-5.934,36.2618,-22.1142,64.2099,18.1854],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    PERS jointtarget p1_TBOX1_TCP_p3:=[[90,1.69518,26.5716,0,81.7332,-0.000000363],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    PERS jointtarget p1_TBOX1_TCP_p4:=[[82.3264,-5.934,36.2618,22.1142,64.2099,-18.1854],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    PERS jointtarget p1_TBOX1_TCP_tip:=[[90,-7.07749,35.8164,0,61.2611,-0.00000006],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    
    ! Puntos de elongador para la Rotación (Orientación)
    PERS jointtarget p1_TBOX1_TCP_z:=[[90,-8.08827,33.6314,0,64.4569,0.000000348],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    PERS jointtarget p1_TBOX1_TCP_x:=[[90,-3.77428,32.817,0,60.9573,-0.000000856],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

    !
    !========================================================================================
    ! 2. Tipo de datos de herramienta "tooldata".
    !========================================================================================
    PERS tooldata TBox1:=[TRUE,[[-110,0,255],[1,0,0,0]],[5,[0,0,50],[1,0,0,0],0,0,0]];

    
    ! Variables para recibir el informe de error de precisión
    VAR num TBOX1_max_err;
    VAR num TBOX1_mean_err;

    !
    !======================================
    ! Trayectoria REF TCP TBOX1
    ! HERRAMIENTA = Herramienta TBOX1
    !======================================
    PROC Zt_ref_TBox1()
        !Declaración de variables
        VAR robtarget Apros_pos;
        
        !Aff_Traj "REF TBOX1";
        Anti_Reinicio;
        !
        !Referenciado de posición 1 TBOX1
        TPErase;
        TPWrite "========================================";
        TPWrite "       REFERENCIADO TCP TBOX1";
        TPWrite "              DESTINO ROBOT ";
        TPWrite " =>  posición de  REF.1 TCP TBOX1";
        TPWrite "========================================";
        Z_Valid_MvtRobot;
        ! Aproximación al punto p1
        Apros_pos:=CalcRobT(p1_TBOX1_TCP_p1, tool0\WObj:=wobj0);
        MoveJ Offs(Apros_pos,0,0,20),V_lenta,Z_detener,tool0;
        ! Posición p1 de REFERENCIADO TCP TBOX1
        MoveAbsJ p1_TBOX1_TCP_p1,v10,Z_detener,tool0;
        TPErase;
        TPWrite "========================================";
        TPWrite "     SELECCIONAR EDITOR DE PANTALLA";
        TPWrite "     VERIFICAR / MODIFICAR Punto _p1";
        TPWrite "           DESPUES PULSA START";
        TPWrite "========================================";
        Stop\NoRegain;
        !
        !Referenciado de posición 2 TBOX1
        TPErase;
        TPWrite "========================================";
        TPWrite "              DESTINO ROBOT ";
        TPWrite " =>  posición de  REF.2 TCP TBOX1";
        TPWrite "========================================";
        Z_Valid_MvtRobot;
        ! Alejamiento del punto p1
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Aproximación al punto p2
        Apros_pos:=CalcRobT(p1_TBOX1_TCP_p2, tool0\WObj:=wobj0);
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Posición p2 de REFERENCIADO TCP TBOX1 
        MoveAbsJ p1_TBOX1_TCP_p2,v10,Z_detener,tool0;
        TPErase;
        TPWrite "========================================";
        TPWrite "     SELECCIONAR EDITOR DE PANTALLA";
        TPWrite "     VERIFICAR / MODIFICAR Punto _p2";
        TPWrite "           DESPUES PULSA START";
        TPWrite "========================================";
        Stop\NoRegain;
        !
        !Referenciado de posición 3 TBOX1
        TPErase;
        TPWrite "========================================";
        TPWrite "              DESTINO ROBOT ";
        TPWrite " =>  posición de  REF.3 TCP TBOX1";
        TPWrite "========================================";
        Z_Valid_MvtRobot;
        ! Alejamiento del punto p2
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Aproximación al punto p3
        Apros_pos:=CalcRobT(p1_TBOX1_TCP_p3, tool0\WObj:=wobj0);
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Posición p3 de REFERENCIADO TCP TBOX1
        MoveAbsJ p1_TBOX1_TCP_p3,v10,Z_detener,tool0;
        TPErase;
        TPWrite "========================================";
        TPWrite "     SELECCIONAR EDITOR DE PANTALLA";
        TPWrite "     VERIFICAR / MODIFICAR Punto _p3";
        TPWrite "           DESPUES PULSA START";
        TPWrite "========================================";
        Stop\NoRegain;
        !
        !Referenciado de posición 4 TBOX1
        TPErase;
        TPWrite "========================================";
        TPWrite "              DESTINO ROBOT ";
        TPWrite " =>  posición de  REF.4 TCP TBOX1";
        TPWrite "========================================";
        Z_Valid_MvtRobot;
        ! Alejamiento del punto p3
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Aproximación al punto p4
        Apros_pos:=CalcRobT(p1_TBOX1_TCP_p4, tool0\WObj:=wobj0);
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Posición p4 de REFERENCIADO TCP TBOX1
        MoveAbsJ p1_TBOX1_TCP_p4,v10,Z_detener,tool0;
        TPErase;
        TPWrite "========================================";
        TPWrite "     SELECCIONAR EDITOR DE PANTALLA";
        TPWrite "     VERIFICAR / MODIFICAR Punto _p4";
        TPWrite "           DESPUES PULSA START";
        TPWrite "========================================";
        Stop\NoRegain;
        !
        !Referenciado de posición tip TBOX1
        TPErase;
        TPWrite "========================================";
        TPWrite "              DESTINO ROBOT ";
        TPWrite " =>  posición de  REF.tip TCP TBOX1";
        TPWrite "========================================";
        Z_Valid_MvtRobot;
        ! Alejamiento del punto p4
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Aproximación al punto tip
        Apros_pos:=CalcRobT(p1_TBOX1_TCP_tip, tool0\WObj:=wobj0);
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Posición tip de REFERENCIADO TCP TBOX1 
        MoveAbsJ p1_TBOX1_TCP_tip,v10,Z_detener,tool0;
        TPErase;
        TPWrite "========================================";
        TPWrite "     SELECCIONAR EDITOR DE PANTALLA";
        TPWrite "     VERIFICAR / MODIFICAR Punto _tip";
        TPWrite "           DESPUES PULSA START";
        TPWrite "========================================";
        Stop\NoRegain;
        !
        !Referenciado de posición z TBOX1
        TPErase;
        TPWrite "========================================";
        TPWrite "              DESTINO ROBOT ";
        TPWrite " =>  posición de  REF.Z TCP TBOX1";
        TPWrite "========================================";
        Z_Valid_MvtRobot;
        ! Alejamiento del punto tip
        MoveJ Offs(Apros_pos,0,0,20),v10,Z_detener,tool0;
        ! Posición z de REFERENCIADO TCP TBOX1
        MoveAbsJ p1_TBOX1_TCP_z,v10,Z_detener,tool0;
        TPErase;
        TPWrite "========================================";
        TPWrite "     SELECCIONAR EDITOR DE PANTALLA";
        TPWrite "     VERIFICAR / MODIFICAR Punto _z";
        TPWrite "           DESPUES PULSA START";
        TPWrite "========================================";
        Stop\NoRegain;
        !
        !Referenciado de posición x TBOX1
        TPErase;
        TPWrite "========================================";
        TPWrite "              DESTINO ROBOT ";
        TPWrite " =>  posición de  REF.X TCP TBOX1";
        TPWrite "========================================";
        Z_Valid_MvtRobot;
        ! Posición x de REFERENCIADO TCP TBOX1 
        MoveAbsJ p1_TBOX1_TCP_x,v10,Z_detener,tool0;
        TPErase;
        TPWrite "========================================";
        TPWrite "     SELECCIONAR EDITOR DE PANTALLA";
        TPWrite "     VERIFICAR / MODIFICAR Punto _x";
        TPWrite "           DESPUES PULSA START";
        TPWrite "========================================";
        Stop\NoRegain;
        !
        !Posicionar robot en punto de montaje Punta
        TPErase;
        TPWrite "========================================";
        TPWrite "               DESTINO ROBOT ";
        TPWrite " =>  posición SEGURA ...";
        TPWrite "========================================";
        Z_Valid_MvtRobot;
        ! Mover robot a punto de montaje Punta en Box1
        MoveJ p1_Mont6,V_lenta,Z_detener,Tool_defecto;
        TPErase;
        TPWrite "========================================";
        TPWrite "       FIN DE REFERENCIADO TCP TBOX1";
        TPWrite "========================================";
        TPReadFK S_MENU,"Modificar Referenciado TCP? ","","","","SI","NO";
        TEST S_MENU
        CASE 4:
            ! Asignación valores coordenadas del TCP
            MToolTCPCalib p1_TBOX1_TCP_p1, p1_TBOX1_TCP_p2, p1_TBOX1_TCP_p3, p1_TBOX1_TCP_p4, TBOX1, TBOX1_max_err, TBOX1_mean_err;
            ! Asignación valores de orientación del TCP
            MToolRotCalib p1_TBOX1_TCP_tip, p1_TBOX1_TCP_z \XPos:=p1_TBOX1_TCP_x, TBOX1;
            !
            TPErase;
            TPWrite "========================================";
            TPWrite " REFERENCIADO DE TCP TBOX1";
            TPWrite " max_err = "\Num:=TBOX1_max_err;
            TPWrite " mean_err = "\Num:=TBOX1_mean_err;
            TPWrite "========================================";
            TPReadFK T_MENU,"        VERIFICA PARA CONTINUAR","","","","","SIG";
        ENDTEST
        !
    ENDPROC

4. Validación de la Calibración y Control de Calidad

No des nunca por buena una calibración sin verificar los resultados numéricos y prácticos.

1. Verificación de Errores Numéricos (MeanErr y MaxErr)

Al finalizar la calibración (tanto en FlexPendant como en RAPID), la pantalla mostrará el Resultado de cálculo:
  • Error Medio (MeanErr): Distancia promedio entre las 4 aproximaciones y el TCP matemático calculado.
  • Error Máximo (MaxErr): El mayor desvío detectado en una de las posiciones.
Criterio Técnico: Para aplicaciones generales de manutención o manipulación, un error medio por debajo de 0.2 mm - 0.5 mm es óptimo. En soldadura o aplicaciones de alta precisión, se busca mantener el error por debajo de 0.2 mm. Si el error es elevado, repite la toma de puntos asegurándote de aproximar con mayor exactitud visual.

2. Prueba Práctica de Reorientación (Prueba del Punto Fijo)

Es la comprobación reina en planta:
  1. En la FlexPendant, selecciona el modo de movimiento Reorientación.
  2. Asegúrate de seleccionar como herramienta activa la herramienta que acabas de calibrar (T_BOX1).
  3. Sitúa la punta de la herramienta tocando el punto fijo de referencia.
  4. Mueve el Joystick para girar la muñeca y reorientar el robot en todas las direcciones.
Resultado correcto: La punta de la herramienta debe permanecer imantada/inmóvil sobre la punta de referencia sin separarse ni desplazarse espacialmente.

5. La Importancia de la Cargas Dinámicas: Masa y Centro de Gravedad

¡Atención personal de mantenimiento y nuevos programadores! Calibrar las dimensiones geométricas del TCP es solo el 50% del trabajo.
Una herramienta declarada solo con su TCP pero sin datos de carga correctos (tload):
  1. Provocará falsos disparos por supervisión de colisión o errores de sobrecarga en los servomotores.
  2. Degradará la precisión en trayectorias a alta velocidad debido a la falta de compensación del modelo dinámico.
  3. Puede suponer un riesgo de seguridad en modo manual, ya que el robot podría realizar movimientos bruscos o caer por gravedad al soltar los frenos si desconoce el peso real montado en el eje 6.

Rutina LoadIdentify

ABB incluye la rutina de servicio LoadIdentify integrada en el sistema IRC5:
  • Para ejecutarla, dirígete a Menú ABB -> Editor de Programas-> Llamar a Rutinas de servicio -> LoadIdentify.
  • La rutina solicitará mover el eje 5 y 6 realizando pequeños oscilamientos calculando automáticamente la masa (kg), el centro de gravedad (cog) y los momentos de inercia reales de la herramienta.

6. Conclusión y Comunidad Onedoor

Dominar la definición del sistema de coordenadas de herramienta (tooldata) en robots ABB es una habilidad necesaria tanto para la puesta en marcha de instalaciones como para el mantenimiento diario. Recordar la diferencia entre heredar la orientación de tool0 o definirla con elongadores te ahorrará horas de depuración en la programación de puntos.

💬 ¡Queremos conocer tu experiencia!

  • ¿Qué método utilizas habitualmente en tus instalaciones: la FlexPendant o las rutinas de calibración RAPID?
  • ¿Has tenido problemas alguna vez por no calibrar la carga mediante LoadIdentify?
Deja tu comentario abajo contando tus trucos o dudas al referenciar herramientas.
📥¡No olvides suscribirte a Onedoor para no perderte las próximas guías técnicas sobre robótica industrial y automatización!

Publicar un comentario

0Comentarios

Publicar un comentario (0)