idm_platoon_simulate — DRIVE traffic op

• Data kinds: any → table

• Call: import fullseye as fs; fs.ledger.idm_platoon_simulate(lead_v_of_t, n_followers: 'int', *, params_per_vehicle, dt: 'float', t_end: 'float', reaction_delay: 'float' = 0.0, seed: 'Optional[int]' = None) -> 'Dict[str, object]' (to call the implementation directly, import drivetraffic; drivetraffic.idm_platoon_simulate(lead_v_of_t, n_followers: 'int', *, params_per_vehicle, dt: 'float', t_end: 'float', reaction_delay: 'float' = 0.0, seed: 'Optional[int]' = None) -> 'Dict[str, object]'; from the registry, opsdrive.get("idm_platoon_simulate"))

Usage

Integrates an IDM platoon of following vehicles behind the leader's speed profile (car 0 = leader, 1..n = following vehicles).

Arguments

• lead_v_of_t: speed of the lead vehicle [m/s]. callable(t) -> v or an array of the same length as the time series.

• params_per_vehicle: a dict per following vehicle (length n), or a single dict shared by all vehicles. Keys v0, T, a, b, s0 (required), delta (default 4), length (used as the vehicle length of the car in front; default 4.5 m, assumed), reaction_delay (if absent, the argument reaction_delay), speed_noise (relative spread 1 + N(0, speed_noise²) multiplied onto the desired speed v0; if > 0, seed is required = deterministic). The lead vehicle's length uses params_per_vehicle of the first entry of length.

• reaction_delay: reaction delay [s]. Rounded to an integer multiple of the step dt (m = round(delay/dt)). Vehicle i at time k decides its acceleration by looking at its own speed, gap and relative speed at time k − m (for t < 0 the initial steady state is assumed to have continued).

Integration (ballistic update): v_{k+1} = max(0, v_k + a_k dt), x_{k+1} = x_k + v_k dt + ½ a_k dt² (in a step where the speed would become negative, it stops at the stopping position x_k − v_k²/(2 a_k)). The lead vehicle's position is the trapezoidal integral of its speed. Initial state: all vehicles run at v_lead(0), and each follower's gap is the equilibrium gap idm_equilibrium_gap at that speed. If a gap becomes 0 or less (rear-end collision), that vehicle is stopped at the contact position (gap 0) and not moved afterwards (speed and acceleration 0; the vehicles in front and behind continue integrating, and for the vehicle behind the stopped vehicle becomes its leader). Vehicles are not overlapped —— integrating while overlapped makes the positions meaningless.

Return dict: t (K,), x, v, a, gap (K, n+1) (gap[:, 0] = inf), params (the per-vehicle parameters actually used, including speed spread), delay_steps (n,), collision (bool), collision_time (first time or None), collisions (list of (時刻, 車番) for rear-end collisions; vehicle index i is the vehicle that hit vehicle i−1 in front), crashed (n+1,) bool.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_driving_traffic — py -3.11 examples/poc_driving_traffic.py

Ops the type connects to (they accept table as input)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

Same category (traffic)

idm_accel · idm_equilibrium_gap · driver_style · lateral_wobble · ou_estimate · social_force_step · pedestrian_crossing · occlusion_reveal_distance


*Provenance: drivetraffic.py — DRIVE operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.