A repeatable TCP translation mismatch of about 1.322 mm appears after inverting the robot-held work-object result, even though the orientation matches. That error is slightly larger than the 1.3 mm object spacing, so the transformed target cannot be used for placement until the coordinate chains agree.
Wrong fixes and why they fail
Changing numeric storage, adjusting load data, or repeatedly sampling the same position does not repair a frame-definition mismatch.
| Attempt | Why it does not solve the mismatch |
|---|---|
Store the result as dnum
|
CRobT returns a robtarget, while poseinv operates on a pose. Increasing the precision of a later variable cannot recover information already produced by those operations or correct the referenced frames. |
Apply GripLoad matching the tool load |
The tested load change produced no position change. Load data addresses mechanical loading and compensation; it does not redefine which coordinate system is fixed or attached to the robot. |
| Repeat the program | Repeated execution produced the same values. A stable error points to deterministic geometry, metadata, or a controller calculation path rather than uncontrolled robot motion. |
| Blame motion between calls | The code ran in a non-motion task with motion tasks stopped. Back-to-back captures can independently prove that both calculations used the same robot state. |
Invert pose2 again |
poseinv reverses the transform supplied to it. It cannot make two differently defined transform chains reciprocal. |
Coordinate-chain cause
The number that matters is the relative translation after both results are expressed in reciprocal frames. For the captured values, pose1 is approximately [0.000420381,-0.000173362,-0.00047082] mm and pose3 is [0.0335206,0.362376,1.27074] mm. Their component error is therefore approximately [0.0331002,0.3625494,1.27121082] mm.
The resulting magnitude is:
error = sqrt(dx^2 + dy^2 + dz^2)
= sqrt(0.0331002^2 + 0.3625494^2 + 1.27121082^2)
≈ 1.322 mm
This is geometry, not motion timing. The matching quaternion values show that the reported discrepancy is translational.
The two calls use different semantic chains. The first reads tool0 against wobj0. The second reads tool0_not_held against wobj0_held, then inverts that result. Those outputs become reciprocals only when the stationary tool and robot-held work object describe the same physical interface, use compatible parent frames, and attach the moving frame to the correct mechanical unit.
The declared work object is [TRUE,TRUE,"",...]: it is marked robot-held, but its user frame is also marked fixed/programmed and its mechanical-unit string is empty. That combination does not define the moving attachment chain required for a robot-held frame. Inverting its calculated pose therefore does not reproduce the standard tool/work-object result.
Quantity and frame audit
| Quantity or field | Observed value | Where to read or verify it |
|---|---|---|
| Placement pitch | 1.3 mm | Application target spacing |
| Calculated translation error | Approximately 1.322 mm | Difference between pose1.trans and pose3.trans
|
| Orientation error | No component difference in the stored pose1 and pose3 quaternions |
pose1.rot and pose3.rot
|
| Held-work-object declaration | [TRUE,TRUE,"",...] |
wobj0_held |
| Stationary-tool declaration | Held flag FALSE
|
tool0_not_held |
| Repeatability of result | Same result across repeated runs | Stored persistent targets and poses |
| Controller context | Not recorded | RobotWare version and robot type in the controller system information |
Also audit every identity pose in the declarations. An identity value means zero displacement from its declared parent; it does not mean “the same frame” when two objects have different parents. The nonzero robot base frame makes that distinction visible.
Correction procedure
- Capture two identical
CRobTcalls back-to-back into separate persistentrobtargetvariables. Compare the complete results to exclude motion or asynchronous task updates. - Record the first chain using
tool0andwobj0. Keep the unmodifiedrobtargetso translation, rotation, configuration, and external-axis fields remain available for diagnosis. - Record the stationary-tool/held-work-object chain into another
robtarget. Convert only after the raw target has been saved. - Correct the held work-object definition so its user frame is movable and associated with the robot mechanical unit that physically carries it. Read the exact mechanical-unit name from the controller configuration; an empty string cannot identify that attachment.
- Define the stationary tool from its actual fixed reference. Its frame must represent the same physical interface used as the reciprocal endpoint of the held work object.
- Run
poseinvon the corrected second pose and calculate the relative translation and rotation against the first pose. - Repeat the capture at several robot configurations. A correct coordinate relationship remains consistent as the axes change; a coincidental match at one pose does not validate the chain.
A useful sampling pattern is:
p_CRobT1 := CRobT(\Tool:=tool0, \WObj:=wobj0);
p_CRobT2 := CRobT(\Tool:=tool0, \WObj:=wobj0);
p_CRobT3 := CRobT(\Tool:=tool0_not_held, \WObj:=wobj0_held);
pose1 := target_TO_POSE(p_CRobT1);
pose2 := target_TO_POSE(p_CRobT3);
pose3 := poseinv(pose2);
If p_CRobT1 and p_CRobT2 differ, investigate task execution and sampling before analyzing frame inversion. If they match while pose1 and pose3 do not, continue with the attachment audit.
Verification criteria
Verify the correction numerically before executing close-pitch motion. Calculate a relative transform; avoid comparing only formatted screen values. The translation residual must fit the process tolerance with margin below the 1.3 mm pitch.
Compare rotations as orientations rather than raw quaternion signs because a quaternion and its negation represent the same orientation. In this capture, the stored quaternion components already match, so translation remains the deciding quantity.
Use CJointT, CalcJointT, and CalcRobT only as secondary checks. Inverse kinematics also depends on robot configuration and solution selection, so differing joint values do not by themselves prove that CRobT or poseinv lost precision. Preserve the configuration fields when comparing calculated robtarget values.
Recurring diagnostic pitfalls
- Treating an identity pose as globally identical while its parent coordinate system changes.
- Setting the robot-held flag without defining how the movable user frame attaches to a mechanical unit.
- Discarding the configuration and external-axis fields before the raw
robtargethas been inspected. - Converting the final value to
dnumand expecting earlier transform calculations to change. - Comparing quaternion components without accounting for equivalent sign representations.
- Testing only one robot configuration, where separate frame errors may partially cancel.
- Escalating a possible controller defect without recording the RobotWare version, robot type, declarations, raw targets, and repeatable test sequence.
FAQ
How do I prove the robot did not move between two CRobT calls?
Store two consecutive calls with identical \Tool and \WObj arguments in separate persistent robtarget variables. Compare their translation, rotation, configuration, and external-axis fields before evaluating the alternate frame chain.
How do I calculate the TCP mismatch between pose1 and pose3?
Subtract the translation components and calculate sqrt(dx^2+dy^2+dz^2). The captured values produce approximately 1.322 mm, which exceeds the 1.3 mm object pitch.
How do I configure a robot-held work object for this test?
Mark it as robot-held, define its user frame as movable, and associate it with the mechanical unit that carries it. Obtain the exact unit name from the controller configuration instead of leaving the attachment string empty.
How do I use dnum with CRobT or poseinv?
CRobT produces a robtarget, and the extracted transform passed to poseinv is a pose. Moving the result into dnum storage afterward does not change the frame semantics or recover precision lost earlier.
When should I stop troubleshooting and contact ABB support?
Stop when the frame attachments are correct, consecutive identical captures match, and a repeatable position-dependent residual still exceeds the process tolerance. Record the RobotWare version, robot type, complete data declarations, raw robtarget values, and a minimal non-motion reproduction. Submit that package through an official ABB support channel so the calculation can be checked against the specific controller and software release.