Bringing together drone enthusiasts to create the extraordinary through technology
Generations of self-developed and iterated drone platforms
1-kilogram payload capacity and is designed to perform autonomous target recognition, object delivery, and 2D mapping tasks.
LiDAR-based autonomous drones feature obstacle-avoidance capabilities in dense environments and the ability to generate 3D semantic maps.
Employ neural-network-based obstacle avoidance, with optimization performed on the onboard NPU
High-Maneuver Flight Control Based on Reinforcement Learning
equipped with a swarm-based unknown-environment coverage algorithm and 2D mapping capabilities.
Oversees overall project planning and planner algorithm research
Specializes in airframe structural design and powertrain optimization
Responsible for flight/Motion control and computer vision algorithm development
Researches UAV communication links, flight controller chips
Constantly pushing boundaries in competitions and in the lab
SUAS competition 2021, 2022, 2023
Final Year Project 2020, 2021, 2022, 2023, 2024, 2026
MTR Drone Project 2025, 2026
HKU-THU Drone Project 2025
Inno Show 2020, 2021, 2022, 2023, 2024
Student Interest Course 2025, 2026
Core research topics and engineering projects in progress
IARC Competition Mission 10, About using a swarm drone system for Mines Detection and Mapping in Unknown Areas
Based on Motion Capture Technology or Lighthouse System to control a swarm of Crazyflie drones and form a pattern
Investigating the application of reinforcement learning algorithms for autonomous control of drone swarms in dynamic environments
A complete drone learning path from the ground up — covering hardware, flight control, ROS2, simulation, and environmental perception
A drone can be decomposed into three major subsystems:
Multirotor drones achieve various flight maneuvers by adjusting the speed differences between motors. The flight controller computes a target state (desired position, orientation, attitude, thrust) and compares it with the current state measured by sensors. The error drives motor commands:
The transformation from desired position (x, y, z) and orientation (φ, ω, κ) down to individual motor PWM signals goes through multiple cascaded PID loops: Position → Velocity → Attitude → Rate → Motor Mixer → PWM.
Drones use outer-ring rotor brushless motors where the outer casing rotates around fixed internal windings. This design provides higher torque and better heat dissipation compared to inner-rotor designs.
The ESC receives low-voltage PWM signals from the flight controller, processes them, and drives MOSFETs to deliver high-voltage three-phase power:
PWM Duty Cycle: As the PWM duty cycle increases from 50% to 100%, the effective voltage delivered to the motor increases, causing it to spin faster.
The FC is a real-time microcontroller (typically STM32-based) dedicated to low-latency flight-critical tasks:
Key FC sensors onboard: IMU (accelerometer + gyroscope), barometer, magnetometer (compass). External: GPS module, rangefinder, optical flow sensor.
A Linux-based companion computer (Raspberry Pi, Jetson Nano/Orin, Intel NUC) handling computationally intensive tasks:
Real-time flight control requires deterministic sub-millisecond timing that a Linux OS cannot guarantee. Separating the real-time FC from the high-level onboard computer ensures that critical stabilization loops are never interrupted by CPU-intensive vision or planning tasks.
Modern drone IMUs are fabricated on silicon chips using MEMS technology, integrating both a 3-axis accelerometer and a 3-axis gyroscope in a tiny package.
Uses the Coriolis force principle:
Uses a micro-flexible hinge with a proof mass:
6-Axis IMU: 3-axis gyro + 3-axis accelerometer. 9-Axis IMU: adds 3-axis magnetometer (compass).
| Component | Recommended Model | Key Specs |
|---|---|---|
| Frame | F450 | 450mm wheelbase, glass-fiber arms, classic entry frame |
| Flight Controller | Pixhawk 2.4.8 / CUAV V5+ | STM32F4/F7, dual IMU, supports ArduPilot/PX4 |
| Motor | 2212 920KV | Outer-rotor brushless, pairs with 10-inch props |
| ESC | 30A BLHeli_S | Supports DShot300/600 digital protocol |
| Battery | 4S 5200mAh LiPo | ~20 min hover, 30C+ discharge rate |
| GPS+Compass | M8N GPS / Here3 | Dual GNSS, external compass, safety switch |
| Transmitter | RadioMaster TX16S | OpenTX/EdgeTX, multi-protocol module, 16 channels |
| Receiver | FrSky X8R / ELRS 2.4G | SBUS/PPM output, telemetry capable |
PX4 is an open-source flight control firmware running on NuttX RTOS. Its two core software components:
Both control and estimation run directly on the flight controller hardware (STM32 processor), ensuring real-time performance.
QGC is the primary ground control station for PX4-based drones. Key functions:
Scenario: You have a drone with a LiDAR. You want it to move forward and stop in front of a wall.
If you write everything in one file: read LiDAR hardware port → detect range → make decision → send command to FC... you face problems:
You'd think: "Write a separate LiDAR reader, distribute messages via queue/pipe/shared memory." And for multi-machine: "Use TCP/UDP." But for incredibly large and complex systems, configuring all this manually is extremely inconvenient. This is why we need ROS.
ROS2 is a communication middleware built on top of DDS (Data Distribution Service). DDS handles all the complexity of distributed communication — ROS2 further simplifies DDS usage by providing a clean API. Your code just calls simple publish/subscribe functions; ROS2 handles everything underneath.
DDS is primarily data-driven communication middleware. Data transmission is handled by DataReader/DataWriter, with QoS (Quality of Service) controlling transmission quality (reliability, durability, deadline, etc.). ROS2 inherits all properties of DDS.
| Command | Usage |
|---|---|
ros2 run <pkg> <node> | Run a node from a package |
ros2 node list | List all active nodes |
ros2 node info <node> | Show node details (pub/sub, services) |
ros2 topic list | List all active topics |
ros2 topic echo <topic> | Print messages published on a topic |
ros2 topic info <topic> | Show topic type and publishers/subscribers |
ros2 topic pub <topic> <msg> | Publish a message from CLI (no node needed) |
ros2 interface show <type> | Display message/service/action structure |
ros2 service list | List all active services |
ros2 service call <srv> <data> | Call a service from CLI |
colcon build | Build ROS2 workspace packages |
rqt_graph | Visualize node-topic connection graph |
mkdir -p ~/ros2_ws/src && cd ~/ros2_wsros2 pkg create --build-type ament_python my_packagecolcon buildsource install/setup.bashros2 run my_package my_nodePX4 uses uORB (micro Object Request Broker) as its internal messaging system, while ROS2 uses DDS. These are different communication middlewares — we need a bridge to translate between them.
PX4 automatically activates all uORB topics when powered on. The MicroXRCEAgent (also called uXRCE-DDS) runs on the onboard computer and bridges uORB ↔ DDS, making PX4 topics available as ROS2 topics.
Two kinds of information are needed for drone control:
/fmu/in/trajectory_setpoint/fmu/out/vehicle_odometryTo control the drone in Offboard mode:
VehicleCommand service to arm, takeoff, land, and change flight modesIf you want to build a drone, simulation testing before actual flight is essential. It allows you to:
Team Recommendation: Use Gazebo with PX4 SITL (Software In The Loop).
SDF is an XML-based format for describing simulation objects. The four main element types:
sw_urdf_exporter, then convert URDF to SDF.PX4 has provided a complete simulation environment. To get started:
git clone https://github.com/PX4/PX4-Autopilot.git --recursivebash ./PX4-Autopilot/Tools/setup/ubuntu.shmake px4_sitl gazeboChange the vehicle type by specifying the airframe:
make px4_sitl gazebomake px4_sitl gazebo_standard_vtolGazebo worlds define the environment. PX4 includes several:
PX4 also supports multi-vehicle simulation for swarm testing. Each vehicle runs its own PX4 instance with unique MAVLink IDs and UDP ports, all within a single Gazebo world.
With MicroXRCEAgent running, the simulated drone's PX4 topics become available as ROS2 topics — identical to real hardware. This means you can develop and test your entire ROS2 control stack in simulation before deploying to a real drone.
Getting correct position and velocity is very difficult because:
The solution: KF (linear systems) → EKF (nonlinear systems)
The robot has a state (e.g., position + velocity). We don't know the actual values; there are many possible combinations. KF assumes each variable follows a Gaussian distribution ℕ(μ, σ²): mean μ is the most likely state, variance σ² quantifies uncertainty.
The state at time k is represented by two quantities:
x̂k ∈ ℝn (best estimate), Pk ∈ ℝn×n (covariance matrix)
Position and velocity are correlated: high velocity → likely moved far; slow → likely didn't move much. This correlation is captured in the covariance matrix P — each element Pij = Cov(xi, xj) represents the joint uncertainty between state variables i and j. Off-diagonal terms encode this cross-information.
Use the system's motion model Fk and control input uk to predict the next state:
x̂k|k−1 = Fk · x̂k−1 + Bk · uk
Pk|k−1 = Fk · Pk−1 · FkT + Qk
where Qk is the process noise covariance — it captures external disturbances (wind, motor vibrations, modeling errors). Adding Qk inflates the uncertainty to account for unmodeled effects.
Incorporate sensor measurement zk with measurement model Hk and sensor noise R:
ỹk = zk − Hk · x̂k|k−1 (innovation / measurement residual)
Sk = Hk · Pk|k−1 · HkT + R (innovation covariance)
Kk = Pk|k−1 · HkT · Sk−1 (Kalman Gain)
x̂k = x̂k|k−1 + Kk · ỹk
Pk = (I − Kk · Hk) · Pk|k−1
Kk = PpredHT / (HPpredHT + R). Two extreme cases:
K elegantly solves: "Given two Gaussian distributions (prediction and measurement), what's the most likely true state?" — it's the weighted overlap (product) of the two Gaussians, with weights determined by their relative uncertainties.
Real drone dynamics are nonlinear: xk+1 = f(xk, uk) + wk, zk = h(xk) + vk. EKF linearizes at the current estimate:
Fk = ∂f/∂x |x̂k−1 (state transition Jacobian)
Hk = ∂h/∂x |x̂k|k−1 (measurement Jacobian)
Then apply the standard KF prediction/update equations using these Jacobians. PX4 uses EKF2 to fuse IMU (250+ Hz), GPS (5-10 Hz), magnetometer, barometer, optical flow, and vision data into a consistent, high-rate state estimate on the FC in real-time.
Humans recognize letters through 2D features, objects through 3D features, motion through 4D features (3D + time), and mathematical relationships through higher-dimensional features. In the past, engineering tried to use hand-crafted features to replicate functions — but the world is far too complex. Some features may never be fully understood by humans.
The core approach to feature extraction is: define a basis function, then perform a dot product between that basis function and your data. This separates features by measuring how much of each basis function is present.
Treat each frequency (sin x, sin 2x, sin 3x…) as an axis of a coordinate system. A sound signal is a vector in that system. By dot-product with each basis function axis, you obtain the coefficients (how much of each frequency is present). Convolution solves the time-alignment problem (the signal may start at different times).
Same principle applied to images. The basis functions are small matrices (e.g., 3×3 kernels). Convolution solves the position problem (features may appear anywhere in the image). Through years of experience, people have discovered useful kernel patterns: edge detectors (Sobel), corner detectors, blob detectors (LoG).
3D Convolution: Applied to volumetric data (e.g., CT scans, point cloud voxels). 4D Convolution: 3D + time — for video understanding and spatio-temporal features. Transformer (Attention): Extends this idea to language and other domains — self-attention as learned dot-product feature extraction.
How do we know which features are important? Historically, people defined them arbitrarily (e.g., VIO feature detectors). The results were unsatisfactory until neural networks emerged. Humans delegate the "find useful features" process to machines via gradient descent. As layers deepen, features become features of features — from edges → textures → object parts → full objects. When layers get too deep to design, fully connected networks emerged, though they're being replaced by specialized architectures (CNN, Transformer, GNN).
For all animals, 2D object detection is crucial — especially for birds that must spot prey from high altitudes. For drones, object detection enables target recognition, obstacle avoidance, search and rescue, and autonomous landing.
YOLO is a real-time object detection system that treats detection as a single regression problem —直接从图像像素到边界框坐标和类别概率. It's widely used due to its speed-accuracy balance.
The team has prepared custom datasets for mines detection as part of the IARC competition. Using PyTorch (GPU or CPU version), we train YOLO models to detect and classify target objects from drone camera feeds. This integrates with the ROS2 perception pipeline: Camera → YOLO Node → Detection Topic → Planner Node → Offboard Control.
Three main measurement methods:
LiDAR types by scanning mechanism: Mechanical (rotating assembly), MEMS semi-solid-state (micro-mirror), rotating mirror, Flash (illuminates entire scene at once).
The core challenge: finding corresponding points in two images (the stereo matching problem).
Traditional Approaches:
Neural Network Approach — PSMNet: Instead of hand-crafted feature matching, PSMNet uses a CNN to learn stereo matching end-to-end — from image pair to dense disparity map.
Using a single camera with deep learning to estimate depth from monocular cues (texture gradient, occlusion, relative size, perspective). While less accurate than stereo or LiDAR, it's lightweight and cost-effective for certain applications.
VIO fuses data from camera and IMU sensors to achieve "complementary advantages":
Together: IMU provides short-term motion prediction (bridging camera blind spots during fast motion), while camera provides long-term drift correction (constraining IMU bias estimates).
A state-of-the-art tightly-coupled VIO framework supporting stereo+IMU and mono+IMU configurations. Widely used in drone research for GPS-denied navigation.
Other advanced perception methods the team explores:
Given a map of the environment (from perception) and a goal, the planner must compute a collision-free, dynamically feasible trajectory from start to goal. For drones, this is a high-dimensional problem: position (3D) + yaw (1D) + time.
A* (A-Star) is the classic grid-search algorithm that finds the shortest path by combining actual cost-to-come g(n) with heuristic cost-to-go h(n):
f(n) = g(n) + h(n)
EGO-Planner (ESDF-free Gradient-based local Planner) is a state-of-the-art method for aggressive drone flight:
Instead of building an explicit Euclidean Signed Distance Field (ESDF), it computes collision costs directly from the obstacle point cloud and back-propagates gradients to deform a B-spline trajectory away from obstacles:
minQ J = λsJsmooth + λcJcollision + λfJfeasibility
where Q is the B-spline control points, Jsmooth penalizes acceleration/jerk, Jcollision pushes the trajectory away from obstacles via gradient descent, and Jfeasibility enforces velocity/acceleration limits.
Quadrotors are differentially flat: the full state (position, velocity, attitude, angular velocity) can be expressed as functions of the flat outputs (x, y, z, yaw) and their derivatives. This means we can plan in the 3D position space and recover the full orientation later — dramatically simplifying the planning problem.
When a drone enters an unknown environment, it must simultaneously map and decide where to go next to maximize information gain — trading off exploration (visiting new areas) vs. exploitation (thoroughly mapping known regions).
The classic approach: frontiers are boundaries between known-free and unknown space. The drone greedily navigates to the nearest (or largest) frontier, updates the map, and repeats until no frontiers remain.
A more sophisticated approach: generate candidate viewpoints, evaluate each by expected information gain (how many unknown voxels become visible), and select the one maximizing gain / travel_cost. NBV naturally handles 3D structures like building facades and bridges that frontier methods miss.
Treats the occupancy map probabilistically. Each grid cell has entropy (uncertainty):
H(cell) = −pocc log pocc − pfree log pfree
A ray cast through cells reduces their entropy. The expected Information Gain of a candidate viewpoint is the sum of entropy reductions along all its potential rays. This provides a principled, mathematically grounded approach to exploration — especially important for the IARC competition's unknown-environment coverage task.
Vision-Language-Action (VLA) models are a new paradigm that unifies perception, reasoning, and control into a single model. A VLA takes visual input (camera feed) and natural language instruction (e.g., "fly through the window and land on the red table"), and outputs actions directly.
VLA models typically combine three components:
at = πθ(ot, L)
where ot is the visual observation at time t, L is the language instruction embedding, and at is the action.
VLA models represent the frontier of drone intelligence, bridging high-level human intent with low-level control through a unified learned representation.
Traditional autonomy stacks are modular: Perception → Mapping → Planning → Control. Each module is designed separately, introducing compounding errors. End-to-End approaches learn a direct mapping:
Sensors → Neural Network → Motor Commands
No explicit map, no explicit planner, no hand-tuned controller — the network learns everything from data.
End-to-End approaches align with several of our drone platforms: the NN-based Planning drone (onboard NPU for real-time inference) and the RL-based Flight Control drone (high-maneuverability learned policies). These methods are particularly promising for the IARC competition where unknown, dynamic environments make hand-engineered systems brittle.
The flight controller knows the target state xdes and the current state x (from sensors). The error is:
e(t) = xdes(t) − x(t)
The question PID answers: "By what percentage should I change the throttle to reduce this error?"
Imagine a 1m-tall water tank with a leak. Your goal: keep the water level at 1m. You can only add water; you don't know the leak rate or how much water you add per action.
uP(t) = Kp · e(t)
The larger the error, the more water you add. At 0.2m (error = 0.8), open the tap wide. As the tank approaches 1m (error → 0), the tap closes proportionally.
The Steady-State Error Problem: If the tank leaks 0.1m per cycle and Kp = 0.5, then at 0.8m (error = 0.2): u = 0.5 × 0.2 = 0.1 — exactly matching the leak rate. The water level stays at 0.8m forever. This is Steady-State Error: P alone cannot overcome constant disturbances.
uI(t) = Ki · ∫0t e(τ) dτ
The integral accumulates all past errors. When the water level drops due to leakage, error reappears (>0), the integral keeps growing until uI ≥ leak rate. In steady state: Ki · ∫e = leak rate — the integral term automatically compensates for the constant disturbance that P cannot handle.
uD(t) = Kd · de(t)/dt ≈ Kd · [e(t) − e(t−1)] / Δt
Measures the rate of change of the error. When water is added too quickly (error decreasing fast), D applies a negative correction to prevent overshoot. This is the "braking" term — it anticipates future error from the current trend.
u(t) = Kp·e(t) + Ki·∫0te(τ)dτ + Kd·de(t)/dt
In a drone, PID cascades through multiple layers: Position PID → Velocity PID → Attitude PID → Rate PID → Motor Mixer → PWM → ESCs — each layer's output becomes the next layer's setpoint.
Euler-angle PID suffers from gimbal lock at pitch = ±90° and kinematic singularities — simple subtraction of angles does not represent the shortest rotation. SO(3) geometric control works on the manifold of rotation matrices directly.
Let R ∈ SO(3) be the current rotation matrix and Rd ∈ SO(3) the desired rotation. The attitude error is the geodesic distance on the SO(3) manifold:
eR = ½(RdTR − RTRd)∨
The vee map (∨) extracts a 3-vector from a skew-symmetric matrix: [x]∨ = x for [x]y = x × y.
eω = ω − RTRd ωd
The term RTRd transforms the desired angular velocity from the desired body frame back to the current body frame — necessary because angular velocities live in different tangent spaces at different orientations.
τ = −KR·eR − Kω·eω + ω × Jω
The three terms: Proportional (attitude error restoring torque), Derivative (angular velocity damping), Coriolis (compensates gyroscopic coupling — without this, the controller would fight the drone's natural dynamics).
Define the Lyapunov candidate:
V = ½ eωT J eω + KR·Ψ(R, Rd) ≥ 0
where Ψ(R, Rd) = ½ tr(I − RdTR) is the chordal distance on SO(3). Taking the time derivative along trajectories:
V̇ = −Kω·||eω||2 ≤ 0
By LaSalle's invariance principle, the system converges to the desired attitude almost globally — the only stable equilibrium besides R = Rd is the 180° upside-down configuration, which is an unstable saddle.
At each control step k, solve the finite-horizon optimal control problem:
minu0,...,uN−1 ∑i=0N−1 [ (xi−xref,i)TQ(xi−xref,i) + uiTR ui ] + (xN−xref,N)TQf(xN−xref,N)
subject to: xi+1 = f(xi, ui), xi ∈ X, ui ∈ U, x0 = xcurrent
In practice: MPC runs on the onboard computer (not the FC), generating high-level trajectory setpoints that are tracked by the low-level SO(3) or PID attitude controller on the FC — a hierarchical control architecture.
Drone control is formalized as a Markov Decision Process (MDP):
The objective: find policy πθ(a|s) that maximizes expected cumulative reward:
maxθ 𝔼πθ [ ∑t=0∞ γt R(st, at) ]
Proximal Policy Optimization (PPO) is the most widely used RL algorithm for continuous control. It optimizes a clipped surrogate objective:
LCLIP(θ) = 𝔼t[ min( rt(θ)Ât, clip(rt(θ), 1−ε, 1+ε)Ât ) ]
where rt(θ) = πθ(at|st) / πθold(at|st) is the probability ratio and Ât is the advantage estimate (how much better this action was than average). The clipping prevents destructively large policy updates.
RL control is an active research frontier — our RL-based Flight Control drone (100 km/h, 6 min) and NN-based Planning drone (onboard NPU) are platforms specifically designed for this research.
As emphasized in our Gazebo course, pre-flight simulation testing is essential for drone development. Follow this workflow for any new feature:
Golden Rule: If it hasn't been tested in simulation, it doesn't fly.
| Tool | Category | Description |
|---|---|---|
| Mission Planner | Ground Station | ArduPilot ground control station — setup, tuning, mission planning |
| QGroundControl | Ground Station | PX4 ground control station — calibration, flight modes, telemetry |
| Betaflight Configurator | FC Config | Racing/freestyle drone firmware configuration |
| eCalc | Design | Online powertrain calculator — motor/prop/battery matching |
| Gazebo | Simulation | 3D robotics simulator with physics, sensors, and ROS2 integration |
| rviz2 | Visualization | ROS2 3D visualization — sensor data, robot models, trajectories |
| rosbag2 | Data | Record and replay ROS2 topic data for debugging and dataset creation |
| PyTorch | ML Framework | Deep learning framework for object detection, depth estimation |
| MAVLink Inspector | Debugging | Analyze MAVLink messages between FC and ground station |
| OpenCV | Vision | Computer vision library — image processing, feature extraction |
Contact team leaders for access to private repositories and datasets.
Guiding the team with expertise and vision
Dr. Wang is a Lecturer at HKU and holds a Ph.D. in Mechanical and Automation Engineering from CUHK. His research centers on aerial robotics — spanning motion planning, collision-resilient UAV design, and autonomous inspection systems — with publications at top venues like ICRA and IROS. Passionate about experiential engineering education, he mentors the HKUUAS team in designing, building, and iterating real aerial robotic systems from concept to prototype.
Visit BlogPartner with us or become a part of the team
We are grateful for the generous support from our sponsors who make our research and innovation possible.
Interested in sponsoring us? We'd love to collaborate!
Scan the QR code below to fill out the application form and join the HKUUAS team!
Scan to apply • We welcome all passionate students!