Translational Kinematics¶
Note
You can download this example as a Python script:
translational.py
or Jupyter Notebook:
translational.ipynb
.
Learning Objectives¶
After completing this chapter readers will be able to:
calculate the velocity and acceleration of a point in a multibody system
apply the one and two point theorems to calculate velocity and acceleration of points
identify the tangential, centripetal, and Coriolis acceleration components
Introduction¶
In multibody dynamics, we are going to need to calculate the translation velocities and accelerations of points. We will learn that the acceleration of the mass centers of the bodies in a multibody system will be a primary ingredient in forming Newton’s Second Law of motion \(\bar{F} = m\bar{a}\). This chapter will equip you to calculate the relative translational velocities and accelerations of points in a system.
Translational Velocity¶
If a point \(P\) is moving with respect to a point \(O\) that is fixed in reference frame \(A\) the translational velocity vector of point \(P\) is defined as:
We also know from Eq. (63) that the time derivative of any vector can be written in terms of the angular velocity of the associated reference frames, so:
This formulation will allow us to utilize different reference frames to simplify velocity calculations. Take for example this piece of kinetic art that now stands in Rotterdam:
User https://www.reddit.com/user/stravalnak posted this video of the sculpture to Reddit during the 2022 storm Eunice:
From: https://www.reddit.com/r/Rotterdam/comments/svo3cs/hij_maakt_overuren/
and it looks very dangerous. It would be interesting to know the velocity and acceleration of various points on this sculpture. First, we sketch a configuration diagram:
Now let’s use SymPy Mechanics to calculate Eq. (70) for this example.
import sympy as sm
import sympy.physics.mechanics as me
me.init_vprinting(use_latex='mathjax')
class ReferenceFrame(me.ReferenceFrame):
def __init__(self, *args, **kwargs):
kwargs.pop('latexs', None)
lab = args[0].lower()
tex = r'\hat{{{}}}_{}'
super(ReferenceFrame, self).__init__(*args,
latexs=(tex.format(lab, 'x'),
tex.format(lab, 'y'),
tex.format(lab, 'z')),
**kwargs)
me.ReferenceFrame = ReferenceFrame
Set up the orientations:
alpha, beta = me.dynamicsymbols('alpha, beta')
N = me.ReferenceFrame('N')
A = me.ReferenceFrame('A')
B = me.ReferenceFrame('B')
A.orient_axis(N, alpha, N.z)
B.orient_axis(A, beta, A.x)
Write out the position vectors to \(P\), \(S\), and \(Q\):
h, d, w, c, l = sm.symbols('h, d, w, c, l')
r_O_P = h*N.z
r_P_S = -d*A.x
r_S_Q = -w*B.x - (c + l/2)*B.z
r_O_P, r_P_S, r_S_Q
Now calculate:
\(S\) is not moving when observed from \(A\) and \(O\) is fixed in \(A\) so:
(r_O_P + r_P_S).dt(A)
The second term does have a value and can be found with these two components:
A.ang_vel_in(N)
me.cross(A.ang_vel_in(N), r_O_P + r_P_S)
giving \({}^N\bar{v}^S\):
N_v_S = (r_O_P + r_P_S).dt(A) + me.cross(A.ang_vel_in(N), r_O_P + r_P_S)
N_v_S
Similarly for point \(Q\) where \(P\) is fixed in \(B\):
(r_P_S + r_S_Q).dt(B)
me.cross(B.ang_vel_in(N), r_P_S + r_S_Q)
N_v_Q = (r_P_S + r_S_Q).dt(B) + me.cross(B.ang_vel_in(N), r_P_S + r_S_Q)
N_v_Q
SymPy Mechanics provides the
Point
object that simplifies
working with position vectors. Start by creating points and setting relative
positions among points with
set_pos()
.
O = me.Point('O')
P = me.Point('P')
S = me.Point('S')
Q = me.Point('Q')
P.set_pos(O, h*N.z)
S.set_pos(P, -d*A.x)
Q.set_pos(S, -w*B.x - (c + l/2)*B.z)
Once relative positions among points are established you can request the
position vector between any pair of points that are connected by the
set_pos()
statements, for
example \(\bar{r}^{Q/O}\) is:
Q.pos_from(O)
Also, once the position vectors are established, velocities can be calculated.
You will always explicitly need to set the velocity of at least one point in a
collection of points before the velocities of the other points can be
calculated. In our case, we can set \({}^N\bar{v}^O=0\) with
set_vel()
:
O.set_vel(N, 0)
Note
SymPy Mechanics has no way of knowing whether the sculpture is fixed on the road or floating around with some constant speed. All the relative velocities of the various points would not be changed in those two scenarios. Hence, at least the speed of one point must be specified.
Now the velocity in \(N\) for any point that is connected to \(O\) by
the prior set_pos()
statements can be found with the
vel()
method:
Q.vel(N)
This gives the same result as manually calculated above.
Warning
vel()
method will
calculate velocities naively, i.e. not necessarily give the simplest form.
Exercise
Calculate the velocity of point \(B_c\) when observed from reference frame \(A\).
Solution
\(B_c\) is fixed in \(B\) and thus its velocity is zero in \(B\). \(S\) is fixed in \(A\). Using (70) we can then write:
This results in:
Bc = me.Point('B_c')
Bc.set_pos(S, -c*B.z - w/2*A.x)
me.cross(B.ang_vel_in(A), Bc.pos_from(S))
Velocity Two Point Theorem¶
If there are two points \(P\) and \(S\) fixed in a reference frame \(A\) and you know the angular velocity \({}^N\bar{\omega}^A\) and the velocity \({}^N\bar{v}^P\) then \({}^N\bar{v}^S\) can be calculated if the vector \(\bar{r}^{S/P}\), which is fixed in \(A\), is known. The following theorem provides a convenient formulation:
For our example kinetic sculpture, both \(O\) and \(P\) are fixed in \(N\), so \({}^N\bar{v}^P=0\):
N_v_P = 0*N.z
Only the cross product then needs to be formed:
N_v_S = N_v_P + me.cross(A.ang_vel_in(N), S.pos_from(P))
N_v_S
Using pairs of points both fixed in the same reference frame and Eq. (73) gives a compact result.
Point objects have the
v2pt_theory()
method for
applying the above equation given the other point fixed in the same frame, the
frame you want the velocity in, and the frame both points are fixed in. The
velocity of \(P\) is set to zero using
set_vel()
first to ensure
we start with a known velocity.
P.set_vel(N, 0)
S.v2pt_theory(P, N, A)
Note that when you call
v2pt_theory()
it also sets
the velocity of point \(S\) to this version of the velocity vector:
S.vel(N)
Both points \(S\) and \(Q\) are fixed in reference frame \(B\) and we just calculated \({}^N\bar{v}^S\), so we can use the two point theorem to find the velocity of \(Q\) in a similar fashion by applying:
First, using the manual calculation:
N_v_Q = N_v_S + me.cross(B.ang_vel_in(N), Q.pos_from(S))
N_v_Q
and then with the
v2pt_theory()
:
Q.v2pt_theory(S, N, B)
Exercise
Calculate the velocity of the center of mass of the plate \(B_c\) using the two point theorem.
Solution
Bc = me.Point('B_c')
Bc.set_pos(S, -c*B.z - w/2*A.x)
Bc.v2pt_theory(S, N, B)
Velocity One Point Theorem¶
If you are interested in the velocity of a point \(R\) that is moving in a reference frame \(B\) and you know the velocity of a point \(S\) fixed in \(B\) then the velocity of \(R\) is the sum of it’s velocity when observed from \(B\) and the velocity of a point fixed in \(B\) at \(R\) at that instant of time. Put into mathematical terms we get:
where point \(T\) is a point that coincides with \(R\) at that instant.
Combined with the two point theorem for \(T\), you can write:
In our kinetic sculpture example, if the pigeon \(R\) is walking at a distance \(s\) in the \(\hat{b}_x\) direction from the upper right corner, then we can calculate the velocity of the pigeon when observed from the \(N\) reference frame. First establish the position of \(R\):
s = me.dynamicsymbols('s')
t = me.dynamicsymbols._t
R = me.Point('R')
R.set_pos(Q, l*B.z + s*B.x)
The velocity of the pigeon when observed from \(B\) is:
B_v_R = s.diff(t)*B.x
B_v_R
Now the other terms:
r_S_R = R.pos_from(S)
r_S_R
N_v_T = N_v_S + me.cross(B.ang_vel_in(N), r_S_R)
N_v_T
And finally the velocity of the pigeon when observed from \(N\):
N_v_R = B_v_R + N_v_T
N_v_R
There is a method
v1pt_theory()
that does
this calculation. It does require that the point \(S\)’s, in our case,
velocity is fixed in \(B\) before making the computation:
S.set_vel(B, 0)
R.v1pt_theory(S, N, B)
Translational Acceleration¶
The acceleration of point \(P\) in reference frame \(A\) is defined as
Using SymPy Mechanics, the acceleration of a point in a reference frame can be
calculated with acc()
:
S.acc(N)
Acceleration Two Point Theorem¶
The two point theorem above has a corollary for acceleration. Starting with the velocity theorem:
the acceleration can be found by applying the definition of acceleration:
This presentation of the acceleration shows the tangential component of acceleration:
\({}^N\bar{\alpha}^A\) can be calculated with
ang_acc_in()
:
me.cross(A.ang_acc_in(N), S.pos_from(P))
The tangential component is always tangent to the motion path of \(P\). The last term is the radial component of acceleration, also called centripetal acceleration:
which can also be calculated using the methods of with
Point
and
ReferenceFrame
:
me.cross(A.ang_vel_in(N), me.cross(A.ang_vel_in(N), S.pos_from(P)))
This acceleration component is always normal to the motion path of \(P\).
Lastly, a2pt_theory()
calculates the acceleration using this theorem with:
S.a2pt_theory(P, N, A)
where \(S\) and \(P\) are fixed in \(A\) and the velocity is desired in \(N\).
Exercise
Calculate the acceleration of point \(Q\) with the two point theorem.
Solution
Q.a2pt_theory(S, N, B)
Acceleration One Point Theorem¶
The velocity one point theorem also can be time differentiated to see its acceleration form. Starting with the expanded one point theorem for velocity:
and taking the time derivative in the frame \(N\) the corollary formula for acceleration can be derived:
One of my dynamics professors, Dean Karnopp, liked to call this equation the “five term beast”, as it is about the nastiest equation that shows up in dynamics. Looking carefully at this form, the result of the two point theorem is embedded, so this is equivalent to:
where \(T\) is again the point fixed at \(R\) in this instant of time. The tangential and centripetal acceleration terms are present in \({}^N\bar{a}^T\). The term \(2{}^N\bar{\omega}^B \times {}^B\bar{v}^R\) is the Coriolis acceleration that arises from \(R\) moving in the rotating frame \(B\).
The three terms in Eq. (84) can be calculated for our pigeon like so:
B_a_R = R.acc(B)
B_a_R
N_a_T = R.a2pt_theory(S, N, B)
N_a_T
2*me.cross(B.ang_vel_in(N), R.vel(B))
The a1pt_theory()
method
can also be used to make this calculation:
R.a1pt_theory(S, N, B)
The acceleration of the pigeon when viewed from \(N\) is no flapping matter.