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