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
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.
"""
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
| Parameter | Type | Default | Description |
|---|---|---|---|
pose | list[float] | - | Via-point TCP pose [x, y, z, rx, ry, rz]. |
speed | float | 0.25 | TCP speed in m/s. |
acceleration | float | 1.2 | TCP acceleration in m/s². |
blend | float | 0.0 | Blend radius in meters. |
Return Value
| Value | Description |
|---|---|
None | This 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:
- Use Set Cartesian Pose for straight-line moves.

