Intermediate

Autonomous Flight

Program drones for fully autonomous missions using flight controllers, companion computers, and AI-powered decision-making systems.

Flight Controller Ecosystem

PX4 Autopilot

Open-source flight controller used in research and industry. Supports MAVLink protocol, offboard control, and SITL simulation.

💻

ArduPilot

Mature open-source autopilot supporting copters, planes, rovers, and submarines. Extensive community and plugin ecosystem.

🔄

MAVSDK

Modern API for drone communication via MAVLink. Python, C++, and Swift bindings for programmatic drone control.

🔧

Companion Computer

NVIDIA Jetson or Raspberry Pi runs AI workloads and sends commands to the flight controller via MAVLink.

Autonomous Mission with MAVSDK

import asyncio
from mavsdk import System
from mavsdk.mission import MissionItem, MissionPlan

async def run_mission():
    drone = System()
    await drone.connect(system_address="udp://:14540")

    # Wait for connection
    async for state in drone.core.connection_state():
        if state.is_connected:
            print("Drone connected!")
            break

    # Define mission waypoints
    mission_items = [
        MissionItem(47.397742, 8.545594, 25, 10,
                    True, float('nan'), float('nan'),
                    MissionItem.CameraAction.NONE,
                    float('nan'), float('nan'), float('nan'),
                    float('nan'), float('nan'),
                    MissionItem.VehicleAction.NONE),
        MissionItem(47.397900, 8.545800, 25, 10,
                    True, float('nan'), float('nan'),
                    MissionItem.CameraAction.TAKE_PHOTO,
                    float('nan'), float('nan'), float('nan'),
                    float('nan'), float('nan'),
                    MissionItem.VehicleAction.NONE),
    ]

    mission_plan = MissionPlan(mission_items)
    await drone.mission.upload_mission(mission_plan)

    # Arm and start mission
    await drone.action.arm()
    await drone.mission.start_mission()

    # Monitor progress
    async for progress in drone.mission.mission_progress():
        print(f"Mission progress: {progress.current}/{progress.total}")
        if progress.current == progress.total:
            break

    # Return to launch
    await drone.action.return_to_launch()

asyncio.run(run_mission())

GPS-Denied Navigation

When GPS is unavailable (indoors, urban canyons, jamming), drones must rely on alternative navigation:

MethodSensorsAccuracyBest For
Visual OdometryCameraGood (drifts over time)Indoor/outdoor navigation
Visual-Inertial OdometryCamera + IMUVery goodHigh-speed flight
LiDAR SLAMLiDARExcellentIndoor mapping missions
Optical FlowDownward cameraGood for hoverLow-altitude position hold
UWB BeaconsUWB radio~10cmWarehouse, indoor tracking

Offboard Control Mode

Offboard mode allows a companion computer to send real-time position, velocity, or attitude commands to the flight controller:

async def offboard_control(drone):
    """Control drone position from companion computer."""
    from mavsdk.offboard import PositionNedYaw, OffboardError

    # Set initial setpoint before starting offboard mode
    await drone.offboard.set_position_ned(
        PositionNedYaw(0.0, 0.0, -5.0, 0.0)
    )
    await drone.offboard.start()

    # Fly a square pattern
    positions = [
        PositionNedYaw(5.0, 0.0, -5.0, 0.0),
        PositionNedYaw(5.0, 5.0, -5.0, 90.0),
        PositionNedYaw(0.0, 5.0, -5.0, 180.0),
        PositionNedYaw(0.0, 0.0, -5.0, 270.0),
    ]

    for pos in positions:
        await drone.offboard.set_position_ned(pos)
        await asyncio.sleep(5)
Key takeaway: Autonomous flight requires a reliable flight controller (PX4/ArduPilot), a companion computer for AI processing, and robust communication between them. Always test in simulation (SITL) before flying real hardware, and implement failsafe behaviors for all failure modes.

Ready to Go Deeper?

Live instructor-led courses from our partners. Affiliate disclosure.