Velocity and Acceleration of a point of a rigid body

Renato Naville Watanabe

This notebook shows the expressions of the velocity and acceleration of a point on rigid body, given the angular velocity of the body.

Angular velocity of a body

The magnitude of the angular velocity of a rigid body rotating on a plane is defined as:

\begin{equation*} \omega = \frac{d\theta}{dt} \end{equation*}

Usually, it is defined an angular velocity vector perpendicular to the plane where the rotation occurs (in this case the x-y plane) and with magnitude $\omega$:

\begin{equation*} \vec{\bf{\omega}} = \omega\hat{\bf{k}} \end{equation*}

Position of a point on a rigid body

The description of the position of a point P of a rotating rigid body is given by:

$${\bf\vec{r}_{P/O}} = x_{P/O}^*{\bf\hat{i}'} + y_{P/O}^*{\bf\hat{j}'}$$

where $x_{P/O}^*$ and $y_{P/O}^*$ are the coordinates of the point P position at a reference state.

Translation of a rigid body

Let's consider now the case in which, besides a rotation, a translation of the body happens. This situation is represented in the figure below. In this case, the position of the point P is given by:

$${\bf\vec{r}_{P/O}} = {\bf\vec{r}_{A/O}}+{\bf\vec{r}_{P/A}}= {\bf\vec{r}_{A/O}}+x_{P/A}^*{\bf\hat{i}'} + y_{P/A}^*{\bf\hat{j}'} $$

Velocity of a point

First we will consider the situation with no translation. The velocity of the point P is given by:

$${\bf\vec{v}_{P/O}} = \frac{d{\bf\vec{r}_{P/O}}}{dt} = \frac{d(x_{P/O}^*{\bf\hat{i}'} + y_{P/O}^*{\bf\hat{j}'})}{dt}$$

To continue this deduction, we have to find the expression of the derivatives of ${\bf\hat{i}'}$ and ${\bf\hat{j}'}$. This is very similar to the derivative expressions of ${\bf\hat{e_R}}$ and ${\bf\hat{e_\theta}}$ of polar coordinates.

$$\frac{d{\bf\hat{i}'}}{dt} = -\dot{\theta}\sin(\theta){\bf\hat{i}}+\dot{\theta}\cos(\theta){\bf\hat{j}} = \dot{\theta}{\bf\hat{j}'}$$$$\frac{d{\bf\hat{j}'}}{dt} = -\dot{\theta}\cos(\theta){\bf\hat{i}}-\dot{\theta}\sin(\theta){\bf\hat{j}} = -\dot{\theta}{\bf\hat{i}'}$$

Another way to represent the expressions above is by using the vector form to express the angular velocity $\dot{\theta}$. It is usual to represent the angular velocity as a vector in the direction ${\bf\hat{k}}$: ${\bf\vec{\omega}} = \dot{\theta}{\bf\hat{k}} = \omega{\bf\hat{k}}$. Using this definition of the angular velocity, we can write the above expressions as:

$$\frac{d{\bf\hat{i}'}}{dt} = \dot{\theta}{\bf\hat{j}'} = \dot{\theta} {\bf\hat{k}}\times {\bf\hat{i}'} = {\bf\vec{\omega}} \times {\bf\hat{i}'} $$$$\frac{d{\bf\hat{j}'}}{dt} = -\dot{\theta}{\bf\hat{i}'} = \dot{\theta} {\bf\hat{k}}\times {\bf\hat{j}'} ={\bf\vec{\omega}} \times {\bf\hat{j}'} $$

So, the velocity of the point P in the situation of no translation is:

$${\bf\vec{v}_{P/O}} = \frac{d(x_{P/O}^*{\bf\hat{i}'} + y_{P/O}^*{\bf\hat{j}'})}{dt} = x_{P/O}^*\frac{d{\bf\hat{i}'}}{dt} + y_{P/O}^*\frac{d{\bf\hat{j}'}}{dt}=x_{P/O}^*{\bf\vec{\omega}} \times {\bf\hat{i}'} + y_{P/O}^*{\bf\vec{\omega}} \times {\bf\hat{j}'} = {\bf\vec{\omega}} \times \left(x_{P/O}^*{\bf\hat{i}'}\right) + {\bf\vec{\omega}} \times \left(y_{P/O}^*{\bf\hat{j}'}\right) ={\bf\vec{\omega}} \times \left(x_{P/O}^*{\bf\hat{i}'}+y_{P/O}^*{\bf\hat{j}'}\right)$$$${\bf\vec{v}_{P/O}} = {\bf\vec{\omega}} \times {\bf{\vec{r}_{P/O}}} $$

It is worth to note that the expression above is general, including three dimensional movements..

Relative velocity of a point on a rigid body to another point

To compute the velocity of a point on a rigid body that is translating, we need to find the expression of the velocity of a point (P) in relation to another point on the body (A). So:

$${\bf\vec{v}_{P/A}} = {\bf\vec{v}_{P/O}}-{\bf\vec{v}_{A/O}} = {\bf\vec{\omega}} \times {\bf{\vec{r}_{P/O}}} - {\bf\vec{\omega}} \times {\bf{\vec{r}_{A/O}}} = {\bf\vec{\omega}} \times ({\bf{\vec{r}_{P/O}}}-{\bf{\vec{r}_{A/O}}}) = {\bf\vec{\omega}} \times {\bf{\vec{r}_{P/A}}}$$

Velocity of a point on rigid body translating

The velocity of a point on a rigid body that is translating is given by:

$${\bf\vec{v}_{P/O}} = \frac{d{\bf\vec{r}_{P/O}}}{dt} = \frac{d({\bf\vec{r}_{A/O}}+x_{P/A}^*{\bf\hat{i}'} + y_{P/A}^*{\bf\hat{j}'})}{dt} = \frac{d{\bf\vec{r}_{A/O}}}{dt}+\frac{d(x_{P/A}^*{\bf\hat{i}'} + y_{P/A}^*{\bf\hat{j}'})}{dt} = {\bf\vec{v}_{A/O}} + {\bf\vec{\omega}} \times {\bf{\vec{r}_{P/A}}}$$

Below is an example of a body rotating with the angular velocity of $\omega = \pi/10$ rad/s and translating at the velocity of ${\bf\vec{v}} = 0.7 {\bf\hat{i}} + 0.5 {\bf\hat{j}}$ m/s. The red arrow indicates the velocity of the geometric center of the body and the blue arrow indicates the velocity of the lower point of the body

In [2]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib notebook
from matplotlib.animation import FuncAnimation
from matplotlib.patches import FancyArrowPatch
t = np.linspace(0,13,10)
omega = np.pi/10 #[rad/s]
voa = np.array([[0.7],[0.5]])
fig = plt.figure()
plt.grid()
ax = fig.add_axes([0, 0, 1, 1])    
ax.axis("on")
plt.rcParams['figure.figsize']=5,5
def run(i):
    theta = omega * t[i]
    phi = np.linspace(0,2*np.pi,100)
    B = np.squeeze(np.array([[2*np.cos(phi)],[6*np.sin(phi)]]))
    Baum = np.vstack((B,np.ones((1,np.shape(B)[1]))))
    roa = voa * t[i]
    R = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]])
    T = np.vstack((np.hstack((R,roa)), np.array([0,0,1])))
    BRot = R@B
    BRotTr = T@Baum   
    
    
    
    plt.plot(BRotTr[0,:],BRotTr[1,:], roa[0], roa[1],'.', hold = False)
    vVoa = FancyArrowPatch(np.array([float(roa[0]), float(roa[1])]), 
                           np.array([float(roa[0]+voa[0]), 
                                       float(roa[1]+voa[1])]), mutation_scale=20, 
                           lw=2, arrowstyle="->", color="r", alpha=1)
    ax.add_artist(vVoa)
    
    
    
    element = 75
    Vp = 3*np.array([voa[0]-omega*BRot[1,element], voa[1]+omega*BRot[0,element]])
    vVP = FancyArrowPatch(np.array([float(BRotTr[0,element]), float(BRotTr[1,element])]), 
                          np.array([float(BRotTr[0,element]+Vp[0]), 
                                      float(BRotTr[1,element]+Vp[1])]),
                          mutation_scale=20, 
                          lw=2, arrowstyle="->", color="b", alpha=1)
    ax.add_artist(vVP)
    
    plt.xlim((-10, 20))
    plt.ylim((-10, 20))
       
    
#run(2)
ani = FuncAnimation(fig, run, frames = 50,repeat=False,  interval =500)
plt.show()

Acceleration of a point on a rigid body

The acceleration of a point on a rigid body is obtained by deriving the previous expression:

$${\bf\vec{a}_{P/O}} = {\bf\vec{a}_{A/O}} + \dot{\bf\vec{\omega}} \times {\bf{\vec{r}_{P/A}}} + {\bf\vec{\omega}} \times {\bf{\vec{v}_{P/A}}} = {\bf\vec{a}_{A/O}} + \dot{\bf\vec{\omega}} \times {\bf{\vec{r}_{P/A}}} + {\bf\vec{\omega}} \times ({\bf\vec{\omega}} \times {\bf{\vec{r}_{P/A}}}) = {\bf\vec{a}_{A/O}} + \ddot{\theta}\bf\hat{k} \times {\bf{\vec{r}_{P/A}}} - \dot{\theta}^2{\bf{\vec{r}_{P/A}}}$$

Below is an example of a rigid body with an angular acceleration of $\alpha = \pi/150$ rad/s$^2$ and initial angular velocity of $\omega_0 = \pi/100$ rad/s. Consider also that the center of the body accelerates with ${\bf\vec{a}} = 0.01{\bf\hat{i}} + 0.05{\bf\hat{j}}$, starting from rest.

In [2]:
t = np.linspace(0, 20, 40)

alpha = np.pi/150 #[rad/s^2] angular acceleration 

omega0 = np.pi/100 #[rad/s] angular velocity

aoa = np.array([[0.01],[0.05]]) # linear acceleration

fig = plt.figure()
plt.grid()
ax = fig.add_axes([0, 0, 1, 1])    
ax.axis("on")
plt.rcParams['figure.figsize']=5,5
theta = 0
omega = 0
def run(i):
    phi = np.linspace(0,2*np.pi,100)
    B = np.squeeze(np.array([[2*np.cos(phi)],[6*np.sin(phi)]]))
    Baum = np.vstack((B,np.ones((1,np.shape(B)[1]))))
    
    omega = alpha*t[i]+omega0 #[rad/s] angular velocity
    
    theta = alpha/2*t[i]**2 + omega0*t[i] # [rad] angle
    
    voa = aoa*t[i] # linear velocity
    
    roa = aoa/2*t[i]**2 # position of the center of the body
    
    R = np.array([[np.cos(theta), -np.sin(theta)],[np.sin(theta), np.cos(theta)]])
    T = np.vstack((np.hstack((R,roa)), np.array([0,0,1])))
    BRot = R@B
    BRotTr = T@Baum   
    
    plt.plot(BRotTr[0,:],BRotTr[1,:], roa[0], roa[1],'.', hold = False)
    #vVoa = FancyArrowPatch(np.array([float(roa[0]), float(roa[1])]), 
    #                       3*np.array([float(roa[0]+voa[0]), 
    #                                   float(roa[1]+voa[1])]), mutation_scale=20, 
    #                       lw=2, arrowstyle="->", color="r", alpha=1)
    #ax.add_artist(vVoa)
    
    #plt.plot(BRotTr[0,:],BRotTr[1,:], roa[0], roa[1],'.', hold = False)
    
    element = 75
    ap = np.array([aoa[0] - alpha*BRot[1,element] - omega**2*BRot[0,element],
                   aoa[1] + alpha*BRot[0,element] - omega**2*BRot[1,element]])
    vVP = FancyArrowPatch(np.array([float(BRotTr[0,element]), float(BRotTr[1,element])]), 
                          np.array([float(BRotTr[0,element]+ap[0]), 
                                      float(BRotTr[1,element]+ap[1])]),
                          mutation_scale=20, 
                          lw=2, arrowstyle="->", color="b", alpha=1)
    ax.add_artist(vVP)
    
    plt.xlim((-10, 20))
    plt.ylim((-10, 20))
       
    

ani = FuncAnimation(fig, run, frames = 50,repeat=False,  interval =500)
plt.show()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-36020e76105f> in <module>()
----> 1 t = np.linspace(0, 20, 40)
      2 
      3 alpha = np.pi/150 #[rad/s^2] angular acceleration
      4 
      5 omega0 = np.pi/100 #[rad/s] angular velocity

NameError: name 'np' is not defined

Problems

  1. Solve the problems 15.2.5, 15.2.10, 15.2.11 and 15.2.20 from Ruina and Rudra's book.
  2. Solve the problems 16.1.2, 16.1.8, 16.1.9, 16.1.10, 16.1.11 and 16.1.12 from Ruina and Rudra's book.