 Euler Angles from Unit Vectors

• Hello,

I have been trying to generate orientation positions for the flange in respect to a single point.

I chose to calculate the direction of the vector from the tcp position to this point, in which the orientation of X vector from tcp is inversed from this calculated vector, Y vector parallel to the base, and Z vector pointed to the base. The image below shows the original reference frame from the base (Red - X, Green - Y, Blue - Z), the red dot as the point, and the frames with thin lines, the calculated pose. To obtain the rotation matrix from the unit vectors i simply fit them in each respective column of the matrix:

Rmat =

 Xx Yx Zx Xy Yy Zy Xz Yz Zz

From this link from this forum, i know that Kukas rotation order is Rz-Ry-Rx which then to obtain the Euler angles (A,B,C as kuka uses) is then:

C = atan2(Yz, Zz)

B = asin(-Xz)

A = atan2(Xy,Xx)

The A,B,C values obtained from this are not however the expected from the image above. The image below is an example using RoboDk to simulate one pose: Target 2 X vector should have been following the direction of the position of Target 1 to Target 2.

Am i not able to use the unit vectors in such way to calculate the Euler Angles?

• .. Kukas rotation order is Rz-Ry-Rx ...

Just one thing:

Should be: Rz - Ry' - Rx'', means second rotation is around the y-axis already rotated by Rz and third rotation is rotation around the x-axis aleady rotated by Rz and Ry. Now you can think again about your calculations.

• From this link from this forum, i know that Kukas rotation order is Rz-Ry-Rx which then to obtain the Euler angles (A,B,C as kuka uses) is then:

C = atan2(Yz, Zz)

B = asin(-Xz)

A = atan2(Xy,Xx)

this calculation only works if angle B is not equal +/- 90 degrees

Here I would suggest that you are following the suggestion from fubini in the "link"

I would be also helpful to get the values you are using to make the calculations

KUKA has a built in function (At least I thought it was built in):

Even if you aren't writing this code for KRL, its pretty easy to read this code and convert it to whatever language you are working with. It says that T[,] is an output, but thats only because kuka forces more complicated variables to be declared as outputs. Its actually being used as an input in this scenario. Last note, a lot of other programming languages use radians by default, but not KRL, so keep that in mind if porting this over into a different language.

• check function MAT_TO_RPY(). it is on every robot in KUE_WEG(). also forum posts computing base use it

2) if you have an issue with robot, post question in the correct forum section... do NOT contact me directly

• The A,B,C values obtained from this are not however the expected from the image above. The image below is an example using RoboDk to simulate one pose:

posts #3, #4 and #5 tells you how to calculate the angles correctly.

Useful would be getting the values you use for the calculation in order to find the problem you have Checking you screen shot shows that target 2 is actually the flange coordinate system with an angle b of 135 deg (rough guess)

angle b must be in the range of +/90 deg. Doing frame2mat and afterwards an mat2frame will correct this (angle a and angle will change their values and angle b will be in the allowed range.

could this be the problem?

• Thank you all. I found out the problem was in the way i created the Rotation matrix from the unit vectors of the target frames.

By constructing it like this i managed to get the Euler angles like i said:

Rmat =

 Xx Xy Xz Yx Yy Yz Zx Zy Zz

The poses simulated from the script: The results obtained with robodk (inputting the angles manually obtained from the script): Checking you screen shot shows that target 2 is actually the flange coordinate system with an angle b of 135 deg (rough guess)

angle b must be in the range of +/90 deg. Doing frame2mat and afterwards an mat2frame will correct this (angle a and angle will change their values and angle b will be in the allowed range.

could this be the problem?

Yes it can be, i am aware of that but ill just make a specific condition for that to give the same orientation or ill implement the code that micahstuh posted from kuka.

I feel like i made the problem a bit confusing but this was just so i can get the orientation of a pose given the vector from the pose coordinates to the target point in space, and the XZ plane of the orientation. The whole idea is that I define a number of poses, the given angle from the base and the distance to the target. This is mainly to use a camera that has manual focus so it needs to face an object with the same orientation in all poses, but i can also use the same concept for other projects like welding,non planar 3d printing, etc..