explainer
Instantaneous center of rotation: find the center from a planar velocity
Calculate a planar rigid body's instantaneous center of rotation from its linear and angular velocity. Check point velocities, move the reporting reference, and distinguish turning, translation, and rest.
What you will learn
- Calculate the velocity of any body point from a planar twist at a stated origin.
- Find the finite ICR and check perpendicularity between a radius and its point velocity.
- Distinguish a distant finite center, pure translation, and an instantaneously stopped body.
- Change the reporting reference without changing the physical velocity field.
- Connect vehicle wheel constraints to ICR geometry while keeping velocity and acceleration distinct.
Before you start
A turning robot can move every point on its chassis while rotating about a center outside the chassis. That center comes from the velocities at one instant. It does not need a physical pin, axle, or bearing.
The instantaneous center of rotation, or ICR, is the point where the planar rigid-body velocity field is zero. With nonzero yaw rate, one linear velocity and the yaw rate determine its location. Working through that calculation also shows why different points on the same robot have different linear velocities.
Describe one instant of rigid-body motion
Choose a body-fixed reference point O as the coordinate origin. At the instant under study, draw x to the right and y upward, and count counterclockwise yaw as positive. In a robot's body frame, x usually points forward and y left; the plot shows those axes aligned with the page at this instant.
Let (vx, vy) be O's physical velocity relative to the ground, expressed along these axes, and let ω be the body's yaw rate. The three numbers (vx, vy, ω) describe a planar twist using the component order stated here. Linear velocity uses m/s, yaw rate uses rad/s, and point coordinates use meters.
For a body point P with coordinates (x, y), rigid-body rotation adds a velocity perpendicular to the offset from O:
v(P) = (vx − ωy, vy + ωx)
The University of Illinois rigid-body kinematics notes give the vector relation v(P) = v(O) + ω × OP. In the plane, the cross product turns (x, y) into ω(−y, x). The same field extends mathematically beyond the physical body, which lets its center lie outside the chassis.
These are ground-relative velocities expressed in chosen coordinates. A body-fixed coordinate label stays constant even while that physical point moves through the world. Review coordinate frames if those two statements seem contradictory.
Solve for the point with zero velocity
Call the center C and write its coordinates as (cx, cy). Set both components of its velocity to zero:
0 = vx − ωcy
0 = vy + ωcx
C = (−vy/ω, vx/ω), when ω ≠ 0
Nonzero ω gives exactly one solution. Substituting it into the velocity field cancels both components. MIT's planar rigid-body lecture derives the same center through the cross-product equation.
When vy = 0, the center lies somewhere on the y-axis through O. Allowing lateral velocity shifts its x-coordinate to −vy/ω. A pure spin with vx = vy = 0 and nonzero ω has its center exactly at O.
Check the radius and velocity directions
Write the radius from C to a point P as r = P − C. Substituting the center formula into the original field gives:
v(P) = ω(−ry, rx)
r · v(P) = 0
‖v(P)‖ = |ω| ‖r‖
The dot product check establishes perpendicularity. Points farther from the center move faster in proportion to their distance. Positive ω gives counterclockwise tangents, and negative ω reverses those tangent directions.
Geometrically, draw a line through each moving point perpendicular to its velocity. Two nonparallel lines locate the common center. Some point choices produce coincident lines, so those two velocity directions alone do not locate a unique intersection; the known yaw rate and velocity magnitudes still determine the center through the equations above.
Calculate a center and three point velocities
Use vx = 1 m/s, vy = 0.5 m/s, and ω = 0.5 rad/s. Let P = (2, 0) m and Q = (1, 1) m. These are the experiment's starting values.
The center is C = (−0.5/0.5, 1/0.5) = (−1, 2) m. The three point velocities are:
| Point | Calculation | Velocity, m/s |
|---|---|---|
| O = (0, 0) | (1 − 0.5 × 0, 0.5 + 0.5 × 0) | (1, 0.5) |
| P = (2, 0) | (1 − 0.5 × 0, 0.5 + 0.5 × 2) | (1, 1.5) |
| Q = (1, 1) | (1 − 0.5 × 1, 0.5 + 0.5 × 1) | (0.5, 1) |
For Q, the center-to-point radius is (2, −1) m. Its dot product with Q's velocity is 2 × 0.5 + (−1) × 1 = 0. Its speed is √(0.5² + 1²) = 1.118034 m/s, matching 0.5 × √5 from yaw rate times radius.
At C itself, the field gives (1 − 0.5 × 2, 0.5 + 0.5 × (−1)) = (0, 0). That cancellation provides a second independent check of the center's signs.
Separate a distant center from translation and rest
The division by ω requires a case distinction. A small nonzero value still describes rotation, even when the resulting center lies far outside a practical plot.
| Motion at this instant | Condition | Center description |
|---|---|---|
| Rotation, possibly with translation at O | ω ≠ 0 | One finite ICR |
| Pure translation | ω = 0 and (vx, vy) ≠ (0, 0) | No finite zero-velocity point |
| Instantaneous rest | ω = 0 and vx = vy = 0 | Every point has zero velocity; no unique ICR |
Keep the example's linear velocity and reduce ω to 0.000001 rad/s. The center becomes (−500000, 1000000) m, while Q's velocity becomes (0.999999, 0.500001) m/s. Nearby arrows look almost parallel, although the center remains finite.
With ω exactly zero, every point has velocity (1, 0.5) m/s. Center at infinity names the limiting geometry of pure translation; it is not a finite coordinate to put into a drawing. The experiment preserves the distinction and omits off-plot center geometry from its fixed view.
Measured yaw also carries uncertainty. Near zero, dividing by a noisy rate can produce a poorly determined center. A numerical threshold can help classify measurements in an application, but it changes the reporting policy; the mathematical cases above use exact zero.
Move the reporting point without changing the motion
Suppose Q has coordinates (a, b) relative to O. Choose Q as the new reference origin while keeping the new axes parallel to the original ones. The new linear velocity is the physical velocity at Q:
ux = vx − ωb
uy = vy + ωa
C in Q coordinates = C − Q
Yaw rate stays the same because the whole rigid body shares one angular velocity. For the worked example, the new twist at Q = (1, 1) is (0.5, 1, 0.5). Calculating the center from that twist gives (−1/0.5, 0.5/0.5) = (−2, 1) m, exactly (−1, 2) − (1, 1).
Point coordinates must shift with the reference. P becomes (1, −1) relative to Q, so its velocity becomes (0.5 − 0.5 × (−1), 1 + 0.5 × 1) = (1, 1.5) m/s. Changing where the calculation starts preserves P's physical velocity.
If the new axes also rotate counterclockwise by α, apply the rotation R(−α) to both Q's linear velocity and each shifted point coordinate. The center becomes R(−α)(C − Q), while planar ω stays unchanged. With α = 90° in this example, Q's velocity components become (1, −0.5) m/s and the center coordinates become (1, 2) m.
This operation changes the reporting point and axes. It does not subtract the velocity of a moving observer. Modern Robotics' twist representation develops the broader frame-change rules; check its component ordering before transferring a matrix formula.
Inspect the velocity field
The fixed plot uses equal x and y scales from −4 m to +4 m. Blue arrows show physical velocities at O, P, and Q with one common scale. Dashed radii meet the orange ICR whenever its marker fits inside the view with room for its label.
Move only Q. The velocity readout at Q changes, while the center in O coordinates and the velocities at O and P stay fixed. Set Q to (−1, 2) in the default example to place it at the ICR and make its velocity zero.
Choose Clockwise turn to change ω to −0.5 rad/s while preserving the linear velocity at O. The center moves to (1, −2) m, and Q's velocity becomes (1.5, 0) m/s. Changing only yaw is a different operation from reversing all three twist components, which preserves the center and reverses every velocity arrow.
Compare Almost straight, Pure translation, and Stopped body. Only the first has a finite center. The arrows represent one instant of motion; their tips do not predict where the body points will be after one second.
Connect the center to wheel constraints
An ideal conventional wheel rolls along its wheel plane without lateral motion at its modeled wheel-center location. Its ground-plane velocity therefore points along the wheel's rolling direction. For a nonzero planar turn, the perpendicular line through that wheel center must pass through the chassis ICR.
Ackermann steering chooses different front-wheel angles so those lines meet the rear axle's common normal at one center. For a differential-drive robot, the ideal axle-midpoint velocity has vy = 0, placing the ICR on the axle line when ω ≠ 0. Opposite wheel speeds can put that center at the axle midpoint.
Those conclusions depend on the stated rolling constraints and reference point. A different chassis point can have a lateral velocity component even when the wheels satisfy no-slip rolling. The nonholonomic constraint lesson shows how to express the restriction at the correct point and in the correct frame.
A rigid chassis with lateral slip still has the geometric ICR whenever its yaw rate is nonzero. Its actual velocity field then need not align with the wheel rolling directions. Inferring the center from steering angles alone can fail under slip, even though inferring it from a known actual twist remains valid.
For wheel odometry, this makes the center a model-dependent estimate whenever wheel measurements supply the twist. A learned slip correction needs measured ground-truth motion to check whether its corrected velocities describe the chassis accurately.
Keep instantaneous geometry separate from a whole path
The ICR describes the velocity field at one instant. Changing the ratios vx/ω or vy/ω changes its body coordinates. Multiplying the whole twist by one nonzero factor preserves those ratios, so a speed change alone need not move the center.
Holding a body-frame twist constant gives circular trajectories about a fixed world center when ω ≠ 0. Under varying commands, the center can move, and joining instantaneous tangent arrows does not produce a valid integrated path. Use a stated motion model and time integration to predict future poses, as in the exact planar pose update.
Zero instantaneous velocity at the ICR does not imply zero acceleration there. Consider a wheel of radius r rolling at constant center speed u, viewed from the side. The material point touching the floor has zero velocity at contact and upward acceleration u²/r; a different material point reaches contact a moment later.
MIT's rolling-cylinder example works through this acceleration. For r = 0.5 m and u = 1 m/s, that contact-point acceleration is 2 m/s² upward. The instantaneous velocity center therefore supplies no general license to treat the body as pinned there for acceleration or force calculations.
Reproduce the calculations in Python
This standard-library example uses meters, seconds, and radians. It reports ground-relative velocity at Q and the same center in the two parallel reference frames. Exact zero selects translation or rest; finite but unrepresentable arithmetic raises an error.
from math import isfinite
def velocity(twist, point):
vx, vy, omega = twist
x, y = point
if not all(isfinite(n) for n in (*twist, *point)):
raise ValueError("Use finite inputs")
result = (vx - omega * y, vy + omega * x)
if not all(isfinite(n) for n in result):
raise ValueError("Velocity exceeds numeric range")
return result
def center(twist):
vx, vy, omega = twist
if not all(isfinite(n) for n in twist):
raise ValueError("Use finite inputs")
if omega == 0:
return "stopped" if vx == vy == 0 else "translation", None
point = (-vy / omega, vx / omega)
if not all(isfinite(n) for n in point):
raise ValueError("Center exceeds numeric range")
return "finite", point
def fmt_pair(point):
if point is None:
return "none"
return "(" + ", ".join(f"{0.0 if abs(n) < 0.5e-6 else n:.6f}" for n in point) + ")"
q = (1.0, 1.0)
for name, twist in [
("mixed", (1.0, 0.5, 0.5)),
("clockwise", (1.0, 0.5, -0.5)),
("spin", (0.0, 0.0, 0.5)),
("almost straight", (1.0, 0.5, 0.000001)),
("translation", (1.0, 0.5, 0.0)),
("stopped", (0.0, 0.0, 0.0)),
]:
kind, c = center(twist)
vq = velocity(twist, q)
_, cq = center((*vq, twist[2]))
print(f"{name}: {kind}; C={fmt_pair(c)}; vQ={fmt_pair(vq)}; C_Q={fmt_pair(cq)}")
Expected output, with center coordinates in meters and vQ in m/s:
mixed: finite; C=(-1.000000, 2.000000); vQ=(0.500000, 1.000000); C_Q=(-2.000000, 1.000000)
clockwise: finite; C=(1.000000, -2.000000); vQ=(1.500000, 0.000000); C_Q=(0.000000, -3.000000)
spin: finite; C=(0.000000, 0.000000); vQ=(-0.500000, 0.500000); C_Q=(-1.000000, -1.000000)
almost straight: finite; C=(-500000.000000, 1000000.000000); vQ=(0.999999, 0.500001); C_Q=(-500001.000000, 999999.000000)
translation: translation; C=none; vQ=(1.000000, 0.500000); C_Q=none
stopped: stopped; C=none; vQ=(0.000000, 0.000000); C_Q=none
The kind value explains why none appears. Pure translation has no finite center, while an instantaneously stopped body has infinitely many zero-velocity points and no unique center.
Try it yourself
Exercise 1: locate a clockwise center. Use (vx, vy, ω) = (−0.5, 1, −0.25) and P = (2, 0) m. Find C and v(P), then verify the radius dot velocity is zero. Report the center and linear velocity again using Q = (1, −1) m as the new origin with parallel axes.
Show the clockwise center and reference calculation
The center is C = (−1/(−0.25), −0.5/(−0.25)) = (4, 2) m. Point P has velocity (−0.5, 0.5) m/s and radius P − C = (−2, −2) m. The dot product is (−2)(−0.5) + (−2)(0.5) = 0.
At Q, the velocity is (−0.5 − (−0.25)(−1), 1 + (−0.25)(1)) = (−0.75, 0.75) m/s. The center relative to Q is (3, 3) m. In Python, check center((-0.5, 1, -0.25)), velocity((-0.5, 1, -0.25), (1, -1)), and center((-0.75, 0.75, -0.25)).
Exercise 2: distinguish three almost identical-looking plots. Keep (vx, vy) = (1, 0.5) m/s and compare ω = 0.000001, −0.000001, and 0 rad/s. Find each center description and v(P) at P = (2, 0) m. What changes if all three twist components become zero?
Show the near-zero and exact-zero cases
Positive tiny yaw gives C = (−500000, 1000000) m and v(P) = (1, 0.500002) m/s. Negative tiny yaw gives C = (500000, −1000000) m and v(P) = (1, 0.499998) m/s. Both centers are finite and lie outside the lab's view.
Exact zero yaw gives pure translation with no finite center and v(P) = (1, 0.5) m/s. Setting all three rates to zero makes the whole body instantaneously stationary, so every point has zero velocity and no unique center exists. Call center((1, 0.5, omega)) and velocity((1, 0.5, omega), (2, 0)) for each rate to check the numbers.
Sources and further study
- University of Illinois, Rigid bodies: point velocity and acceleration relations, planar cross products, and instantaneous centers.
- MIT OpenCourseWare, 16.07 Lecture 21: 2D Rigid Body Dynamics: the zero-velocity center, reference-point changes, and a rolling-cylinder acceleration example.
- Kevin Lynch and Frank Park, Modern Robotics: Twists, Part 2: expressing a rigid-body twist in different frames.
Continue with Ackermann steering to turn one desired center into separate left and right front-wheel angles.