How it works

From a moving dot to a measured 3D track

Video is analysed where it is recorded. Only small metadata packets travel to a shared server, which pairs simultaneous sightings, intersects their sight lines and reports every position with its uncertainty.

Overview

Each node is a small computer (an NVIDIA Jetson Orin Nano) in a volunteer's home with a sky-facing camera, a GPS receiver for position and precise time, and optionally an orientation sensor. The server is shared. The design keeps the heavy data, the video, on the node, and moves only what triangulation needs.

On the node In your home

  1. Capture

    1080p video at 60 fps into a rolling buffer in memory. Video never leaves the device by default.

  2. Detect and track

    Background subtraction finds moving points; a tracker links them frame to frame.

  3. Filter

    Stars, clouds, birds, insects and ADS-B aircraft are labelled and dropped.

  4. Report

    A signed, roughly 0.5 KB packet: time, position, direction. Ten per second while visible.

On the server Shared

  1. Match

    Packets from nodes within 80 miles and 50 ms of each other are paired.

  2. Triangulate

    Sight lines are intersected; every fix carries its own error estimate.

  3. Track and flag

    Fixes join into 3D tracks; speed and acceleration come from fitted curves.

  4. Request clips

    Only after two or more nodes agree, each is asked for ten seconds of HD video.

The clip request is the only message the server sends to a node, and it is signed with that node's key.

Step 1

On the node: detect, track, filter

The camera streams video (by default 1920 × 1080 at 60 frames per second through a lens with a field of view of about 90°) into a pre-allocated buffer in memory that holds the last 10 seconds. A detector compares each frame with a slowly updated model of the background sky and picks out small moving points; a tracker links them from frame to frame into local tracks. A sky mask ignores everything below a minimum elevation (3° by default) and any pixels the host marks as rooftops, trees or neighbouring buildings.

Before anything is reported, each confirmed track goes through false-positive filters:

FilterWhat it looks for
Stars and planetsObjects moving at or below the sidereal rate (0.0042° per second) and fixed lights.
CloudsLarge, diffuse, low-contrast structure that is slow or drifts with the wind field measured across the frame.
Birds and insectsObjects close to the lens: large apparent size plus rapid growth or shrinking, a periodic wingbeat flicker (2–25 Hz) or defocus.
AircraftTracks that follow an aircraft broadcasting its position by ADS-B, projected to each frame time, from a local receiver or an online feed.
Satellites and meteorsOff by default: one camera cannot tell a straight-flying unknown from a satellite. Triangulated altitude settles it on the server.

Filtered tracks are not sent. Their label and the reason are logged on the node, so an operator can audit what was suppressed and why. A track that has manoeuvred is never labelled as a satellite or meteor.

Each detection's pixel position is converted to a direction in the sky (azimuth from true north and elevation above the horizon) using the lens calibration and the camera's pointing. Pointing accuracy dominates the error budget, so fixed cameras are calibrated against the star field; an orientation sensor, if fitted, is used to notice that a mount has moved, not to measure direction.

Step 3

Matching simultaneous sightings

The server keeps a spatial index of active nodes (heard from in the last 60 seconds). For every incoming sighting it looks for sightings from other nodes within 80 miles whose timestamps fall within 50 milliseconds. Fifty milliseconds matters: an object at Mach 6 covers about 100 m in that time, so when the neighbour has samples of the same track on both sides, the server interpolates its sight line to the exact moment of the packet.

A candidate pair is accepted as the same object only if:

  • the two sight lines converge in front of both cameras, not behind one of them;
  • the angle between them (the parallax) is at least 1°, so distance is meaningfully constrained;
  • both ranges (150 m to 400 km) and the altitude (−500 m to 150 km) are physically plausible;
  • the lines pass within a distance consistent with the expected angular noise: at most three times its predicted spread plus 30 m for timing and GPS error.

Competing candidates are ranked by how small their miss distance is relative to that prediction.

Step 4

Triangulation

Two sight lines in three dimensions almost never intersect exactly. The server finds the shortest segment between them; its midpoint is the position estimate and its length, the error margin, is a direct check on consistency.

With three or more nodes the server solves a weighted least-squares problem: the point that minimises the squared perpendicular distances to all sight lines, with each line weighted by 1/(range × σ)², so that distant observers, whose sideways error is larger, count for less. The result is converted to latitude, longitude and height above the WGS84 ellipsoid.

Derivations and tests: docs/MATH.md and the shared skynet_common.triangulation module.

Stereo triangulation with two ground nodes Two cameras, node A and node B, sit on the ground several miles apart. Each draws a line of sight to the same object in the sky, surrounded by a narrow wedge of angular uncertainty. The lines cross at the object; the small diamond where the wedges overlap is the position uncertainty. The angle between the sight lines at the object is the parallax, and a dashed line from the object to the ground marks its altitude. Node A Node B object 5–40 miles 1 2 3 4 5
  1. Line of sight. Each node measures only a direction to the object: its azimuth and elevation, to about 0.01–0.05° when the camera is calibrated against the stars.
  2. Angular uncertainty. A small angular error becomes a sideways position error that grows with distance: range × angle.
  3. Position and its error. Where the sight lines cross is the estimate; the overlap of the two wedges is its uncertainty, published as sigma_m.
  4. Parallax. The angle between the sight lines at the object. Larger parallax pins down distance better, which is why nodes need to be miles apart.
  5. Altitude. Follows directly from the 3D position. Successive fixes, ten per second, give speed and acceleration.
Angles exaggerated for clarity.

Step 5

The error model, and why calibration and spacing matter

Each sight line constrains the position in the two directions perpendicular to it, with a standard deviation of range × σ, where σ is the angular error. Combining all lines gives a covariance for the position; the API reports its square-root trace as sigma_m, the 3D RMS error in metres. A Monte-Carlo test confirms that simulated errors match this prediction.

Predicted 3D position error (1σ RMS) for two nodes due east–west and a target at 10 km altitude midway between them, for three levels of pointing accuracy. From the project's error model (docs/MATH.md).

Node spacing Range Parallax Elevation σ at 0.01° σ at 0.05° (default) σ at 1°
8 km (5 mi) 10.4 km 45° 68° 4 m 19 m 386 m
16 km (10 mi) 12.5 km 79° 50° 4 m 18 m 351 m
32 km (20 mi) 18.7 km 118° 31° 6 m 29 m 570 m
64 km (40 mi) 33.4 km 146° 17° 15 m 77 m 1.5 km
128 km (80 mi) 64.7 km 162° 8° 53 m 266 m 5.3 km

Pointing calibration matters most

A 1080p sensor behind a 90° lens covers about 0.047° per pixel, and finding a point's centre gives 0.01–0.05°. A consumer orientation sensor manages about 1°, which is 20 to 100 times worse. That is why fixed cameras are calibrated against the stars.

Spacing of 5–40 miles is the sweet spot

Too close and the sight lines are nearly parallel for distant objects. Too far and the object sits low on both horizons, where refraction, haze and obstructions dominate: at 80 miles it is only 8° up.

Timing has to be GPS-grade

Nodes discipline their clocks with the GPS pulse-per-second signal. Ordinary internet time over a home connection is only good to a few milliseconds, and the capture delay of each camera is calibrated once.

Not modelled yet: atmospheric refraction (about 0.5° at the horizon, under 0.02° above 45° elevation), residual lens distortion and the node's own GPS position error (about 2–5 m, negligible next to angular error at these ranges).

Step 6

3D tracks, speed, acceleration and flags

Every node labels its own tracks, so successive triangulations that share a node's track are linked into a single 3D track. Individual fixes are noisy (tens of metres at typical ranges), so velocity and acceleration are never taken from point-to-point differences. Instead the server fits a straight line and a parabola to the last second of points, and again to a once-per-second history of the last 30 seconds, and keeps each parameter's standard error.

Flags use the 2σ lower bound of the fitted value, so measurement noise alone cannot trigger them. The published maximum acceleration is that lower bound.

FlagRule
hypersonicSpeed above 1,715 m/s (Mach 5 at sea level).
high_gAcceleration above 98 m/s² (10 g).
ballisticFor at least 5 s, moving at 100 m/s or more with an acceleration that matches gravity (within the larger of 3σ and 2 m/s²) and is known to within 3 m/s².
stationarySpeed below 2 m/s for 30 s.
unknownThe default when no rule has fired.

A flag describes motion; it does not identify anything. Meteors, for example, routinely exceed the hypersonic threshold: they enter the atmosphere at roughly 11–72 km/s and burn up around 80–120 km altitude, and that altitude is what identifies them.

Step 7

The clip back-signal

Only when two or more nodes confirm a match does the server send each contributing node a signed clip_request for the 10 seconds around the event (5 seconds either side). Because the node keeps the most recent seconds of video in memory, the moments before the request can still be saved.

  1. The node verifies the request's signature and copies the frames out of memory to its local SSD.
  2. It encodes them to H.264 at low priority, on the processor rather than a hardware encoder (the Orin Nano does not have one), so detection is never starved.
  3. It uploads the file to a one-time upload address and records a per-frame timestamp file alongside it for forensic and stereo re-analysis.
  4. The server links the clip to the track, where it is available from the public track record.

The design target for delivering the request is under 20 ms on the UDP transport. By default nodes also keep short clips of their own detections on their own disk, for up to 14 days, and upload nothing unless asked.

What is and isn't published

The map and the public API are read-only and open to anyone. This is what they contain.

Published

  • 3D tracks: positions, altitude, speed, acceleration lower bound, flags and the uncertainty of each fix.
  • Each fix's sight lines (azimuth and elevation) and which nodes contributed.
  • Nodes: optional label, position rounded to about 1 km, camera pointing and field of view, online status and basic health.
  • Clips requested after a confirmed match, once uploaded, linked from the track.
  • Network statistics, the stereo coverage map, and volunteer counts per 1° × 1° cell with at least 3 volunteers.

Not published

  • Continuous video. It stays on the node.
  • Detections filtered out on the node (stars, clouds, birds, insects, ADS-B aircraft).
  • Exact node coordinates, which the server uses only for triangulation.
  • Volunteer names, email addresses, notes, postal codes and individual locations.

Rounding is a safeguard, not a guarantee: published sight lines combined with triangulated positions could, in principle, narrow a node's location further. This is under review before launch. See the privacy notice.

Read this

Honest limitations

  • The network is new. The accuracy figures on this site are predictions of the error model, checked in simulation. They have not yet been verified in the field against targets of known position.
  • Most detections will be ordinary. Not every aircraft broadcasts ADS-B, and ADS-B data can be missing or delayed, so some aircraft will get through. So will balloons, drones, satellites, meteors and insects.
  • Cameras only see what stands out against the sky. Unlit objects at night, small or distant objects by day and anything behind cloud are invisible. Coverage depends on weather, daylight and where hosts live.
  • Low elevations are hard. Near the horizon, refraction (about 0.5°, not yet modelled), haze and obstructions degrade accuracy.
  • False matches are possible. In a busy sky, two nodes may see different objects whose sight lines happen to cross. Gating and a third node reduce this but cannot rule it out; two-node fixes deserve more caution than three-node ones.
  • Systematic errors are not in the error bars. A mount that shifts, a mis-set clock or an uncalibrated capture delay biases every measurement from that node until it is fixed. The error model assumes random errors.
  • Short tracks give weak kinematics. Acceleration in particular needs many points. Because flags are conservative, a real but marginal event may go unflagged.
  • The software is pre-release. Version 0.1; some hardware paths, such as the orientation-sensor driver, have not yet been tested on real devices.
  • No identification. The system measures where something was and how it moved. It does not say what it was.