How to find angular velocity of rotated objects in 3D

I am trying to obtain equation for angular velocity of rotated object in 3d.

I started with defining yaw, pitch and roll angles. Then I wrote rotation matrices from these angles. As I understand it I should integrate this rotation matrix (which is multiplication of three rot. matrices of every axes) and multiply it with transpose of rotation matrix. And somehow I should able to obtain skew symmetric matricx which have component of angular velocity.

But I didnt understand why multiplication of R'*Tranpose(R) equals to skew matrices.

And also I couldn't able to solve it in Matlab. I dont know is it appropriate to ask question related to Matlab. But output of my symbolic script does not give skew symmetric matrix.

Here is the code:

%a - yaw
%b - pitch
%c  - roll
syms a b c da db dc

Rx=[1 0 0; 0 cos(c) -sin(c); 0 sin(c) cos(c)];
Ry=[cos(b) 0 sin(b); 0 1 0; -sin(b) 0 cos(b)];
Rz=[cos(a) -sin(a) 0; sin(a) cos(a) 0; 0 0 1];
dRx=diff(Rx,c)*dc;
dRy=diff(Ry,b)*db;
dRz=diff(Rz,a)*da;
R=Rx*Ry*Rz;

dR=dRx*Ry*Rz+dRy*Rx*Rz+dRz*Ry*Rx;

dR*transpose(R);


The proof is very simple and comes right form the definition. let $R(t)$ be a rotation matrix as a function of time. $R$ is an orthogonal matrix so its inverse is equal to its transpose:

$I = R(t)R^T(t).$ ($I$ is the identity matrix)

The time derivative of the above equation is $0 = \frac{d[R(t)R^T(t)]}{dt} = \frac{d[R(t)]}{dt}R^T(t)+R(t)\frac{d[R^T(t)]}{dt} =\dot{R}R^T(t)+(\dot{R}R^T(t))^T$.

Therefore, $S(t)=\dot{R}R^T(t)$ is a skew-symmetric matrix. The way you use it to get to angular velocity is $\dot{R}=S(t)R(t)$.

For a constant norm vector $p\in \mathbb{R}^3$ and $p=R(t)p'$ there are two ways to compute $\dot{p}$; the rate of the change of $p$:

• $\dot{p}=\dot{R}p'=S(t)R(t)p'=S(t)p(t)$
• $\dot{p}=\omega\times p(t)=S(\omega(t))p(t)$

Compare the two and you see how $S(\omega)=\dot{R}R^T$.

Also your Matlab code was wrong. Below is the corrected code. Compare and figure out what you did wrong.

syms a b c da db dc

Rx=[1 0 0; 0 cos(c) -sin(c); 0 sin(c) cos(c)];
Ry=[cos(b) 0 sin(b); 0 1 0; -sin(b) 0 cos(b)];
Rz=[cos(a) -sin(a) 0; sin(a) cos(a) 0; 0 0 1];
dRx=diff(Rx,c);
dRy=diff(Ry,b);
dRz=diff(Rz,a);
R=Rx*Ry*Rz;

dR=dRx*Ry*Rz+Rx*dRy*Rz+Rx*Ry*dRz;

S = dR*transpose(R);
simplify(S+transpose(S))

• Why did you erased da, db, dc while taking derivatives of rotation matrices? Shouldn't I taking their derivatives according to time? Commented Apr 19, 2016 at 19:47
• @user3160302 The result is also true for partial derivatives with respect to the Euler angles (just see it as setting the rates da=db=dc=1 or multiplying the above equation by dt). Of course, for the general case you can put back da, db and dc to work with time derivatives. The only reason I deleted them was to speed up the process of "simplify" function. Commented Apr 19, 2016 at 22:00