Skip to main content
Follow-Me is a first-party extension, com.altnautica.follow-me. Click a subject in the live video, pick Follow, and the drone flies a standoff follow: it keeps a set horizontal distance behind the subject and a set height above the ground, and turns to face it.
Follow-Me flies the drone with guided setpoints. Read Safety before you use it, and keep a pilot ready to take over.
Permissions
  • event.publish
  • flight.guided_setpoint
  • mavlink.read
  • mavlink.write
  • mcp.expose
  • ui.slot.flight-skill
  • ui.slot.node-detail-tab
  • vision.detection.subscribe
Boards: cm4, cm5, rock-5c-lite, rk3588s2, rk3576, rpi5, cubie-a7s, cubie-a7z

What you need

  • A camera bound to the vision pipeline (USB UVC or CSI), facing forward or down. A gimbal is optional; with gimbal_point on, the plugin points it at the subject.
  • A detector on the companion. The default coco-person model runs on the NPU of supported boards and on the CPU elsewhere. Check backend_state in GET /api/vision/status: a node that reports unavailable produces no detections to follow.
  • A flight controller in a guided position mode: ArduPilot Guided, or PX4 Offboard.
  • Optional: a downward rangefinder on the flight controller, for height above the terrain; and a planar LiDAR published by the World Engine extension, as a third range cue.

Start and stop a follow

  1. In the cockpit video, click or tap a detected person and pick Follow this target (default key F), or drag a box around the subject. This designates the track.
  2. Turn the Follow-Me Skill on (Shift+F). It asks for confirmation and needs the aircraft armed and in a guided mode.
  3. To stop, pick Stop following (X), turn the Skill off, or change the flight mode from your transmitter.
An AI client gets two tools, follow_status and stop_follow, and no way to start a follow. A follow begins only when an operator designates a subject.

How it follows

The loop runs at 20 Hz.
  1. Vehicle state. The plugin reads the flight controller’s LOCAL_POSITION_NED for position and velocity, ATTITUDE, and DISTANCE_SENSOR from a downward rangefinder (orientation 25 only). GLOBAL_POSITION_INT is used only to show latitude and longitude.
  2. Height above ground. The rangefinder is used while its reading is younger than 0.3 s, inside its own minimum and maximum, and the aircraft is tilted less than 30°. Otherwise the plugin falls back to the barometric relative altitude. The read-back names the choice in agl_source (rng or baro).
  3. Range to the subject. Up to three cues, each with its own 1-sigma error, fused by inverse variance: With no cue available the loop holds with hold_reason: "no-range".
  4. Subject motion. A constant-velocity Kalman filter over north, east and their velocities (acceleration noise 1.5 m/s²) tracks the subject’s position and velocity.
  5. Setpoint. The standoff point sits follow_distance_m behind the subject along its direction of travel when it moves faster than 0.5 m/s, and along the line from the drone otherwise. The plugin sends SET_POSITION_TARGET_LOCAL_NED (#84) in MAV_FRAME_LOCAL_NED with position, the subject’s velocity as feed-forward (clamped to max_speed_mps) and yaw toward the subject; acceleration and yaw rate are ignored (type_mask 2496). Height is terrain-following: the drone climbs or descends by the difference between the measured height above ground and follow_height_m.
The loop commands only while the flight controller’s pose is fresh, the aircraft is armed and in a guided mode, and the tracker reports a live lock. When a gate fails it sends a short burst of hold setpoints at the current position, then stops sending, and publishes the reason in hold_reason.

Re-acquire after an occlusion

When the tracker loses the subject (a tree trunk, a building corner), reacquire_mode decides what happens. The tracker itself never re-locks silently. A smart re-acquire is an explicit designation by the plugin, announced on the event bus and shown on every operator surface. The appearance match uses a re-identification embedding when the vision engine provides one, and a colour and gradient histogram otherwise. The re-acquire toggle is on the Follow-Me Skill’s popover and in the Follow-Me tab.

Parameters

Set them in the Follow-Me tab, or with PUT /api/plugins/com.altnautica.follow-me/config.

Follow state

The plugin publishes follow.state on every change. The agent re-serves it as the follow kind of its navigation routes, so the cockpit, Mission Control, the Android app and the terminal dashboard read the same fields. One-shot events: follow.reacquired ({track_id, similarity, gap_s}) and follow.lost.

On the operator surfaces

The cockpit, Mission Control and the Android app draw the follow with the same target symbology: tracking brackets with a TRACK tag and the range under the box while following, dashed COAST brackets at the predicted box, a SEARCHING sweep, a Re-acquired toast, and LOST. While following, a range panel shows the range with its uncertainty, the height source, the bearing and the subject’s speed.

Next steps

Agent cockpit

The on-node console and its follow chrome.

Extensions catalog

Install and the catalog entry.
Last modified on November 3, 2026