VPS

·
August 29, 2026

How a Drone Knows Where It Is Without GPS

One 360 flight produces the map, and the same map tells the drone where it is when GPS cannot. How aerial capture becomes a positioning system.
Shadnam Khan
MultiSet AI

You are flying a facade inspection. At 40 metres everything is fine. The aircraft holds position, the fix is solid, the log looks clean.

Then you drop to three metres off the wall for the detail pass, which is the only reason anyone commissioned the flight, and the position solution starts to come apart. Satellites disappear behind the building. The ones you can still see are bouncing off glass and concrete before they reach you. Your fix goes to float, or it holds a number that looks plausible and is quietly wrong by a couple of metres.

The aircraft did not get worse at flying. It got closer to the thing it was sent to look at.

That is the gap this post is about. Not how to fly better, but what a drone should be doing about position when the satellites stop being useful, and why the answer has been sitting inside the survey data the whole time.

A drone flying a residential construction site, localizing against a map built from a single 360 flight. The panel top left is the frame going to the API. X 84.498 Y -1.207 Z 67.135 m, yaw 355.0°, confidence 0.97, with no GPS fix.

The short version

Four layers sit under any drone's sense of where it is, and each one gives you something the others cannot.

LayerWhat you getWhat is still missing
GNSS and RTKGlobal position, metres to centimetres with a correction streamFails at facades, under canopy and indoors. No heading at all without a second antenna
Photogrammetry and orthomosaicsA measurable deliverable of the site as it was on flight dayA frame that something can localize into, live
Onboard VIO and SLAMSmooth relative motion between fixesDrift. Nothing absolute. None of it survives the flight
A VPS mapAn absolute 6-DoF pose against a map made earlier, carrying no accumulated errorThe layer most aerial captures never get

The rest of this post is about that last row.

The assumption everyone inherited

Aerial capture grew up selling pictures. The first paying customers wanted things to look at: progress photos, roof condition, a fly-around for the client. So the industry learned that the deliverable is the visual, and that framing survived every technology change underneath it. Film to digital, digital to photogrammetry, photogrammetry to LiDAR, LiDAR to splats. Camera up, render out, invoice.

But a flight is not a picture. It is a measurement. When you fly a site you are recording geometry, appearance, and, if you are disciplined about it, a coordinate frame. The orthomosaic is not that dataset. It is one read path through it, the projection optimised for human eyes. The same measurement can be read by machines, for localization, for navigation, for simulation.

This matters because appearance fidelity and metric fidelity are different axes. A facade survey that is seven percent wrong in scale looks identical to one that is exactly right. Your eyes do not notice. A drone trying to hold three metres off that facade notices immediately.

One drone flight fanning into two groups of outputs. The human-readable group holds a Gaussian splat, a 360 tour and a textured mesh. The machine-readable group holds the VPS map, whose feature data never leaves the platform, and a point cloud at 5 cm spacing. Both come from the same single pass.
A flight records geometry, appearance and a coordinate frame. The orthomosaic is one read path through that, not the dataset itself.

The industry solved repeatability, not addressability

Credit where it is due, because the hard parts did get solved.

Docked drone-in-a-box systems now fly a fixed route on a schedule with nobody at the controls, and because every flight follows the same path they produce orthomosaics and volumetrics that are comparable week over week. Verity's indoor inventory drones took the 2026 Award for Innovation and Entrepreneurship in Robotics and Automation and run in about 200 warehouses, with no GPS and no human in the loop. Corvus Robotics deploys infrastructure-free into a million square feet in about a week and moves cycle counts from twice a year to weekly.

Every one of those is a closed loop, and that is the limitation nobody names. The drone knows where it is for its own purposes, inside its own stack, for the duration of its own mission. Nothing in that position is addressable by anything else, and nothing in it survives the flight. Repeating a path is not the same as knowing where you are. The moment the path is unavailable, or the site has changed, or somebody on the ground needs to meet the drone's data in the same frame, a closed loop has nothing to offer.

Where a GNSS fix actually degrades

The failure is not random and it is not rare. It is structural, and it is worst exactly where the work is.

  • Close to a facade. Satellites are occluded on one side and the signals you keep are arriving via reflections off glass and concrete, which corrupts the carrier phase.
  • Under a canopy. Foliage attenuates and scatters. The fix survives in patches and drops between them.
  • Under a roofline. Not degraded. Gone.
  • Between racking, in a yard, in an urban canyon. Narrow sky, high multipath, and a receiver that cannot resolve ambiguities fast enough to hold a fix.

RTK does not exempt you from any of this. RTK is still GNSS. It needs a live correction stream, it drops to float in the same places GPS does, and it gives you position without heading unless you have paid for a second antenna. Practitioners describe the worst RTK failure mode as a fix that looks good and is wrong, which is precisely the problem.

And interference is now an operating condition rather than an edge case. EUROCONTROL puts up to 38 percent of European en-route traffic through regions that are intermittently but regularly affected by radio-frequency interference, and IATA's flight data recorded a 220 percent rise in GPS signal-loss events between 2021 and 2024. EASA has revised its safety bulletin on GNSS interference four times. Aviation treats a degraded fix as a standing condition to design around rather than an incident to report, and drone work sits in the same signal environment.

Four panels showing the same drone in different positions and what happens to its satellite fix: open sky with four satellites in clear view and a solid fix, close to a facade where half the sky is occluded and signals arrive by reflection, under tree canopy where the fix survives only in patches, and under a roofline where there is no fix at all.
The fix is worst exactly where the work is. Visual positioning is unaffected by all four, because it only needs to see the space that was mapped.

There is a version of this problem that visual positioning shares, and it is worth saying out loud rather than waiting to be asked. A visual fix can also be confidently wrong, and a confident wrong answer is worse than no answer, because everything downstream trusts it. That is why v2.3.0 added false-positive detection: the SDK cross-checks every localization against the device's own motion, and when the returned pose disagrees with where the device has actually moved, the pose is discarded and onLocalizationFalsePositive fires. A wrong answer is treated as a distinct event, not as a bad number.

One flight, one map

Fly the site once with a 360 camera. That is the whole capture step.

Raw .insv from an Antigravity A1 uploads directly and MultiSet stitches it server-side, which preserves more detail than re-ingesting somebody else's stitch. Any other 360 drone exports a stitched equirectangular .mp4 and goes through that route instead: DJI Avata 360, DJI Osmo 360, GoPro Max 2, Ricoh Theta, Insta360 X3. The pipeline cares about the format, not the brand.

What it will not take:

  • Flat or single-lens footage. Ordinary drone video is not a scan input.
  • Stereoscopic 360, over-under or side-by-side.
  • Anything that is not exactly 2:1 monoscopic equirectangular.
  • More than one video per zip, or a zip over 50 GB.

The capture rules matter more than the hardware. Fly in Cinematic mode at constant speed, turn through motion rather than pivoting on the spot, and never stop recording partway through a zone, because the whole zone is one continuous clip. Lock the shutter at 1/2000 in bright sun or 1/1000 in overcast, fix the white balance, and shoot 8K at 30 fps in strong light or 5.2K at 60 when motion blur is the bigger risk. Auto exposure is the single biggest cause of grey, smeared reconstructions.

Level the aircraft and let it settle before the clip starts. The tilt you begin with is the tilt the map keeps, and a tilted frame means floors are not flat in map space, floor-height bands cut diagonally through the building, and georeferencing starts from a frame that is already wrong.

Then fly four passes, as one continuous clip, in this order:

PassWhat to fly
1. Establishing orbitOne smooth loop at mid altitude, showing every primary side
2. Fill-in snakeA lawn-mower path across the whole surface, 30 to 50 percent overlap between lanes, flown close enough to pick up detail
3. Higher and widerRoofline, upper facade and the surrounding context
4. Reverse returnBack toward the start from a different angle, closing the loop

Low, mid and high are all required. A capture flown at one altitude will not reconstruct. Match the trajectory to the subject: a vertical snake for a flat facade, a rising spiral for a tower, a lawn-mower grid over a property.

Four animated drone capture trajectories: a perimeter orbit around a building, a vertical snake across a facade, an ascending spiral around a tower, and an overhead lawn-mower grid over a property.
Match the path to the shape of the subject. Every one is flown as a single continuous clip that ends where it started.

Two practical notes. A flight covers what nobody wants to walk, which is the real argument for aerial capture on a large site, and the 50 GB ceiling is how you split one into zones and rejoin them with a MapSet rather than a limitation. And because a printed ChArUco board cannot be resolved from the air, drone captures set metric scale after processing rather than from a marker in frame.

What actually comes out of a flight

One distinction first, because it is the one enterprise readers ask about. Localization runs on the map's feature data, which stays inside the platform and is never downloaded. The output assets are separate visual representations of the same space, and you can preview, download and load them wherever you like.

A table of what each capture input produces: mesh, point cloud, Gaussian splat and panoramas, showing that 360 video is the only input that can yield the complete set.
A mesh and a point cloud come from every input. The splat and the tour are opt-in at upload.

A mesh and a point cloud are produced from every input, whatever it was. The Gaussian splat and the panoramic tour are opt-in at upload. 360 video is the only input that yields the complete set, which is the argument for flying a 360 camera rather than a conventional payload.

One detail worth carrying away: the mesh, the splat and the panoramas share the map's local frame, origin at zero, +Y up, metric scale, and a localization query returns poses in that same frame. The point cloud is the exception. map.pcd is right-handed with +Z up, so overlaying it on the mesh needs a conversion. That catches people.

The same map answers the ground

An aerial capture and a walked ground capture fold into one coordinate frame through a MapSet, which holds the relative transform between them. A facade flown from the air and a corridor walked on foot resolve in the same query. There is no second capture and no registration step, and a robot and a technician's glasses report positions that can be compared directly.

The property that surprises people: you do not have to query from where you captured. Localization matches a live camera view against the map, not against a recorded flight path, so a device can localize from a position and an angle no flight ever occupied, as long as it is looking at mapped surfaces. The drone flies the facade. The technician stands at the bottom of it two weeks later and gets a pose from the same map.

An aerial capture flying a vertical snake up a building facade and a ground capture walked through the interior, both resolving into one coordinate frame held by a MapSet. Below them, a drone, a phone, a headset and a robot each query the same map and get a pose back in that frame.
No second capture and no registration step. A robot and a technician's glasses report positions that can be compared directly.

How the drone actually localizes

It is a REST call. Not an SDK dependency, not a flight-controller integration.

Three endpoints share one response shape. POST /vps/map/query takes JSON with one base64 image and answers in about two seconds. POST /vps/map/query-form is the same query when uploading a file is easier than encoding one. POST /vps/map/multi-image-query takes four to six frames and returns a consensus pose, which is the right choice in repetitive or partly occluded scenes.

A request carries the map code, the image, the camera intrinsics and the frame dimensions, plus whatever hints you want to apply. The response is small and always the same shape: whether a pose was found, position as x, y and z in metres, rotation as a quaternion, a confidence value between 0 and 1, which map it matched against, and how long the query took. The full request and response reference, with worked examples, is in the Map Query docs.

Gate on that confidence value. Applying a low-confidence pose is worse than applying none, because it moves something that was previously correct.

If the frame is a full 360 panorama, the request gets shorter rather than longer. Set imageType to equirect and send the map code, the handedness and the image. No fx, no fy, no principal point, no width or height, because a full sphere fixes the geometry by itself. The pose you get back describes the forward-looking direction, the way the centre column of the panorama faces. Panoramas need to be at least 1.9:1, between 2048 and 16384 pixels wide, and under 30 MB, and 4096 by 2048 is a good default. Larger is not better.

Hints narrow the search when you already have a rough idea where you are:

  • hintPosition with hintRadius, from 5 to 100 metres around a known point.
  • hintMapCodes to pin the query to specific maps inside a MapSet.
  • hintFloorHeight to restrict the search to a vertical band.
  • geoHint to seed from a GPS fix, on a georeferenced map.

One trap worth printing. Hints are always supplied in the map's native left-handed frame, whatever you set isRightHanded to. Passing a right-handed hintPosition straight back from a previous result is the most common reason a query mysteriously stops finding a pose.

When a query does fail, the documented ladder is short. Query with the fast engine, which answers in about two seconds. On poseFound: false or low confidence, retry the same frame with Deep Search, which searches more of the map for up to 15 percent higher recall at three to four seconds. If it still fails, keep running on local tracking and re-query from a different viewpoint.

The architectural constraint underneath all of this, stated once: a query is a network round trip, so it cannot live inside a control loop. Onboard visual-inertial odometry flies the aircraft between queries, and each VPS fix stops that estimate drifting. It is the same division of labour a ground robot uses, which is the point. The platform does not have a drone mode.

A chart of position error over a flight. Onboard visual-inertial odometry drifts steadily upward away from truth, and each VPS fix drops the error back to the absolute pose line. The query itself takes about two seconds, marked as a bracket on the time axis.
Each fix removes the error built up since the last one. The query is a network round trip, which is why it corrects the loop rather than running inside it.

Where RTK and VPS actually meet

The framing of RTK as the thing visual positioning replaces is wrong, and the API makes it obvious why.

Georeferencing a map means posting control points. Each one pairs a map-local x, y, z in metres with a WGS 84 latitude, longitude and altitude, and the server solves the map's origin and heading from those pairs, so no compass reading is required. You need at least three, not all on the same vertical line, with six decimal places on the coordinates.

Control points are exactly what an RTK rover produces. That is the join. Your existing survey workflow is what ties the visual map into the real world, once.

  • First, survey a handful of well-spread points on site with the rover you already own.
  • Then post them as control points against the map.
  • The server solves origin, heading and optionally scale.
  • Read the residuals it hands back: rmseMeters, horizontalRmseMeters, maxErrorMeters, which points were kept as inliers, which were rejected, and a tiltCheck telling you whether the map's gravity alignment is sound.
  • From then on, a GPS fix narrows the search as a geoHint, and every pose comes back as GeoPose.
Three steps showing how RTK and visual positioning compose. Control points surveyed on site pair a latitude, longitude and altitude with a map-local coordinate. One API call solves the map origin, heading and scale and reports RMSE, inliers and a gravity tilt check. From then on every localization query returns a GeoPose in the same coordinate system, derived from the camera rather than from satellites.
RTK builds the frame. Visual positioning delivers position in that frame when RTK cannot hold a fix. Two halves of one system, not two competing answers.

So an existing waypoint stack that speaks latitude and longitude carries on speaking it, with a visually derived position underneath when the satellites cannot supply one. RTK builds the frame. Visual positioning delivers position in that frame when RTK cannot hold a fix.

Three layers, not two competitors

LayerGives youFails whenRole
GNSS and RTKGlobal position, centimetres with correctionsMultipath, canopy, canyon, roofline, interference, or the correction stream droppingPrimary in open sky, and the source of the control points that georeference the map
VIO and onboard SLAMSmooth relative motion at a high rateAlways drifting, never absoluteCarries the pose between fixes
VPSAn absolute 6-DoF pose against a prior map, orientation includedNo prior map, unmapped area, feature-poor sceneAbsolute correction, and the only layer that does not share GNSS's failure mode

That last row is the whole argument. A fallback that fails for the same reason as the primary is not a fallback. It is a second copy of the same risk.

What this unlocks

Use caseWhat the pose makes possible
Change detectionTwo flights of the same site land in one coordinate frame, so a difference becomes a measurement rather than two orthomosaics compared by eye
Inspection and QA/QCA defect gets a map-space coordinate instead of a photo filename, so whoever comes next can find it again, on foot or in the air
Incident reportingPlace, time and the camera position the photo was taken from, all logged together. The photo becomes evidence with a location attached
Tracking inside other systemsLive pose drawn into the reconstruction, or handed to a GIS, a fleet view or an ops console as GeoPose
Air-to-ground handoffThe drone that surveyed the site and the technician who walks it later agree on where everything is
Progress captureThis week's flight lands in last week's frame with no alignment work

Change detection deserves a straight answer rather than a claim. MultiSet gives you the shared frame and the aligned captures. It does not ship a diffing product. Map Versioning aligns scans taken months apart using the VPS itself rather than ICP, which is why it survives repainted walls, swapped fixtures, different sensors and different point densities where geometric matching gives up, and the panoramas carry position and orientation per capture point, which is what makes a visual before-and-after comparable at all. The frame is the hard part. The diff is the easy part, and it is yours.

Where this breaks

ConditionFailure modeWhat to do
A single-altitude flightWill not reconstruct at allFour passes, low, mid and high, as one continuous clip
Auto exposure or a tilted startGrey smeared map, or a frame whose tilt breaks floor bands, georeferencing and any measurement off the meshLock the shutter and white balance, and let the aircraft settle level before recording
Feature-poor or reflective surfacesConfidence drops, or worse, a confident wrong poseGate on confidence, retry with Deep Search, add a wider context pass, turn on false-positive detection
A site that changed since capturePoses that are right about a space that no longer existsMap Version the zone that moved, set a recapture cadence per zone
Wind, rain or moving subjectsBlur and inconsistent geometryDaylight and stable light, nothing large moving through the area you care about

Where MultiSet fits

Everything above holds regardless of vendor. Here is how we have built for it.

One pipeline, scan-agnostic on the way in, producing a human-readable scene and a machine-readable map from the same capture. It runs in:

  • Public cloud, as a managed service.
  • Private cloud or VPC, for regulated workloads.
  • Self-hosted, for air-gapped and data-sovereign environments.
  • On-device, for offline and privacy-strict deployments.

Map versioning carries your anchors and routes forward across recaptures instead of resetting the world each time, and a Fortune 100 industrial customer runs this pattern in private cloud production.

Everything in v2.3.0 is additive, so existing integrations need no changes.

FAQ

How does a drone know where it is without GPS?

By recognising where it is. Fly the site once with a 360 camera and process it into a map. In flight, send a camera frame to the localization API with the map code. A pose comes back in about two seconds: position in metres, rotation as a quaternion, and a confidence value, all in that map's coordinate frame. Onboard visual-inertial odometry carries the aircraft between queries. Each pose is absolute, so it carries no accumulated error however long the flight has been running.

Can I use this as a fallback when RTK loses fix?

Yes, and it works in both directions. RTK control points are what georeference the map in the first place, so your survey rig builds the frame. Once that is done, a visual pose comes back as GeoPose in the same latitude and longitude your waypoint stack already uses, which means the handoff needs no new coordinate system. The reason it works as a fallback is that visual positioning fails for entirely different reasons than GNSS. Multipath, canopy and interference do not touch it.

Do I need a special drone?

No. An Antigravity A1 uploads its raw .insv directly. Any other drone carrying a 360 camera that exports monoscopic 2:1 equirectangular .mp4 works through the same pipeline. What does not work is flat, single-lens footage, which is what most drones record by default.

The site changed. Is my map garbage?

No, it is ageing, and the decay is zonal rather than total. A loading yard changes weekly, a facade changes over years. Map Versioning plus partial recapture handles it: rescan the zones that moved, keep the ones that did not, and anchors authored against the original frame carry forward. The question is not whether to recapture but at what cadence per zone.

What survives

Aircraft will keep changing. So will sensors, payloads and capture formats. The conserved quantity across all of them is the registration: the shared frame every future flight lands in, and every device on the ground can be measured against.

A flight without one is a folder of pictures with a timestamp on it.

If you want to give yours a coordinate frame, start free on the developer portal or book a demo. One flight is all the hardware asks.

Further reading: 360 Video to VPS · Antigravity A1 · Map Versioning · Localization · Equirect Query · Georeferencing Maps · How It Works