I have a program where I re-orient the TCP about one of its axes(lets say Y). Typically I do this by something like the following(syntax from memory, so may be slightly off)
LIN X=0, Y=1500 ,Z=1000 ,A=0 ,B=0 , C=-65, E1=0
LIN REL C=65
Now the TCP def is not perfectly 0 in the Y(nor do I think that would matter), but the basic issue is of course this is a wrist flip. What I would like to happen is that axis 4 and 6 would not move, and 5 would shift by 130(axis 2 and 3 also move), and the tcp would not move. What actually happens, do to the singularity, etc., is that the TCP does not move, the rotation occurs correctly, but of course the wrist flips, the motion slows down(and in reality the tcp does move a little, because its just too much to ask the robot, as we do this at max axis speed).
I haven't tried it(nor do I think it will work), but PTP REL might be an option. I can calculate the start and end pos of every axis with IK(I already have these numbers) for the start and end points. But I assume PTP REL interpolates each axis pos from the start to the end in a linear fashion, which will inherently not be a linear(or in this case, "static") TCP reorientation. Unless I were to subdivide into many very small PTP REL moves(maybe last resort) and keep it close to the same tcp pos(I think this would take a lot of points to make it actually not move
I have seen a robot do this motion before however. Does the $SINGUL_POS[3] var have anything to do with this. The manual describes that as if the end point of the move is at the wrist singularity. I just want to pass through it. I suppose another thing to try would be to command LIN REL move to the "edge" of the singularity range, PTP to the exact singularity, again to the opposite edge(not allowing the wrist to flip, with SINGUL_POS[3] = 0), and then LIN REL to the end. Also not ideal, but I think this could really make this program better, as this move happens several times per minute.
Thoughts?