Skip to content

Get TCP Force

SUMMARY

Get TCP Force returns the TCP wrench [Fx, Fy, Fz, Tx, Ty, Tz] - forces in N, torques in N·m, expressed in the robot base frame.

Reads from the manipulator state - live values when connected, zero-filled offline.

SUPPORTED ROBOTS

Available on all supported manipulators in offline mode. Live hardware readings are currently supported only on Universal Robots.

UNITS

Returns TCP wrench [Fx, Fy, Fz, Tx, Ty, Tz] - forces in N, torques in N·m.

The Skill

python
tcp_force = robot.get_tcp_force()

The Code

python
"""
Read TCP wrench (force/torque) example for the Synapse SDK.

Returns the TCP wrench ``[Fx, Fy, Fz (N), Tx, Ty, Tz (N·m)]``. With
``--ip``, reads live hardware state. Without ``--ip``, reads from the
internal commanded cache (no connection made) and logs a warning.

Illustrated using Universal Robots (UR10e), supported on all robots.

Usage:
    python get_actual_tcp_force.py [--ip <ROBOT_IP>]
"""

import argparse
from loguru import logger

from telekinesis.synapse.robots.manipulators import universal_robots


def main(ip: str | None = None):
    """Log the current TCP wrench [N, N·m]."""

    robot = universal_robots.UniversalRobotsUR10E()

    if ip is not None:
        robot.connect(ip=ip)
    else:
        logger.warning(
            "No --ip provided; reading offline commanded-cache state, "
            "not live hardware readings."
        )

    try:
        logger.success(f"tcp_force [N, N·m]: {robot.get_tcp_force()}")
    finally:
        if ip is not None:
            robot.disconnect()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Read TCP wrench Synapse example")
    parser.add_argument("--ip", type=str, default=None, help="UR robot IP address (optional)")
    args = parser.parse_args()

    main(ip=args.ip)

The Explanation of the Code

python
from telekinesis.synapse.robots.manipulators import universal_robots

robot = universal_robots.UniversalRobotsUR10E()

Create the robot. UR10e is used here for illustration; the same pattern works for every supported brand.

python
if ip is not None:
    robot.connect(ip=ip)

Connect to the robot at the given IP. When no --ip is passed, no connection is made and the getter returns from the offline commanded-cache (zero-filled) instead of live hardware.

python
logger.success(f"tcp_force [N, N·m]: {robot.get_tcp_force()}")

Read the TCP wrench [Fx, Fy, Fz, Tx, Ty, Tz] in the base frame, forces in N and torques in N·m. When connected this is the live controller value (payload-compensated on supported controllers); offline the cache is zero-filled.

python
finally:
    if ip is not None:
        robot.disconnect()

Always release the controller link in a finally block so a failure mid-read still cleans up the connection.

Return Value

TypeDescription
list[float]TCP wrench [Fx, Fy, Fz, Tx, Ty, Tz]. Forces in N, torques in N·m, expressed in the robot base frame. Payload-compensated on supported controllers. Zero-filled offline.

Where to Use the Skill

  • Contact detection - Detect unexpected contact by monitoring force magnitude.
  • Compliant control - Use force feedback for admittance or hybrid force-position control.
  • Assembly verification - Confirm insertion force profile matches expected values.

When Not to Use the Skill