Battling TCP Inaccuracies (Is this normal or do I need calibration?)

I have an application where I rotate the end-effector around a section of pipe. To do this, I first find the center-point of the pipe by probing the inner diameter. I then rotate around this center point and probe the edge of the pipe.

As I rotate, I maintain the end-effector’s orientation relative to the center point.

I found that as I rotate around the pipe edge, the probe moves in both X and Y.

I checked the programmed TCP by rotating the around the Z-axis (wrist 3). I expected it to stay stationary through the rotation but it “walks” in X and Y. I found that taking more care to set the TCP reduces the XY movement, but I’m still seeing around 3mm
X/Y deviation from the expected rotation point.

Is there anything I can do to improve it? Does my robot need recalibrating?

I’m using a UR5e.