Skip to content

Servo Circular

SUMMARY

Servo Circular commands a circular arc motion by providing a via-point (or target) TCP pose. The robot traces a circular arc defined by the current pose, the via-point, and the target pose.

SUPPORTED ROBOTS

Currently supported only on Universal Robots.

UNITS

Waypoint poses in meters and Euler XYZ degrees. speed in m/s, acceleration in m/s².

The Skill

python
robot.servo_circular(
    pose=via_point_pose,
    speed=0.25,
    acceleration=1.2,
    blend=0.0,
)

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: Execute a Circular Arc Move

Move the robot along a circular arc by providing a via-point offset from the current pose.

python
"""
Servo Circular example for the Synapse SDK.

Commands a circular-arc move from the current TCP pose to a target pose
using ``servo_circular`` (UR ``servoC``). The target here is offset 2 cm
along Z and 2 cm along Y so the arc is visually distinct from a straight
line.

Currently supported only for Universal Robots (UR10e).
Usage:
    python servo_circular.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):
    """Drive a circular arc from the current TCP pose to an offset target."""

    # Create robot instance
    robot = universal_robots.UniversalRobotsUR10E()

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

    try:
        # Target pose: 2 cm down in Z and 2 cm out in Y from the current pose.
        current = robot.get_cartesian_pose()
        target = list(current)
        target[1] += 0.02
        target[2] -= 0.02

        logger.warning(
            f"About to move real robot along a circular arc from {current} to {target}. "
            "Make sure it's safe to move there."
        )
        logger.info(f"servo_circular target: {target}")

        # Command the circular servo move, then stop streaming to end the motion.
        robot.servo_circular(
            pose=target,
            speed=0.1,
            acceleration=0.1,
            blend=0.0,
        )

        time.sleep(2.0)  # In a real application, you would typically stream continuously until some condition is met (e.g. a certain time has elapsed, or a sensor triggers).

        # In a real application, you would typically stream continuously until some
        # condition is met (e.g. a certain time has elapsed, or a sensor triggers).
        robot.servo_stop()
        logger.success("servo_circular complete.")
    finally:
        robot.disconnect()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="UR10e servo_circular 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

servo_circular executes a circular arc motion. pose is the via-point (intermediate pose on the arc) [x, y, z, rx, ry, rz] in meters and degrees. speed is the TCP speed in m/s; acceleration is in m/s². blend is the blend radius in meters - a non-zero value blends the arc end smoothly into the next motion segment.

How to Tune the Parameters

ParameterTypeDefaultDescription
poselist[float]-Via-point TCP pose [x, y, z, rx, ry, rz].
speedfloat0.25TCP speed in m/s.
accelerationfloat1.2TCP acceleration in m/s².
blendfloat0.0Blend radius in meters.

Return Value

ValueDescription
NoneThis skill returns nothing.

Where to Use the Skill

  • Arc weld paths.
  • Circular polishing trajectories.
  • Any application requiring a curved TCP path.

When Not to Use the Skill

Use a different skill instead in these cases: