How to set the payload and center of gravity on a UR e-Series robot

Based on contributions by Arik.

Whenever you mount a new tool or gripper, the robot needs an accurate payload mass and center of gravity (CoG) to move safely and predictably. This guide covers both the manual (Installation tab) method and the scripted method.

What you need

  • A Universal Robot, CB3 (software 3.3 or later) or e-Series (any version).
  • The tool/gripper already mounted, so you measure with the actual final load.
  • For the scripted method: at least 4 reachable joint positions that vary the wrist angles as much as possible (accuracy depends on this).

Steps

1. Manual method (Installation tab)

  1. Go to Installation → General → Payload.
  2. Press Measure.
  3. Follow the on-screen instructions to move the robot through several wrist orientations and confirm.

The more varied the wrist angles during measurement, the more accurate the result.


Screen reference from Universal Robots Academy.

2. Scripted method with estimate_payload()

If you need to (re-)measure the payload from within a program instead of the Installation tab, use estimate_payload(). It needs:

  • a list of at least 4 TCP or joint poses,
  • a list of the same length with the TCP force (“wrench”) measured at each of those poses, from get_tcp_force().

estimate_payload() returns a struct with .mass and .cog. If the rotational distance between any two poses is less than Pi / (2*n) radians (where n is the number of poses), the function raises an error — so spread the poses out.

def measure_payload():

  # positions to measure at — fill in with real poses (p1, p2, p3, p4)
  pose_list = [p1, p2, p3, p4]

  # placeholder list for the measured wrenches, filled in below
  wrench_list = [[0,0,0,0,0,0], [0,0,0,0,0,0], [0,0,0,0,0,0], [0,0,0,0,0,0]]

  sleep(1)  # wait for the robot to settle before measuring

  i = 0
  while i < 4:
    movej(pose_list[i])          # move to the next position

    sleep(1)                     # wait for stability

    wrench_list[i] = get_tcp_force()
    i = i + 1
  end

  # estimate payload from the recorded poses and wrenches
  payload = estimate_payload(pose_list, wrench_list)

  sleep(1)                       # wait before applying the new payload

  set_payload(payload.mass, payload.cog)

end

Common mistakes

  • Calling set_payload() immediately after estimate_payload() without a short sleep() first — the robot may reject the new payload if it’s set too quickly after measuring.
  • Using poses that are too close together (same wrist orientation) — this triggers the Pi / (2*n) rotational-distance error from estimate_payload().
  • Measuring payload before the final tool/gripper is mounted, then never re-measuring after swapping tools.

Related


Rewritten and consolidated (Sept 2026) from the original student how-to’s: How to calculate the tools center of gravity and payload for URe robot.