Rishabh Singh Kushwaha リシャブ

Backend engineer who takes
a system end to end.

The algorithm, the API around it, and the measurement harness that proves it works. Below is a real one, assembling itself as you scroll.

01 · SIH 2026 · SIH26037 · MathWorks · Robotics and Drones

SARATHI

サラティ

Adaptive path planning for unstructured Indian roads.

  • Python
  • NumPy
  • SciPy
  • WebSockets
  • HTML5 Canvas
  • pytest
  • Playwright
  • uv
Mean route progress
43.3%

against a lane-following baseline's 36.2%

Scenarios ahead
8 / 10

same seeds, same sensor noise

Median p95 replan
46 ms

inside the 50 ms that 20 Hz allows

Tests
155

including behavioural regressions

The idea

Every production autonomous-driving stack assumes a lane. Indian roads do not have lanes. They have a negotiated, continuously deforming free space shared by buses, auto-rickshaws, two-wheelers filtering through 60 cm gaps, pushcarts, pedestrians crossing wherever they like, and cattle.

So the two primitives that break down there were replaced rather than patched. Because it never needed lane markings in the first place, it degrades gracefully when they are faded, absent, or simply wrong — there is no branch anywhere in the code for “markings missing”.

The diagnosis

The planner would not pull away from a stopped obstruction. The reflex is to reach for the thresholds, and there are 31 of them to reach for.

Instead I counted what the lattice was throwing away. Of 131 candidate trajectories, 1 was usable. That is not a threshold problem — a threshold problem does not leave you with one survivor out of a hundred and thirty-one. It is a sampling problem: candidates were being generated outside the reachable set and then discarded, correctly, for being infeasible. The planner was doing the right thing with the wrong material.

Sampling inside the reachable set, and re-parameterising the lateral profile by distance travelled rather than by time, took the usable fan from 1 to somewhere between 35 and 50. No threshold moved.

The evidence

Every number here comes out of scripts/benchmark.py — ten scenarios, three seeds, two controllers, identical seeds and identical sensor noise for both. The baseline is a fair comparison rather than a straw man: it sees the same sensors and the same noise, and it mostly fails by stopping rather than by crashing, which is exactly why the contact counts are close while the progress numbers are not.

Both presentation decks read that same JSON and refuse to build without it, so a figure on a slide cannot drift away from what the code actually does.

A conventional stack usesThis uses instead
Lane centreline as the planning frameA drivable corridor — a dynamic program over the free space ahead, re-solved every tick
Binary occupancy gridA continuous risk field — class-conditioned, harm-weighted, indexed by time
One predicted trajectory per agentMulti-modal intent — cut in, filter, dart, ride the wrong way — with covariance that grows
Obstacles are wallsPotholes are traversable cost; the verge is drivable
A lane-change state machineEight behaviours, wrong-way evasion included
Ten scenarios × three seeds × two controllers, on identical seeds and identical sensor noise. Sorted by margin, so the two losses sit at the bottom.
SARATHILane-following baselineAhead on 8 of 10 · mean 43.3% against 36.2%
Scenario0204060OursBaseΔCleanp95
School zone61.927.3+34.63/347
Village road47.630.4+17.22/347
Dense market22.113.0+9.13/372
Highway merge40.333.0+7.33/339
Unsignalled junction48.341.0+7.31/356
Construction diversion27.421.6+5.83/346
Cattle crossing49.846.7+3.13/345
Narrow bridge, oncoming61.261.1+0.13/337
Bus stop overtake34.636.8−2.23/338
Night, wrong-way rider40.251.6−11.41/337

Ours and Base are mean route progress, in percent. Clean counts how many of three runs finished without contact. p95 is the 95th-percentile replan latency in milliseconds; 50 ms is the budget 20 Hz allows.

What it does not do

  • It is not yet safer than the baseline by raw contact count — 25 of 30 runs finish clean against the baseline's 27. Three of those five contacts happened with the vehicle stationary and another road user driving into it, which is a different failure from one we drove into, so every contact is recorded with our own speed and the bearing of the other body.
  • The dense market peaks at 72 ms and is the one place the 50 ms replan budget is exceeded.
  • The vehicle is over-cautious in dense traffic, and two scenarios account for four of the five contacts.
  • Prediction priors are hand-built rather than fitted to data.

02 · The board

What I reach for

I came to this from physics, which is a useful place to start: you are trained to distrust a result you cannot reproduce, and to write down the conditions under which it was measured. Most of what follows is in service of that.

Languages
  • Python
  • TypeScript
  • JavaScript
  • SQL
Backend & real-time
  • Node.js
  • WebSockets
  • REST API design
Databases
  • PostgreSQL
  • Supabase
Frontend
  • Next.js
  • React
  • HTML5 Canvas
AI integration
  • Claude API
  • Groq · Llama 70B
  • LLM application design
Tooling & testing
  • AWS
  • Docker
  • Git
  • uv
  • pytest
  • Playwright

03 · Writing

Not yet

There is a queue: how counting rejected candidates beats tuning thresholds, why a serverless runtime cannot host a 20 Hz simulation, and what a substring match costs when the string is a diagnosis. When the first one is written it appears here.