alan yin
← Work

Vision-Guided Autonomous Drone

[One or two sentences: what the drone does, and the thing about it worth knowing.]

Year
2026 – present
Status
Verified in simulation; in development on the vehicle
Context
Personal project
Role
Airframe, mechanical design, perception, control, test infrastructure
Stack
Python 3 · ArduPilot 4.6 · OpenCV · MAVLink 2 · picamera2 · SolidWorks
The quadcopter from above: four three-blade propellers on a carbon frame, with the Raspberry Pi and wiring mounted over the flight-controller stack.
The quadcopter from the side, showing the camera on its front mount and the flight-controller stack.

[Caption both photographs — what the reader is looking at.]

What it does

[What the drone does, in plain terms. Tag detection, what it holds position relative to, and what the pilot still controls.]

How the control loop works

[The loop, step by step — from a camera frame to a command the flight controller acts on.]

pitch = K_p · e_forward + K_d · v_forward

[Why the derivative term is not optional — and what happened in simulation without it.]

[What the controller does when it loses the tag, and why it does that rather than searching.]

What I built

  • [The vehicle — airframe, components, wiring, configuration.]
  • [The custom mechanical parts, and what they had to hold.]
  • [The perception pipeline.]
  • [The outer control loop.]
  • [The ArduPilot integration.]
  • [The test infrastructure, and what it caught.]

The airframe, in CAD

[Why these mounts had to be modelled against measured dimensions rather than eyeballed.]

Exploded CAD view of the quadcopter: four motors and three-blade propellers on a carbon frame, the flight-controller stack on standoffs, the Raspberry Pi and active cooler above it, the camera on a front mount, and the GPS module on a raised mast.
[Caption the exploded view — which parts you designed.]
Assembled CAD view of the same quadcopter from above and to the side, showing the Raspberry Pi with its cooler mounted over the flight-controller stack.
[Caption the assembled view.]
[Caption the assembly animation.]

Technical overview

AirframeCustom 7-inch quadcopter, ~816 g, 6S
Flight controllerSpeedyBee F405 V3 running ArduCopter 4.6
Companion computerRaspberry Pi 4
CameraCamera Module 3 (IMX708), 1280×720, 2 ms shutter, focus fixed at 1 m
PerceptionAprilTag 36h11 via OpenCV ArUco; monocular pose from tag corners
ControlOuter PD loop on relative position; yaw held on the tag bearing
CommunicationUART, MAVLink 2 at 921600 baud
Flight modeGUIDED_NOGPS, from a custom ArduPilot build
SimulationArduPilot SITL, with a synthetic tag closing the full loop
MechanicalSolidWorks — custom Raspberry Pi, camera and GPS mounts
Radio / GPSELRS; HGLRC M100 Pro GPS with QMC5883L compass

Status

ComponentStatus
AprilTag detection and pose estimationRunning on the vehicle
Camera tuning for vibration and blurMeasured on hardware
MAVLink link and telemetryHardware tested
Outer PD controllerTuned in SITL
Control path and sign conventionsVerified in SITL
Closed-loop convergence to a tagVerified in SITL
Camera intrinsic calibration toolingImplemented
Autonomous position hold in physical flightIn development
Inner-loop AUTOTUNE on the real airframeNot yet performed

[What works in simulation, what works on the vehicle, and the gap between them.]

Limitations and what comes next

[The limiting factor, and why more software will not fix it.]

  • [Next step.]
  • [Next step.]
  • [Longer term.]