physics.robotics.actuation
physics.robotics.actuation
Joint mechanics, contact dynamics, and thermal/electrical actuation limits.
Functions
| Name | Description |
|---|---|
| calc_alpha_power_gate_delay_stretch | Estimate CMOS gate delay stretch using the alpha-power approximation. |
| calc_coasting_contact_peak_force | Calculate peak spring force after drive removal at a contact tripwire. |
| calc_contact_force | Calculate linear Hookean elastic contact force upon unconstrained impact. |
| calc_contact_yield_deadline | Calculate the constant-speed contact deadline at a force threshold. |
| calc_inductive_voltage_droop | Calculate inductive voltage drop during a current transient. |
| calc_inverted_pendulum_fall_time | Calculate characteristic instability timescale or fall duration for an inverted pendulum. |
| calc_kinetic_energy | Calculate kinetic energy of a translating body. |
| calc_passive_compliance_stiffness_bound | Largest series stiffness that keeps a driven contact under a force limit after the tripwire. |
| calc_quasistatic_spill_acceleration | Calculate the steady-tilt acceleration ceiling for an open vessel. |
| calc_quintic_blend_duration | Compute minimum blend duration for quintic polynomial trajectory to bound torque jerk. |
| calc_reduced_mass | Calculate the two-body reduced mass of a collision. |
| calc_reflected_inertia | Calculate reflected rotor inertia felt at the actuator output shaft. |
| calc_seam_acceleration_torque_jump | Calculate the impulsive torque spike at an actuator seam transition. |
| calc_smoothstep_blend_window | Shortest window of a fixed-endpoint quintic smoothstep whose peak rate stays at a limit. |
| calc_transient_contact_speed_limit | Calculate the highest contact speed whose transient peak force stays at a force limit. |
| calc_transient_impact_force | Calculate peak unbraked transient impact force on an elastic body. |
| calc_tripwire_contact_force_accumulation | Calculate contact force at brake-command onset after a tripwire breach. |
| calc_voltage_droop | Calculate DC bus voltage droop across internal battery and cable resistance. |
calc_alpha_power_gate_delay_stretch
physics.robotics.actuation.calc_alpha_power_gate_delay_stretch(
nominal_voltage,
drooped_voltage,
threshold_voltage=None,
alpha=1.3,
)Estimate CMOS gate delay stretch using the alpha-power approximation.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| nominal_voltage | Quantity | Nominal rail voltage in V, above threshold in the intended regime. | required |
| drooped_voltage | Quantity | Drooped rail voltage in V; must exceed threshold. | required |
| threshold_voltage | Quantity | Threshold in V; None selects the assumed 0.42 V default. | None |
| alpha | float | Dimensionless alpha-power exponent; assumed default is 1.3. | 1.3 |
Returns
| Name | Type | Description |
|---|---|---|
| dict | Dimensionless stretch_ratio and delay_expansion_percent relative to nominal delay. |
Notes
Equation:
Sakurai-Newton Alpha-Power Law: stretch_ratio = (V_droop / V_nom) * ((V_nom - V_th) / (V_droop - V_th))^alpha
Assumptions: Both rail voltages exceed the threshold in the intended regime; threshold defaults to an assumed 0.42 V and exponent alpha to an assumed 1.3.
Excludes: Process-specific calibration, frequency control, temperature dependence, and behavior at or below threshold.
References
Derivation: Under the alpha-power approximation delay is proportional to V/(V-V_th)**alpha; divide drooped delay by nominal delay.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_alpha_power_gate_delay_stretch
>>> from mlsysim.core.units import ureg
>>> calc_alpha_power_gate_delay_stretch(ureg('1 V'), ureg('1 V'))['stretch_ratio'] == 1.0
Truecalc_coasting_contact_peak_force
physics.robotics.actuation.calc_coasting_contact_peak_force(
contact_velocity,
effective_mass,
contact_stiffness,
preload_force,
)Calculate peak spring force after drive removal at a contact tripwire.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| contact_velocity | Quantity | Positive relative approach speed in m/s. | required |
| effective_mass | Quantity | Positive robot-side effective mass in kg. | required |
| contact_stiffness | Quantity | Positive linear contact stiffness in N/m. | required |
| preload_force | Quantity | Initial spring-force magnitude in N, nonnegative in the intended model. | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Peak elastic contact force in N. |
Notes
Equation:
Energy balance from the tripwire, where the spring already carries preload_force: F0^2 / (2k) + m v^2 / 2 = F_peak^2 / (2k) => F_peak = sqrt(F0^2 + k m v^2)
With preload_force zero this is the unbraked transient force v sqrt(k m) (calc_transient_impact_force). Added 2026-10-20.
Assumptions: After drive removal, a positive effective mass and approach speed compress a positive linear spring with a nonnegative preload magnitude.
Excludes: Damping, residual drive torque, nonlinear contact, and safety certification.
References
Derivation: Conserve initial spring energy plus kinetic energy to obtain F_peak squared = F0 squared + k m v squared.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_coasting_contact_peak_force
>>> from mlsysim.core.units import ureg
>>> calc_coasting_contact_peak_force(ureg('1 m/s'), ureg('1 kg'), ureg('1 N/m'), ureg('0 N')) == ureg('1 N')
Truecalc_contact_force
physics.robotics.actuation.calc_contact_force(stiffness, displacement)Calculate linear Hookean elastic contact force upon unconstrained impact.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| stiffness | Quantity | Positive linear spring stiffness in N/m. | required |
| displacement | Quantity | Nonnegative compression in m. | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Elastic force in N. |
Notes
Equation: F = k * delta_x
Assumptions: The spring is linear with positive stiffness and nonnegative compression.
Excludes: Damping, nonlinear material response, and dynamic impact trajectory.
References
Derivation: Hooke’s law gives force as stiffness times displacement.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_contact_force
>>> from mlsysim.core.units import ureg
>>> calc_contact_force(ureg('100 N/m'), ureg('0.01 m')) == ureg('1 N')
Truecalc_contact_yield_deadline
physics.robotics.actuation.calc_contact_yield_deadline(
yield_force,
stiffness,
approach_velocity,
)Calculate the constant-speed contact deadline at a force threshold.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| yield_force | Quantity | Maximum permissible mechanical shock / yield force (e.g. N). | required |
| stiffness | Quantity | Contact environment stiffness (e.g. N/m). | required |
| approach_velocity | Quantity | Tool-center-point approach velocity (e.g. m/s). | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Deadline duration in milliseconds. |
Notes
Equation:
For an arm approaching a rigid fixture of stiffness k at constant velocity v, contact force rises as F(t) = k * v * t. To prevent structural damage (F <= F_yield): t_deadline = F_yield / (k * v)
Assumptions: Positive approach speed stays constant while a positive linear stiffness accumulates force from zero.
Excludes: Braking after detection, damping, initial preload, and safety certification.
References
Derivation: Substitute compression v t into Hooke’s law and solve k v t = F_yield.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_contact_yield_deadline
>>> from mlsysim.core.units import ureg
>>> calc_contact_yield_deadline(ureg('10 N'), ureg('100 N/m'), ureg('1 m/s')).check('[time]')
Truecalc_inductive_voltage_droop
physics.robotics.actuation.calc_inductive_voltage_droop(
loop_inductance,
current_slew_rate,
)Calculate inductive voltage drop during a current transient.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| loop_inductance | Quantity | Positive loop inductance in H. | required |
| current_slew_rate | Quantity | Positive current slew in A/s. | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Inductive voltage drop in V. |
Notes
Equation: Delta_V_ind = L * (dI / dt)
Assumptions: A positive lumped loop inductance experiences a positive current slew.
Excludes: Resistive droop, decoupling capacitance, and distributed PDN resonances.
References
Derivation: The ideal inductor terminal relation is voltage L times the time derivative of current.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_inductive_voltage_droop
>>> from mlsysim.core.units import ureg
>>> calc_inductive_voltage_droop(ureg('1 H'), ureg('1 A/s')) == ureg('1 V')
Truecalc_inverted_pendulum_fall_time
physics.robotics.actuation.calc_inverted_pendulum_fall_time(
effective_length,
gravity=None,
theta_0=None,
theta_fall=None,
)Calculate characteristic instability timescale or fall duration for an inverted pendulum.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| effective_length | Quantity | Center-of-mass height or pendulum leg length L (e.g. meter). | required |
| gravity | Quantity | Gravitational acceleration g (defaults to 9.80665 m/s^2). | None |
| theta_0 | Quantity or float | Initial angular perturbation from vertical (e.g. radians or degrees). | None |
| theta_fall | Quantity or float | User-selected fall angle greater than theta_0; it is not a certified recovery threshold. | None |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Characteristic timescale or fall duration in seconds. |
Notes
Equation:
Models bipedal/humanoid balance dynamics under gravity. The linearized dynamics d^2 theta / dt^2 = (g / L) * theta yield the characteristic natural timescale: tau_0 = sqrt(L / g)
If initial perturbation theta_0 and fall threshold theta_fall are given: t_fall = tau_0 * ln(2 * theta_fall / theta_0)
Assumptions: The pendulum has positive length and gravity. The optional fall estimate assumes a small initial angle, zero angular velocity, and a much larger final angle.
Excludes: Nonlinear large-angle motion, active balancing, and a proof that the chosen angle implies irrecoverability.
References
The linear inverted pendulum has natural frequency omega_0 = sqrt(g / h), so tau_0 = sqrt(L / g) (Caron, “Biped Stabilization by Linear Feedback of the Variable-Height Inverted Pendulum Model”, arXiv:1909.07732, Sec. II). The t_fall expression is derived here, not taken from a published model. With zero initial angular velocity the linearized solution is theta(t) = theta_0 * cosh(t / tau_0), so t = tau_0 * acosh(theta_fall / theta_0), and ln(2x) approximates acosh(x) for x >> 1 (it overestimates by about 5% at x = 2). The small-angle linearization also loses accuracy as theta_fall grows.
Derivation: The linearized equation has timescale sqrt(L/g); replacing acosh(theta_f/theta_0) by log(2 theta_f/theta_0) gives the optional approximation.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_inverted_pendulum_fall_time
>>> from mlsysim.core.units import ureg
>>> calc_inverted_pendulum_fall_time(ureg('1 m')).check('[time]')
Truecalc_kinetic_energy
physics.robotics.actuation.calc_kinetic_energy(mass, velocity)Calculate kinetic energy of a translating body.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| mass | Quantity | Total mass of the body (e.g. kg). | required |
| velocity | Quantity | Translational velocity (e.g. m/s). | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Kinetic energy in Joules. |
Notes
Equation: E_k = 0.5 * m * v^2
Assumptions: A translating point mass has nonrelativistic speed; mass is positive and speed is nonnegative.
Excludes: Rotation, deformation, and dissipated energy.
References
OpenStax, University Physics Volume 1, Sec. 7.2, Eq. 7.6.
Derivation: Integrating Newtonian work m v dv from rest gives m v squared divided by two.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_kinetic_energy
>>> from mlsysim.core.units import ureg
>>> calc_kinetic_energy(ureg('2 kg'), ureg('3 m/s')).check('[energy]')
Truecalc_passive_compliance_stiffness_bound
physics.robotics.actuation.calc_passive_compliance_stiffness_bound(
force_limit,
tripwire_force,
detection_speed,
response_latency,
arm_deceleration,
)Largest series stiffness that keeps a driven contact under a force limit after the tripwire.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| force_limit | Quantity | Force ceiling in N. | required |
| tripwire_force | Quantity | Force at tripwire detection in N. | required |
| detection_speed | Quantity | Positive contact approach speed in m/s. | required |
| response_latency | Quantity | Nonnegative delay before braking in s. | required |
| arm_deceleration | Quantity | Positive constant braking deceleration in m/s^2. | required |
Returns
| Name | Type | Description |
|---|---|---|
| tuple of Quantity | Stiffness bound in N/m and driven stroke in mm; nonpositive stiffness indicates no positive force headroom. |
Notes
Equation:
After the tripwire the arm keeps driving for the response latency, then stops at arm_deceleration; the stroke it drives is s = v t_r + v^2 / (2 a), and the force rises by k s on top of the tripwire force: F_trip + k s <= F_limit <=> k <= (F_limit - F_trip) / (v t_r + v^2 / (2 a))
Returns (stiffness bound, driven stroke). Added 2026-10-20.
Assumptions: The arm keeps a positive speed during a nonnegative delay, then brakes at positive constant deceleration; a usable bound requires force_limit greater than tripwire_force.
Excludes: Jerk ramps, damping, controller tracking error, and certification. The implementation returns a nonpositive stiffness when no force headroom remains.
References
Derivation: Add latency travel and constant-deceleration braking travel, then divide force headroom by that stroke.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_passive_compliance_stiffness_bound
>>> from mlsysim.core.units import ureg
>>> calc_passive_compliance_stiffness_bound(ureg('10 N'), ureg('1 N'), ureg('1 m/s'), ureg('1 s'), ureg('1 m/s**2'))[0].check('[force]/[length]')
Truecalc_quasistatic_spill_acceleration
physics.robotics.actuation.calc_quasistatic_spill_acceleration(
inner_radius,
freeboard,
gravity=None,
)Calculate the steady-tilt acceleration ceiling for an open vessel.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| inner_radius | Quantity | Positive vessel inner radius in m. | required |
| freeboard | Quantity | Positive liquid-to-rim height in m. | required |
| gravity | Quantity | Positive gravitational acceleration in m/s^2; None uses standard gravity. | None |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Steady-tilt acceleration ceiling in m/s^2. |
Notes
Equation: tan(theta) = a / g ; wall rise = R a / g ; a_max = g h_f / R
Under steady acceleration the free surface settles perpendicular to the effective gravity. Sloshing overshoots this steady tilt, so the bound is necessary, not sufficient.
Assumptions: A positive-radius open vessel has positive freeboard and reaches a steady free- surface tilt under positive gravity.
Excludes: Transient slosh, viscosity, vessel shape details, and a sufficient no-spill guarantee.
References
Hydrostatics of a uniformly accelerated liquid gives a free surface normal to effective gravity. Container slosh is discussed by Mayer and Krechetnikov 2012, “Walking with coffee: why does it spill?”, Phys. Rev. E 85, 046117.
Derivation: The free surface is perpendicular to effective gravity, so wall rise R a/g reaches freeboard h at a = g h/R.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_quasistatic_spill_acceleration
>>> from mlsysim.core.units import ureg
>>> calc_quasistatic_spill_acceleration(ureg('1 m'), ureg('1 m'), ureg('1 m/s**2')) == ureg('1 m/s**2')
Truecalc_quintic_blend_duration
physics.robotics.actuation.calc_quintic_blend_duration(
delta_torque,
max_allowable_jerk,
)Compute minimum blend duration for quintic polynomial trajectory to bound torque jerk.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| delta_torque | Quantity | Signed torque change in N m; the magnitude sets duration. | required |
| max_allowable_jerk | Quantity | Positive torque-rate ceiling in N m/s, not angular jerk. | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Required smoothstep duration in ms. |
Notes
Equation: tau_blend >= (1.875 * |Delta_tau|) / jerk_max
Assumptions: The torque command follows a fixed-endpoint quintic smoothstep; the positive rate limit is a torque rate, despite the legacy jerk parameter name.
Excludes: Mechanical angular jerk, actuator tracking error, and time optimality among other trajectory families.
References
Derivation: The peak derivative of 10 s cubed - 15 s fourth + 6 s fifth is 1.875; divide peak scaled torque slope by the allowed torque rate.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_quintic_blend_duration
>>> from mlsysim.core.units import ureg
>>> calc_quintic_blend_duration(ureg('0 N*m'), ureg('1 N*m/s')) == ureg('0 ms')
Truecalc_reduced_mass
physics.robotics.actuation.calc_reduced_mass(mass_a, mass_b)Calculate the two-body reduced mass of a collision.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| mass_a | Quantity | Positive first-body mass in kg. | required |
| mass_b | Quantity | Positive second-body mass in kg. | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Reduced mass in kg. |
Notes
Equation: mu = (1/m_a + 1/m_b)^-1
When one body cannot recoil (m_b -> infinity, a clamped contact), mu -> m_a.
Assumptions: Both masses are positive and free to recoil in a one-dimensional two-body collision.
Excludes: Rotational inertia coupling, constraints, and contact compliance.
References
ISO/TS 15066:2016 Annex A, transient-contact model (content carried into ISO 10218-2:2025), as reproduced in Kirschner et al. 2022, eq. 2 (arXiv:2203.02706).
Derivation: In the relative coordinate, inverse effective mass is the sum of the two inverse masses.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_reduced_mass
>>> from mlsysim.core.units import ureg
>>> calc_reduced_mass(ureg('2 kg'), ureg('2 kg')) == ureg('1 kg')
Truecalc_reflected_inertia
physics.robotics.actuation.calc_reflected_inertia(gear_ratio, rotor_inertia)Calculate reflected rotor inertia felt at the actuator output shaft.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| gear_ratio | float | Transmission reduction ratio N (>= 1.0). | required |
| rotor_inertia | Quantity | Unloaded rotor moment of inertia (e.g. kg * m^2). | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Reflected inertia in kg * m^2. |
Notes
Equation: J_reflected = N^2 * J_rotor
Assumptions: The ideal gear reduction has ratio at least one and a rigid rotor.
Excludes: Gear compliance, efficiency losses, and load inertia.
References
Lynch and Park, Modern Robotics, Cambridge University Press, 2017, Sec. 8.9.2 (“Apparent Inertia”), where G^2 * I_rotor is the rotor’s apparent (often called reflected) inertia for gear ratio G.
Derivation: Equate rotor kinetic energy to output-shaft kinetic energy with rotor speed N times output speed.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_reflected_inertia
>>> from mlsysim.core.units import ureg
>>> calc_reflected_inertia(2, ureg('1 kg*m**2')) == 4 * ureg('1 kg*m**2')
Truecalc_seam_acceleration_torque_jump
physics.robotics.actuation.calc_seam_acceleration_torque_jump(
gear_ratio,
rotor_inertia,
delta_accel,
)Calculate the impulsive torque spike at an actuator seam transition.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| gear_ratio | float | Transmission reduction ratio N (>= 1.0). | required |
| rotor_inertia | Quantity | Unloaded rotor moment of inertia (e.g. kg * m^2). | required |
| delta_accel | Quantity | Discontinuous acceleration step across the seam (e.g. rad / s^2). | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Peak reaction torque spike in Newton-meters. |
Notes
When an unblended trajectory transition injects an acceleration discontinuity delta_accel across a discrete boundary, the transmission’s reflected rotor inertia amplifies the required inertial reaction torque at the output joint.
Equation: tau_spike = J_reflected * delta_accel = (N^2 * J_rotor) * delta_accel
Assumptions: A positive rotor inertia is reflected through an ideal reduction; the acceleration jump is nonnegative.
Excludes: Link/load inertia, friction, gear compliance, and finite controller response.
References
The torque relation tau = I * alpha (OpenStax, University Physics Volume 1, Sec. 10.7, Eq. 10.25) applied to the rotor’s apparent (reflected) inertia G^2 * I_rotor (Lynch and Park, Modern Robotics, Cambridge University Press, 2017, Sec. 8.9.2). Link inertia, load, friction, and gear compliance are omitted, so this is the reflected-rotor share of the spike; treating the seam as an instantaneous acceleration step is a modeling assumption.
Derivation: Multiply the gear-reflected inertia N squared J by the acceleration jump.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_seam_acceleration_torque_jump
>>> from mlsysim.core.units import ureg
>>> calc_seam_acceleration_torque_jump(2, ureg('1 kg*m**2'), ureg('1 rad/s**2')).check('[force]*[length]')
Truecalc_smoothstep_blend_window
physics.robotics.actuation.calc_smoothstep_blend_window(change, rate_limit)Shortest window of a fixed-endpoint quintic smoothstep whose peak rate stays at a limit.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| change | Quantity | Signed command change; its units must match rate_limit times seconds. | required |
| rate_limit | Quantity | Positive allowed command rate in change-units per second. | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Window in seconds. |
Notes
Equation: T >= 1.875 |Delta u| / rate_max
The smoothstep alpha(s) = 10 s^3 - 15 s^4 + 6 s^5 has peak slope d alpha / ds = 30/16 = 1.875 at s = 1/2, so a change Delta u spread over T peaks at 1.875 Delta u / T. Unit-generic form of calc_quintic_blend_duration: an acceleration change against a jerk bound, or a torque change against a torque-rate ceiling (added 2026-10-20).
Assumptions: The change has units compatible with a positive rate limit times time; a quintic fixed-endpoint smoothstep is used.
Excludes: Tracking error, other profile shapes, and dynamic feasibility beyond the rate ceiling.
References
Derivation: The quintic smoothstep peak slope is 1.875; scaling by absolute change and dividing by rate gives the required window.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_smoothstep_blend_window
>>> from mlsysim.core.units import ureg
>>> calc_smoothstep_blend_window(ureg('0 m/s**2'), ureg('1 m/s**3')) == ureg('0 s')
Truecalc_transient_contact_speed_limit
physics.robotics.actuation.calc_transient_contact_speed_limit(
force_limit,
effective_mass,
contact_stiffness,
human_mass=None,
)Calculate the highest contact speed whose transient peak force stays at a force limit.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| force_limit | Quantity | Force ceiling in N. | required |
| effective_mass | Quantity | Positive robot-side effective mass in kg. | required |
| contact_stiffness | Quantity | Positive linear contact stiffness in N/m. | required |
| human_mass | Quantity | Positive recoiling-body mass in kg; None uses the robot mass alone. | None |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Modeled contact-speed ceiling in m/s. |
Notes
Equation: v_max = F_max / sqrt(k * m)
The inverse of calc_transient_impact_force: human_mass=None gives the clamped case (m = m_eff); a human_mass gives the free, recoiling case (m = mu, the two-body reduced mass).
Assumptions: Positive force limit, effective mass, and linear stiffness describe the same elastic model as calc_transient_impact_force.
Excludes: Damping, control response, biological variability, and certification of a safe operating speed.
References
ISO/TS 15066:2016 Annex A (carried into ISO 10218-2:2025), as used for v_rel,max in Kirschner et al. 2022 (arXiv:2203.02706).
Derivation: Solve the elastic energy equation F = v sqrt(k m) for v.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_transient_contact_speed_limit
>>> from mlsysim.core.units import ureg
>>> calc_transient_contact_speed_limit(ureg('1 N'), ureg('1 kg'), ureg('1 N/m')) == ureg('1 m/s')
Truecalc_transient_impact_force
physics.robotics.actuation.calc_transient_impact_force(
contact_velocity,
effective_mass,
contact_stiffness,
human_mass=None,
)Calculate peak unbraked transient impact force on an elastic body.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| contact_velocity | Quantity | Positive relative approach speed in m/s. | required |
| effective_mass | Quantity | Positive robot-side effective mass in kg. | required |
| contact_stiffness | Quantity | Positive linear contact stiffness in N/m. | required |
| human_mass | Quantity | Positive recoiling-body mass in kg; None uses the robot mass alone. | None |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Modeled peak elastic force in N. |
Notes
Equation: F_peak = v * sqrt(k * m)
With human_mass=None the robot-side effective_mass acts alone (m = m_eff), the clamped (quasi-static) case in which the body part cannot recoil. With human_mass given, the free body part recoils and the two-body reduced mass acts: m = mu = (1/m_eff + 1/m_H)^-1.
Assumptions: A positive approach speed loads a positive linear stiffness without braking; optional human mass gives free recoil, otherwise the contacted body is clamped.
Excludes: Damping, geometry-dependent stiffness, active control, injury prediction, and safety certification.
References
ISO/TS 15066:2016 Annex A energy model F = v * sqrt(mu * k) (content carried into ISO 10218-2:2025), as reproduced in Kirschner et al. 2022, eqs. 1-2 (arXiv:2203.02706).
Derivation: Equate relative kinetic energy m v squared/2 with spring energy F squared/(2 k).
Examples
>>> from mlsysim.physics.robotics.actuation import calc_transient_impact_force
>>> from mlsysim.core.units import ureg
>>> calc_transient_impact_force(ureg('1 m/s'), ureg('1 kg'), ureg('1 N/m')) == ureg('1 N')
Truecalc_tripwire_contact_force_accumulation
physics.robotics.actuation.calc_tripwire_contact_force_accumulation(
tripwire_force,
contact_stiffness,
penetration_velocity,
loop_latency,
)Calculate contact force at brake-command onset after a tripwire breach.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| tripwire_force | Quantity | Force at tripwire detection in N. | required |
| contact_stiffness | Quantity | Positive linear contact stiffness in N/m. | required |
| penetration_velocity | Quantity | Positive continued penetration speed in m/s. | required |
| loop_latency | Quantity | Positive response delay in s. | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Contact force at brake-command onset in N. |
Notes
Equation: F_lat = F_trip + k * v * t_lat
Assumptions: Positive speed remains constant during a positive loop delay after a positive tripwire threshold; stiffness is linear and positive.
Excludes: Braking travel after command onset, damping, and contact safety certification.
References
Derivation: Add the spring-force increment k times additional penetration v t to the tripwire force.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_tripwire_contact_force_accumulation
>>> from mlsysim.core.units import ureg
>>> calc_tripwire_contact_force_accumulation(ureg('1 N'), ureg('1 N/m'), ureg('1 m/s'), ureg('1 s')) == ureg('2 N')
Truecalc_voltage_droop
physics.robotics.actuation.calc_voltage_droop(current, internal_resistance)Calculate DC bus voltage droop across internal battery and cable resistance.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| current | Quantity | Total instantaneous draw current across actuators and compute (e.g. Amperes). | required |
| internal_resistance | Quantity | Combined battery internal DC resistance and harness resistance (e.g. Ohms). | required |
Returns
| Name | Type | Description |
|---|---|---|
| Quantity | Voltage droop in Volts. |
Notes
Equation: Delta_V = I * R_internal
Assumptions: Current is nonnegative and a positive lumped DC resistance describes the path.
Excludes: Inductance, capacitance, and frequency-dependent impedance.
References
Ohm’s law, V = I * R (OpenStax, University Physics Volume 2, Sec. 9.3).
Derivation: Ohm’s law applied to the series resistance gives I R.
Examples
>>> from mlsysim.physics.robotics.actuation import calc_voltage_droop
>>> from mlsysim.core.units import ureg
>>> calc_voltage_droop(ureg('2 A'), ureg('1 ohm')) == ureg('2 V')
True