New · Single drone · PX4 SITL + Gazebo

Search & find.
Eight targets, each located to under a metre.

A drone with a downward camera sweeps a 60 × 60 m field in PX4/Gazebo. Eight ArUco markers sit on the ground at seeded positions. Every time the camera sees one, the drone works out where it is on the ground using PX4's own position and attitude estimate. The simulator's true positions are never given to the drone; they are only used afterwards, to score the result.

Targets found–
False detections–
Mean position error–
Worst position error–

Figures from the recorded run below (also the flight in the 3D Search Demo). Six runs so far, all 8/8 with no false ids; worst-case error 0.45–0.63 m across them.

The drone's downward camera: green grass, the white field boundary, and ArUco marker 34 outlined with its id label; the drone's shadow is visible nearby.
The drone's downward camera during the sweep: marker 34 detected and labelled. The small shape is the drone's own shadow.
Gazebo view of the 60 by 60 metre search field outlined in white, with small square markers spread across it and the launch grid at the near edge.
The search field in Gazebo: white outline, eight targets on the ground, launch grid at the near edge.

▶ Watch this flight as a 3D replay →

Result, target by target

Reported position (from the drone's estimate) against the true position (from the world file), in metres north and east of the launch point.

Marker idReported N, ETrue N, EErrorSightings
Loading the recorded report…

Loaded from data/search_report.json (the committed evidence file, evidence/search/) and data/search_targets.json (the world's ground truth). A test keeps both byte-identical to the repository copies.

How it works

  1. World. A generated Gazebo world: open field, eight textured ArUco markers, and a ground-truth file that only the scorer reads (a test fails if flight code opens it).
  2. Camera. An x500 drone with a camera pointing straight down (640 × 480, 100° field of view). At 8 m a 1 m marker is about 34 pixels wide.
  3. Detect. OpenCV finds every marker in each frame.
  4. Locate. Each detection becomes a ray from the camera, rotated by PX4's attitude estimate and intersected with the ground. A target is reported once it has been seen three times; its position is the median of the sightings.
  5. Score. After landing, a separate scorer compares the report with the ground truth: found, missed, false ids, and position error.

What this does not show yet

Run it yourself

With PX4 SITL and Gazebo Harmonic installed: scripts/run_search_demo.sh opens the Gazebo window and the live camera view, flies the sweep and prints the score. Source: geolocation · flight · world generator.