Skip to content

DJI media

DJI dock aircraft capture photos and videos to the aircraft’s SD card during flight. On landing, the dock copies the SD card to its own storage and streams the files to S3 through ARGUS’s media pipeline. Everything is indexed into Firestore so the mission ops view can surface captured media per flight task.

Capture source

  • Photos — triggered by waypoint actions in the wayline, by a manual shutter press during DRC, or by the aircraft’s intelligent-tracking mode.
  • Videos — recorded on DRC video-record start, or on a waypoint’s startRecord action.
  • PPK / RTK sidecars.obs (RINEX observations), .rtk (dock base-station observations), .mrk (per-photo exposure marker), .nav (GNSS navigation message), .dat (raw binary). Captured whenever the aircraft flies with RTK enabled.

The aircraft writes to its own SD card; no upload happens in-flight.

On-landing upload

When the aircraft lands and re-docks:

  1. The dock copies the SD-card contents to its internal storage. This takes 30–300 s depending on payload size.
  2. The dock publishes file_upload_progress over MQTT as it queues files for upload.
  3. For each file, the dock requests a presigned S3 PUT from argus-api and uploads directly to S3 — no intermediate hop.
  4. On each completed upload, the dock publishes fileupload_callback with {file_name, object_key, sub_file_type, fingerprint, size, ...}.
  5. argus-dji receives the callback and, inside a Firestore transaction, writes a dji_media/{id} doc with:
    • deviceSn / dockSn;
    • S3 bucket + key;
    • fileName, fileSize, fileType (photo / video);
    • flightTaskId — link back to the wayline / ad-hoc flight that produced it;
    • position (lat/lng/alt of capture, from the aircraft EXIF);
    • capturedAt + uploadedAt timestamps.

Media appears in the Media tab of the mission ops view within seconds of the dock’s upload completing.

PPK / RTK sidecar handling

Sidecar files share the base name of their photo (DJI_0042.JPG pairs with DJI_0042.MRK). argus-dji tags them with a subFileType so the mission post-processor can bundle each photo with its exposure marker and the dock’s raw observations for centimetre-accurate georeferencing. A typical RTK mission produces ~7 files per image:

  • .JPG — the image itself.
  • .MRK — per-photo exposure timestamp.
  • Per-mission: .obs, .rtk, .nav, .dat, and the wayline result JSON.

If PPK post-processing is enabled for the mission, argus-media picks up the sidecars and runs the RTKLib-based post-solver to produce corrected EXIF coordinates — replacing the raw aircraft-side position.

Deduplication

Each upload’s object_key is unique per capture session, but a dock can retry a fileupload_callback (e.g. on a transient Firestore write failure). argus-dji writes each dji_media/{id} doc inside a Firestore transaction keyed by object_key: if a doc for that key already exists, the retry is a no-op. This keeps the index clean even on flaky links.

Prioritisation

By default, media uploads run in the dock’s native order (oldest capture first). For an active mission where the operator needs a specific image now (e.g. a target-of-interest photo for triage), the mission-ops view offers a Prioritise action on any pending upload row:

  • ARGUS publishes a media_upload_prioritize MQTT service to the dock with the object_key.
  • The dock re-sorts its upload queue so that key jumps to the front.
  • Status on the row flips from queued to uploading within a few seconds.

Aspirational: bulk-prioritise by wayline waypoint id (so a critical-waypoint batch jumps the whole queue) is planned but not yet wired — at present the operator prioritises one file at a time.

Download / view

In the mission Media tab, clicking any thumbnail calls GET /api/dji/media/{id}/url and redirects to a short-lived presigned S3 GET. Video files open in an inline player; photos in a lightbox. Bulk-download zips are generated server-side from the selection.

Storage location

Per-org bucket, prefixed by dock serial and capture date: s3://{org-bucket}/dji-media/{dockSn}/{yyyy-mm-dd}/{filename}. Retention follows the org’s storage policy (default 1 year, configurable under Admin → Organisation → Storage).

Troubleshooting

  • Photos appear but videos don’t. Videos can be hundreds of MB — filter the media tab on fileType: video and wait; the progress bar on the dock tile shows the dock’s upload queue depth.
  • PPK sidecars missing. The aircraft was flown with RTK disabled — sidecars are only emitted when RTK was active at capture time.
  • Thumbnails empty. Thumbnail generation is lazy; the first open kicks off the generator. Refresh after ~10 s.
  • Flight tasks — the wayline dispatch that triggers most captures.
  • DRC — manual capture path.
  • Dock tile — surfaces dock storage used / total.