Axioforce

Resources

Metric Library

A reference for every metric Axioforce computes from force-plate data.

182 metrics

3D Spin Longitudinal Angle

deg

Longitudinal component of the measured 3D spin axis.

TrackMan B1 live feed

3D Spin Tilt

Spin axis expressed as a clock face (e.g. "12:00"). Text, not numeric. Sibling of `tilt`; both appear, on different pitches.

TrackMan B1 live feed

3D Spin Transverse Angle

deg

Transverse component of the measured 3D spin axis.

TrackMan B1 live feed

Active Spin Rate

rpm

The component of total spin that produces movement.

TrackMan B1 live feed

Airborne Displacement

cm

Estimated horizontal center of mass displacement during airborne phase using takeoff velocity.

d=vxy × (2 × vz / g)

Auto Pitch Type

Pitch type classified automatically by TrackMan. Text. Not yet observed.

TrackMan B1 live feed

Average

The average value of the dataset

average=sum(x) / n

Average Contact Time

s

Mean ground contact time across every contact of a repeated set (hops, bounds). Shorter contacts with equal flight indicate better reactive ability.

averageContactTime=mean(phaseDuration over every 'Contact' phase)

Average Force

% BW

The average force during a phase, multiple phases, or a capture.

average_force=average(force)

Average Hang Time

ms

Mean time in the air across every flight of a repeated set.

averageHangTime=mean(hangtime over every 'Flight' phase)

Average Jump Height

cm

Mean jump height across every flight of a repeated-jump set (hops), from each flight's hang time.

averageJumpHeight=mean(jumpHeight over every 'Flight' phase)

Average over 1 Second

Get the average of the data for the last 1 second.

average=sum(x[t−1s:]) / len(x[t−1s:])

Average Peak Force

% BW

Mean of the per-contact peak force magnitude across a repeated set, per axis. Magnitude, not the signed peakForce: bounds alternate left and right, so signed Fx peaks cancel when averaged.

averagePeakForce=mean(peakForceMagnitude over every 'Contact' phase)

Average Power

W

The average power during a phase, multiple phases, or a capture. For the vector component, power is the dot product of the force and the centre-of-mass velocity (Fx·Vx + Fy·Vy + Fz·Vz): the power delivered along the direction of motion, which is negative while braking. (Before 1.11.0 it was the product of the two magnitudes, |F| × speed, which is never negative and overstates power whenever force and motion point in different directions.)

average_power=average(force × velocity)
vector: force · velocity = Fx·Vx + Fy·Vy + Fz·Vz

Average Relative Power

W/kg

The mean power over the window analysed (total work divided by elapsed time), divided by body MASS in kg, so it is comparable between athletes. Note the divisor is mass in kg, obtained as system weight / g — system weight is stored in NEWTONS. For the vector component, power is the dot product of the force and the centre-of-mass velocity (Fx·Vx + Fy·Vy + Fz·Vz): the power delivered along the direction of motion, which is negative while braking. (Before 1.11.0 it was the product of the two magnitudes, |F| × speed, which is never negative and overstates power whenever force and motion point in different directions.)

average_relative_power=(∫(force × velocity)dt / Δt) / (BW / g)
vector: force · velocity = Fx·Vx + Fy·Vy + Fz·Vz

Average RFD

N/s

The rate at which force is developed

RFD=ΔF / Δt

Average RFD (Magnitude)

N/s

The magnitude of the average rate at which force is developed across a phase. Always non-negative. Use this instead of averageRateOfForceDevelopment on a horizontal axis (Fx/Fy) whenever the movement direction varies between trials — a lateral jump cued randomly left or right, for example — because the signed version reports the direction of the force change, so trials in opposite directions cancel when averaged.

RFD_magnitude=abs(ΔF / Δt)

Average RSI

Mean Reactive Strength Index (flight time divided by contact time) across the repetitions of a hop or bound set.

averageReactiveStrengthIndex=mean(reactiveStrengthIndex over every iteration)

Average Velocity

m/s

The average velocity during a phase, multiple phases, or a capture.

average_velocity=average(velocity)

Ball Hang Time

s

Time from contact to landing for a batted ball. Not yet observed - no hit has come through the live feed. NOTE the id deliberately differs from TrackMan's `hangTime`: the existing force-plate analytic `hangtime` is the time the ATHLETE is in the air, a different quantity, and the two differ only by case. Canon ids name the thing measured, not the source, so a hang time reported by any other system maps here too.

TrackMan B1 live feed

Best Contact Time

s

Shortest single ground contact in a repeated set.

bestContactTime=min(phaseDuration over every 'Contact' phase)

Best Jump Height

cm

Highest single jump in a repeated-jump set.

bestJumpHeight=max(jumpHeight over every 'Flight' phase)

Best RSI

Highest single-repetition Reactive Strength Index in a hop or bound set.

bestReactiveStrengthIndex=max(reactiveStrengthIndex over every iteration)

Body Mass

N

The body mass of the individual.

body_mass=mass

Brake Time

s

Brake time - the counter to drive impulse. Elapsed time from the delivery-phase start (front-foot contact) until the DELIVERY zone's cumulative braking impulse reaches 50% of that capture's DRIVE impulse. Braking impulse COUNTERS the drive: Fz above 100% BW plus backward shear (Fy below 0), per body weight. The 50% target uses the drive impulse over the LAST drive movement (start Fz>80% BW OR Fy>3% BW; separate/end Fz<30% BW AND Fy<3% BW). Blank if the delivery leg never absorbs 50% of the drive.

brakeTime=time from delivery−phase start until trapz((max(Fz−100,0)+max(−Fy,0))/BW, t) over the delivery zone reaches 0.5 × driveImpulse

Brake Time

ms

Milliseconds from front-foot contact (the Reaction Window start) until the front side has countered HALF of the positive drive impulse the hitter built -- how quickly the lead leg arrests the body's travel and turns it into rotation. A SHORTER time means a more abrupt block. The drive it is measured against is swingDriveImpulse. POSITIVE-ONLY, with a sign convention per metric: the drive counts +Fx, +Fy and +Fz (Fz meaning force above body weight), while braking counts -Fy and +Fz. Z is positive for both, because the hitter pushes up through body weight to drive and to block. Every axis is gated on the DIRECTION OF TRAVEL: it contributes only on samples where the forward axis is itself acting in the counted direction, so the drive accumulates only while Fy > 0 and braking only while Fy < 0. Without that gate, +Fz and +Fx banked drive during the backward load at the start of the Gather -- the hitter pushing up through body weight while moving away from the pitcher -- which was a median 5.5% of the drive and up to 83.9% on the worst capture. Each axis is rectified BEFORE integrating, so it contributes only while it pushes the counted way and an axis that reverses does not subtract what it already earned -- that is what makes these positive-only impulses rather than net momentum. The resultant sqrt(Jx^2+Jy^2+Jz^2) is assembled from the per-axis integrals at the END, because a weight vector cannot be subtracted from an already-combined magnitude. NO de-biasing: body weight comes off the VERTICAL axis only, since gravity acts along Z and Fx/Fy carry no weight to remove, and nothing is subtracted on the strength of the Wait phase. Integration starts at the Gather onset, so no standing-still data enters the measurement. CAVEAT ON X: +X is rightward in the plate frame, so the lateral term is handedness-dependent -- a left- and a right-handed hitter drive laterally in opposite directions, and only one of them accumulates under +X for the drive. Fx is the smallest of the three contributions but not negligible. The braking impulse ACCUMULATES from contact and the time reported is when it reaches half the drive, which is literally half the drive countered. That shape is forced by the positive-only convention: a rectified cumulative integral only ever increases, so it can never FALL to half the way a signed momentum curve does. It is also strictly better behaved -- the previous signed-vector version could floor above half and report nothing at all on captures that plainly braked. The braking accumulation is re-anchored at contact so only braking done after the front foot lands counts, and the search is not bounded above because braking runs on into Fire. NOTE: the window, the sign conventions and the integration here are duplicated VERBATIM in swingDriveImpulse, because the engine passes no computed metric values into an analytic's namespace. The two must agree on the drive value; edit both or neither. THE TARGET IS THE POSITIVE Fy DRIVE while the braking side stays a VECTOR of Y and Z. The drive is read on Fy because including Fz and Fx let it bank credit during the backward load at the head of the Gather; the block is nonetheless a three-axis action, so braking is still accumulated across all three. The two sides are therefore different quantities, and a vector braking impulse reaches half an Fy drive sooner than half a vector drive. Fx IS EXCLUDED FROM BRAKING: lateral force is the axis whose sign depends on handedness, it carries the largest share of implausible rear-plate readings, and it is not what arrests travel toward the pitcher. The block is the backward and vertical work, so braking is Y and Z; the drive it is measured against is positive Y alone.

D=Jy over [Gather start, Forward Momentum end] with +Fy only
B(t) = sqrt(By^2 + Bz^2) with −Fy and +Fz accumulated from the Reaction Window start
swingBrakeTime=t( first sample where B(t) >= 0.5 × D ) − t(Reaction Window start)

Count

The number of data points in the dataset

count=n

Countermovement Depth

cm

The peak negative vertical displacement during the braking and propulsive phases of a CMJ.

countermovement_depth=min(Pz)

Drive Impulse

Ns

The POSITIVE net impulse the hitter accumulates over the drive -- integrated across Gather and Forward Momentum and evaluated at the close of that span, which is front-foot contact. It is a DEFINITE INTEGRAL over a fixed window, not a maximum of anything: the window ends at front-foot contact because past that the front side is arresting the body and anything accumulated there is braking rather than drive. This is the drive that swingBrakeTime is measured against: braking time is how long the front side takes to counter half of THIS number. POSITIVE-ONLY, with a sign convention per metric: the drive counts +Fx, +Fy and +Fz (Fz meaning force above body weight), while braking counts -Fx, -Fy and +Fz. Z is positive for both, because the hitter pushes up through body weight to drive and to block. Every axis is gated on the DIRECTION OF TRAVEL: it contributes only on samples where the forward axis is itself acting in the counted direction, so the drive accumulates only while Fy > 0 and braking only while Fy < 0. Without that gate, +Fz and +Fx banked drive during the backward load at the start of the Gather -- the hitter pushing up through body weight while moving away from the pitcher -- which was a median 5.5% of the drive and up to 83.9% on the worst capture. Each axis is rectified BEFORE integrating, so it contributes only while it pushes the counted way and an axis that reverses does not subtract what it already earned -- that is what makes these positive-only impulses rather than net momentum. The resultant sqrt(Jx^2+Jy^2+Jz^2) is assembled from the per-axis integrals at the END, because a weight vector cannot be subtracted from an already-combined magnitude. NO de-biasing: body weight comes off the VERTICAL axis only, since gravity acts along Z and Fx/Fy carry no weight to remove, and nothing is subtracted on the strength of the Wait phase. Integration starts at the Gather onset, so no standing-still data enters the measurement. CAVEAT ON X: +X is rightward in the plate frame, so the lateral term is handedness-dependent -- a left- and a right-handed hitter drive laterally in opposite directions, and only one of them accumulates under +X for the drive. Fx is the smallest of the three contributions but not negligible. Taken from the combined (Parent) trace because a net impulse is a property of the whole hitter -- the rear foot generates the drive and the front foot destroys it, so a per-foot split would measure contributions rather than the body's net impulse, and subtracting a whole body weight from one plate carrying ~49 %BW would invent ~51 %BW of downward force. Reported in RAW newton-seconds, so it scales with the athlete: a heavier hitter moving the same way records a larger number. Use relativeSwingDriveImpulse to compare across athletes. Per-axis values are available on Fx/Fy/Fz; the vector is the headline. THE KEY METRIC IS THE POSITIVE Fy AXIS, not the vector. Including Fz and Fx let the vector bank drive during the backward load at the head of the Gather, where the hitter pushes up through body weight while travelling AWAY from the pitcher: measured over 90 captures that was a median 5.5% of the drive, p90 15.4% and 83.9% on the worst capture, 81.4% of it from Fz. Positive Fy removes that by construction, because the backward load is Fy < 0 and contributes nothing. The per-axis and vector values remain available for inspection; the slate uses Fy.

Jx=int(max(Fx,0))dt
Jy=int(max(Fy,0))dt
Jz=int(max(Fz−100%BW,0))dt, each over [Gather start, Forward Momentum end]
swingDriveImpulse=sqrt(Jx^2+Jy^2+Jz^2)

Drive Impulse

N*s

Non-normalized net drive impulse in newton-seconds: the driveImpulse integrand (Fz above bodyweight + forward Fy, as a fraction of BW) integrated over the drive window and multiplied by systemWeight (body_mass, N). Exactly equals the raw-Newton net drive impulse (normalization is division by body_mass, a constant, so multiplying back is exact). Same drive window + Fz>80%BW qualifier as driveImpulse.

drive_impulse_Ns=systemWeight × integral((max(Fz−100,0)+max(Fy,0))/100 dt) over the drive window

Drive Impulse Normalized

Ns/kg

Drive-leg impulse over the DRIVE window, normalized to body MASS in kg (Ns/kg) so it is comparable between athletes. Sums Fz above 100% BW (vertical drive) PLUS positive Fy (drive-toward-home shear). WINDOW: a drive movement STARTS when Fz > 80% BW OR Fy > 3% BW (the Fy trigger also needs Fy risen >= 2% above its running-min baseline so a static lean does not trigger; the Fz trigger has no rise guard, so LEG LIFT opens it before Fy goes positive). It ENDS/SEPARATES only when Fz < 30% BW AND Fy < 3% BW. The DRIVE is the LAST such movement, and only counts if its peak Fz exceeded 80% BW. NOTE: until 2026-08-31 this divided by body weight in NEWTONS rather than mass in kg, so every stored value before that date is a factor of g = 9.80665 too small despite the Ns/kg label. Historical pitch values and any norm derived from them are not comparable to current ones.

driveImpulse=g × trapz( (max(Fz−100,0) + max(Fy,0))/100, t ) over the LAST movement [= driveImpulseAbs / (BW/g), i.e. Ns per kg]

Drive Time

ms

Drive time - elapsed time (ms) of the DRIVE impulse window: the last drive movement (start Fz>80% BW OR Fy>3% BW; separate/end Fz<30% BW AND Fy<3% BW). Same window driveImpulse integrates over; this is its duration.

driveTime=(drive−window end ms) − (drive−window start ms), the last drive movement

Effective Velocity

kph

Perceived velocity adjusted for extension. Not yet observed.

TrackMan B1 live feed

Estimated Airborne Displacement

cm

Estimated horizontal center of mass displacement during airborne phase using takeoff velocity.

d=vxy × (2 × vz / g)

Estimated Jump Distance

cm

Estimated jump distance from center of mass displacement and takeoff velocity, assuming a symmetric flight arc.

Z: h = vz^2 / (2g)
X/Y: d = 2 × Δxcontact + vx × (2 × vz / g)

Estimated Jump Distance From Impulse

cm

Estimate jump distance from net impulse and time in air.

distance=Δv × tair
where Δv = impulse / m and tair = 2×vz/g

Estimated Time in air

s

Estimate the time spent in the air based on the vertical velocity at takeoff.

time_in_air=2 × vz / g

Exit Speed

kph

Ball speed off the bat. Wire unit unverified - no hit has been observed on the live feed yet.

TrackMan B1 live feed

Exit Velocity

kph

Ball speed off the bat, manually entered or from external source (e.g., Trackman, Rapsodo)

Manual Entry

Extension

cm

Distance from the pitching rubber to the release point. CAUTION: real flat-ground bullpen payloads report this NEGATIVE (~-1.6), because TrackMan measures against an assumed rubber position that is not where the athlete is actually throwing from. Expect it to be meaningful only on a real mound.

TrackMan B1 live feed

First Quartile

The value below which the first quartile of the data falls

Q1=0.25 × (n + 1)

First Step

ms

Time from the start of the visual stimulus until the estimated center of mass displacement reaches 61 cm (~2 ft).

reactive_61cm_displacement_time=timeat,61cm,displacement − timeof,stimulus

Force at Minimum Displacement

% BW

The vertical ground reaction force applied to the system center of mass at the instant of peak negative vertical displacement of the system center of mass.

force_at_minimum_displacement=Fz_parent(tmin,Pz,parent)

Handedness

Batter handedness: the sign of the mean front-foot Fx over +-25 ms around the Fire start. A right-handed swing drives the lead foot's Fx negative; positive means left-handed. The same rule signs every swing stance/stride sideways value and angle (they carry it inline), so this card and those signs always agree; a coach correcting handedness is meant to flip them together. Replaces the Fy/Fz-resultant-peak rule (Caleb 2026-09-29). On 111 Lab swings it disagrees with the hitter's usual side on 8. Text-valued metric.

handedness='Right handed' if mean(Fxfront over Fire start +−25 ms) < 0 else 'Left handed'

Hang Time

ms

Time airborne, measured between the two 30 N crossings of vertical force across the Propulsive–Flight–Landing window — the same detection jumpHeight uses, so the two can never disagree.

hang_time=touchdowntime − takeofftime, both at a 30 N threshold

Hip Rotation Magnitude

Nm

Sum of absolute peak vertical free moments (Tz) from back foot (zone_index 1) and front foot (zone_index 0) during the Swing.

hip_rot_mag=|peakTz,back| + |peakTz,front|

Hip Rotation Symmetry

Nm

Difference of absolute peak vertical free moments (Tz): back foot (zone_index 1) minus front foot (zone_index 0).

hip_rot_sym=|peakTz,back| − |peakTz,front|

Horizontal Approach Angle

deg

Horizontal angle of the ball's path at the plate. Not yet observed.

TrackMan B1 live feed

Horizontal Break

cm

Horizontal movement of the pitch. Wire unit unverified - not yet observed.

TrackMan B1 live feed

Horizontal Release Angle

deg

Horizontal angle of the ball's path at release.

TrackMan B1 live feed

Impulse

Ns

The change in momentum of the athlete

impulse=force × time

Impulse Ratio

The ratio between the impulse during the propulsive phase and the braking phase during a CMJ.

impulse_ratio=propulsiveimpulse / brakingimpulse

Induced Vertical Break

cm

Vertical movement caused by spin, with gravity removed. UNITS UNVERIFIED - inches is the TrackMan convention but this field has not yet appeared in a real payload.

TrackMan B1 live feed

Interquartile Range

The range between the first and third quartiles

IQR=Q3 − Q1

Jump Height

cm

The height of the jump from the instant of take-off to the apex, from flight time. Take-off and touchdown are both identified by an absolute 30 N threshold on vertical force, matched to the plates’ residual noise rather than to a fraction of body weight, and detected across the Propulsive–Flight–Landing window so the result does not depend on phase-boundary accuracy. Does NOT include the centre-of-mass elevation already present at take-off from ankle plantarflexion.

jump_height=g × flighttime^2 / 8
flighttime between 30 N crossings

Jump Height Consistency

Coefficient of variation (standard deviation divided by the mean) of jump height across a repeated-jump set. Lower is more consistent.

jumpHeightConsistency=cv(jumpHeight over every 'Flight' phase)

Jump Height from Takeoff Velocity

cm

Calculate the vertical leap height based on the takeoff velocity.

vertical_leap_takeoff_velocity=vz^2 / (2 × g)

Jump Momentum

kg*m/s

Momentum at takeoff — body MASS in kg times takeoff velocity. Note the mass is obtained as system weight / g, because system weight is stored in NEWTONS; multiplying by the stored value directly overstates momentum by a factor of g (~9.81), which is what this analytic used to do. kg*m/s is dimensionally identical to N*s, so this is directly comparable to the impulse metrics: momentum at takeoff should equal the net impulse accumulated over the jump window.

jump_momentum=(BW / g) × vtakeoff

Jump Time

ms

The elapsed time of the jump window — movement onset through takeoff. Phase-name agnostic by design: it measures whatever window it is keyed to rather than looking for 'Unweighting'/'Braking'/'Propulsive' by name, so it keeps working when a capture type's phase set changes. Named jumpTime rather than contactTime because 'contact time' conventionally means ground contact in a rebound/drop jump; this is the force-production window of a jump started from standing. Pairs with reactionTime (stimulus to onset) and reactionTimeToTakeoff (stimulus to takeoff), which is their sum.

jump_time=max(time) − min(time), over movement onset..takeoff

JumpingStiffness

N/m

The vertical ground reaction force applied to the system center of mass at the instant of peak negative vertical displacement of the system center of mass divided by the peak negative vertical displacement of the system center of mass during the jumping phases.

jumping_stiffness=Fz(tmin,Pz) / abs(min(Pz))

Kurtosis

A measure of the 'tailedness' of the data distribution compared to a normal distribution

kurtosis=(1/n) × sum((x − mean)^4) / (stddev^4)

L/R Asymmetry Average Force

%

The asymmetry between the left and right average force (either positive or negative) during a phase, multiple phases, or a capture.

asymmetry=((Right − Left) / max(Right, Left)) × 100

L/R Asymmetry Average RFD

%

The asymmetry index between the left and right RFD (either positive or negative) during a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry_index=((Right − Left) / (Total × 0.5)) × 100

L/R Asymmetry Average RFD

%

The asymmetry between the left and right RFD (either positive or negative) during a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry=((Right − Left) / max(Right, Left)) × 100

L/R Asymmetry Impulse

%

The asymmetry between the left and right impulse (either positive or negative) during a phase, multiple phases, or a capture.

impulse=integral(Fz × dt)
asymmetry=((Right − Left) / max(Right, Left)) × 100

L/R Asymmetry Index Average Force

%

The asymmetry index between the left and right average force (either positive or negative) during a phase, multiple phases, or a capture.

asymmetry_index=((Right − Left) / (Total × 0.5)) × 100

L/R Asymmetry Index Impulse

%

The asymmetry index between the left and right impulse (either positive or negative) during a phase, multiple phases, or a capture.

impulse=integral(Fz × dt)
asymmetry_index=((Right − Left) / (Total × 0.5)) × 100

L/R Asymmetry Index Peak Force

%

The asymmetry index between the left and right force (either positive or negative) during a phase, multiple phases, or a capture.

asymmetry_index=((Right − Left) / (Total × 0.5)) × 100

L/R Asymmetry Index Peak RFD

%

The asymmetry index between the left and right at the peak combined (left + right) instantaneous RFD (either positive or negative) during a phase, multiple phases, or a test.

RFD=dF / dt
asymmetry_index=((Right − Left) / (Total × 0.5)) × 100 at peak (L+R) RFD

L/R Asymmetry Index RFD

%

The asymmetry index between the left and right RFD (either positive or negative) during a phase, multiple phases, or a capture.

RFD=ΔF / Δt
asymmetry_index=((Right − Left) / (Total × 0.5)) × 100

L/R Asymmetry Index RFD 100

%

The asymmetry index between the left and right RFD (either positive or negative) during the first 100 ms of a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry_index=((Right − Left) / (Total × 0.5)) × 100

L/R Asymmetry Index RFD 150

%

The asymmetry index between the left and right RFD (either positive or negative) during the first 150 ms of a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry_index=((Right − Left) / (Total × 0.5)) × 100

L/R Asymmetry Index RFD 200

%

The asymmetry index between the left and right RFD (either positive or negative) during the first 200 ms of a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry_index=((Right − Left) / (Total × 0.5))

L/R Asymmetry Index RFD 50

%

The asymmetry index between the left and right RFD (either positive or negative) during the first 50 ms of a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry_index=((Right − Left) / (Total × 0.5)) × 100

L/R Asymmetry Peak Force

%

The asymmetry between the left and right force (either positive or negative) during a phase, multiple phases, or a capture.

asymmetry=((Right − Left) / max(Right, Left)) × 100

L/R Asymmetry Peak Landing Force

%

Percent difference between the left and right peak landing forces.

asymmetry=100 × (PeakLandingRight − PeakLandingLeft) / max(PeakLandingRight, PeakLandingLeft)

L/R Asymmetry Peak RFD

%

The asymmetry between the left and right at the peak combined (left + right) instantaneous RFD (either positive or negative) during a phase, multiple phases, or a test.

RFD=dF / dt
asymmetry=((Right − Left) / max(Right, Left)) × 100 at peak (L+R) RFD

L/R Asymmetry RFD

%

The asymmetry between the left and right RFD (either positive or negative) during a phase, multiple phases, or a capture.

RFD=ΔF / Δt
asymmetry=((Right − Left) / max(Right, Left)) × 100

L/R Asymmetry RFD 100

%

The asymmetry between the left and right RFD (either positive or negative) during the first 100 ms of a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry=((Right − Left) / max(Right, Left)) × 100

L/R Asymmetry RFD 150

%

The asymmetry between the left and right RFD (either positive or negative) during the first 150 ms of a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry=((Right − Left) / max(Right, Left)) × 100

L/R Asymmetry RFD 200

%

The asymmetry between the left and right RFD (either positive or negative) during the first 200 ms of a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry=((Right − Left) / max(Right, Left)) × 100

L/R Asymmetry RFD 50

%

The asymmetry between the left and right RFD (either positive or negative) during the first 50 ms of a phase, multiple phases, or a test.

RFD=ΔF / Δt
asymmetry=((Right − Left) / max(Right, Left)) × 100

Landing Angle

deg

How open or closed the base is when the stride lands: the angle of the back-foot-to-front-foot line off straight at the pitcher, as a JSON value {angle, direction, signedDeg}. angle = the magnitude; direction = 'closed' when the front foot lands toward the plate, 'open' when away, null when handedness cannot be resolved; signedDeg = the raw plate-frame angle in the previous convention (sideways = back minus front x), for machines. Keeps the swingStrideAngle id and value shape so customer history and Flux's open/closed display continue. Back foot = footprint centroid of every loaded rear sample over Gather + Forward Momentum; front foot = footprint centroid over +-25 ms around the Fire start. Handedness is the sign of the front foot's Fx around the Fire start. A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

{angle: |degrees(atan2(L.x − B.x, L.y − B.y))|, direction: open/closed via handedness, signedDeg: degrees(atan2(B.x − L.x, L.y − B.y))}

Landing Distance

cm

Flat-ground landing distance of the batted ball. Wire unit unverified - not yet observed.

TrackMan B1 live feed

Landing Net Impulse Asymmetry

%

Left/Right asymmetry of the NET landing impulse each leg absorbs. The assessment window runs from landing touchdown until the cumulative combined net landing impulse reaches 80% of the jump's net positive impulse (the propulsion impulse that produced takeoff), or 500 ms, whichever comes first -- standardizing the window to the athlete's own output and excluding the noisy stabilization tail. Uses IMPULSE, not peak force, because landing impulse (the momentum being arrested) is surface-independent while peak landing force scales with floor stiffness (concrete vs rubber vs court). Each leg's impulse is relative to its own quiet-stance weight. asymmetry = (Right - Left)/max(|Right|,|Left|)*100; + = right-dominant.

window=[landingstart .. min(t where cumulative combined net landing impulse >= 0.8 × jumpnet,positive,impulse, landingstart + 500 ms)]
per leg impulse = integral(max(legFz − 50 %BW (half body weight, flat), 0) × bodyweightN) over window
asymmetry=(Right − Left)/max(|R|,|L|)×100

Landing Width

cm

How wide the base is when the stride lands: the straight-line distance between the back foot and the front foot at landing. Keeps the swingStrideLength id so customer history continues: before 2.2.0 this id reported the forward-only gap between the feet at landing under the name Swing Stride Length (median difference from the straight-line value < 1 cm). Back foot = footprint centroid of every loaded rear sample over Gather + Forward Momentum; front foot = footprint centroid over +-25 ms around the Fire start. A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

landingWidth=hypot(L − B), group frame

LandingStiffness

N/m

Landing stiffness = PEAK vertical GRF during landing absorption divided by the peak COM sink depth (N/m) - the field-standard vertical stiffness of the spring-mass model (McMahon & Cheng), so values are comparable with published ones. The two quantities are taken from different instants by convention: peak force is the impact transient (~14 ms after touchdown) while the COM bottoms out much later (~208 ms). The COM displacement is RECONSTRUCTED (the stored Pz drifts to meters): anchor Vz=0 at the flight apex (flight-phase center, true zero), integrate the actual force to a real touchdown velocity, then integrate displacement from touchdown and stop at the bottom of absorption (first v>=0) so integration bias can't run away.

apex(=flight center) Vz=0 −> integrate force to touchdown velocity −> Pz=0 at touchdown −> integrate to bottom (first v>=0)
landing_stiffness=max Fz(touchdown..bottom) / |min Pz|

Launch Angle

deg

Vertical angle of the batted ball off the bat. Not yet observed.

TrackMan B1 live feed

Launch Direction

deg

Horizontal angle of the batted ball off the bat. Not yet observed.

TrackMan B1 live feed

Left Force at Minimum Displacement

% BW

The left-side vertical ground reaction force at the instant of peak negative vertical displacement of the system center of mass (Parent).

left_force_at_minimum_displacement=Fz_left(tmin,Pz,parent)

Left Force at Peak Force

% BW

The left ground reaction force applied to the system center of mass at the point of the peak instantaneous ground reaction force applied to the system center of mass.

left_force_at_peak_force=Fz_left(tpeak,parent)

Max

The maximum value in the dataset

max=max(x)

Median

The median value of the dataset

median=Q2 = 0.5 × (n + 1)

Min

The minimum value in the dataset

min=min(x)

Mode

The most frequently occurring value in the dataset

mode=most_frequent(x)

Momentum at Peak Force

kg*m/s

Calculate the momentum at peak force during a phase, multiple phases, or a capture.

momentum_at_peak_force=vat,peak,force × bodymass

mRSI

m/s

Modified Reactive Strength Index — how much jump height per second of effort. The numerator is the SAME 30 N flight-time jump height that the jumpHeight metric reports; it previously derived its own height from the raw Flight-phase span, which ran 11% high. The denominator is the time from movement initiation to take-off.

mRSI=jumpheight / timeto,takeoff

mRSI Lateral

Ns/kg/s

Net impulse per kilogram of body mass, per second of ground contact — the body-size-independent companion to modifiedReactiveStrengthIndexLateral. Same construction, same rationale (the numerator is the net impulse itself, never a jump distance or a v^2/(2g) displacement, both of which smuggle in a jump-angle assumption), with the only difference being that the impulse is divided by mass in kg. Use this one to COMPARE athletes: the absolute version scales with body size, so a heavier athlete scores higher at equal relative effort. Use the absolute version to track one athlete over time, where mass is roughly constant and the raw output is what changed. Note the divisor is mass in kg, obtained as system weight / g, because system weight is stored in NEWTONS. Dimensionally Ns/kg/s reduces to N/kg, i.e. mean net acceleration over the jump window.

relative_mRSI_lateral=(|Jnet| / (BW / g)) / contacttime

mRSI Lateral (Absolute)

Ns/s

ABSOLUTE net impulse per second of ground contact for a lateral jump — NOT normalised for body size, so it scales with mass and a heavier athlete scores higher at equal relative effort. Prefer relativeModifiedReactiveStrengthIndexLateral for comparing athletes; this one is for tracking a single athlete over time, where mass is roughly constant and the raw output is what changed. Measured across 128 captures it correlates r=+0.70 with system weight, which is why it is kept available but not shown as a key metric. Numerator is the net impulse itself, never a jump distance and never a v^2/(2g) displacement — both smuggle in a jump-angle assumption. The RESULTANT (vector) impulse is used so a lateral drive contributes fully instead of cancelling, built per-axis with body weight removed from the vertical only (see netImpulse).

mRSI_lateral=|Jnet| / contacttime, where Jz = ∫(Fz − BW)dt, Jx = ∫Fx dt, Jy = ∫Fy dt

Net Impulse

Ns

The net impulse over the window analysed — the time integral of force with body weight removed, so it equals the change in momentum (impulse-momentum theorem). Body weight is subtracted from the VERTICAL axis only: gravity acts along Z, so Fx/Fy carry no weight to remove. For the resultant ('vector') the axes are integrated separately and the magnitude taken at the end, because the weight vector cannot be removed from an already-combined magnitude.

Jz=∫(Fz − BW)dt
Jx=∫Fx dt
Jy=∫Fy dt
J_vector=sqrt(Jx² + Jy² + Jz²)

Peak

The largest absolute value in the dataset

peak=max(abs(x))

Peak Direction

The direction of the peak value in the dataset

????

Peak Direction Phi

The phi value of the peak direction

????

Peak Direction Rho

The rho value of the peak direction

????

Peak Direction Theta

The theta value of the peak direction

????

Peak Drive Velo (COM)

m/s

COMPARISON metric (self-integrated). Peak whole-body (all-plate) COM horizontal velocity DURING the drive impulse window, computed by integrating the combined horizontal GRF from v=0 at the drive-window start (a=(F%BW/100)*g, mass cancels) instead of reading stored Vx/Vy. COM = is_parent virtual device (drive + both delivery plates). Peak searched only within [drive_start, drive_end] because the landing zone brakes the COM after front-foot contact. Self-contained, so it also works on older captures whose stored velocity was never recorded. Returns (peak COM velocity m/s, time of peak s).

peak=max(sqrt(Vx^2+Vy^2)) for drivestart<=t<=driveend
Vx=integral(Fx/100×g dt), Vy=integral(Fy/100×g dt) from drivestart

Peak Force

% BW

The peak force (either positive or negative) during a phase, multiple phases, or a capture.

peak_force=max(abs(Force))

Peak Force (Magnitude)

% BW

The largest force MAGNITUDE during a phase, multiple phases, or a capture. Always non-negative. Use this instead of peakForce on a horizontal axis (Fx/Fy) whenever the movement direction varies between trials — a lateral jump cued randomly left or right, for example — because peakForce keeps the sign of the direction, so trials in opposite directions cancel when averaged.

peak_force_magnitude=max(abs(Force))

Peak Free Moment

Nm

Peak vertical free moment (Tz) — pure rotational torque about the vertical axis. Returns value at peak |Tz| with sign preserved.

peak_Tz=Tz at max(|Tz|)

Peak Impulse

Ns

The maximum impulse value in the dataset

peak_impulse=max(impulse)

Peak Momentum XY

kg*m/s

Calculate the peak momentum in the XY (horizontal) plane during a phase, multiple phases, or a capture: mass * sqrt(Vx^2 + Vy^2). NOTE: the engine passes body_mass as BODYWEIGHT in newtons, so it is divided by g (9.81) to get true mass (kg); momentum is therefore kg*m/s. Returns (peak momentum, time of peak in s).

peak_momentum_xy=max(sqrt(Vx^2 + Vy^2) × dt)

Peak Power

W

The peak instantaneous power (either positive or negative) during a phase, multiple phases, or a capture. For the vector component, power is the dot product of the force and the centre-of-mass velocity (Fx·Vx + Fy·Vy + Fz·Vz): the power delivered along the direction of motion, which is negative while braking. (Before 1.11.0 it was the product of the two magnitudes, |F| × speed, which is never negative and overstates power whenever force and motion point in different directions.)

peak_power=max(abs(force × velocity))
vector: force · velocity = Fx·Vx + Fy·Vy + Fz·Vz

Peak Relative Power

W/kg

The peak instantaneous power during the window analysed, divided by body MASS in kg, so it is comparable between athletes. Note the divisor is mass in kg, obtained as system weight / g — system weight is stored in NEWTONS. For the vector component, power is the dot product of the force and the centre-of-mass velocity (Fx·Vx + Fy·Vy + Fz·Vz): the power delivered along the direction of motion, which is negative while braking. (Before 1.11.0 it was the product of the two magnitudes, |F| × speed, which is never negative and overstates power whenever force and motion point in different directions.)

peak_relative_power=max(abs(force × velocity)) / (BW / g)
vector: force · velocity = Fx·Vx + Fy·Vy + Fz·Vz

Peak RFD

N/s

Peak instantaneous rate of force development

peak(RFD) = max(dF / dt)

Peak to Peak Amplitude

The difference between the maximum and minimum values in the dataset

peak_to_peak_amplitude=max(x) − min(x)

Peak Velocity

m/s

The peak velocity (either positive or negative) during a phase, multiple phases, or a capture.

peak_velocity=max(abs(Velocity))

Phase Duration

s

Duration of the phase in seconds: last sample time minus first over the phase's data slice.

phaseDuration=(tlast − tfirst) / 1000

Pitch Velocity

kph

Ball velocity at release. Measured by TrackMan when radar is available, otherwise entered manually.

TrackMan B1 live feed, or manual entry

Plate Location Height

cm

Height of the ball as it crosses the front of home plate. The Location block is SPARSE - it appeared on only one of four pitches in a real session - so consumers must tolerate its absence per pitch.

TrackMan B1 live feed

Plate Location Side

cm

Horizontal position at the front of home plate.

TrackMan B1 live feed

Plate Speed

kph

Ball speed as it crosses the plate.

TrackMan B1 live feed

Positive Impulse

Ns

The impulse during the braking and propulsive phases.

positive_impulse=(F × dt)

Positive Net Impulse

Ns

Net impulse over the Propulsive phase. Fx and Fy integrate signed horizontal force without subtracting body weight; Fz integrates vertical force minus body weight. The vector result is the magnitude of the three integrated net-impulse components. The phase is selected explicitly; this metric does not clip negative force samples. For a vertical jump starting propulsion at zero vertical velocity, its Fz value equals mass times takeoff velocity.

Propulsive only: Jx = integral(Fx dt)
Jy=integral(Fy dt)
Jz=integral((Fz − BW) dt)
Jvector=sqrt(Jx^2 + Jy^2 + Jz^2)

Positive Net Impulse Asymmetry

%

Asymmetry of each leg's NET positive impulse during the propulsive phase, taken above a flat 50 %BW (half body weight) per leg -- NOT each leg's own stance -- so a standing posture already favoring the stronger leg is captured, not masked. asymmetry = (Right-Left)/max(|R|,|L|)*100.

per_leg_net_impulse=integral((legFz − 50)×bodyweightN) over Propulsive (50 %BW = half body weight, flat)
asymmetry=(Right − Left)/max(|R|,|L|)×100

Pre-Takeoff Displacement

cm

Horizontal center of mass displacement at the end of the propulsive phase.

Px
Py
Pvector=sqrt(Px^2 + Py^2)

Range

The difference between the maximum and minimum values in the dataset

range=max(x) − min(x)

Rate of Force Development

N/s

The rate at which force is developed

RFD=ΔForce / ΔTime

Reaction Time

ms

Elapsed time from the visual stimulus to the first detectable movement — the athlete's reaction proper, ending where the jump window begins, so it excludes the time spent producing force. Pair with reactionTimeToTakeoff (stimulus to leaving the ground) to separate 'how fast did they decide' from 'how fast did they go'. Phase-name agnostic by design: it measures whatever window it is keyed to rather than looking for 'Reactionary' by name, so it keeps working when a capture type's phase set changes. Key it to the phase that begins at the stimulus and ends at movement onset.

reaction_time=max(time) − min(time), over stimulus..movement onset

Reaction Time to Takeoff

ms

The elapsed time from the visual stimulus to takeoff — the athlete's total response: recognising the cue, then producing enough impulse to leave the ground. Phase-name agnostic by design: it measures whatever window it is keyed to rather than looking for 'Reactionary'/'Unweighting'/'Braking'/'Propulsive' by name, so it keeps working when a capture type's phase set changes. Key it to the reaction phase plus the jump window; the window must START at the stimulus for the value to mean what the name says.

reaction_time_to_takeoff=max(time) − min(time), over stimulus..takeoff

Reaction Window Duration

ms

Duration of the Reaction Window in milliseconds -- front-foot contact to the Fire commitment, i.e. how long the hitter has between landing the front foot and committing to the swing. Named explicitly rather than surfaced as the generic phaseDuration so the key-metric table reads as a metric instead of as a phase row. Returns no value when no Reaction Window was detected, which is a real answer for no-kick / toe-drag hitters (about 1 capture in 6) rather than an error.

reactionWindowDuration=t(last Reaction Window sample) − t(first Reaction Window sample)

Recoil Time

ms

Time from first negative Fy after Delivery contact to the first zero-crossing of Fy back to >= 0.

recoil_time_ms=t(Fy crosses 0 up) − t(first Fy < 0 after contact)

Relative Drive Impulse

Ns/kg

The POSITIVE net impulse the hitter accumulates over the drive -- integrated across Gather and Forward Momentum and evaluated at the close of that span, which is front-foot contact. It is a DEFINITE INTEGRAL over a fixed window, not a maximum of anything: the window ends at front-foot contact because past that the front side is arresting the body and anything accumulated there is braking rather than drive. This is the drive that swingBrakeTime is measured against (brake time compares braking to a FRACTION of the drive, so it is unaffected by which of the two is used): braking time is how long the front side takes to counter half of THIS number. POSITIVE-ONLY, with a sign convention per metric: the drive counts +Fx, +Fy and +Fz (Fz meaning force above body weight), while braking counts -Fx, -Fy and +Fz. Z is positive for both, because the hitter pushes up through body weight to drive and to block. Every axis is gated on the DIRECTION OF TRAVEL: it contributes only on samples where the forward axis is itself acting in the counted direction, so the drive accumulates only while Fy > 0 and braking only while Fy < 0. Without that gate, +Fz and +Fx banked drive during the backward load at the start of the Gather -- the hitter pushing up through body weight while moving away from the pitcher -- which was a median 5.5% of the drive and up to 83.9% on the worst capture. Each axis is rectified BEFORE integrating, so it contributes only while it pushes the counted way and an axis that reverses does not subtract what it already earned -- that is what makes these positive-only impulses rather than net momentum. The resultant sqrt(Jx^2+Jy^2+Jz^2) is assembled from the per-axis integrals at the END, because a weight vector cannot be subtracted from an already-combined magnitude. NO de-biasing: body weight comes off the VERTICAL axis only, since gravity acts along Z and Fx/Fy carry no weight to remove, and nothing is subtracted on the strength of the Wait phase. Integration starts at the Gather onset, so no standing-still data enters the measurement. CAVEAT ON X: +X is rightward in the plate frame, so the lateral term is handedness-dependent -- a left- and a right-handed hitter drive laterally in opposite directions, and only one of them accumulates under +X for the drive. Fx is the smallest of the three contributions but not negligible. Taken from the combined (Parent) trace because a net impulse is a property of the whole hitter -- the rear foot generates the drive and the front foot destroys it, so a per-foot split would measure contributions rather than the body's net impulse, and subtracting a whole body weight from one plate carrying ~49 %BW would invent ~51 %BW of downward force. Normalized to body MASS in kg (Ns/kg), which is what makes it comparable across athletes; swingDriveImpulse is the same quantity in raw newton-seconds. Note Ns/kg is dimensionally m/s, so this is numerically the speed a free body of the hitter's mass would carry under the same positive impulse. Per-axis values are available on Fx/Fy/Fz; the vector is the headline. THE KEY METRIC IS THE POSITIVE Fy AXIS, not the vector. Including Fz and Fx let the vector bank drive during the backward load at the head of the Gather, where the hitter pushes up through body weight while travelling AWAY from the pitcher: measured over 90 captures that was a median 5.5% of the drive, p90 15.4% and 83.9% on the worst capture, 81.4% of it from Fz. Positive Fy removes that by construction, because the backward load is Fy < 0 and contributes nothing. The per-axis and vector values remain available for inspection; the slate uses Fy.

Jx=int(max(Fx,0))dt
Jy=int(max(Fy,0))dt
Jz=int(max(Fz−100%BW,0))dt, each over [Gather start, Forward Momentum end]
relativeSwingDriveImpulse=sqrt(Jx^2+Jy^2+Jz^2) / (BW/g)

Relative Net Impulse

Ns/kg

The net impulse over the window analysed, divided by body MASS in kg — so it equals the change in velocity (m/s) and is directly comparable between athletes. Body weight is subtracted from the vertical axis only, and the resultant is built per-axis then combined; see netImpulse. Note the divisor is mass in kg, obtained as system weight / g — system weight is stored in NEWTONS.

relative_net_impulse=Jnet / (BW / g)

Relative Positive Impulse

Ns/kg

The net impulse accumulated over the braking and propulsive phases, divided by body MASS in kg. Body weight is subtracted from the vertical axis only, and the resultant is built per-axis then combined; see netImpulse. Note the divisor is mass in kg, obtained as system weight / g — system weight is stored in NEWTONS. For a capture type with no braking phase (a reactive lateral drive, say) prefer relativeNetImpulse keyed to the jump phase, which does not depend on these phase names existing.

relative_positive_impulse=(Jbraking + Jpropulsive) / (BW / g)

Relative Positive Net Impulse

Ns/kg

Net vertical impulse over the propulsive phase, divided by body MASS in kg (Ns/kg) -- so it is comparable between athletes. Because the propulsive phase begins at the countermovement bottom (velocity = 0), the absolute integral equals mass x takeoff velocity, which means this relative form IS the takeoff velocity in m/s and remains the exact determinant of jump height. Prefer this over the absolute positiveNetImpulse for cross-athlete comparison: absolute impulse tracks body mass (measured r = +0.90 with system weight over a 45-98 kg sample), so it rewards being heavy rather than being explosive. Body weight is subtracted from the vertical axis only; see netImpulse. Note the divisor is mass in kg, obtained as system weight / g -- system weight is stored in NEWTONS.

relative_positive_net_impulse=integral((Fz − bodyweight) dt) over the Propulsive phase / (BW / g) = takeoff velocity

Release Height

cm

Height of the release point above the ground.

TrackMan B1 live feed

Release Side

cm

Horizontal release position relative to the centre of the rubber; positive toward the third-base side.

TrackMan B1 live feed

Repetitions

Number of ground contacts recorded in a repeated set (hops or bounds).

repetitionCount=count(phaseDuration over every 'Contact' phase)

RFD 100

N/s

The rate at which force is developed during the first 100 ms of the test or phase.

RFD=ΔF / Δt

RFD 150

N/s

The rate at which force is developed during the first 150 ms of the test or phase.

RFD=ΔF / Δt

RFD 200

N/s

The rate at which force is developed during the first 200 ms of the test or phase.

RFD=ΔF / Δt

RFD 50

N/s

The rate at which force is developed during the first 50 ms of the test or phase

RFD=ΔF / Δt

Right Force at Minimum Displacement

% BW

The right-side vertical ground reaction force at the instant of peak negative vertical displacement of the system center of mass (Parent).

right_force_at_minimum_displacement=Fz_right(tmin,Pz,parent)

Right Force at Peak Force

% BW

The right ground reaction force applied to the system center of mass at the point of the peak instantaneous ground reaction force applied to the system center of mass.

right_force_at_peak_force=Fz_right(tpeak,parent)

RSI

Calculate the Reactive Strength Index (RSI).

RSI=flighttime / (contacttime or timeto,takeoff)

Skewness

A measure of the asymmetry of the data distribution

skewness=(1/n) × sum((x − mean)^3) / (stddev^3)

Spin Axis

deg

Spin axis orientation in degrees.

TrackMan B1 live feed

Spin Efficiency

%

Percentage of total spin that contributes to movement. TrackMan sends a 0-1 ratio on the wire; the enricher converts it to a percentage.

TrackMan B1 live feed

Spin Rate

rpm

Total spin rate of the pitch at release, measured by TrackMan.

TrackMan B1 live feed

Stance Angle

deg

How open or closed the stance is: the angle of the back-foot-to-front-foot line off straight at the pitcher, + closed (front foot toward the plate), - open. Foot placement only; it cannot see which way the toes point. Signed by handedness (the sign of the front foot's Fx around the Fire start) so + always means toward the plate (closed) and - away from it (open), for both right- and left-handed hitters. Stance points: back foot = footprint centroid of every loaded rear sample over Gather + Forward Momentum; front foot = footprint centroid over +-100 ms around the Gather start. A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

stanceAngle=degrees(atan2(hand × (S.x − B.x), S.y − B.y))
+ = closed

Stance Forward

cm

The toward-the-pitcher part of the stance: how far forward of the back foot the front foot is set before the stride. Stance points: back foot = footprint centroid of every loaded rear sample over Gather + Forward Momentum; front foot = footprint centroid over +-100 ms around the Gather start. A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

stanceForward=S.y − B.y, group frame (+Y toward the pitcher)

Stance Sideways

cm

The sideways part of the stance: how far the front foot is set toward (+, closed stance) or away from (-, open stance) the plate relative to the back foot. Signed by handedness (the sign of the front foot's Fx around the Fire start) so + always means toward the plate (closed) and - away from it (open), for both right- and left-handed hitters. Stance points: back foot = footprint centroid of every loaded rear sample over Gather + Forward Momentum; front foot = footprint centroid over +-100 ms around the Gather start. A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

stanceSideways=hand × (S.x − B.x), group frame
+ = front foot closer to the plate

Stance Width

cm

How far apart the feet are set up before the stride: the straight-line distance between the back foot and the front foot. Stance points: back foot = footprint centroid of every loaded rear sample over Gather + Forward Momentum; front foot = footprint centroid over +-100 ms around the Gather start. A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

stanceWidth=hypot(S − B), group frame

Standard Deviation

A measure of the amount of variation or dispersion in the dataset

std_dev=sqrt((1/n) × sum((x − mean)^2))

Stride Angle

deg

Which way the stride goes: the angle of the front foot's travel off straight at the pitcher, + closed (toward the plate), - open (away from it). No value below 4 cm of travel, where the direction is COP noise rather than where the foot went. Signed by handedness (the sign of the front foot's Fx around the Fire start) so + always means toward the plate (closed) and - away from it (open), for both right- and left-handed hitters. Stride points: the front foot's footprint centroid over +-100 ms around the Gather start (before the stride) and over +-25 ms around the Fire start (at landing). A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

strideAngle=degrees(atan2(hand × (L0.x − S0.x), L0.y − S0.y))
+ = closed
none below 4 cm of travel

Stride Angle

deg

Stride angle in degrees, measured from straight toward home plate (0 deg). Built from the same stride vector as strideLength: forward length = lead-foot COPy at Delivery peak Fz minus back-foot COPy at Loading peak Fz, each in the group frame via its zone's originOffsetY (mm, on the mound definition); lateral width = COPx delta. Angle = atan2(width, length). 0 deg = the lead foot lands directly in line with home; the sign indicates which side of the line the stride falls (open vs closed).

strideAngle=degrees( atan2( strideWidth, strideLength ) )

Stride Duration

ms

How long the stride takes: from the front foot's first lift to its final landing, between the Gather and Fire starts. A toe tap's brief touch falls inside the span. The front plate does not read zero with the foot off -- on Batter's Box captures it sits on a flat 12-37 N plateau that varies by plate -- so airborne is measured against that plateau: front Fz below (5th percentile of front Fz in the window) + 3 %BW. Gaps under 60 ms are bridged and airborne runs under 30 ms ignored (the swing detector's BRIDGE_GAP_MS / MIN_AIR_MS). No value when the front foot never leaves the plate: its 5th percentile stays above 10 %BW, or no run qualifies. On 106 Lab swings the landing this finds sits a median 1 ms from the detector's front-foot landing (Reaction Window start); 3 swings are more than 25 ms off.

strideDuration=t(final landing) − t(first lift) of the front foot between the Gather and Fire starts
airborne=front Fz < p5(front Fz) + 3 %BW

Stride Forward

cm

The toward-the-pitcher part of the stride; negative for a backward stride. Stride points: the front foot's footprint centroid over +-100 ms around the Gather start (before the stride) and over +-25 ms around the Fire start (at landing). A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

strideForward=L0.y − S0.y, front zone (+Y toward the pitcher)

Stride Length

cm

How far the front foot travels in the stride: the straight-line distance from where it was set before the stride to where it lands. Both points are on the front plate, so its origin offsets cancel. Stride points: the front foot's footprint centroid over +-100 ms around the Gather start (before the stride) and over +-25 ms around the Fire start (at landing). A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

strideLength=hypot(L0 − S0), front zone

Stride Length

cm

Forward distance between back-foot COP at Loading peak Fz and lead-foot COP at Delivery peak Fz, each placed in the group frame with its zone's origin offset (originOffsetY on the mound definition's virtual devices, mm). Reports an error string, not a number, when a mound definition carries no zone offsets.

stride_length_cm=((COPydelivery + originOffsetYdelivery/1000) − (COPyloading + originOffsetYloading/1000)) × 100

Stride Sideways

cm

The sideways part of the stride: how far the front foot moves toward (+, closed) or away from (-, open) the plate. Signed by handedness (the sign of the front foot's Fx around the Fire start) so + always means toward the plate (closed) and - away from it (open), for both right- and left-handed hitters. Stride points: the front foot's footprint centroid over +-100 ms around the Gather start (before the stride) and over +-25 ms around the Fire start (at landing). A footprint centroid uses only COP samples carrying at least 10 %BW, rejects outliers at 3 MAD per axis and counts each visited 5 mm cell once, so it is the centre of where the foot pressed.

strideSideways=hand × (L0.x − S0.x), front zone
+ = toward the plate

Stride Type

ms

Stride Type: (forward-drive END) - (delivery-phase START) in ms. The forward-drive END is the last time the drive-plate Fy is >= 3% BW (the drive-toward-home push), with the vertical (Fz) condition intentionally dropped - so the boundary tracks when forward drive stops, not when the drive foot finally unloads. Positive = TERRESTRIAL (drive still pushing after front-foot contact, overlap); negative = AERIAL (forward drive ended before contact, flight gap). Uses the same drive-movement detection + Fz>80%BW qualifier as driveImpulse to find the drive; delivery start = first time zone_index 0 is in phase 'Delivery'.

strideStyle=(drive−window end ms) − (delivery−phase start ms)
+ = terrestrial, − = aerial

Swing Lateral Impulse

Ns/kg

Medial-lateral impulse on the REAR plate -- the sideways component of the drive, which is where rotational intent shows up rather than in the forward push. Back Leg Medial-Lateral Impulse is one of the variables the LASSO model retained when predicting bat speed (RMSE 2.47 mph, R^2 = 0.420). Rectified to one direction and normalized to body MASS in kg (Ns/kg), so it is comparable between hitters. Window: Forward Momentum through Fire. The window deliberately spans more than one phase where a single phase is unreliable -- Reaction Window is absent on roughly 1 in 6 captures and any phase can measure 0 ms.

swingLateralImpulse=integral(max(Fx, 0) dt) over Forward Momentum through Fire / (BW / g)

Swing Load Impulse

Ns/kg

How much the hitter loads into the back leg while gathering -- the vertical impulse accumulated on the REAR plate above quiet stance during Gather. Driveline reports a Load Impulse and a Max Fz Load Force of roughly 66% BW for this action. Measured above THIS plate's own quiet-stance baseline (the mean Fz over the Wait phase), not above a flat half body weight -- a batting stance is deliberately rear-loaded, so 50 %BW is not either plate's neutral and would charge the rear plate for standing still. Normalized to body MASS in kg (Ns/kg). Window: the Gather phase. The baseline is the MEDIAN of the last 500 ms of Wait rather than the mean of the whole phase: Wait runs up to 6.1 s and the athlete is often still settling early in it (measured Wait-phase Fz standard deviations reach 21.8 %BW). CAVEAT ON THIS CORPUS: front-plate stance load varies from 1.9 to 107 %BW across captures, so stance setup is not consistent and this metric is legitimately sensitive to it -- a hitter set up almost entirely off this plate will score a large above-stance impulse. Compare within an athlete and setup, not across the corpus.

swingLoadImpulse=integral(max(Fz − median(Fz over last 500 ms of Wait), 0) dt) over the Gather phase / (BW / g)

Swing Rotational RFD

Nm/s

Peak rate of change of the vertical free moment (Tz) on the front plate through the swing -- how fast the hitter builds rotational torque against the ground, rather than how much. Torque magnitude is already covered by hipRotationMagnitude; this is its rate, which is the property that distinguishes a quick swing from a merely strong one. Computed on a 10 ms centred slope so single-sample jitter in the free moment does not dominate.

swingRotationalRFD=max |dTz/dt| over Reaction Window + Fire, Tz = Mz − (Fy×COPx − Fx×COPy), 10 ms centred slope

Swing Stride Tempo

ms

Time between peak force vectors on the back-foot plate (zone_index 1) and the lead-foot plate (zone_index 0).

tempo_ms=tlead,peakF − tback,peakF

Swing Stride Width

cm

Lateral (X) COP displacement between the two plates at their respective peak force vectors during the Swing. Landing COP averaged over +-30 ms around the front force-vector peak (single-sample COP is jitter-prone at touchdown). Back-foot COP = occupancy centroid of the rear footprint over Gather..RW start (outlier-rejected, 5 mm cells, dwell-unbiased) when a Gather phase exists; legacy loading-peak COP otherwise.

stride_width_cm=(COPxzone1,peakF − COPxzone0,peakF) × 100

System Weight

N

The body mass of the individual

system_weight=weight

Tagged Pitch Type

Pitch type tagged by the operator in the TrackMan app (e.g. "Fastball"). Text. Arrives via PlayMetadata, which has not yet been observed on the live feed.

TrackMan B1 live feed

Takeoff Angle

deg

The angle of the takeoff vector above horizontal, in degrees: 0 is a purely horizontal launch, 90 purely vertical. Derived from the NET IMPULSE components rather than from a velocity sample, because impulse divided by mass IS takeoff velocity — the mass cancels out of the ratio, so the angle is identical either way while the impulse route avoids depending on a single boundary sample of a drifted velocity trace. Body weight is removed from the vertical axis only (see netImpulse), which matters here: leaving it in would bias the vertical component and tilt every angle. This is the technique dimension deliberately kept OUT of mRSI-lateral — read the two together to separate how much impulse the athlete produced from which direction they aimed it.

takeoff_angle=degrees(atan2(Jz, sqrt(Jx^2 + Jy^2)))

Takeoff Velocity

m/s

Velocity of the center of mass at the instant of take-off.

takeoff_velocity=velocity at time of take−off

Third Quartile

The value below which the third quartile of the data falls

Q3=0.75 × (n + 1)

Tilt

Spin axis expressed as a clock face (e.g. "10:30"). Text, not numeric.

TrackMan B1 live feed

Time To Peak Block

ms

Milliseconds from FRONT-FOOT CONTACT to the front plate's peak resultant force -- how quickly the lead leg goes from touchdown to a fully posted block. Contact is the start of the Reaction Window, or the start of Fire when no Reaction Window was detected (Reaction Window is absent on roughly 1 in 6 captures, so anchoring on it alone would drop the metric there rather than degrade it). This is the lead-leg analogue of time-to-peak-force, and the timing half of the front-plate peak-resultant measure that correlates with bat speed at r = 0.662. It describes the LEAD LEG and not the swing, which is why it carries no swing prefix: the same mechanism and the same measurement apply to the front leg in a pitch.

timeToPeakBlock=t(max |F| resultant on the Front plate) − t(front−foot contact), where contact is the start of the Reaction Window, or the start of Fire when no Reaction Window was detected

Time to Peak Force

ms

The total time taken from the initiation of movement to the peak force.

time_to_peak_force=timeof,peak,force − timeof,initial,movement

Time to Takeoff

ms

The total time taken from the initiation of movement to the instant of take-off.

time_to_takeoff=timeof,takeoff − timeof,initial,movement

Trend

The overall direction of the data over time

trend=(y2 − y1) / (x2 − x1)

Variance

A measure of how far a set of numbers is spread out from their average value

variance=(1/n) × sum((x − mean)^2)

Vertical Approach Angle

deg

Vertical angle of the ball's path at the plate. Not yet observed.

TrackMan B1 live feed

Vertical Break

cm

Total vertical movement including gravity. Wire unit unverified - not yet observed.

TrackMan B1 live feed

Vertical Leap

cm

The vertical distance the athlete jumps

vertical_leap=(initialvelocity^2 × sin(angle)^2) / (2 × g)

Vertical Release Angle

deg

Vertical angle of the ball's path at release.

TrackMan B1 live feed