Universal Robots Forum

How are the final jointvalues chosen in movel?

As there are different configurations to reach a certain goal pose I wonder how these are selected and which path is used. If for example wrist1 is at zero, a translation in z can be achieved by moving mostly shoulder, elbow and a bit of wrist1, however, it can also be done by flipping wrist1 to 180 and compensating the rotation by also rotating wrist3. This could also generate a linear cartesian movement.

How is the path generated?


For a linear move the robot by default will choose the shortest path to the required pose (I’d guess this is just the smallest sum of joint rotation angles).

You can specify which joint configuration you’d prefer using the get_inverse_kin() URScript command. This allows you to reach the desired TCP pose with the configuration closest to the list of joint angles you pass in the qnear variable.

Perfect, thanks a lot!

Note that passing the result of get_inverse_kin() to movel() won’t necessarily move the robot to the calculated joint position. That isn’t possible in general, since there is no guarantee that a given joint position can be reached with a linear path in cartesian space for the TCP.

Also, the final joint positions of a movel() are not guaranteed to be the result of get_inverse_kin(target). So you have no guarantee that you end up at the joint state which is closest to the start state. The only thing you can be certain of is that the TCP will attempt to follow a linear path in cartesian space, or fail to reach the goal. As for the linear path, it will choose the linear path with the smallest rotation.

So if you want exact control over the joints, you can’t really use movel().

1 Like