Twists and screw axes: connect point velocities to rigid motion

Build a six-component twist from a screw axis, calculate point velocities, and compare exact helical motion with a tangent prediction. Separate pitch, accumulated displacement, current rate, and pure translation.

By 13 min read

What you will learn

  • Calculate the velocity of a point from an angular-first six-component twist.
  • Construct a normalized screw axis from its direction, location, and pitch.
  • Separate a finite screw displacement from the instantaneous rate of motion.
  • Handle pure translation and zero twist without assigning an undefined pitch.

Before you start

A rotating robot link gives different velocities to different points. A point on its rotation axis can remain still while a point away from the axis moves quickly. Add translation along the axis and those points trace different helices, even though they belong to one rigid body.

A twist describes that entire instantaneous velocity field using six numbers. A screw axis describes a motion direction that can be scaled by a rate or integrated through a finite amount. This lesson connects those two descriptions with one offset vertical axis.

Describe the velocity of every point

We use column vectors, fixed right-handed world axes, and active motion of a rigid body. All coordinates in each equation refer to this same frame. Our six-component convention is angular first:

V = (ω, v),   ẋ = ω × x + v

Here ω has three angular-velocity components, v has three linear components, and x is the current position of a material point. The cross product supplies the position-dependent part. Every point shares the same ω and v, but usually has a different ẋ.

The linear component v is the value of the velocity field at x = 0. It need not equal the velocity of a particular point attached to the body. There might be no material point at the world origin at all. This interpretation avoids treating the fixed world origin itself as a moving object.

For a body pose T with rotation R and origin position p, differentiation gives ṗ = ω × p + v, so v = ṗ − ω × p. In matrix notation the spatial twist satisfies [V] = ṪT⁻¹. A body-frame twist uses a different representation, T⁻¹Ṫ. Modern Robotics derives these frame-dependent definitions. We stay with the world-frame representation throughout the experiment.

Build a screw axis from a line

Specify a line using a point q on it and a unit direction ω̂. Specify a pitch h, the signed axial advance per radian of positive rotation. The normalized rotational screw axis is:

S = (ω̂, vₛ),   vₛ = −ω̂ × q + hω̂,   ‖ω̂‖ = 1

To check the sign, insert a point on the axis, x = q + λω̂. Its rotational terms cancel:

ω̂ × (q + λω̂) − ω̂ × q + hω̂ = hω̂.

Thus a point on the axis moves only along it. An off-axis point also moves around it. Choosing another point q + λω̂ on the same line leaves vₛ unchanged because ω̂ × ω̂ = 0. Modern Robotics introduces this screw construction and the angular-first convention.

“Normalized” refers to the angular direction having length one. The complete six-vector combines angular and length-related quantities; normalizing it with an ordinary six-dimensional Euclidean norm would change this convention and obscure its units.

Keep pitch, amount, and rate separate

Let θ be accumulated rotation in radians and θ̇ its current rate in radians per second. A fixed screw S generates the instantaneous twist V = Sθ̇. Its integrated generator is Sθ. One describes velocity; the other describes an accumulated motion parameter.

Positive rotation follows the right-hand rule around ω̂. The signed axial advance is hθ. With h = 0.2 meters per radian, one positive revolution advances 2πh ≈ 1.256637 meters. Negative pitch reverses that axial direction relative to positive rotation. Setting h = 0 gives pure rotation.

Radians are mathematically dimensionless, but retaining labels such as m/rad and rad/s helps track the physical calculation. Multiplying the screw's linear part in m/rad by θ̇ in rad/s yields v in m/s. The angle slider uses degrees for readability and converts them to radians before any calculation.

Reversing the current rate reverses the twist without changing the current pose. Reversing both the chosen axis direction and the accumulated angle describes the same finite displacement, with the same pitch. A parameterization needs its sign convention stated before its numbers can be interpreted.

Integrate a fixed screw into a finite motion

Put the normalized screw into a four-by-four matrix:

[S] = [ [ω̂]×   vₛ;   0   0 ],   G(θ) = exp([S]θ)

The notation [ω̂]× means the matrix satisfying [ω̂]×x = ω̂ × x. The final row of [S] is zero; the final row of the finite homogeneous transform G is (0, 0, 0, 1).

For a screw through q, its action on an initial point x₀ has a direct geometric form:

x(θ) = q + R(ω̂, θ)(x₀ − q) + hθω̂.

Subtract the axis point, rotate the relative vector using Rodrigues' formula, restore the axis point, and add the axial advance. Equivalently, G has translation q − Rq + hθω̂. That finite translation is different from the linear component v of a twist.

For a fixed world-frame screw and initial pose T₀, T(θ) = G(θ)T₀. Modern Robotics explains this exponential and multiplication convention. If the screw changes over time, a single constant-axis formula no longer describes the whole motion. General successive motions require their order to be retained.

Work through an offset vertical screw

Take ω̂ = (0, 0, 1), q = (0.5, 0, 0) meters, h = 0.2 m/rad, and initial point x₀ = (1, 0, 0) meters. The radius from the line is 0.5 meters. Since ω̂ × q = (0, 0.5, 0), the screw is:

S = ((0, 0, 1), (0, −0.5, 0.2)).

After θ = π/2 radians, the relative point (0.5, 0, 0) rotates to (0, 0.5, 0). Its axial advance is 0.2 × π/2 = π/10 meters. Therefore:

x = (0.5, 0.5, 0.314159) meters.

At θ̇ = 1 rad/s, ω = (0, 0, 1) and v = (0, −0.5, 0.2). Substituting the current point gives:

ẋ = (−0.5, 0.5, 0) + (0, −0.5, 0.2) = (−0.5, 0, 0.2) m/s.

Its speed is √(0.5² + 0.2²) ≈ 0.538516 m/s. Its velocity differs from v because the point is away from the world origin.

The body's finite transform from the identity has origin position p = (0.5, −0.5, π/10). Even that origin's current velocity, ṗ = (0.5, 0, 0.2), differs from v. The same twist correctly predicts both point velocities when supplied with their respective positions.

Compare the exact path with its tangent

The experiment keeps ω̂ vertical and x₀ fixed, while allowing the axis offset, pitch, accumulated amount, and current rate to change. The XY projection shows the orbit; the XZ projection includes height. Both views use equal meter scales and retain full three-coordinate readouts.

Interactive experiment

Separate the screw, pose, and current velocity

Start at x₀ = (1, 0, 0) meters. Rotate about a fixed vertical axis with axial advance, or translate along +z. Both views use one fixed world frame.

0.5 m
0.2 m/rad
90 °
1 rad/s

Accumulated angle or distance sets the current pose. Rate sets the current twist and is held constant for the next 0.5 seconds. Changing modes retains each mode’s settings; presets restore their stated case from the defaults.

  • Open circle: initial point
  • Dot and solid path: current motion
  • Square and dashed path: exact future
  • Amber arrow: tangent prediction

For a screw, the gray cross in XY and gray dashed line in XZ locate the axis. A projection can hide motion along its omitted coordinate. Overlapping markers are possible.

XY projection

XY projectionBounds follow the current geometry. Both views share the same horizontal and vertical bounds and equal meter scales. This view drops z; full coordinates appear below. The amber arrow is a 0.5-second tangent displacement. The square shows the exact future point at the same fixed rate.-0.3-0.50.50.31.31.1xy
Bounds follow the current geometry. Both views share the same horizontal and vertical bounds and equal meter scales. This view drops z; full coordinates appear below. The amber arrow is a 0.5-second tangent displacement. The square shows the exact future point at the same fixed rate.

XZ projection

XZ projectionBounds follow the current geometry. Both views share the same horizontal and vertical bounds and equal meter scales. This view drops y; full coordinates appear below. The amber arrow is a 0.5-second tangent displacement. The square shows the exact future point at the same fixed rate.-0.3-0.50.50.31.31.1xz
Bounds follow the current geometry. Both views share the same horizontal and vertical bounds and equal meter scales. This view drops y; full coordinates appear below. The amber arrow is a 0.5-second tangent displacement. The square shows the exact future point at the same fixed rate.
S angular part
(0.000000, 0.000000, 1.000000)
S linear part
(0.000000, -0.500000, 0.200000)
Angular velocity ω (rad/s)
(0.000000, 0.000000, 1.000000)
Twist linear part v (m/s)
(0.000000, -0.500000, 0.200000)
Current point x (m)
(0.500000, 0.500000, 0.314159)
Point velocity ẋ (m/s)
(-0.500000, 0.000000, 0.200000)
Point speed (m/s)
0.538516
Axial advance (m)
0.314159
Exact point after 0.5 s (m)
(0.260287, 0.438791, 0.414159)
Tangent prediction (m)
(0.250000, 0.500000, 0.414159)
Tangent error (m)
0.062067
Instantaneous motion
Screw motion

The tangent arrow uses the current velocity for 0.5 seconds. The exact future follows the curved screw trajectory, so its endpoint differs from the straight prediction.

For screws, S is scaled by angular rate in rad/s, and its linear part has units m/rad. For translation, S has a unit linear direction and is scaled by speed in m/s. Values show six decimals; calculations retain full precision.

The future comparison holds the current rate fixed for Δt = 0.5 seconds. It computes the exact point at θ + θ̇Δt and the local tangent prediction x + ẋΔt. The amber arrow is a displacement in meters, obtained by multiplying velocity by Δt. It is not a velocity drawn on position axes without a time scale.

In the default case, the exact future point is (0.260287, 0.438791, 0.414159) and the tangent prediction is (0.250000, 0.500000, 0.414159). Their separation is 0.062067 meters. The height prediction is exact here because axial motion is linear in θ. The orbit bends away from its tangent.

Choose Reverse rate to keep the current position while reversing the arrow. Choose Point on axis to remove the orbit radius: axial motion remains, and the straight prediction becomes exact. A point on an axis can have zero velocity during pure rotation even though the body's twist is nonzero. This is why the motion label depends on the entire twist.

This fixed half-second example demonstrates a finite-step error; it does not establish an acceptable error for a robot. The required time step depends on the motion scale and the task's accuracy requirements. Taylor linearization explains the local approximation behind the tangent prediction.

Handle translation and zero motion

A pure translation has ω = 0 and ẋ = v for every point. Use a normalized translational axis S = (0, d̂) with ‖d̂‖ = 1. Its accumulated parameter d is a distance in meters, and its rate ḋ is in m/s:

x(d) = x₀ + dd̂,   V = Sḋ.

The translation preset uses d̂ = (0, 0, 1), d = 0.5 meters, and ḋ = 1 m/s. It places the point at (1, 0, 0.5), with velocity (0, 0, 1). Half a second later it reaches (1, 0, 1). The tangent and exact predictions agree.

Pure translation is sometimes described as an infinite-pitch screw. The widget assigns it no finite pitch and no uniquely located axis line. Translating along parallel lines produces the same rigid motion.

A zero twist has both ω = 0 and v = 0. It specifies no instantaneous movement and does not determine a unique screw axis. The Paused at finite pose preset retains a previously chosen geometric screw and accumulated displacement, while its rate and actual twist are zero.

Conversely, Identity pose, moving sets the accumulated angle to zero but keeps a nonzero rate. The current transform is the identity and the current point is x₀, yet its velocity is nonzero. Displacement and velocity answer different questions.

Connect the model to joints and pose estimation

Revolute, prismatic, and helical joints fit the pure rotation, pure translation, and nonzero-pitch cases. A joint's screw describes its allowed instantaneous motion. Its encoder amount and current rate supply separate scalars, with units determined by the joint type.

A robot with several joints requires several such motions. The product of exponentials uses their ordered finite transforms to calculate an end-effector pose. Its axes must be expressed in the frame required by the chosen formula.

For estimation or learned pose updates, six numbers alone are insufficient documentation. An angular-first vector in the world frame and a linear-first vector in a body frame represent different conventions. A squared error that combines meters and radians also needs an explicit weighting or physical length scale. The adjoint transformation explains how a single physical twist changes coordinates between frames.

These equations assume rigid motion in Euclidean three-dimensional space. They describe kinematics: they do not predict required motor torque, contact forces, or deformation. The experiment also fixes one axis and ignores limits or obstacles. Its screw trajectory is not asserted to be a shortest path under a pose-space metric.

Reproduce the calculation in Python

This standard-library example implements the same fixed vertical screw directly. All trigonometric arguments are in radians. The cross product calculates the instantaneous velocity independently of the position formula.

from math import cos, sin, pi, sqrt

qx, h = 0.5, 0.2
theta, rate, dt = pi / 2, 1.0, 0.5

def position(angle):
    radius = 1.0 - qx
    return (qx + radius * cos(angle), radius * sin(angle), h * angle)

def cross(a, b):
    return (a[1]*b[2] - a[2]*b[1],
            a[2]*b[0] - a[0]*b[2],
            a[0]*b[1] - a[1]*b[0])

def formatted(values):
    return '(' + ', '.join(f'{0.0 if abs(v) < 0.5e-6 else v:.6f}' for v in values) + ')'

omega = (0.0, 0.0, rate)
v = (0.0, -qx * rate, h * rate)
x = position(theta)
rotation_part = cross(omega, x)
velocity = tuple(rotation_part[i] + v[i] for i in range(3))
future = position(theta + rate * dt)
tangent = tuple(x[i] + dt * velocity[i] for i in range(3))
error = sqrt(sum((future[i] - tangent[i])**2 for i in range(3)))
print('Point:', formatted(x))
print('Twist linear part:', formatted(v))
print('Point velocity:', formatted(velocity))
print('Exact future:', formatted(future))
print('Tangent prediction:', formatted(tangent))
print(f'Tangent error: {error:.6f} m')

Expected output:

Point: (0.500000, 0.500000, 0.314159)
Twist linear part: (0.000000, -0.500000, 0.200000)
Point velocity: (-0.500000, 0.000000, 0.200000)
Exact future: (0.260287, 0.438791, 0.414159)
Tangent prediction: (0.250000, 0.500000, 0.414159)
Tangent error: 0.062067 m

Set rate = 0.0 while keeping theta = pi / 2. The current point stays at its finite displacement, the velocity becomes zero, and the two future points equal the current point. Setting theta = 0.0 with rate = 1.0 gives the identity-pose case with a nonzero velocity.

Try it yourself

Exercise 1. A pure rotation has ω̂ = (0, 0, 1) and an axis through q = (0, 1, 0) meters. Find its normalized linear component vₛ. At angular rate 2 rad/s, find the instantaneous velocity of the point currently at (1, 1, 0) meters. Where would a positive quarter-turn about this fixed axis send that point?

Show solution 1

Since ω̂ × q = (−1, 0, 0) and h = 0, vₛ = (1, 0, 0). At the stated rate, ω = (0, 0, 2) and v = (2, 0, 0). Therefore:

ẋ = (−2, 2, 0) + (2, 0, 0) = (0, 2, 0) m/s.

The point's relative position is x − q = (1, 0, 0). A positive quarter-turn sends it to (0, 1, 0). Adding q gives the finite endpoint (0, 2, 0) meters. Its coordinates happen to match the velocity's numbers here, but their units and meanings differ.

Exercise 2. A body translates along +z with normalized S = (0, 0, 0, 0, 0, 1). Its accumulated distance is d = 0.75 meters and current rate is ḋ = −2 m/s. For x₀ = (1, 0, 0), find its current position, twist, and position after 0.5 seconds at that rate. Then describe what changes if the rate becomes zero immediately.

Show solution 2

The current point is (1, 0, 0.75) meters. The angular-first twist is V = (0, 0, 0, 0, 0, −2), with angular components zero and linear components in m/s. The future accumulated distance is 0.75 − 2 × 0.5 = −0.25 meters, giving point (1, 0, −0.25).

If the rate becomes zero now, both parts of the actual twist become zero. The current point remains (1, 0, 0.75) and stays there under the zero-rate model. The stored translation direction can remain +z; a zero twist by itself does not identify that direction.

Continue with adjoint transformations to express these same point velocities using a different coordinate origin and orientation.

Sources and further study