Safety Metrics

Use safety metrics for collision, separation, lane-boundary, drivable-area, and time-to-collision checks in navigation and driving-style evaluation.

Reference

Hayward, Time-to-collision, 1972; Gottschalk et al., OBBTree, SIGGRAPH 1996; Caesar et al., nuScenes, CVPR 2020.

Quick Example

import numpy as np
from robometrics import AgentState, collision_rate, collision_rate_obb, min_distance_to_actors, time_to_collision

ego = np.array([[0.0, 0.0], [1.0, 0.0]])
actors = [np.array([[10.0, 0.0], [1.4, 0.0]])]
print(collision_rate(ego, actors, ego_radius=0.5, actor_radius=0.5))
print(min_distance_to_actors(ego, actors))

ego_state = AgentState(x=0.0, y=0.0, vx=2.0, vy=0.0, radius=0.5)
actor_state = AgentState(x=8.0, y=0.0, vx=0.0, vy=0.0, radius=0.5)
print(time_to_collision(ego_state, actor_state))

ego_dims = np.array([4.5, 2.0])
ego_yaws = np.array([0.0, 0.0])
actor_dims = [np.array([4.5, 2.0])]
actor_yaws = [np.array([0.0, 0.0])]
print(collision_rate_obb(ego, ego_dims, ego_yaws, actors, actor_dims, actor_yaws))

Metrics

collision_rate(ego_traj, actor_trajs, ego_radius, actor_radius) -> float

Formula: mean over actor-covered timesteps of any disc overlap. Reference: Standard disc-overlap collision metric for robotics simulation Unit: ratio Direction: lower is better

Disc collision rate is a fast conservative check for round or buffered agents.

collision_rate_obb(ego_traj, ego_dims, ego_yaws, actor_trajs, actor_dims, actor_yaws) -> float

Formula: mean over actor-covered timesteps of any SAT OBB overlap. Reference: Gottschalk et al., OBBTree, SIGGRAPH 1996 Unit: ratio Direction: lower is better

OBB collision rate handles oriented rectangular footprints for vehicles and mobile robots.

time_to_collision(ego_state, actor_state) -> float

Formula: smallest nonnegative root of the relative-motion disc collision quadratic. Reference: Hayward, Time-to-collision, 1972 Unit: seconds Direction: higher is safer

Time to collision estimates imminent risk under constant velocity. It accepts AgentState, dict, flat [x, y, vx, vy, radius] arrays, or trajectory arrays when dt is supplied; trajectory inputs estimate velocity from their first segment.

min_distance_to_actors(ego_traj, actor_trajs) -> float

Formula: minimum time-aligned Euclidean distance from ego to any actor. Reference: Standard minimum Euclidean separation metric Unit: meters Direction: higher is safer

Minimum actor distance reports the closest sampled encounter.

lane_departure_rate(ego_traj, lane_boundary) -> float

Formula: mean of points outside a lane polygon. Reference: Standard lane boundary containment metric Unit: ratio Direction: lower is better

Lane departure rate checks path containment in a provided lane boundary polygon.

offroad_rate(ego_traj, drivable_polygons) -> float

Formula: mean of ego positions outside all drivable-area polygons. Reference: Caesar et al., nuScenes, CVPR 2020 Unit: ratio Direction: lower is better

Offroad rate evaluates whether sampled positions remain in drivable regions.

soft_ttc(ego_traj, actor_trajs, dt) -> float

Formula: minimum constant-velocity TTC computed across rollout timesteps. Reference: Weng et al., nuScenes-Forecast, ECCV 2022 Unit: seconds Direction: higher is safer

Soft TTC summarizes the closest future interaction under local velocity estimates.

recovery_success_rate(opportunities, successes) -> float

Formula: successful recoveries divided by recovery opportunities. Reference: Standard recovery opportunity evaluation Unit: ratio Direction: higher is better

Recovery success rate reports how often a policy recovers when recovery was available. No opportunities returns nan.

failure_severity(failures, aggregation="mean") -> float

Formula: mean or max over numeric severity values or known severity labels. Reference: Standard incident severity aggregation Unit: severity Direction: lower is better

Failure severity summarizes incident impact. Empty failure collections return 0.0.

near_miss_rate(clearances, threshold, collision_mask=None) -> float

Formula: fraction of clearance samples below threshold, excluding collisions by default. Reference: Standard near-miss clearance diagnostic Unit: ratio Direction: lower is better

Near-miss rate separates risky close calls from confirmed collisions.

intervention_free_time(timestamps, interventions, mode="longest") -> float

Formula: longest or mean duration of consecutive non-intervention segments. Reference: Standard autonomy intervention diagnostic Unit: seconds Direction: higher is better

Intervention-free time measures how long a system runs without human or safety intervention.