Skip to content

Freedrive Mode

SUMMARY

Freedrive mode is used for teach-by-demonstration workflows, operator-guided pose capture, and constrained manual positioning.

start_freedrive_mode puts the robot into gravity-compensated, back-drivable mode along the specified axes, and the robot stays powered but offers no active resistance to manual motion.

stop_freedrive_mode restores normal stiff position control.

SUPPORTED ROBOTS

Currently supported only on Universal Robots.

UNITS

free_axes is a unitless 6-element mask [x, y, z, rx, ry, rz] (0 = locked, 1 = free). feature is a compliance-frame pose in meters and Euler XYZ degrees.

The Skill

python

# Start freedrive mode on all axes
robot.start_freedrive_mode(free_axes=[1, 1, 1, 1, 1, 1])

# Stop freedrive mode and restore normal control.
robot.stop_freedrive_mode()

The Code

Safety first!

A real robot will faithfully do whatever you ask of it - so please take a moment to clear the workspace, keep an E-Stop within reach, and be ready to disconnect.

Operating real hardware is at your own risk.

Example: Start, Use, and Stop a Freedrive Session

Enable freedrive on all axes, allow 10 seconds of manual interaction, then exit cleanly.

python
"""
Freedrive mode example for the Synapse SDK.

``start_freedrive_mode`` puts the robot into hand-guiding mode — the operator
can physically push the arm and it complies. ``free_axes`` is a 6-element
mask ``[x, y, z, rx, ry, rz]`` where ``1`` means the axis is free and ``0``
means it is locked. ``stop_freedrive_mode`` returns the controller to normal
motion control.

Currently supported only for Universal Robots (UR10e).

Usage:
    python freedrive_mode.py --ip <ROBOT_IP>
"""

import argparse
import time
from loguru import logger

from telekinesis.synapse.robots.manipulators import universal_robots


def main(robot_ip: str):
    """Enter freedrive for 10 seconds, then exit."""

    # Create robot instance
    robot = universal_robots.UniversalRobotsUR10E()

    # Connect to the robot
    robot.connect(ip=robot_ip)

    # Enter freedrive with all axes free
    free_axes = [1, 1, 1, 1, 1, 1]
    logger.info(f"Starting freedrive - free axes: {free_axes}")
    robot.start_freedrive_mode(free_axes=free_axes)

    # Hold freedrive open for hand-guiding
    time.sleep(10)

    # Exit freedrive
    robot.stop_freedrive_mode()
    logger.success("Freedrive mode stopped.")

    # Disconnect
    robot.disconnect()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="UR robot freedrive mode example")
    parser.add_argument("--ip", type=str, required=True, help="IP address of the UR robot")
    args = parser.parse_args()

    main(args.ip)

The Explanation of the Code

start_freedrive_mode puts the robot into gravity-compensated freedrive. free_axes is a 6-element mask [x, y, z, rx, ry, rz] where 1 means the axis is free (compliant) and 0 means it is locked. feature specifies the compliance frame pose [x, y, z, rx, ry, rz]; the default [0, 0, 0, 0, 0, 0] means the base frame.

stop_freedrive_mode sends the exit command to the controller, restoring normal stiff position control. Always call it before issuing programmed motion commands after a freedrive session.

How to Tune the Parameters

start_freedrive_mode

ParameterTypeDefaultDescription
free_axeslist[int][1, 1, 1, 1, 1, 1]Six-element mask - 1 = free, 0 = locked, for [x, y, z, rx, ry, rz].
featurelist[float][0, 0, 0, 0, 0, 0]Compliance frame pose [x, y, z, rx, ry, rz] in meters and degrees.

stop_freedrive_mode

This skill takes no input parameters.

Return Value

MethodTypeDescription
start_freedrive_modeNoneReturns after freedrive mode is activated.
stop_freedrive_modeNoneReturns after freedrive mode is deactivated.

Where to Use the Skill

  • Teach-by-demonstration workflows.
  • Operator-guided pose capture.
  • Constrained manual positioning along specific axes.

When Not to Use the Skill

  • Unconstrained back-drive - use Teach Mode instead when you do not need to configure a compliance frame or axis mask.