Autonomous Vessel Navigation · COLREGs Benchmark

vesselnav-bench v1

A transparent, reproducible benchmark where rule-based, optimization and learning agents navigate the same seas under the same collision-avoidance rules — every number backed by a replayable episode log.

7agents9scenarios360seeded episodes
View the leaderboard

← VesselNav-Bench v2 (current)

Seeded navigation suite for comparing autonomous-vessel navigation policies under identical physics, scenarios, and scoring: canonical COLREGs encounters, coastal planning, and randomized worlds, in calm and disturbed (current + wind gust) conditions.

generated 2026-06-14T12:51:09 9 scenarios × 20 seeded episodes × 2 conditions config hash per condition (physics fingerprint, not a seed): calm: 1baf1e352220ed61disturbed: 9571b64e338c5753

Benchmark score = 100 × (0.6 × success rate + 0.25 × COLREGs compliance + 0.15 × path efficiency). Rates carry Wilson 95% CIs, means carry seeded bootstrap 95% CIs; all metrics are computed from ground-truth episode logs. Scores are comparable only between runs with identical config hashes.

The agents

classicalrule-based (layered)

by V. Ravendranathan (VesselNav-Bench baseline)

A* plans the route, ILOS guidance tracks it, and a predictive COLREGs-inspired avoider overrides the helm when rollouts with the real vessel dynamics predict a conflict on the route.

classical-legacyrule-based (layered, original avoider)

by V. Ravendranathan (VesselNav-Bench baseline)

Ablation of the classical pipeline: same A* route and ILOS guidance, but collision avoidance uses the project's original commitment-based avoider, which lacks route-aware rollouts and reduced-speed escape maneuvers. Kept to quantify how much the avoidance layer contributes.

mpcoptimization (model predictive control)

by V. Ravendranathan (VesselNav-Bench baseline)

Solves a local optimal-control problem each second: candidate maneuver plans are rolled out with the real dynamics and scored by one cost combining progress, separation, effort, and a COLREGs prior.

rl_ppolearning (deep reinforcement learning)

by V. Ravendranathan (VesselNav-Bench baseline)

PPO policy over a labeled 35-feature observation (goal vector, own dynamics, land lidar, nearest traffic); each decision logs the full action probability distribution and value estimate.

rl_ppo_shieldedhybrid (learning + runtime safety filter)

by V. Ravendranathan (VesselNav-Bench baseline)

The PPO policy proposes; a classical predictive filter vets every proposal with real-dynamics rollouts and substitutes the nearest safe course when needed. Every intervention is logged.

velocity-obstaclesreactive (velocity space)

by Fiorini & Shiller (1998); reference implementation

Picks the velocity closest to the preferred course that lies outside every obstacle's collision cone (starboard-preferring, A* route reference).

potential-fieldsreactive (force field)

by Khatib (1986); reference implementation

Steers along the resultant of an attractive force toward the route and repulsive forces from traffic and land. Historically foundational; known to suffer local minima and oscillation.

What is being tested

All agents steer the same own-ship model: a 3-DOF surge–sway–yaw maneuvering model (first-order Nomoto yaw response, sideslip toward −k·u·r, turn-induced speed loss, first-order surge), an IMO-standard rudder actuator (35° limit, 70°-in-11-s slew rate), and a course-over-ground PD autopilot. Disturbed episodes add a scenario-seeded water current (drifting the traffic too) and wind gusts. Agents command intent (desired course and speed); the physics decides what the hull does.

Scenario COLREGs ruleSituation
open_waterNo obstaclesPure route following, no rule applies
head_onRule 14 — head-onReciprocal courses; both vessels must alter to starboard and pass port-to-port
crossing_starboardRule 15/16 — give-wayTraffic crosses from starboard; own ship must take early, substantial action to keep clear
crossing_portRule 17 — stand-onTraffic crosses from port; own ship should hold course while it remains safe
overtakingRule 13 — overtakingSlow vessel ahead on the same course; overtaking vessel keeps clear, either side
coastalMixedLandmasses forming a channel plus two traffic vessels; planning and avoidance together
multi_vesselRules 14+15 combinedTwo simultaneous conflicts timed to overlap, plus a third vessel passing by
narrow_channelRule 14 in a fairway (Rule 9 flavor)Oncoming vessel inside a narrow channel; limited sea room on both sides
randomMixedSeeded random islands and wandering traffic

Each scenario runs 20 seeded episodes per condition; calm has no disturbances, disturbed adds a scenario-seeded random current (up to 0.3 cells/s) and wind gusts. Every agent faces the identical episodes.

Podium — Overall

Ranked by the unweighted mean benchmark score across all 2 conditions (each carries the same episode count), so all-round competence wins.

2
classical
96.3
overall score
99% mean success · 2 conditions
1
mpc
96.7
overall score
99% mean success · 2 conditions
3
velocity-obstacles
93.8
overall score
99% mean success · 2 conditions

Condition: calm

Baseline physics — no current, wind, sea state or perception noise. Isolates pure navigation and COLREGs skill and anchors every robustness comparison.

#AgentScoreSuccess CollisionGroundingCOLREGs Time to goal (s)Min separation
1 classical V. Ravendranathan (VesselNav-Bench baseline) 97.9 100.0% [97.9%, 100.0%] 0.0% [0.0%, 2.1%] 0.0% [0.0%, 2.1%] 0.95 (n=148) 63.2 [59.9, 66.7] 13.34 [12.27, 14.56]
2 mpc V. Ravendranathan (VesselNav-Bench baseline) 97.0 99.4% [96.9%, 99.9%] 0.0% [0.0%, 2.1%] 0.0% [0.0%, 2.1%] 0.93 (n=193) 46.6 [44.6, 48.7] 13.39 [12.24, 14.75]
3 velocity-obstacles Fiorini & Shiller (1998); reference implementation 93.9 99.4% [96.9%, 99.9%] 0.0% [0.0%, 2.1%] 0.0% [0.0%, 2.1%] 0.82 (n=188) 55.5 [52.9, 58.1] 13.32 [12.22, 14.55]
4 classical-legacy V. Ravendranathan (VesselNav-Bench baseline) 88.1 87.8% [82.2%, 91.8%] 0.0% [0.0%, 2.1%] 12.2% [8.2%, 17.8%] 0.84 (n=167) 49.4 [48.1, 51.0] 13.09 [11.90, 14.40]
5 rl_ppo_shielded V. Ravendranathan (VesselNav-Bench baseline) 86.3 88.3% [82.8%, 92.2%] 0.0% [0.0%, 2.1%] 0.0% [0.0%, 2.1%] 0.85 (n=192) 65.8 [60.0, 72.4] 12.37 [11.30, 13.59]
6 rl_ppo V. Ravendranathan (VesselNav-Bench baseline) 83.4 87.8% [82.2%, 91.8%] 0.0% [0.0%, 2.1%] 11.7% [7.8%, 17.2%] 0.63 (n=190) 38.7 [38.0, 39.4] 10.26 [9.01, 11.64]
7 potential-fields Khatib (1986); reference implementation 48.4 44.4% [37.4%, 51.7%] 55.6% [48.3%, 62.6%] 0.0% [0.0%, 2.1%] 0.33 (n=188) 71.9 [61.5, 82.9] 5.28 [3.90, 6.74]
Episode outcomes
classicalgoal: 180/180 (100%)100%mpcgoal: 179/180 (99%)99%out_of_bounds: 1/180 (1%)velocity-obstaclesgoal: 179/180 (99%)99%out_of_bounds: 1/180 (1%)classical-legacygoal: 158/180 (88%)88%grounding: 22/180 (12%)12%rl_ppo_shieldedgoal: 159/180 (88%)88%out_of_bounds: 21/180 (12%)12%rl_ppogoal: 158/180 (88%)88%grounding: 21/180 (12%)12%out_of_bounds: 1/180 (1%)potential-fieldsgoal: 80/180 (44%)44%collision: 100/180 (56%)56%goalcollisiongroundingout of boundstimeout
Safety vs speed trade-off
25%50%75%100%classical: 63.2s, 100% successclassicalmpc: 46.6s, 99% successmpcvelocity-obstacles: 55.5s, 99% successvelocity-obstaclesclassical-legacy: 49.4s, 88% successclassical-legacyrl_ppo_shielded: 65.8s, 88% successrl_ppo_shieldedrl_ppo: 38.7s, 88% successrl_ppopotential-fields: 71.9s, 44% successpotential-fieldsmean time to goal, s (successful episodes) — left and high is bettersuccess rate
Success rate by scenario
classicalmpcvelocity-obstaclesclassical-legacyrl_ppo_shieldedrl_ppopotential-fieldsopen waterclassical · open water: 100% (20 episodes)100%mpc · open water: 100% (20 episodes)100%velocity-obstacles · open water: 100% (20 episodes)100%classical-legacy · open water: 100% (20 episodes)100%rl_ppo_shielded · open water: 100% (20 episodes)100%rl_ppo · open water: 100% (20 episodes)100%potential-fields · open water: 100% (20 episodes)100%head onclassical · head on: 100% (20 episodes)100%mpc · head on: 100% (20 episodes)100%velocity-obstacles · head on: 100% (20 episodes)100%classical-legacy · head on: 100% (20 episodes)100%rl_ppo_shielded · head on: 100% (20 episodes)100%rl_ppo · head on: 100% (20 episodes)100%potential-fields · head on: 0% (20 episodes)0%crossing starboardclassical · crossing starboard: 100% (20 episodes)100%mpc · crossing starboard: 100% (20 episodes)100%velocity-obstacles · crossing starboard: 100% (20 episodes)100%classical-legacy · crossing starboard: 100% (20 episodes)100%rl_ppo_shielded · crossing starboard: 0% (20 episodes)0%rl_ppo · crossing starboard: 100% (20 episodes)100%potential-fields · crossing starboard: 0% (20 episodes)0%crossing portclassical · crossing port: 100% (20 episodes)100%mpc · crossing port: 100% (20 episodes)100%velocity-obstacles · crossing port: 100% (20 episodes)100%classical-legacy · crossing port: 100% (20 episodes)100%rl_ppo_shielded · crossing port: 100% (20 episodes)100%rl_ppo · crossing port: 100% (20 episodes)100%potential-fields · crossing port: 0% (20 episodes)0%overtakingclassical · overtaking: 100% (20 episodes)100%mpc · overtaking: 100% (20 episodes)100%velocity-obstacles · overtaking: 100% (20 episodes)100%classical-legacy · overtaking: 100% (20 episodes)100%rl_ppo_shielded · overtaking: 100% (20 episodes)100%rl_ppo · overtaking: 100% (20 episodes)100%potential-fields · overtaking: 0% (20 episodes)0%coastalclassical · coastal: 100% (20 episodes)100%mpc · coastal: 100% (20 episodes)100%velocity-obstacles · coastal: 100% (20 episodes)100%classical-legacy · coastal: 0% (20 episodes)0%rl_ppo_shielded · coastal: 100% (20 episodes)100%rl_ppo · coastal: 0% (20 episodes)0%potential-fields · coastal: 100% (20 episodes)100%multi vesselclassical · multi vessel: 100% (20 episodes)100%mpc · multi vessel: 100% (20 episodes)100%velocity-obstacles · multi vessel: 100% (20 episodes)100%classical-legacy · multi vessel: 100% (20 episodes)100%rl_ppo_shielded · multi vessel: 100% (20 episodes)100%rl_ppo · multi vessel: 100% (20 episodes)100%potential-fields · multi vessel: 0% (20 episodes)0%narrow channelclassical · narrow channel: 100% (20 episodes)100%mpc · narrow channel: 100% (20 episodes)100%velocity-obstacles · narrow channel: 100% (20 episodes)100%classical-legacy · narrow channel: 100% (20 episodes)100%rl_ppo_shielded · narrow channel: 100% (20 episodes)100%rl_ppo · narrow channel: 100% (20 episodes)100%potential-fields · narrow channel: 100% (20 episodes)100%randomclassical · random: 100% (20 episodes)100%mpc · random: 95% (20 episodes)95%velocity-obstacles · random: 95% (20 episodes)95%classical-legacy · random: 90% (20 episodes)90%rl_ppo_shielded · random: 95% (20 episodes)95%rl_ppo · random: 90% (20 episodes)90%potential-fields · random: 100% (20 episodes)100%0%100% success

COLREGs compliance by encounter type

Agent crossing-portcrossing-starboardhead-on
classical0.76 (n=25)0.99 (n=63)1.00 (n=60)
mpc0.76 (n=50)0.99 (n=83)1.00 (n=60)
velocity-obstacles0.76 (n=45)0.84 (n=83)0.83 (n=60)
classical-legacy0.76 (n=45)0.75 (n=62)1.00 (n=60)
rl_ppo_shielded0.76 (n=66)0.95 (n=66)0.83 (n=60)
rl_ppo0.76 (n=64)0.71 (n=66)0.41 (n=60)
potential-fields0.36 (n=65)0.30 (n=63)0.31 (n=60)

Condition: disturbed

Environmental robustness — scenario-seeded water current (up to 0.3 cells/s) and wind gusts, plus a moderate sea state (Hs ≈ 1.25 m, sea state 3–4) that adds speed loss from added resistance and a first-order yaw oscillation at the wave encounter frequency. Wave direction is drawn per episode.

#AgentScoreSuccess CollisionGroundingCOLREGs Time to goal (s)Min separation
1 mpc V. Ravendranathan (VesselNav-Bench baseline) 96.3 98.3% [95.2%, 99.4%] 0.0% [0.0%, 2.1%] 0.0% [0.0%, 2.1%] 0.92 (n=191) 45.4 [43.3, 47.7] 13.22 [11.96, 14.60]
2 classical V. Ravendranathan (VesselNav-Bench baseline) 94.7 97.2% [93.7%, 98.8%] 1.7% [0.6%, 4.8%] 1.1% [0.3%, 4.0%] 0.90 (n=146) 66.1 [62.1, 70.3] 13.32 [12.19, 14.62]
3 velocity-obstacles Fiorini & Shiller (1998); reference implementation 93.6 98.3% [95.2%, 99.4%] 0.6% [0.1%, 3.1%] 0.0% [0.0%, 2.1%] 0.83 (n=186) 55.0 [52.2, 57.7] 13.09 [11.94, 14.35]
4 rl_ppo_shielded V. Ravendranathan (VesselNav-Bench baseline) 87.9 92.2% [87.4%, 95.3%] 1.1% [0.3%, 4.0%] 0.0% [0.0%, 2.1%] 0.81 (n=192) 63.0 [56.9, 69.5] 12.64 [11.56, 13.88]
5 classical-legacy V. Ravendranathan (VesselNav-Bench baseline) 84.9 83.9% [77.8%, 88.5%] 4.4% [2.3%, 8.5%] 11.1% [7.3%, 16.5%] 0.81 (n=169) 49.3 [47.4, 51.5] 12.58 [11.28, 13.95]
6 rl_ppo V. Ravendranathan (VesselNav-Bench baseline) 83.2 87.2% [81.6%, 91.3%] 0.0% [0.0%, 2.1%] 12.8% [8.7%, 18.4%] 0.64 (n=189) 38.3 [37.7, 39.0] 10.08 [8.88, 11.39]
7 potential-fields Khatib (1986); reference implementation 49.5 46.1% [39.0%, 53.4%] 53.3% [46.1%, 60.5%] 0.0% [0.0%, 2.1%] 0.31 (n=189) 63.3 [54.2, 72.9] 5.56 [4.18, 7.10]
Episode outcomes
mpcgoal: 177/180 (98%)98%out_of_bounds: 3/180 (2%)classicalgoal: 175/180 (97%)97%collision: 3/180 (2%)grounding: 2/180 (1%)velocity-obstaclesgoal: 177/180 (98%)98%collision: 1/180 (1%)out_of_bounds: 2/180 (1%)rl_ppo_shieldedgoal: 166/180 (92%)92%collision: 2/180 (1%)out_of_bounds: 12/180 (7%)classical-legacygoal: 151/180 (84%)84%collision: 8/180 (4%)grounding: 20/180 (11%)11%out_of_bounds: 1/180 (1%)rl_ppogoal: 157/180 (87%)87%grounding: 23/180 (13%)13%potential-fieldsgoal: 83/180 (46%)46%collision: 96/180 (53%)53%timeout: 1/180 (1%)goalcollisiongroundingout of boundstimeout
Safety vs speed trade-off
25%50%75%100%mpc: 45.4s, 98% successmpcclassical: 66.1s, 97% successclassicalvelocity-obstacles: 55.0s, 98% successvelocity-obstaclesrl_ppo_shielded: 63.0s, 92% successrl_ppo_shieldedclassical-legacy: 49.3s, 84% successclassical-legacyrl_ppo: 38.3s, 87% successrl_ppopotential-fields: 63.3s, 46% successpotential-fieldsmean time to goal, s (successful episodes) — left and high is bettersuccess rate
Success rate by scenario
mpcclassicalvelocity-obstaclesrl_ppo_shieldedclassical-legacyrl_ppopotential-fieldsopen watermpc · open water: 100% (20 episodes)100%classical · open water: 100% (20 episodes)100%velocity-obstacles · open water: 100% (20 episodes)100%rl_ppo_shielded · open water: 70% (20 episodes)70%classical-legacy · open water: 100% (20 episodes)100%rl_ppo · open water: 100% (20 episodes)100%potential-fields · open water: 100% (20 episodes)100%head onmpc · head on: 100% (20 episodes)100%classical · head on: 100% (20 episodes)100%velocity-obstacles · head on: 95% (20 episodes)95%rl_ppo_shielded · head on: 100% (20 episodes)100%classical-legacy · head on: 100% (20 episodes)100%rl_ppo · head on: 100% (20 episodes)100%potential-fields · head on: 20% (20 episodes)20%crossing starboardmpc · crossing starboard: 100% (20 episodes)100%classical · crossing starboard: 100% (20 episodes)100%velocity-obstacles · crossing starboard: 100% (20 episodes)100%rl_ppo_shielded · crossing starboard: 90% (20 episodes)90%classical-legacy · crossing starboard: 75% (20 episodes)75%rl_ppo · crossing starboard: 100% (20 episodes)100%potential-fields · crossing starboard: 5% (20 episodes)5%crossing portmpc · crossing port: 100% (20 episodes)100%classical · crossing port: 100% (20 episodes)100%velocity-obstacles · crossing port: 100% (20 episodes)100%rl_ppo_shielded · crossing port: 100% (20 episodes)100%classical-legacy · crossing port: 85% (20 episodes)85%rl_ppo · crossing port: 100% (20 episodes)100%potential-fields · crossing port: 10% (20 episodes)10%overtakingmpc · overtaking: 100% (20 episodes)100%classical · overtaking: 100% (20 episodes)100%velocity-obstacles · overtaking: 100% (20 episodes)100%rl_ppo_shielded · overtaking: 100% (20 episodes)100%classical-legacy · overtaking: 100% (20 episodes)100%rl_ppo · overtaking: 100% (20 episodes)100%potential-fields · overtaking: 25% (20 episodes)25%coastalmpc · coastal: 85% (20 episodes)85%classical · coastal: 100% (20 episodes)100%velocity-obstacles · coastal: 100% (20 episodes)100%rl_ppo_shielded · coastal: 100% (20 episodes)100%classical-legacy · coastal: 5% (20 episodes)5%rl_ppo · coastal: 0% (20 episodes)0%potential-fields · coastal: 70% (20 episodes)70%multi vesselmpc · multi vessel: 100% (20 episodes)100%classical · multi vessel: 100% (20 episodes)100%velocity-obstacles · multi vessel: 100% (20 episodes)100%rl_ppo_shielded · multi vessel: 100% (20 episodes)100%classical-legacy · multi vessel: 100% (20 episodes)100%rl_ppo · multi vessel: 100% (20 episodes)100%potential-fields · multi vessel: 5% (20 episodes)5%narrow channelmpc · narrow channel: 100% (20 episodes)100%classical · narrow channel: 75% (20 episodes)75%velocity-obstacles · narrow channel: 100% (20 episodes)100%rl_ppo_shielded · narrow channel: 75% (20 episodes)75%classical-legacy · narrow channel: 100% (20 episodes)100%rl_ppo · narrow channel: 100% (20 episodes)100%potential-fields · narrow channel: 80% (20 episodes)80%randommpc · random: 100% (20 episodes)100%classical · random: 100% (20 episodes)100%velocity-obstacles · random: 90% (20 episodes)90%rl_ppo_shielded · random: 95% (20 episodes)95%classical-legacy · random: 90% (20 episodes)90%rl_ppo · random: 85% (20 episodes)85%potential-fields · random: 100% (20 episodes)100%0%100% success

COLREGs compliance by encounter type

Agent crossing-portcrossing-starboardhead-on
mpc0.75 (n=50)0.98 (n=81)0.99 (n=60)
classical0.76 (n=25)0.99 (n=61)0.87 (n=60)
velocity-obstacles0.74 (n=43)0.87 (n=83)0.85 (n=60)
rl_ppo_shielded0.76 (n=66)0.91 (n=66)0.76 (n=60)
classical-legacy0.66 (n=45)0.76 (n=64)1.00 (n=60)
rl_ppo0.76 (n=65)0.71 (n=64)0.42 (n=60)
potential-fields0.44 (n=55)0.27 (n=74)0.24 (n=60)

Robustness: calm vs disturbed

How much does each model lose (or gain) when conditions get harder? Solid = calm (baseline), hollow = disturbed; the printed delta is the success-rate change vs baseline.

Success rate by condition
25%50%75%100%classicalcalm: 100%disturbed: 97%dist -3%mpccalm: 99%disturbed: 98%dist -1%velocity-obstaclescalm: 99%disturbed: 98%dist -1%classical-legacycalm: 88%disturbed: 84%dist -4%rl_ppo_shieldedcalm: 88%disturbed: 92%dist +4%rl_ppocalm: 88%disturbed: 87%dist -1%potential-fieldscalm: 44%disturbed: 46%dist +2%calm (baseline, solid)disturbed (hollow)

Submit your model

Implement the Agent contract (reset(obs) / decide(obs) → Decision) and run:

python main.py benchmark --suite benchmarks/v1.yaml \
    --agent your_package.your_module:YourAgent

See the repository and docs/SUBMITTING.md. Every leaderboard number is backed by a replayable per-step episode log.