Skip to content

Commit 1035c79

Browse files
committed
Resolve merge.
2 parents 2193fd6 + aa8a9eb commit 1035c79

File tree

9 files changed

+159
-96
lines changed

9 files changed

+159
-96
lines changed

angular.rst

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,25 +39,25 @@ Learning Objectives
3939

4040
After completing this chapter readers will be able to:
4141

42-
- apply the definition of angular velocity
43-
- calculate the angular velocity of simple rotations
44-
- choose Euler angles for a rotating reference frame
45-
- calculate the angular velocity of reference frames described by successive
46-
simple rotations
47-
- derive the time derivative of a vector in terms of angular velocities
48-
- calculate the angular acceleration of a reference frame
49-
- calculate the angular acceleration of reference frames described by
50-
successive rotations
42+
#. apply the definition of angular velocity
43+
#. calculate the angular velocity of simple rotations
44+
#. choose Euler angles for a rotating reference frame
45+
#. calculate the angular velocity of reference frames described by successive
46+
simple rotations
47+
#. derive the time derivative of a vector in terms of angular velocities
48+
#. calculate the angular acceleration of a reference frame
49+
#. calculate the angular acceleration of reference frames described by
50+
successive rotations
5151

5252
Introduction
5353
============
5454

5555
To apply `Euler's Laws of Motion`_ to a multibody system we will need to
5656
determine how the `angular momentum`_ of each rigid body changes with time.
57-
This requires that we specify the angular kinematics of each body in the
58-
system: typically both angular velocity and angular acceleration. Assuming that
59-
a reference frame is fixed to a rigid body, we will start by finding the
60-
angular kinematics of a single reference frame and then use the properties of
57+
This requires specifying the angular kinematics of each body in the system:
58+
typically both angular velocity and angular acceleration. Assuming that a
59+
reference frame is fixed to a rigid body, we will start by finding the angular
60+
kinematics of a single reference frame and then use the properties of
6161
:ref:`Successive Orientations` to find the angular kinematics of a set of
6262
related reference frames.
6363

@@ -76,6 +76,10 @@ of time.
7676
<source
7777
src="https://upload.wikimedia.org/wikipedia/commons/b/be/Dzhanibekov_effect.ogv"
7878
type="video/ogg">
79+
<source
80+
src="https://objects-us-east-1.dream.io/mechmotum/dzhanibekow-effect.mp4"
81+
type="video/mp4">
82+
Your browser does not support the video tag.
7983
</video>
8084
<p>Public Domain, NASA</p>
8185
</center>
@@ -84,8 +88,8 @@ The T-handle exhibits unintuitive motion, reversing back and forth
8488
periodically. This phenomena is commonly referred to as the "`Dzhanibekov
8589
effect`_" and Euler's Laws of Motion predict the behavior, which we will
8690
investigate in later chapters. For now, we will learn how to specify the
87-
angular kinematics of a reference frame in motion, such as one fixed to this
88-
T-handle.
91+
angular kinematics of a reference frame in rotational motion, such as one fixed
92+
to this T-handle.
8993

9094
.. _Dzhanibekov effect: https://en.wikipedia.org/wiki/Tennis_racket_theorem
9195

energy.rst

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ of the system.
164164
Total Energy
165165
============
166166

167-
The total energy of the system is:
167+
The total energy of the system is:
168168

169169
.. math::
170170
@@ -573,7 +573,7 @@ are similar to prior chapters, so I leave them unexplained.
573573
Matplotlib axes for each panel.
574574

575575
"""
576-
fig, axes = plt.subplots(6, 1, sharex=True)
576+
fig, axes = plt.subplots(6, 1, sharex=True, layout='constrained')
577577

578578
fig.set_size_inches((10.0, 6.0))
579579

@@ -593,15 +593,13 @@ are similar to prior chapters, so I leave them unexplained.
593593
axes[4].legend(['$K$', '$V$', '$E$'])
594594
axes[5].legend(['$T_k$'])
595595

596-
axes[0].set_ylabel('Distance [m]')
597-
axes[1].set_ylabel('Angle [deg]')
598-
axes[2].set_ylabel('Speed [m/s]')
599-
axes[3].set_ylabel('Angular Rate [deg/s]')
600-
axes[4].set_ylabel('Energy [J]')
601-
axes[5].set_ylabel('Torque [N-m]')
602-
axes[5].set_xlabel('Time [s]')
603-
604-
fig.tight_layout()
596+
axes[0].set_ylabel('Distance\n[m]')
597+
axes[1].set_ylabel('Angle\n[deg]')
598+
axes[2].set_ylabel('Speed\n[m/s]')
599+
axes[3].set_ylabel('Angular Rate\n[deg/s]')
600+
axes[4].set_ylabel('Energy\n[J]')
601+
axes[5].set_ylabel('Torque\n[N-m]')
602+
axes[5].set_xlabel('Time\n[s]')
605603

606604
return axes
607605

generalized-forces.rst

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,68 @@ where :math:`\hat{e}_r` is a unit vector in the independent speed
284284
:math:`\bar{u}_s` vector space, e.g. :math:`\hat{e}_2=\left[0, 1, 0,
285285
0\right]^T` if :math:`p=4`. See [Kane1985]_ pg. 48 for more explanation.
286286

287+
Revisit the Chaplygin Sleigh
288+
----------------------------
289+
290+
To see how :math:`\mathbf{A}_n` can be used to formulate a nonholonomic partial
291+
velocity, recall the :ref:`Chaplygin Sleigh` velocity equations where
292+
:math:`u_x=\dot{x}` and :math:`u_y=\dot{y}`:
293+
294+
.. jupyter-execute::
295+
296+
x, y, theta = me.dynamicsymbols('x, y, theta')
297+
ux, uy, utheta = me.dynamicsymbols('u_x, u_y, u_theta')
298+
299+
N = me.ReferenceFrame('N')
300+
A = me.ReferenceFrame('A')
301+
302+
A.orient_axis(N, theta, N.z)
303+
304+
O = me.Point('O')
305+
P = me.Point('P')
306+
307+
P.set_pos(O, x*N.x + y*N.y)
308+
309+
O.set_vel(N, 0)
310+
311+
N_v_P = P.vel(N).express(A).xreplace({x.diff(): ux, y.diff(): uy})
312+
N_v_P
313+
314+
and that the nonholonomic constraint is:
315+
316+
.. jupyter-execute::
317+
318+
fn = N_v_P.dot(A.y)
319+
fn
320+
321+
The simplest, but not necessarily computationally efficient, method of finding
322+
a nonholonomic partial velocity is to substitute all dependent speeds for
323+
expressions that are functions only of the independent speeds. So, if we select
324+
:math:`u_x` to be the dependent speed, the nonholonomic partial velocity of
325+
:math:`u_y` is:
326+
327+
.. jupyter-execute::
328+
329+
ux_sol = sm.solve(fn, ux)[0]
330+
ux_sol
331+
332+
.. jupyter-execute::
333+
334+
N_v_P.xreplace({ux: ux_sol}).diff(uy, N).simplify()
335+
336+
But, the same result can be found without substitution by using
337+
:math:`\mathbf{A}_n` from :math:numref:`eq-constraint-linear-form-solve`, which
338+
for this example is simply the scalar:
339+
340+
.. jupyter-execute::
341+
342+
An = ux_sol.diff(uy)
343+
An
344+
345+
.. jupyter-execute::
346+
347+
(N_v_P.diff(uy, N) + N_v_P.diff(ux, N)*An).simplify()
348+
287349
Generalized Active Forces
288350
=========================
289351

introduction.rst

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -147,24 +147,12 @@ helped improve the text in many ways. We also thank the students of TU Delft's
147147
Multibody Dynamics course who test the materials while learning.
148148

149149
These are the primary contributors to the SymPy Mechanics software presented in
150-
the text, in approximate order of first contribution:
151-
152-
- Dr. Luke Peterson, 2009
153-
- Dr. Gilbert Gede, 2011
154-
- Dr. Angadh Nanjangud, 2012
155-
- Tarun Gaba, 2013
156-
- Oliver Lee, 2013
157-
- Dr. Chris Dembia, 2013
158-
- Jim Crist, 2014
159-
- Sahil Shekhawat, 2015
160-
- James McMillan, 2016
161-
- Nikhil Pappu, 2018
162-
- Sudeep Sidhu, 2020
163-
- Abhinav Kamath, 2020
164-
- Timo Stienstra, 2022
165-
- Dr. Sam Brockie, 2023
166-
- Hwayeon Kang, 2024
167-
- Riccardo Di Girolamo, 2024
150+
the text, in approximate order of first contribution: Dr. Luke Peterson (2009),
151+
Dr. Gilbert Gede (2011), Dr. Angadh Nanjangud (2012), Tarun Gaba (2013), Oliver
152+
Lee (2013), Dr. Chris Dembia (2013), Jim Crist (2014), Sahil Shekhawat (2015),
153+
James McMillan (2016), Nikhil Pappu (2018), Sudeep Sidhu (2020), Abhinav Kamath
154+
(2020), Timo Stienstra (2022), Dr. Sam Brockie (2023), Hwayeon Kang (2025), and
155+
Riccardo Di Girolamo (2025).
168156

169157
SymPy Mechanics is built on top of SymPy, whose `1000+ contributors`_ have also
170158
greatly helped SymPy Mechanics be what it is. Furthermore, the software sits on

motion.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -720,8 +720,8 @@ nonholonomic constraints:
720720
.. math::
721721
:label: eq-snakeboard-constraints
722722
723-
{}^A\bar{v}^{Bo} \cdot \hat{b}_y = 0 \\
724-
{}^A\bar{v}^{Co} \cdot \hat{c}_y = 0
723+
{}^N\bar{v}^{Bo} \cdot \hat{b}_y = 0 \\
724+
{}^N\bar{v}^{Co} \cdot \hat{c}_y = 0
725725
726726
.. jupyter-execute::
727727

notation.rst

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ Angular and Translational Kinematics
9090
Constraints
9191
===========
9292

93-
.. todo:: Add Y_k, kin diff eqs.
94-
93+
:math:`\bar{u} = \mathbf{Y}_k \dot{\bar{q}} + \bar{z}_k`
94+
Generalized speeds defined as the kinematical differential equations.
9595
:math:`N,M,n,m,p`
9696
:math:`N` coordinates, :math:`M` holonomic constraints, :math:`n`
9797
generalized coordinates and generalized speeds, :math:`m` nonholonomic
@@ -134,8 +134,8 @@ Mass Distribution
134134
Central inertia dyadic of body :math:`B` or set of particles :math:`B` with respect
135135
to mass center :math:`B_o`.
136136
:math:`{}^A \bar{H}^{B/O}`, ``A_H_B_O``
137-
Angular momentum of rigid body :math:`B` with respect to point :math:`O` in
138-
reference frame :math:`A`.
137+
Angular momentum of rigid body :math:`B` with respect to point :math:`O`
138+
when viewed from reference frame :math:`A`.
139139

140140
Force, Moment, and Torque
141141
=========================
@@ -145,6 +145,8 @@ Force, Moment, and Torque
145145
:math:`\bar{R}^{S/Q}`, ``R_S_Q``
146146
Resultant of the vector set :math:`S` bound to a line of action through
147147
point :math:`Q`.
148+
:math:`\bar{F}^{Q}`, ``F_Q``
149+
Force vector bound to a line of action through point :math:`Q`.
148150
:math:`\bar{M}^{S/P}`, ``M_S_P``
149151
Moment of the resultant of the vector set :math:`S` about point :math:`P`.
150152
:math:`\bar{T}^{B}`, ``T_B``
@@ -187,16 +189,19 @@ Generalized Forces
187189
Unconstrained Equations of Motion
188190
=================================
189191

190-
:math:`\bar{f}_k(\dot{\bar{q}}, \bar{u}, \bar{q}, t) = 0`
191-
Kinematical differential equations.
192+
:math:`\bar{f}_k(\dot{\bar{q}}, \bar{u}, \bar{q}, t) = 0`
193+
Kinematical differential equations that take the form: :math:`\bar{f}_k =
194+
\mathbf{Y}_k \dot{\bar{q}} + \bar{z}_k - \bar{u} = \mathbf{M}_k
195+
\dot{\bar{q}} + \bar{g}_k = 0`.
192196
:math:`\mathbf{M}_k`
193197
Linear coefficient matrix for :math:`\dot{\bar{q}}` in the kinematical
194198
differential equations.
195199
:math:`\bar{g}_k`
196200
Terms not linear in :math:`\dot{\bar{q}}` in the kinematical differential
197201
equations.
198202
:math:`\bar{f}_d(\dot{\bar{u}}, \bar{u}, \bar{q}, t) = 0`
199-
Dynamical differential equations.
203+
Dynamical differential equations that take the form: :math:`\bar{f}_d =
204+
\mathbf{M}_d \dot{\bar{u}} + \bar{g}_d = 0`.
200205
:math:`\mathbf{M}_d`
201206
Linear coefficient matrix for :math:`\dot{\bar{u}}` in the dynamical
202207
differential equations, often called the "mass matrix".
@@ -210,6 +215,8 @@ Unconstrained Equations of Motion
210215
motion.
211216
:math:`\bar{g}_m`
212217
Terms not linear in :math:`\dot{\bar{x}}` in the equations of motion.
218+
:math:`\dot{\bar{x}} = \bar{f}_m(\bar{x}, t) = -\mathbf{M}_m^{-1} \bar{g}_m`
219+
Equations of motion in first order explicit form.
213220

214221
Equations of Motion with Nonholonomic Constraints
215222
=================================================

orientation.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,10 @@ explicitly:
564564

565565
N.orient_explicit(A, A_C_N)
566566

567+
.. todo::
568+
569+
When we change to SymPy 1.13, change ``orient_explicit`` to ``orient_dcm``.
570+
567571
.. warning::
568572

569573
Note very carefully what version of the direction cosine matrix you pass to

0 commit comments

Comments
 (0)