The absolute approach to plane motion writes the position of every point as an explicit function of time, then differentiates to obtain velocity and acceleration. It is mechanical and always works, but the algebra grows quickly with the number of links. We use the rolling wheel as a worked example before moving on to a more efficient approach in the next section.
Wheel rolling without slipping
Rolling wheel kinematics
The marked point \(P\) on the rim traces a cycloid as the wheel rolls. Reading its coordinates off the figure,
\[
\begin{aligned}
& x = s - r \sin\theta \\
& y = r - r \cos\theta
\end{aligned}
\]
where \(s\) is the horizontal travel of the centre and \(\theta\) the rotation angle.
Rolling without slipping ties the translation of the centre to the rotation of the wheel through \(s = r\theta\), so
\[
x = r\theta - r \sin\theta
\]
Differentiating the rolling constraint with respect to time gives the translational velocity and acceleration of the centre,
\[
\begin{aligned}
& v_0 = r \omega \\
& a_0 = r \alpha = r \dot\omega = r \ddot\theta
\end{aligned}
\]
Substituting \(s(t) = r\theta(t)\) gives the position of \(P\) as a function of time,
Since the centre moves rectilinearly, its speed \(v_0\) coincides with the overall speed \(v\) and its acceleration \(a_0\) with the tangential component \(a_t\). Inverting the rolling relations then expresses the angular quantities in terms of linear ones,
The recipe is mechanical: write the position vector as a function of time, differentiate twice, and use the rolling constraint to eliminate intermediate variables. It always works, but it is often laborious. In what follows we develop a more direct approach based on angular velocity and acceleration vectors.
Example - Window
Window opened by a hydraulic piston
A window is held by a pin at \(O\) and opened by a hydraulic piston anchored at \(A\) on the wall, 2 m below \(O\), and attached to the window at \(B\), 1 m from the hinge. The piston extends at a constant rate \(\dot s = 300\) mm/s. We want to know
the maximum opening angle of the window,
the angular velocity \(\dot\theta\) and the peripheral speed at the bottom edge of the window as functions of \(\theta\),
the angular acceleration \(\ddot\theta\) and whether the window speeds up or slows down as it opens.
Solution
We place the origin at the upper hinge \(O\) and let \(\theta\) be the angle between the arm \(OB\) and the downward vertical. From the figure,
The piston is fully extended when \(s = 2\) m. Plotting \(s(\theta)\) lets us read off the angle where this happens, and solving the equation gives the exact value.
import sympy as spsols = sp.solve(sp.Eq(s, 2), theta)theta_max = [x for x in sols if0< x < sp.pi/2][0]ltx(r"\theta_{\max} =", theta_max, r"\text{ rad} =", sp.deg(theta_max).evalf(4), r"^\circ")
To go from \(s(\theta)\) to \(\dot\theta(t)\) we promote \(\theta\) and \(s\) to functions of time and differentiate the relation \(s^2 = 5 - 4\cos\theta\) once,
\[
2 s \dot s = 4 \sin\theta \, \dot\theta \quad \Rightarrow \quad \dot\theta = \frac{s \, \dot s}{2\sin\theta}
\]
Substituting \(\dot s = 0.3\) m/s gives the angular velocity as a function of \(\theta\) alone.
Near \(\theta = 0\) the angular velocity diverges: the piston pulls almost along the arm \(OB\), so a small extension produces a large rotation. As \(\theta\) grows the curve flattens and appears to level off, but a closer look reveals a minimum around \(60^\circ\).
Code
import sympy as sptheta_opt = sp.solve(sp.diff(omega, theta), theta)theta_opt = [x for x in theta_opt if x.is_real and0< x < sp.pi/2][0]omega_min = sp.simplify(omega.subs(theta, theta_opt))ltx(r"\theta_{\min} =", theta_opt, r"=", sp.deg(theta_opt), r"^\circ,\qquad \dot\theta_{\min} =", omega_min, r"\text{ rad/s}")
The minimum is exactly \(60^\circ\) with \(\dot\theta_{\min} = 0.3\) rad/s.
Peripheral speed at the bottom of the window
The bottom edge of the window is at a distance \(r = 2\) m from the hinge \(O\) (1 m to \(B\), then 1 m along the window). For pure rotation about \(O\) the speed of a point at radius \(r\) is
\[
v_p = r \dot\theta
\]
Code
r =2v_p = r * omegaltx(r"v_p(\theta) =", v_p, r"\text{ m/s}")
Differentiating \(\dot\theta(\theta)\) once more with respect to time and using the chain rule \(\ddot\theta = \dfrac{d\dot\theta}{d\theta}\,\dfrac{d\theta}{d t}\) gives the angular acceleration as a function of \(\theta\).
The angular acceleration is negative below \(60^\circ\) (the window is decelerating) and positive above (it is speeding up again), crossing zero exactly at the minimum of \(\dot\theta\). The stroke travels at constant rate, but the geometric mapping from stroke to angle is nonlinear, which is why a constant \(\dot s\) produces a non-constant \(\dot\theta\).
Example - Sliding triangular linkage
A rigid triangular plate \(CBA\) with sides \(b = 0.2\) m. Vertex \(B\) slides on a horizontal track, vertex \(A\) on a vertical track. Vertex \(A\) moves down at \(v_A = 0.3\) m/s.
Find \(v_B(\theta)\), \(a_B(\theta)\), \(\omega(\theta)\), and \(\alpha(\theta)\) for \(\theta \in [0, 80^\circ]\), where \(\theta\) is the angle of bar \(BA\) above the horizontal.
Solution
With the origin at the corner where the tracks meet, \(A_y = b\sin\theta\) and \(B_x = b\cos\theta\). Differentiating \(A_y^2 + B_x^2 = b^2\) in time and using \(\dot A_y = v_A\) propagates the kinematics.
Differentiate \(A_y(t) = b\sin\theta(t)\) in time using the chain rule, then apply \(\dot A_y = v_A\) to solve for the angular velocity \(\dot\theta = \omega\):
A rigid body rotating about a fixed axis is the simplest case of plane motion: every point traces a circle, and a single scalar \(\omega(t)\) together with the radius fixes the velocity and acceleration of every point. This section promotes the scalar relations \(v = r\omega\) and \(a_n = r\omega^2\) to vector form using cross products, which extends cleanly to the moving-pivot case in the next section.
General plane motion of a rigid body
The same motion decomposed into a translation and a rotation
A body rotating about a fixed point. The fixed point may be on or outside the body.
We recall from Section 6.3.12 that for a particle tracing a circle of radius \(r\)
\[
\begin{aligned}
& v = r \omega \\
& a_n = r\omega^2 = \dfrac{v^2}{R} \\
& a_t = r \alpha = \dot v
\end{aligned}
\]
Rotation about the \(z\)-axis in 3D. The scalar relations of the 2D case carry over once we express \(\bm\omega\), \(\bm\alpha\) and the position as vectors and replace products by cross products.
In three dimensions we promote \(\omega\) to a vector \(\bm\omega = \omega\,\bm e_z\) aligned with the rotation axis. Its direction follows from the right-hand rule: a body spinning at 5 rad/s about \(\bm e_z\) rotates counter-clockwise when viewed from the \(+z\) side.
With this promotion the kinematic relations take a coordinate-free vector form,
The right-hand rule fixes the direction of each cross product. With \(\bm\omega\) along \(+\bm e_z\), aligning the thumb with \(\bm\omega\) and the index finger with \(\bm r\) sends the middle finger along \(\bm v\). Geometrically, \(\bm\omega \times \bm r\) rotates \(\bm r\) by \(90^\circ\) in the plane perpendicular to \(\bm\omega\), giving a velocity tangent to the circular path. Applying the rule again, \(\bm a_n = \bm\omega \times \bm v\) rotates \(\bm v\) by another \(90^\circ\) and thus points from the particle toward the rotation axis, which is the centripetal direction.
The vector formulas become concrete once we write out the components. Take \(\bm\omega = \omega\,\bm e_z\) for a body spinning about the \(z\)-axis and place a point at \(\bm r_A = r \bm e_x\), so
The result has magnitude \(r \omega\) and points along \(+\bm e_y\), perpendicular to both \(\bm\omega\) and \(\bm r_A\) as the right-hand rule predicts. This is the tangent direction at the particle’s circular path, and the scalar relation \(v = r\omega\) of the 2D case is recovered.
Applying the cross product once more gives the normal (centripetal) acceleration,
The acceleration points back along \(-\bm e_x\), from the particle toward the rotation axis, with magnitude \(r \omega^2\). This matches \(a_n = r\omega^2\) from the scalar case. Each cross product with \(\bm\omega\) rotates the previous vector by \(90^\circ\) in the plane perpendicular to the rotation axis: \(\bm r\) becomes the tangent direction of \(\bm v\), and \(\bm v\) becomes the inward radial direction of \(\bm a_n\).
Rotation Example - Gearing
Pinion \(A\) (radius \(r_A = 200\) mm) drives gear \(B\) (pitch radius \(r_B = 600\) mm), which is fixed to a hoisting drum of radius \(r_D = 800\) mm. A cable wound on the drum lifts the load \(L\). Point \(C\) sits on the drum rim.
Pinion \(A\) drives gear \(B\), which is rigidly attached to a hoisting drum of radius \(r_D = 800\) mm. A cable wound on the drum lifts the load \(L\). At the instant shown the pinion rotates at \(\omega_A = 200\) rpm and is accelerating at \(\alpha_A = 10\) rad/s\(^2\). We want
the velocity \(v_L\) and acceleration \(a_L\) of the load, and
the acceleration of point \(C\) on the drum rim.
Solution
The hoist forms a single kinematic chain carrying the pinion’s motion outward to the load. The pinion-gear mesh imposes a no-slip rolling contact (see below) that fixes the drum’s angular velocity. The cable leaves the drum tangentially, so the load moves with the drum’s rim speed at the cable point, \(v_L = r_D\omega_B\). Differentiating both constraints once in time propagates accelerations along the same chain.
ImportantNo-slip at a rolling contact
Where two rotating bodies meet without slipping, whether gear teeth, friction wheels, a chain on a sprocket, or a wheel on the ground, the surface velocities at the contact point are equal. For two cylinders of radii \(r_1\) and \(r_2\) rotating at \(\omega_1\) and \(\omega_2\), the no-slip condition gives
\[
r_1\,\omega_1 = r_2\,\omega_2.
\]
This single equation is what links one rotating element to the next in a kinematic chain, and the same form appears in every problem involving gears, belts, or rolling motion.
Converting the pinion speed to SI units, \(\omega_A = 200 \cdot 2\pi/60\) rad/s. Solving the two constraints for the drum and the load gives
Point \(C\) rides on the drum rim at radius \(r_D\), so its acceleration splits into a tangential component along the rim and a normal component pointing toward the drum centre,
A right-angle bar is rotating around a fixed axis.
The right-angle bar rotates clockwise with an angular velocity decreasing at the rate of \(4~\text{rad/s}^2\). Write the vector expressions for the velocity and acceleration of point \(A\) when \(\omega = 2~\text{rad/s}\).
Solution
We place the origin at the bar’s pivot, with \(\bm e_x\) along the horizontal segment, \(\bm e_y\) along the vertical segment, and \(\bm e_z\) out of the figure plane along the rotation axis. Point \(A\) sits at
The bar rotates clockwise as viewed from the \(+\bm e_z\) side (the reader’s viewpoint), so the angular velocity vector points along \(-\bm e_z\),
\[
\bm\omega = -2\,\bm e_z \text{ rad/s}.
\]
The magnitude of \(\bm\omega\) is decreasing at \(\alpha=\) 4 rad/s\(^2\), which means the angular acceleration vector opposes \(\bm\omega\) and therefore points along \(+\bm e_z\),
\[
\bm\alpha = 4\,\bm e_z \text{ rad/s}^2.
\]
Both \(\bm\omega\) and \(\bm\alpha\) are perpendicular to the plane of the bar, so the full position vector \(\bm r_{OA}\) enters the cross products. The perpendicular distance from \(A\) to the rotation axis is \(r_\perp = |\bm r_{OA}| = \sqrt{0.4^2 + 0.3^2} = 0.5\) m. The velocity and the two acceleration components follow from \(\bm v_A = \bm\omega \times \bm r_{OA}\), \(\bm a_n = \bm\omega \times \bm v_A\), and \(\bm a_t = \bm\alpha \times \bm r_{OA}\).
The velocity \(\bm v_A = 0.6\,\bm e_x - 0.8\,\bm e_y\) m/s is tangent to the circular path of \(A\) in the figure plane, with magnitude \(r_\perp \omega = 0.5 \cdot 2 = 1\) m/s. The normal acceleration \(\bm a_n = -1.6\,\bm e_x - 1.2\,\bm e_y\) m/s\(^2\) points from \(A\) back toward the origin (where the rotation axis pierces the plane), with magnitude \(r_\perp\,\omega^2 = 2\) m/s\(^2\). The tangential acceleration \(\bm a_t = -1.2\,\bm e_x + 1.6\,\bm e_y\) m/s\(^2\) is antiparallel to \(\bm v_A\), as expected for a slowing rotation, and has magnitude \(r_\perp\,|\bm\alpha| = 2\) m/s\(^2\). Adding the two perpendicular components,
A picture of the geometry and the kinematic vectors at the instant \(\omega = 2\) rad/s, with the bar in the figure plane and rotation axis \(\bm e_z\) pointing toward the reader.
Code
from mechanicskit import arrowA = sp.Matrix([0.4, 0.3, 0])fig, ax = plt.subplots()# Barax.plot([0, 0.4, 0.4], [0, 0, 0.3], color='k', lw=3, solid_capstyle='round')# Origin and point A markersax.plot(0, 0, 'ko', ms=6)ax.plot(0.4, 0.3, 'ko', ms=6)ax.text(0, -0.05, '$O$', fontsize=12)ax.text(0.41, 0.3, '$A$', fontsize=12)# Local x and y axes at the originarrow([0, 0], [0.5, 0], ax=ax, color='k', linestyle='--', linewidth=1.2, head_scale =10)arrow([0, 0], [0, 0.25], ax=ax, color='k', linestyle='--', linewidth=1.2, head_scale =10)ax.text(0.5, 0, '$x$', color='k', fontsize=11)ax.text(0, 0.27, '$y$', color='k', fontsize=11)# Velocity (blue), acceleration components (green), resultant (red)scale =0.2arrow(A, vv_A, ax=ax, color='tab:blue', scale=scale)arrow(A, aa_n, ax=ax, color='tab:green', scale=scale)arrow(A, aa_t, ax=ax, color='tab:green', scale=scale)arrow(A, aa_A, ax=ax, color='tab:red', scale=scale)# Tip labelsax.text(0.4+float(vv_A[0])*scale, 0.3+float(vv_A[1])*scale, r'$v_A$', color='tab:blue', fontsize=12)ax.text(0.4+float(aa_n[0])*scale-0.05, 0.3+float(aa_n[1])*scale, r'$a_n$', color='tab:green', fontsize=12)ax.text(0.4+float(aa_t[0])*scale, 0.3+float(aa_t[1])*scale, r'$a_t$', color='tab:green', fontsize=12)ax.text(0.4+float(aa_A[0])*scale-0.05, 0.3+float(aa_A[1])*scale, r'$a_A$', color='tab:red', fontsize=12)ax.set_aspect('equal')ax.grid(True, alpha=0.3)ax.set_xlabel('x [m]'); ax.set_ylabel('y [m]')ax.set_title(r'Rotating bar at $\omega = -2$ rad/s')ax.set_xlim(-0.25, 0.6)ax.set_ylim(-0.1, 0.7)plt.tight_layout()plt.show()
Relative Motion
The rotation formulas above assume a fixed pivot. When the body translates as well as rotates, we describe each point relative to a chosen reference point that itself moves. The motion of any other point splits into two pieces: the motion of the reference and a rotation about it. The animations below illustrate this decomposition.
The motion is expressed as the sum of a parallel translation of point B, \(\bm r_B\), and the relative translation \(\bm r_{A/B}\) (“A seen from B”)
Differentiating the position relation in time gives the velocity decomposition. The body-fixed offset \(\bm r\) has constant length, so its time derivative is purely rotational, \(\dot{\bm r} = \bm\omega \times \bm r\), perpendicular to \(\bm r\) with magnitude \(\omega r\).
A second time derivative gives the acceleration. The relative term picks up two pieces, mirroring the centripetal-tangential split for a particle on a circular path:
The two components have the same form as for a particle on a circle of radius \(r\) centred on \(B\), with \(\bm r\) playing the role of the radius vector:
We revisit the rolling wheel of Section 6.4.1 using the centre \(C\) as reference. \(C\) travels in a straight line at \(r\omega\), so its velocity and acceleration are known. The rim point \(A\) swings about \(C\) on a circle of radius \(r\), and the relative formulas reduce to a single cross product per derivative.
At the contact point (\(\theta = 0\)), \(\bm v_A = \bm 0\): the contact is instantaneously at rest, which is the statement of rolling without slipping. At the top of the wheel (\(\theta = \pi\)), \(\bm v_A = 2 r\omega \bm e_x\), twice the centre speed.
\[
\underbrace{\left[\begin{array}{c}
r \alpha \\
0 \\
0
\end{array}\right]}_{\boldsymbol{a}_C}+\underbrace{r \omega^2\left[\begin{array}{c}
\sin \theta \\
\cos \theta \\
0
\end{array}\right]}_{\left(\boldsymbol{a}_{A / C}\right)_n}+\underbrace{r \alpha\left[\begin{array}{c}
-\cos \theta \\
\sin \theta \\
0
\end{array}\right]}_{\left(\boldsymbol{a}_{A / C}\right)_t}=\left[\begin{array}{c}
\alpha r (1-\cos \theta)+\omega^2 r \sin (\theta) \\
\omega^2 r \cos (\theta)+\alpha r \sin (\theta) \\
0
\end{array}\right]
\]
This is exactly \(\ddot P\) from the absolute-motion derivation, recovered without parameterising the cycloid by time. At the contact point (\(\theta = 0\)), \(\bm a_A = (0, r\omega^2, 0)^\mathsf T\): purely centripetal toward the centre, even though the contact velocity is zero. The contact point of a rolling wheel is at rest instantaneously, not over any finite interval.
Example - Hydraulic crank linkage
A hydraulic cylinder pushes the slider \(A\) horizontally to the left at constant speed \(v_A = 2\) m/s. The slider connects through a rigid link of length \(L_{BA} = 300\) mm to the end of a crank \(OB\) of length \(L_{OB} = 120\) mm pinned at the fixed pivot \(O\). The slider track sits \(h = 50\) mm above the pivot. We want the angular velocities \(\omega_O\) of the crank and \(\omega_{BA}\) of the connecting rod when the crank makes an angle \(\theta = 20^\circ\) with the upward vertical.
Hydraulic cylinder
Solution
Place the origin at the pivot \(O\) with \(\bm e_x\) horizontal and \(\bm e_y\) pointing up, and let \(\theta\) be the angle of \(OB\) measured from the upward vertical. The crank end is at
The slider rides on the horizontal track \(y = h\), to the right of \(B\). The fixed length \(|\bm r_{AB}| = L_{BA}\) pins down its \(x\)-coordinate, and the connecting-rod vector reads
with \(\bm v_A = -2\,\bm e_x\) m/s and both angular velocities along \(\bm e_z\). The \(z\)-component of the equation vanishes, so the \(x\) and \(y\) components form a \(2\times 2\) linear system for \(\omega_O\) and \(\omega_{BA}\).
The crank rotates counter-clockwise at about 16.5 rad/s while the connecting rod swings the opposite way at about 2.3 rad/s. The mechanism becomes singular as the connecting rod approaches the horizontal: a horizontal \(\bm r_{AB}\) has no \(y\)-component, so the \(y\)-equation can no longer balance the \(\sin\theta\) contribution from \(\bm\omega_O \times \bm r_{OB}\), and \(\omega_O\) blows up.
Example - Three-bar mechanism
Three-bar linkage. The crank \(CB\) is the input, the crank \(OA\) is the output, and the connecting rod \(AB\) ties them together. Lengths are 100 mm, 182 mm, and 75 mm; the fixed pivots are at \(O\) and \(C = (250, 50)\) mm.
The crank \(CB\) rotates at constant \(\omega_{CB} = 5\) rad/s. We want the link positions, the angular velocities \(\omega_{OA}\), \(\omega_{AB}\), and the angular accelerations \(\alpha_{OA}\), \(\alpha_{AB}\) as functions of the input angle \(\theta\) that locates \(CB\).
Three-bar mechanisms differ from the slider-crank in one respect: the loop closure is implicit. There is no closed-form expression for \(A\) given \(\theta\), so we solve numerically.
Preliminary analysis
Sketching the configuration in CAD before writing equations is worth the time. The same set of link lengths admits two assemblies at most input angles, and the model has to land on the intended branch.
Alternative assembly at the same input angle \(\theta = 30^\circ\). Two configurations exist for most \(\theta\); warm-starting the nonlinear solver from the previous solution keeps the swept trajectory on a single branch.
Position analysis
We close the kinematic loop \(O \to A \to B\) and equate it to \(O \to C \to B\). Let \(\varphi\) be the angle of \(OA\) from the upward vertical and \(\gamma\) the angle of \(AB\) from the upward vertical. Then
For each \(\theta\) this is a \(2\times 2\) nonlinear system in \((\varphi, \gamma)\), solved with scipy.optimize.fsolve.
Kinematic chain. Walking from \(O\) to \(B\) via \(A\) uses the unknowns \(\varphi, \gamma\); walking from \(O\) via \(C\) uses the input \(\theta\). Equating the two paths gives the loop equation.
As a quick proof of concept we set up the kinematics constraints at \(\theta=30^\circ\):
The minus sign comes from our convention that \(\bm r_{AB}\) runs from \(A\) to \(B\), while \(\bm v_{A/B}\) measures the motion of \(A\) as seen from \(B\) and uses the offset from \(B\) to \(A\).
The endpoints \(A\) and \(B\) also belong to cranks rotating about fixed pivots, so their velocities reduce to single rotational contributions,
The positions are known from the previous step at \(\theta=30^\circ\) and \(\omega_{CB} = 5\) rad/s is given, so the \(x\) and \(y\) components of this vector equation form a \(2 \times 2\) linear system for \((\omega_{OA}, \omega_{AB})\).
where the relative acceleration of \(A\) as seen from \(B\) carries a centripetal piece from the curvature of \(A\)’s circular path about \(B\) and a tangential piece from the change in the rod’s spin rate.
The crank endpoints reduce to single rotations as before, but each now carries both contributions. The input crank rotates uniformly, so \(\bm\alpha_{CB} = \bm 0\) and \(B\) has only a centripetal acceleration about \(C\):
The positions, \(\omega_{CB}\), and the just-solved \(\omega_{OA}\) and \(\omega_{AB}\) enter as known quantities, leaving \(\alpha_{OA}\) and \(\alpha_{AB}\) as the only unknowns. The \(x\) and \(y\) components form a \(2 \times 2\) linear system with the same coefficient matrix as the velocity step.
Repeating the position-velocity-acceleration cascade for \(\theta\) across the working range traces out the full motion. We warm-start the nonlinear position solver with the previous step’s solution to stay on the chosen branch, and reduce the velocity and acceleration steps to two \(2\times 2\) linear solves with the same coefficient matrix.
Animating the linkage as \(\theta\) sweeps gives a quick visual check that the solver tracks a single branch and shows where the geometry tightens. Point \(A\) traces an arc on the output crank’s circle, while the connecting rod \(AB\) swings to keep the loop closed.
The angular velocities and accelerations remain bounded over most of the working range and spike near the endpoints, where the linkage approaches a configuration in which \(OA\) and \(AB\) become collinear. There the velocity-loop matrix loses rank, and small input changes produce arbitrarily large response. Real linkages avoid such poses by design or by limit stops on the input crank.