~/satyajit

METEOR: an agent-built driving network that perceives a lot and plans a little

mdjsonmcp

2026-11-12 · 27 min · robotics · computer-vision · 3d · agentic-coding · tensorrt · benchmarks

A 4:43 narrated explainer, drawn in code. Every number and picture in it is this article's own; the sources are below.

› transcript

A driving model its README says an agent wrote, trained on labels no human drew. What does it see, and how does it pick a path? Hi, I'm Aldous! Meteor is a driving network from Tier Four. Let's follow eight camera images to a planned path. Chapter one. Two ways to drive. The classic stack is a chain of modules. Each arrow is a message a human designed, and anything not in it is lost. Meteor is one network: cameras and speed in, a path out. But it keeps depth, boxes and lanes as outputs you can inspect. The video from the post. Eight cameras with predicted segmentation and boxes, and predicted depth for every view. On the right, the bird's-eye map: road, lanes, other cars and the planned path. All from one forward pass. Chapter two. Cameras into a grid. Lay a flat grid on the ground around the car. Meteor's is eight hundred by five hundred cells. Here, a toy. One pixel's ray crosses many cells, so plain projection smears a parked car down the road behind it. So the network also predicts depth: for every pixel, a probability over sixty-four distance bins. Here it peaks at the car. Each cell takes the feature weighted by that probability, plus a small floor. Only the car's cell keeps it. A side camera agrees. The grid stores the weighted average across all eight cameras, with no learned weights in this step. Every grid point sits at height zero. The lift assumes a flat world. The weight is the probability that the surface lies at this cell's range. Plus a small floor. The project's diagram: one shared ResNet backbone, feeding segmentation, detection and depth heads. Depth and context meet in the lift. Every bird's-eye task is a head on that grid, including the planner. Chapter three. A small planner. Strided convolutions shrink the grid and average it to one vector. An MLP adds the car's speed. Out come three candidate paths, six waypoints over three seconds, each with a confidence. A later attention pool adds a small correction. Three paths, so a fork does not average into the median. The most confident one goes to a guardrail. The guardrail checks it against the network's own boxes, forecasts, traffic light and lanes. A failure vetoes it and stops in lane. Counting the released checkpoint, the planner is about eight percent of the weights. The rest exists to see. Chapter four. Labels and agents. Twelve heads need twelve kinds of ground truth. A pipeline makes it all from recorded drives. The planner's target is where the car actually went next. Lanes come from LiDAR points coloured by segmentation masks, accumulated over the whole drive. A LiDAR box is kept only if a camera confirms it. Bad weather is re-rendered from real scenes, labels intact. No human labels, but not self-supervised either. The factory's output for one scene, every label generated from the recording. Per the README, Claude wrote the code and ran training in rounds, each judged automatically. For two months, a cache bug fed the planner zero history. With real history, trajectories got thirty-three to thirty-eight percent worse. So the release is single-frame. The judge never checked that input was non-zero. Chapter five. Does it hold up? The post said sixteen million parameters. The released checkpoint has fifty-four million. Its comparison, Auto E to E, plans in green over the human's purple path. Both are scored open loop, over footage the plan never changes. Its closed-loop test chains plans over logged images that never react. The deployed model sees one frame at a time. It was trained on one sensor rig, mostly on Japanese roads. And its model card says it must not control a vehicle on public roads. Meteor is a strong open reference: big perception, a small planner, a rule checker. Open-source FSD it is not. Depth decides where features land. The planner is small. And the labels come from machines, not people. Every source is in the full article. I'm Aldous. Bye!

Why read this

Notabletop 60%

How the camera-to-BEV lift and the planner work, the checkpoint counted at 54M against a 16M claim, and what stands between this and 'open-source FSD'.

  • Original analysis
  • A lasting reference
  • A new technique

Robotics & embodiedNeeds a workstation GPUApache-2.0Practitioner model

How this was scored
Is it new?
2 of 3: A real new idea, method or capability
Can I trust it?
2 of 3: Measures key facts from files, code or configs
Can I run it?
2 of 3: Open code or weights with real limits
Will I understand it?
2 of 3: Mechanism from first principles with figures
Can I act on it?
2 of 3: A concrete recipe, numbers or comparison
Will it last?
2 of 3: A reference for a year or more
Does it affect many?
1 of 3: A specialist community
Only here?
2 of 3: A teardown or measurement few others did

Score 67 of 100, ranked 245 of 740 rated articles. Each question is answered 0–3 by hand, and a 3 is rare. How articles are scored

On 12 November Shinpei Kato, who founded TIER IV and started Autoware, posted a short video and a handful of claims about a model called METEOR. In translation: it is an autonomous-driving model designed and implemented by agentic AI; no human code and no human labels were needed; anyone can build one once the spec is fixed; it has 16 million parameters, so it runs on any SoC; and it is, fairly, an open-source FSD. He posted it as a quote of his own post from the day before about AutoE2E, the Autoware community's end-to-end model, "just under 80 million parameters".

Those are five different kinds of claim. Two are about method (agent-written code, machine labels), one is a number, one is about hardware, and one is a comparison with Tesla's product. I cloned tier4/METEOR at commit cc66a93 and autowarefoundation/auto_e2e at bc7e27c, read both, and read the released checkpoints on Hugging Face without executing them. METEOR is a careful piece of engineering with unusually honest documentation. Most of the post holds up. The number doesn't, and the last sentence is a stretch the repository itself declines to make.

The video from the post: METEOR's demo renderer on a city drive, camera-only, with depth, 2D and 3D boxes, segmentation, occupancy, the BEV map and the planned path from one forward pass. Video from @ShinpeiKato's post on X, cut to 12 s, sound removed.

Two ways to get from pixels to a path

A self-driving car has to answer one question many times a second: where should I be over the next few seconds? The classic answer, and the one Autoware is built around, is a modular stack. A localization node matches LiDAR scans against a prebuilt point-cloud map and says where the car is. Perception nodes turn sensor data into a list of objects with boxes, classes and velocities. A prediction node forecasts where each object goes. A planner searches for a trajectory over a lane-level HD map, respecting rules someone wrote down. A controller tracks that trajectory. Each arrow between nodes is a message type that a human designed.

That design is debuggable: when the car brakes for nothing, you open the object list and find the phantom box. Its weakness is the same arrows. An object list drops everything nobody thought to put in it, like a traffic officer's hand signal or a cyclist's lean before a turn, and the planner can only reason about what crosses the interface.

An end-to-end model removes some of those arrows. Cameras go in, a trajectory comes out, and the internal representation is whatever gradient descent finds useful for imitating good drivers. The weakness flips: there is no object list to inspect when it goes wrong, and imitation only teaches the states that human drivers visited, so a model that drifts slightly off a human path is in territory it never saw.

METEOR and AutoE2E sit at different points on that line. The widget lays out what crosses each boundary in the three designs.

METEOR is the more conservative of the two. It is end-to-end in the sense that one network emits the trajectory from pixels, but it keeps almost every intermediate a modular stack would have: depth, segmentation, 3D boxes, occupancy, agent forecasts, traffic-light state. Those are trained outputs, not internal activations, so you can still look at them. AutoE2E's v1.0 keeps far less: a bird's-eye feature grid and an auxiliary segmentation head used only in training, then a GRU that writes acceleration and curvature.

Eight cameras into one grid

METEOR's interface is spelled out in its model card and in meteor_v157.param.yaml. The inputs are eight RGB images at 768 by 432 from TIER IV's Co-MLOps data recording rig (wide, left and right, front and back, plus a narrow telephoto each way), each camera's intrinsics K and its extrinsic transform T_cam_ego, and the current speed v0. That is all. No HD map, no localization, no LiDAR unless you opt in.

Every image goes through the same ResNet-34 with a feature pyramid, producing a 160-channel feature map at a quarter of the input resolution: 108 by 192 per camera. Several heads read that map directly: a 21-class segmentation, a 10-class 2D detector, and a depth decoder that outputs, for each pixel, a probability over 64 depth bins out to 80 m.

The hard part of any camera-only driving model is the next step: putting features from eight perspective images onto one top-down grid. METEOR calls its answer a depth-gated IPM, and docs/ARCHITECTURE.md describes it in four lines. Here it is slower.

Lay a flat grid on the ground around the car: METEOR's output grid is 800 rows by 500 columns at 0.2 m, so 80 m ahead, 80 m behind and 50 m to each side. In the released architecture (DepthSegIPMNetV52) the lift itself runs on a coarser 400 by 250 grid at 0.4 m, four times fewer cells to sample, and the result is bilinearly upsampled to 0.2 m. Each cell has a 3D position x=(x,y,0)\mathbf{x} = (x, y, 0) in the car's frame. For camera cc, project it into the image:

u~c=Kc [Rc∣tc] x,rc=∥x−oc∥\tilde{\mathbf{u}}_c = K_c \, [R_c \mid t_c] \, \mathbf{x}, \qquad r_c = \lVert \mathbf{x} - \mathbf{o}_c \rVert

where uc\mathbf{u}_c is the pixel the cell lands on and rcr_c is the distance from the camera centre oc\mathbf{o}_c to the cell. Sample the context features fc(uc)f_c(\mathbf{u}_c) there (96 channels, bilinear). Then read the depth head's probability at range rcr_c (interpolated between the two nearest bins), and use it as a gate:

wc=Pc(depth=rc∣uc)+0.05,BEV(x)=∑cwc fc(uc)∑cwcw_c = P_c\big(\text{depth} = r_c \mid \mathbf{u}_c\big) + 0.05, \qquad \text{BEV}(\mathbf{x}) = \frac{\sum_c w_c \, f_c(\mathbf{u}_c)}{\sum_c w_c}

The intuition is occlusion. The ray through pixel uc\mathbf{u}_c passes over many ground cells before it hits something. Plain inverse perspective mapping paints the pixel's features onto all of them, which is why IPM images smear a parked car into a long streak across the road behind it. With the gate, a cell gets the pixel's features only where the network believes that pixel's surface actually is at that cell's distance. My reading of the 0.05 floor is that it keeps a gradient flowing where the depth head is confidently wrong. The weighted average across cameras settles which camera wins a cell that several of them see.

There are no learned parameters in this step, which is why the architecture table lists it at 0.02M with the context projection. That has a consequence the repository spells out in docs/REPRODUCE.md: every sample point has z=0z = 0. The lift assumes a flat world. Depth never moves where a feature lands; it only decides which camera's feature counts. By that construction, a steep ramp or a raised kerb is projected as if it were painted on the road.

Block diagram. On the left, inputs: 8 cameras, calibration K/T, speed v0, ego pose and optional inputs. The cameras feed a ResNet-34 + FPN, which fans out to a 2D seg head, 2D det head, depth decoder, traffic-light head and a context 1x1. Depth and context feed a blue 'Depth-gated IPM' box, which produces a RAW BEV. The raw BEV feeds lane segmentation, 3D boxes and occupancy on the right, and also goes through a temporal fuse with a memory queue to a FUSED BEV, which feeds the E2E head with K=3 paths, agent forecasting and a risk field.
METEOR's architecture as the repository draws it. Geometry heads read the single-frame BEV and motion heads read the temporally fused one; the banner's latencies are from an earlier engine than the released v157 (tier4/METEOR README, docs/media/architecture.png).

The fused BEV in the diagram, a memory of three past frames warped by ego motion, is baked out of the release. More on why below.

The planner is a small head on a big perception model

Once the bird's-eye grid exists, every BEV task is a convolutional head on it. Lanes are a 9-class segmentation at full 0.2 m resolution. 3D boxes are CenterPoint-style heatmaps and regressions at 0.4 m. Occupancy is a crop of the grid to 40 m either way, lifted to 16 height bins. The E2E planner is one more head.

From bevlane/model.py: a pyramid of strided convolutions takes the 96-channel BEV down by 32x, from 800 by 500 to 25 by 16, and averages it to one vector; the speed is concatenated; an MLP emits 42 numbers. Later rounds added two branches whose last layers start at zero, so they began as no-ops: an attention pool with three learned queries over the BEV, and a small path that reads the lane-segmentation and box heatmaps instead of raw features, added because the global mean of raw BEV features collapsed under INT8. Those are three candidate paths of six waypoints each at 0.5 s spacing (a 3 s horizon), three confidences, and steering, acceleration and a brake logit. The released ONNX exports exactly that as its ego tensor, [1, 42].

Three hypotheses instead of one is the standard fix for averaging. At a fork, half the training data turns left and half goes straight; a single regression head learns to drive into the median. With K=3K = 3 heads trained winner-take-all, one can learn the turn and another the straight. A later round bound the three modes to an optional driving command (straight, left, right) by adding a fixed logit to the commanded mode, so a route planner can pick between them. The released export drops that input (--no-intent), so at deployment the network picks its own mode.

Diagram titled E2E planning stack (v36-v39) plus deterministic guardrails (C7). Fused BEV, v0 plus kinematic history, and an intent input feed a B3 attention pool and a decoupled heading-times-speed module, which produce K=3 hypotheses. A v38 selection box scores confidence minus a gate times integrated risk along each path, giving the chosen plan and the output path plus steer, accel and brake. A red arrow from selection goes to a green box: GUARDRAIL (deterministic): spacetime collision, red-light, feasibility, drivable, VETO leads to MRM stop. A footnote says the checker runs on raw-BEV heads, a partially independent input path.
The planning head and its rule-based guardrail. The ADE values in the output box are the repository's own internal validation numbers from a development round, not the released model's (tier4/METEOR README, docs/media/detail_e2e.png).

The part a modular-stack engineer will like is bevlane/guardrail.py. After the network picks a path, a deterministic checker with no learned weights tests it against the network's own other outputs: does the path, stepped at 0.5 s, intersect any detected agent moved along its own forecast to the same time; is there a red light with a stop line in the corridor; is the curvature feasible at this speed under a bicycle model; do the path cells lie on drivable classes in the predicted lane map. If any check fails, it vetoes the plan and substitutes a minimum-risk stop in lane. The docstring calls the arrangement doer/checker, and points out that the geometry heads read the single-frame BEV while the planner read the fused one, so the checker had a partly independent view.

This is where METEOR's choice to keep the intermediate outputs pays. A pure end-to-end model has nothing to check its plan against. METEOR has twelve outputs that can disagree with each other.

Now look at where the weights are. I read the released checkpoint, meteor_v157.pt, without running it: a PyTorch checkpoint is a zip file, its central directory lists every tensor storage, and its data.pkl can be walked with an unpickler whose class loader returns stubs, so no code from the file ever executes. Learnable tensors sum to 54,060,013, all float32 (BatchNorm running statistics, another 56,688 values, excluded). By module, the ResNet-34 trunk is 21.28M and the refiner 5.03M. The E2E planner, counting its convolution stem, MLP, attention pool, heatmap path and command pieces, is 4,521,408, or 8.4% of the network; adding its small residual refiner (0.11M) makes it 8.6%. The other nine tenths exist to see.

The compute is distributed differently again. The repository's measured table for an earlier version (v26) shows the backbone with more than half of the parameters and under a sixth of the GFLOPs, while the depth decoder and the BEV lane head, about a ninth of the weights, take nearly two thirds of the compute. They run at high resolution: the depth decoder over eight cameras at 108 by 192, the lane head over all 400,000 BEV cells. The widget toggles between that table and my count of v157.

FLOPs per frame times frames per second is the sustained compute a chip has to deliver. docs/REPRODUCE.md measures the v52 graph at 3,405 GFLOP per 8-camera frame; at 15 Hz that is 51 TFLOP/s, at 10 Hz 34. That is an upper bound for v157: its checkpoint carries the half-width depth head (0.92M parameters), which the same document says removes 785 GFLOP, so by subtraction a v157 frame is nearer 2,620.

That table matters for the "runs on any SoC" claim. Parameter count tells you how much memory the weights take: 54 MB at int8, 108 MB at fp16. It says little about whether a chip can run the model at 10 or 15 frames a second, which depends on FLOPs, on activation memory traffic at 800 by 500, and above all on whether the chip's compiler accepts the operators. METEOR's lift uses grid_sample and gather. On the Jetson AGX Orin it runs as a custom TensorRT plugin. That is the real portability problem, and the repository treats it as one (more below).

Where "no labels" comes from

Twelve heads need twelve kinds of ground truth, and nobody drew any of it. docs/DATA_PIPELINE.md describes what TIER IV calls the autolabel factory, built on its CoMET platform: a resumable pipeline (the README counts 17 stages) from raw recordings in the t4dataset format (a nuScenes-like layout with LiDAR sweeps, ego poses, camera frames, and 2D panoptic masks and 3D boxes produced by CoMET's own autolabelers).

The autolabel factory's output for one scene: 21-class segmentation and 2D boxes on all eight cameras, and the BEV lanes, 3D boxes, agent trajectories and ego path, all generated from the recording (tier4/METEOR README, docs/media/groundtruth.gif).

So "no labels" means no human annotation for this model's training, which is true as far as the repository shows. It does not mean self-supervised. The supervision is distilled from LiDAR, accumulated across a whole drive with hindsight the car does not have at inference time, plus the outputs of CoMET's own detectors and segmenters. How those autolabelers were themselves trained is outside this repository, and I could not check it. The method is also only as available as the data: training uses 953 GB of converted recordings across 12,595 scene directories on 8 data-center GPUs, and none of that is public. The published dataset is six anonymised demo scenes with no ground truth.

That changes how to read "anyone can develop it once the spec is set." Anyone with a TIER IV-style sensor rig, a LiDAR-equipped fleet, a CoMET-class autolabel stack and a GPU server can. The README says as much in a commit from day one: "Have Co-MLOps data? You can build this."

What "designed by agentic AI" means in the repository

The README is direct: every line in the repository, including models, label extractors, the trainer, the Python and C++ TensorRT runtimes, the CUDA plugin, the renderers, docs and slide decks, was written by Claude operating autonomously, with humans setting goals and reviewing results. The badge names Claude Fable 5.

The git history is consistent with that and can't prove it. Of 165 commits across all branches, 142 carry a Co-Authored-By: Claude trailer (118 of them Fable 5, the rest Opus versions). All are committed under one engineer's accounts; the citation names Dan Umeda as author. A trailer records that an agent took part, not that no human typed a line, so the "zero human-written code" badge stays the project's claim.

What the documents show more clearly is the loop the agent ran:

  1. Rounds of about 24 hours. Each round refreshes the scene list with newly converted recordings, initialises from the previous best checkpoint and retrains every task. docs/TRAINING.md logs sixteen rounds and six new heads in the first five days.
  2. One lever per round, judged automatically. From a workstation, the agents drive an 8-GPU training server and a Jetson AGX Orin. The judge reads validation metrics, a chained-rollout evaluation and held-out adverse scenes; the Orin rebuilds, calibrates and benchmarks every candidate. Adoption is decided by accuracy per millisecond.
  3. Supervision that watches the supervision. A watchdog relaunches dead or hung runs; a cron supervisor catches subtler failures, like the round that ran for 34,280 steps while 23,533 of them were discarded as non-finite and validation kept printing plausible numbers.
  4. No automatic recipe changes. An earlier watchdog dropped a loss after three failed starts. That behaviour was removed: the docs argue that a round silently training a different objective from the one on record is worse than a round that stays down until the bug is fixed.

The worst one is in the release. The architecture has a temporal memory of three past BEV frames. In September the team found that a dataset cache bug had fed zero history to every E2E training round since July. Feeding real history to those weights made trajectories 33 to 38% worse, and two rounds of retraining did not recover it. So the deployed engine is single-frame: the history path is baked out at export, which also took latency on the Orin from 107 to 83 ms. A history-aware line trained from scratch is listed as open work.

I count that disclosure in the project's favour. It is also the best evidence I have about agent-run ML. The judge checked accuracy, latency and robustness every round for two months and never noticed that an input it was supposed to be learning from was all zeros. An automated loop optimises what it measures, and nobody had written "is the history tensor non-zero" as a test until a human-scale question exposed it. If you run agent loops for training (as in auto-gpu-kernel, where the correctness gate held), the lesson is that the gates you write are the only things the loop will never get wrong.

The checkpoint's own saved arguments add one more detail. v157 was trained from v151's best planner checkpoint with freeze_ego: True and rl_w: 0.0: the final round applied 2:4 structured sparsity to the convolutional trunk with the planner frozen and the GRPO-style reinforcement stage that exists in bevlane/e2e_reward.py switched off. Whatever reinforcement shaped the planner happened in an earlier round, if at all.

Sixteen million, or fifty-four

The post says 16 million parameters. The released checkpoint has 54,060,013. The model card, the README, the parameter file and the architecture figure all say 54M. I searched the code, docs and commit messages on every branch for 16M, 16 million and 1600万 and found none. The video in the post is the eight-camera demo renderer, with the occupancy panel and guardrail readout of the METEOR demo; it is not the one-camera Nano, though from the footage alone I cannot rule out an eight-camera METEOR2 checkpoint.

AutowareFoundation/meteor@b9035e5 · snapshot 2026-11-12
repo size
591.4 MB
task
robotics
library
tensorrt
license
apache-2.0
largest file
350.3 MB
files
19
downloads
50
likes
10
autowareautonomous-drivingcameramulti-viewbird-eye-viewmulti-taske2eplanning

The Hub repo ships a PyTorch checkpoint and an ONNX, no safetensors. My count of meteor_v157.pt's learnable tensors is 54,060,013, all fp32, matching the card's 54M; nothing in the repo or its history says 16M.

repo last modified 2026-10-28

There are smaller members of the family, and one of them is my best guess at the source of the number, labelled as a guess. METEOR2 swaps ResNet-34 for ResNet-18, whose trunk the repository measures at 11.18M against 21.28M, and replaces the plugin-based lift with a learned low-rank mapping built only from standard ONNX operators. METEOR2 Nano goes further: one front camera at 720 by 1280, ResNet-18, and a polar lift in which strided convolutions collapse each image column into range bins, so the BEV lives on an azimuth by range grid and the whole graph is about 220 Conv, Pool and Concat nodes. The README reports that version at 67.7 ms (14.8 FPS) as a single compiled graph on an unnamed low-power edge accelerator. Either a ResNet-18 METEOR2 with slimmer heads or the one-camera Nano could plausibly land near 16M. Neither METEOR2 nor Nano weights are released ("coming soon"), so I cannot count them.

The released model's numbers are concrete. On a Jetson AGX Orin at INT8 with CUDA graphs, the v157 engine with a 2:4 sparse trunk runs in 67.4 ms median, 14.8 FPS; the dense v151 engine runs in 75.4 ms; adding the LiDAR input costs half a millisecond. The C++ renderer adds about 30 ms of CPU work in parallel. The README itemises how 107 ms became 67: baking out the unused history (24 ms), pinned zero-copy input (5), the depth head at half width (1), a validity check that the compiler executed on a zero tensor (3), and sparsity (8). It also notes that an in-graph check for "is the LiDAR input non-zero" cost 14.8 ms by itself.

"Runs on any SoC" is the claim the family is built to approach, by rewriting the camera-to-BEV lift for each compiler's operator set. For the released METEOR it means: an AGX Orin with a custom CUDA plugin, or any NVIDIA GPU through a plugin-free fp16 engine (about 30 ms on a data-center card, per the card).

AutoE2E, the model it was quoted against

AutoE2E is developed in the open by the Autoware Foundation's Robotaxi working group, and its design is the other end of the line.

AutoE2E design diagram with three horizontal bands. Top, purple: World Action Model at 1 Hz, from multi-camera images through a vision backbone and feature embedding to encoded visual history and a visual future feature prediction with a JEPA reconstruction loss. Middle, yellow: Reasoning Model at 1 Hz, edge case scenario detection with a classification loss. Bottom, green: Reactive model for real-time driving at 10 Hz, where an SD/HD map raster and multi-view images go through vision backbones, BEV fusion and map/image fusion into a trajectory planner that also takes ego-motion history, producing a predicted trajectory with a trajectory loss.
AutoE2E's design: a 10 Hz reactive model plus 1 Hz world-action and reasoning models. Only the reactive branch ships in v1.0; the other two are in development (AutoE2E README, Media/auto_e2e_architecture.jpg).

The v1.0 release is the reactive branch alone. Six surround cameras at 512 by 512, plus an optional 1024 by 1024 front view, go into a BEVFormer V2 encoder with a ResNet-50 backbone that attends over the current frame and seven past frames at 0.5 s intervals. A 14-channel HD-map raster and a 2-channel route raster are fused into the BEV with deformable cross-attention. A GRU planner reads that, plus 64 steps of ego-motion history, and writes acceleration and curvature for 64 steps at 10 Hz: a 6.4 s horizon, twice METEOR's.

The Hub config.json gives the parameter count as 79,906,522, and the checkpoint agrees: its model tensors sum to 80,626,522, of which 720,000 are a fixed reference_points_3d buffer. The config also says the camera BEV encoder is frozen. The optimizer state saved in the released nuplan-epoch-5 checkpoint holds Adam moments for 1,448,582 parameters. So in that training stage, about 1.8% of the 79.9M were trained: the planner, the map and route encoders and their fusion. The rest is BEVFormer V2 as initialised from its official weights, which were trained on nuScenes. Two consequences follow. AutoE2E's "80M" is mostly someone else's perception model. And its checkpoints are licensed CC BY-NC-SA 4.0, non-commercial, because of nuPlan, KITScenes and those nuScenes-trained weights. METEOR's weights are Apache-2.0.

AutoE2E's predicted path (green) against the logged human path (purple), through a stop and a curve. Both lines are drawn over logged footage: the model's plan never moves the car. Video from @ShinpeiKato's post on X, cut to 13 s.

The AutoE2E README has a benchmark on KITScenes-Multimodal validation, a public driving dataset from Karlsruhe, and it includes METEOR. Every row is open-loop: the model predicts 3 s from logged frames and is compared with the human's path.

Model (AutoE2E's table)SettingADE@3s (m)FDE@3s (m)
Qwen Drive 1.0first of 6 paths0.5651.397
AutoE2E, KITScenes fine-tunecameras + HD map + route0.7441.980
AutoE2E, nuPlan only, zero-shotcameras + HD map + route, all 11,035 frames0.9152.423
METEOR v1578 camera slots, top-1 of 31.2403.282

METEOR's README has its own table on the same 202 KITScenes keyframes, for METEOR2 fine-tuned on KITScenes train:

Model (METEOR's table)InputsADE@3s (m)FDE@3s (m)
METEOR2 + LiDARimages, speed, ego history, HD map, route, LiDAR0.5351.466
METEOR2images, speed, ego history, HD map, route0.5421.488
METEOR2, past-onlyimages, speed, ego history0.5961.648
METEOR2, camera-onlyimages, speed0.7952.109

Read side by side, each project benchmarks the other at a disadvantage, without anyone doing anything wrong. AutoE2E could only test what METEOR released: v157, trained on a Japanese 8-camera rig, run zero-shot on a German 6-camera rig, with the missing narrow camera synthesised by cropping the front view (run_meteor_kitscenes.py notes that a black slot instead made METEOR under-predict progress by about 10%). Its 1.240 m is a cross-domain number. METEOR's 0.542 m is a fine-tuned model whose weights are research-only and not released, with a route built from the recorded drive, which the README calls a navigation oracle. Different evaluation code computes both tables.

What I would take from them: with comparable inputs to AutoE2E's fine-tune (cameras, ego history, HD map, route), METEOR2's fine-tune reports a lower 3 s error, 0.542 against 0.744. That compares two codebases' metric scripts, and METEOR2's size is unpublished, so treat the gap as suggestive. And neither table says anything about whether either model can drive.

What "open-source FSD" would need

The repository itself lists most of what stands between METEOR and a car:

To that list I would add what any safety engineer would ask for first: an operational design domain (which roads, speeds, weather, times of day), a hazard analysis, and a safety case arguing that the system with its guardrail and a fallback meets a target in that domain. AutoE2E at least has the start of one, a written review of Mobileye's Responsibility-Sensitive Safety framework in Safety/RSS/ as the basis for its safety argument; the review says itself that it is not a certification artifact. METEOR's guardrail is the right architectural instinct. It is also four rules checking a model against itself.

Tesla's FSD is a product: a fleet, validation that closes the loop on real roads, a supervising driver as the fallback, and a regulatory status. "Open-source FSD" borrows the name of that whole system for one component of it. METEOR is a strong open perception-and-planning reference model with permissive weights, a reproducible training stack for whoever holds the data, and a detailed record of an agent running an ML project since July. That is plenty. It does not need the comparison.

If you work on driving perception, the part I would read first is docs/REPRODUCE.md §7, "Measuring so the numbers mean something". Its account of how measuring SD-map and LiDAR inputs the wrong way produced "cost 19 % of mIoU" and "did nothing", both wrong in opposite directions, is useful whoever writes your code. For comparison with a larger, VLM-based approach to the same job, see Qwen-Drive-1.0, which leads AutoE2E's table; for a model that plans from imagined video rather than a bird's-eye grid, Praxis-1.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "METEOR: an agent-built driving network that perceives a lot and plans a little", ai.satyajit.si, November 2026.

bibtex
@misc{ghana2026meteordriving,
  author = {Satyajit Ghana},
  title  = {METEOR: an agent-built driving network that perceives a lot and plans a little},
  url    = {https://ai.satyajit.si/articles/meteor-driving},
  year   = {2026}
}
share