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)
- Go to Installation → General → Payload.
- Press Measure.
- 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 afterestimate_payload()without a shortsleep()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 fromestimate_payload(). - Measuring payload before the final tool/gripper is mounted, then never re-measuring after swapping tools.
Related
- How to set payload, center of gravity and tool center point on a UR robot at run-time — set payload and centre of gravity from URScript at run-time (e.g. after picking up an object)
- How to install and control a Robotiq gripper on a UR robot — re-measure payload/CoG after mounting a Robotiq gripper.
- How to define and switch between multiple TCPs on a UR robot — if your application uses multiple TCPs, consider whether each needs its own payload measurement.
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.
