Source code for suboptimumg.log_analysis.drivetrain
import numpy as np
from perda.core_data_structures.data_instance import (
DataInstance,
left_join_data_instances,
)
from perda.core_data_structures.single_run_data import SingleRunData
from .kinematics import GROUND_SPEED
REAR_SLIP_RATIO = "rear.slipRatio"
[docs]
def add_rear_slip_ratio(
data: SingleRunData,
wheel_speed_col: str = "pcm.moc.motor.wheelSpeed",
low_speed_thresh: float = 1.0,
) -> SingleRunData:
"""Add the rear axle longitudinal slip ratio: ``(v_wheel - v_ground) / v_ground``.
Positive values mean driven wheels spinning faster than ground speed (traction loss).
Requires ``add_groundspeed`` and the ``correct_motor_data`` preprocessing step.
Stores ``rear.slipRatio``.
Parameters
----------
low_speed_thresh : float
Ground speed (m/s) below which slip ratio is forced to zero.
"""
missing = [c for c in (GROUND_SPEED,) if c not in data]
if missing:
raise KeyError(
f"add_rear_slip_ratio: missing variables(s) {missing}.\n"
f"Try running add_groundspeed first."
)
ws = data[wheel_speed_col]
ws, gs_aln = left_join_data_instances(ws, [data[GROUND_SPEED]])
vg = gs_aln.value_np
slip = np.zeros_like(vg, dtype=np.float64)
mask = np.abs(vg) > low_speed_thresh
slip[mask] = (ws.value_np[mask] - vg[mask]) / vg[mask]
data[REAR_SLIP_RATIO] = DataInstance(
timestamp_np=ws.timestamp_np,
value_np=slip,
label="Rear Slip Ratio",
cpp_name=REAR_SLIP_RATIO,
)
return data