Python 3.8+ CFD Arduino CAD CFD Analysis Control IMU RF Communication PWM Control Biomechanics Build Status Hardware PRs Welcome King's College London License
A bio-inspired flying robot designed for seamless wildlife monitoring and conservation
This repository contains the full implementation of my MSc Robotics Engineering Group Project at King’s College London:
R.O.B.I.N. - Robot Ornithopter Bio-Inspired by Nature
MSc Robotics Engineering Group Project | King’s College London | 2025
This project develops a bio-inspired flapping-wing aerial robot combining:
- Lightweight mechanical design and CAD-based prototyping
- Transverse crank-driven flapping-wing actuation
- Aerodynamic analysis via transient CFD simulations
- Embedded control using Arduino-based electronics
- Experimental lift, glide and propulsion testing
The system was designed, simulated, prototyped and experimentally validated as a low-disturbance aerial platform for environmental monitoring and conservation applications.
R.O.B.I.N. is a bio-inspired flapping-wing aerial robot developed to investigate low-disturbance flight for environmental monitoring applications. The system integrates lightweight mechanical design with a transverse crank-based flapping mechanism to generate symmetric wing motion, enabling lift and forward propulsion without conventional rotors. Aerodynamic behaviour is analysed through transient CFD simulations to characterise lift generation, flow separation and wake dynamics. It is validated via physical prototyping and experimental testing. The platform incorporates embedded control using Arduino-based electronics, RF communication and inertial sensing to support controlled flight experiments and performance evaluation. R.O.B.I.N. serves as an experimental testbed for studying bio-inspired aerial locomotion, aerodynamics and system-level design trade-offs in flapping-wing robotics.
- 1. Project Motivation
- 2. Key Features
- 3. System Architecture
- 4. Mechanical Design
- 5. Electronics & Control
- 6. Software
- 7. CFD Analysis
- 8. Testing & Results
- 9. Installation & Setup
- 10. Future Work
- 11. Bill of Materials
- 12. Sustainability & Impact
- 13. Team
- 14. Acknowledgments
- 15. License
- 16. References
Traditional UAVs used in wildlife monitoring suffer from critical issues:
- Noise pollution: Causes anti-predatory responses in animals
- Stress induction: Increases mortality rates in wildlife
- Data quality: Animals flee before adequate observation
- Environmental disruption: High-frequency motor sounds
Solution: A bio-inspired approach that:
- Mimics natural bird flight for seamless habitat integration
- Reduces acoustic signature by 70% compared to traditional drones
- Enables closer wildlife observation without behavioral disruption
- Supports UN SDG 15: Life on Land
- Dual Transverse Shaft Mechanism: Converts rotary to flapping motion
- Adjustable Crank Offset: Variable flapping amplitude (formula-driven design)
- Lightweight Construction: 248g total weight with optimized structure
- Bio-inspired Wing Profile: Flexible steel-frame + nylon membrane
- RF Wireless Control: 2000bps bidirectional communication
- IMU Stabilization: MPU6050 with complementary filter (α=0.98)
- Dual Servo Tail: Independent pitch and yaw control
- Brushless Motor: 2300KV BLDC with ESC integration
- CFD Simulation: Laminar flow analysis at Re×ばつ104
- Lift Testing: Spring scale measurements up to 204 RPM
- Aerodynamic Optimization: Mesh refinement with boundary layer analysis
- Material Testing: Iterative prototyping with PLA, steel, nylon
┌─────────────────────────────────────────────────────────┐
│ R.O.B.I.N. System │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ RF Remote │────────▶│ Arduino │ │
│ │ Controller │ 2000bps│ Nano │ │
│ │ (Joystick + │ │ (Receiver) │ │
│ │ Pot) │ └──────┬───────┘ │
│ └──────────────┘ │ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ BLDC │ │ Servo │ │ MPU6050 │ │
│ │ Motor │ │ (Tail) │ │ (IMU) │ │
│ │ +ESC │ │ x2 │ │ │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────┐ │
│ │ Flapping Tail Feedback│ │
│ │ Mechanism Control Loop │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
The heart of R.O.B.I.N. is a dual transverse shaft mechanism inspired by avian biomechanics.
Design Equations:
Gear Reduction = (Motor KV ×ばつ Battery Voltage) / (Flapping Rate ×ばつ 60)
= (2300 ×ばつ 7.4V) / (6Hz ×ばつ 60) ≈ 50:1
Flapping Angle φ = sin−1(Crank Offset / 12mm)
Amplitude = 2 ×ばつ Wing Span ×ばつ sin(φ)
Key Components:
- 50:1 gear train (PLA gears + steel shafts)
- ×ばつ precision bearings (heat stress mitigation)
- 2300KV BLDC motor
- 2S LiPo battery (7.4V)
Front View of Flapping Mechanism in Fusion Model
Front View of Flapping Mechanism in Fusion Model
Side View of Flapping Mechanism in Fusion Model
Side View of Flapping Mechanism in Fusion Model
IMG-20250319-WA0011
CAD model of flapping mechanism
Specifications:
- Wingspan: 1020mm (optimized for lift-to-weight ratio)
- Frame Material: 1.8mm steel rods (×ばつ 500mm + bracing)
- Membrane: Nylon sheet (semi-elliptical shape)
- Wing Loading: ~0.8 g/cm2 (avian-inspired)
- Degrees of Freedom: Single z-axis motion
Biomimetic Features:
- Flexible trailing edge (natural deformation during flapping)
- Single support batten (mimics bird wing bone structure)
- Cambered profile potential for lift optimization
Schematic of intended wing design
Wing schematic
Fully assembled wings
Fully assembled wings
Mechanical properties of wing membrane and frame materials
Material comparison table
Material Selection Analysis:
| Material | Young's Modulus | Tensile Strength | Density | Selected |
|---|---|---|---|---|
| Elastane | 10-100 MPa | 500-1000 MPa | 1210-1350 kg/m3 | ✓ (ideal) |
| Nylon | - | - | - | ✓ (used) |
| Carbon Fiber | 200-500 GPa | 3-7 GPa | 1600-2000 kg/m3 | Future work |
Center of Gravity Optimization:
- Positioned 26% of chord length from nose
- Balanced for pitch stability during flight
- Total mass: 248g (97g body + 151g electronics/wings)
CAD location of the Centre of Gravity of the Prototype, computed through Fusion 360
CAD location of the Centre of Gravity of the Prototype, computed through Fusion 360
Fully assembled robot
Fully assembled prototype
Full assembled robot (top view)
Full assembled prototype (top view)
Close-up of gearbox and electronics
Close-up of gearbox and electronics
| Component | Model | Quantity | Function |
|---|---|---|---|
| Microcontroller | Arduino Nano | 2 | Processing & control |
| Motor | 2300KV BLDC | 1 | Flapping actuation |
| ESC | 30A | 1 | Motor speed control |
| IMU | MPU6050 | 1 | Orientation sensing |
| Servos | Micro 9g | 2 | Tail control |
| RF Module | RH_ASK 433MHz | 2 | Wireless communication |
| Battery | 2S LiPo (7.4V) | 1 | Power supply |
| Joystick | Analog 2-axis | 1 | Manual control |
| Potentiometer | 10kΩ | 1 | Speed adjustment |
Manual Control:
- Potentiometer: Motor PWM (1000-2000μs range)
- Joystick X-axis: Tail servo angle (30-150°)
Autonomous Stabilization:
- MPU6050 reads pitch angle
- Complementary filter (α=0.98): Combines gyro + accelerometer
- Servo correction: Opposes pitch deviation (×ばつ multiplier)
- Mixed control: 70% manual + 30% feedback
Circuit Diagram of Joystick Controller
Circuit Diagram of Joystick Controller
Circuit Diagram of BLCD Motor integration on Arduino
Circuit Diagram of BLCD Motor integration on Arduino
Adapted from A. Raj (2018)
Circuit Diagram of MPU, tail Feedback system
Circuit Diagram of MPU, tail Feedback system
// Key Features: // - Reads potentiometer (motor speed) and joystick (tail control) // - Maps analog values to PWM ranges // - Transmits via RF module at 2000bps
// --- Program for the Wireless Transmitter / Controller --- #include <RH_ASK.h> // RadioHead ASK library for RF communication #include <SPI.h> // Required even if not directly used // --- RF Module Setup --- // RH_ASK(bitrate, rxPin, txPin, pttPin) RH_ASK rf_driver(2000, 11, 12, 0); // --- Input Pins --- const int PotPin = A1; // Potentiometer connected to analog pin A1 const int JoystickPin = A0; // Joystick axis (e.g., horizontal) connected to A0 // --- Data Structure for Transmission --- // Groups potentiometer and joystick values into a single packet struct ControlData { uint16_t potValue; // Motor PWM value (mapped 1000–2000 for ESC) uint8_t joyValue; // Servo angle (mapped 30–150 for tail control) }; void setup() { Serial.begin(9600); // Start Serial for debugging output // Initialize RF transmitter if (!rf_driver.init()) { Serial.println("Transmitter initialization failed!"); } else { Serial.println("Transmitter ready"); } } void loop() { // --- Read Raw Analog Inputs --- int raw_JoystickValue = analogRead(JoystickPin); // 0–1023 int raw_PotValue = analogRead(PotPin); // 0–1023 // --- Map Inputs to Application Ranges --- // Convert joystick input to an angle between 30° and 150° uint8_t JoystickValue = map(raw_JoystickValue, 0, 1023, 30, 150); // Convert potentiometer input to PWM pulse width between 1000–2000μs uint16_t PotValue = map(raw_PotValue, 0, 1023, 1000, 2000); // --- Create a Control Packet --- ControlData data = { PotValue, JoystickValue }; // --- Transmit the Data Packet via RF --- rf_driver.send((uint8_t *)&data, sizeof(data)); // Send binary data rf_driver.waitPacketSent(); // Ensure data is fully sent // --- Debug Output to Serial Monitor --- Serial.print("Sent -> Motor PWM: "); Serial.print(PotValue); Serial.print(" | Tail Servo: "); Serial.println(JoystickValue); delay(50); // Optional small delay to control transmission rate }
Control Flow Diagram:
┌─────────────────────────────────────────────┐
│ RF Transmitter Loop │
├─────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Read │ │ Read │ │
│ │ Potentiometer│ │ Joystick │ │
│ │ (A1) │ │ (A0) │ │
│ │ 0-1023 │ │ 0-1023 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Map to │ │ Map to │ │
│ │ 1000-2000μs │ │ 30-150° │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └──────────┬──────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ Pack into │ │
│ │ ControlData │ │
│ │ struct │ │
│ └────────┬───────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ RF Transmit │ │
│ │ (433MHz) │ │
│ │ 2000bps │ │
│ └────────────────┘ │
│ │
└─────────────────────────────────────────────┘
Pin Configuration:
| Component | Pin | Type | Range |
|---|---|---|---|
| Potentiometer | A1 | Analog Input | 0-1023 (raw) → 1000-2000μs (PWM) |
| Joystick (X-axis) | A0 | Analog Input | 0-1023 (raw) → 30-150° (servo) |
| RF TX | D12 | Digital Output | 433MHz @ 2000bps |
| RF RX | D11 | Digital Input | (unused on transmitter) |
Dependencies:
RadioHead Library (RH_ASK) - Install via Arduino Library Manager
Usage:
- Connect potentiometer to A1 with 10kΩ pull-down
- Connect joystick X-axis to A0
- Connect 433MHz RF transmitter module to D12
- Power Arduino with USB or 9V battery
- Open Serial Monitor (9600 baud) to view transmitted values
Objectives:
- Validate aerodynamic performance
- Analyze flow separation and vortex formation
- Optimize angle of attack for maximum lift
Parameters:
- Reynolds Number: Re ≈ ×ばつ104
- Inflow Velocity: U = 4 m/s
- Mean Chord: L = 0.085 m
- Air Density: ρ = 1.225 kg/m3
- Dynamic Viscosity: μ = ×ばつ10−5 kg/(m·s)
Mesh Configuration:
- Boundary Layer Thickness: δ ≈ 2.8 mm
- First Layer Height: h1 ≈ 0.108 mm
- Number of Prism Layers: 10
- Growth Rate: r = 1.2
Time Stepping:
- Flapping Frequency: f = 0.57 Hz
- Time Step: Δt = ×ばつ10−3 s
- Steps per Cycle: ~825
Key Findings:
- Peak Lift: Initial transient spike due to flow establishment
- Average Lift: 0.51 N (lower than peak, indicates stall approach)
- Flow Behavior: Leading-edge vortex formation, periodic oscillations
- Conclusion: High angle of attack leads to separation; flexible wings needed
Mesh Layout and Aerodynamic Force Distribution of Flapping-Wing Simulation
Mesh Layout and Aerodynamic Force Distribution of Flapping-Wing Simulation
Pressure Field, Velocity Field, and Aerodynamics
Pressure Field, Velocity Field and Aerodynamics
Test Setup:
- Spring scale (inverted mounting)
- PLA stabilization frame
- Incremental RPM testing (80 → 204 RPM)
Results:
- Maximum Lift: 0.7 N @ 204 RPM (Test 1)
- Relationship: Quadratic correlation between lift and RPM
- Challenges: Vibration at high speeds, material fatigue
Initial testing rig
Pressure Field, Velocity Field and Aerodynamics
Frame to stabilise robot during testing
Frame to stabilise robot during testing
Conceptualized Approach
(a) Conceptualized 2nd Test Approach, (b) In practice Test Rig/Approach, (c) Spring Scale Representation
(Right) Comparative results of Test 1 and Test 2
Comparative results of Test 1 and Test 2
Methodology:
- Electronics removed for weight reduction
- Launch angle: 30-45°
- Tail angle optimization: 15-20°
- Distance measurement: 3-4 meters
Observations:
- Critical Factors: Launch angle and tail trim
- Front-Heavy Issue: Requires precise pitch control
- Optimal Configuration: 35° launch + 17° tail angle
| Metric | Target | Achieved | Status |
|---|---|---|---|
| Wingspan | 1000mm | 1020mm | ✅ |
| Total Weight | <200g | 248g | |
| Lift Force | >0.5N | 0.7N | ✅ |
| Glide Distance | >3m | 3-4m | ✅ |
| Flapping Rate | 6Hz | 3.4Hz (204RPM) | |
| Flight Duration | 30s | - | ❌ |
Conclusion:
- Lift generation successful
- Aerodynamics validated
- Weight optimization needed
- Sustained flight requires material upgrades
- Arduino IDE 1.8.19+
- Fusion 360 (for CAD files)
- ANSYS (for CFD analysis)
- 3D Print Components
# Print settings:
- Material: PLA
- Infill: 100% (flapping mechanism)
- Layer Height: 0.2mm
- Supports: Yes (gear train)-
Wing Construction
- Cut steel rods to dimensions (Table in docs/)
- Form U-shapes for pivots
- Attach nylon membrane
- See:
docs/assembly_guide.md
-
Electronics Integration
- Follow circuit diagrams in
hardware/schematics/ - Solder connections on perfboard
- Mount components in body frame```
- Follow circuit diagrams in
- ESC Calibration
1. Set potentiometer to maximum
2. Power on ESC
3. Wait for beep sequence
4. Set potentiometer to minimum
5. Wait for confirmation beeps
- Servo Centering
// Run servo_calibration.ino // Adjust mechanical linkages to achieve: - Tail centered at 90° - Full range: 30° to 150°
- MPU6050 Offset
// Run mpu_calibration.ino // Place robot on flat surface // Record offset values
Proposed Improvements:
-
Foldable Wings
- Four-bar linkage mechanism
- Reduces drag on upstroke by 40%
- Increases net lift per cycle
-
Elliptical Gears
- Variable gear ratio per cycle
- Faster upstroke, slower downstroke
- Improved motor efficiency
-
Independent Roll Control
- Lateral wing frame sliding
- Differential lift generation
- Enhanced maneuverability
-
Material Upgrades
- Carbon fiber wing frame (−60% weight)
- Machined metal gears (−95% backlash)
- ABS mechanism components (+200% heat resistance)
-
Advanced Control
- PID controller implementation
- Setpoint regulation for hovering
- Trajectory tracking for autonomous flight
Feedback control Using PID
Feedback control Using PID
Control Electronics (43ドル)
| Item | Price | Qty | Total | Weight |
|---|---|---|---|---|
| BLDC Motor* | 14ドル | 1 | 14ドル | 97g |
| ESC* | 10ドル | 1 | 10ドル | - |
| 2S Battery* | 6ドル | 1 | 6ドル | - |
| Micro Servos | 5ドル | 2 | 10ドル | - |
| MPU6050* | 3ドル | 1 | 3ドル | - |
Body Components (31ドル)
| Item | Price | Qty | Total | Weight |
|---|---|---|---|---|
| PLA Filament | 14ドル | 1 | 14ドル | 77g |
| Bearings* | 2ドル | 6 | 12ドル | - |
| Steel Shafts | 5ドル | 1 | 5ドル | - |
Wings & Tail (10ドル)
| Item | Price | Qty | Total | Weight |
|---|---|---|---|---|
| Nylon Sheet | 9ドル | 1 | 9ドル | 74g |
| PLA Filament | 14ドル | 0.1 | 1ドル | - |
| Steel Rods | N/A | 2 | N/A | - |
*Components marked with * were sourced from personal inventory or previous projects
Environmental Impact: 327.7 kg CO2 eq
| Component | Impact (kg CO2 eq) | Percentage |
|---|---|---|
| Battery | 231.6 | 71% |
| Wings (Steel + Nylon) | 52.5 | 16% |
| Body (PLA) | 17.9 | 5% |
| Other | 25.7 | 8% |
Mitigation Strategies:
- Solar panel integration (under development)
- Recyclable material selection
- Long operational lifespan design
UN Sustainable Development Goal 15: Life on Land
This robot supports:
- Wildlife habitat monitoring
- Anti-poaching surveillance
- Biodiversity data collection
- Ecosystem health assessment
Department of Engineering, King's College London
- Imranur Ahmed
- Abdullah Bhuiyan Begum
- Jed Gawan
- Dev Ajay Ateya
- Mohamed Mohamed
- Tan Guo
- Nii Tettey
Supervisors:
- Dr. Juan Li
- Dr. Francesco Ciriello
- Festo Bionic Learning Network - Inspiration from BionicSwift and BionicFlyingFox
- KCL Maker Space - Fabrication facilities and equipment
- Ornithopter.org - Flapping mechanism design resources
This project is licensed under the MIT License - see the LICENSE file for details.
If you use this work in your research, please cite:
@misc{robin2025, author = {Ahmed, I. and Begum, A.B. and Gawan, J. and Masone, G.D. and Ateya, D.A. and Mohamed, M. and Guo, T. and Tettey, N.}, title = {R.O.B.I.N.: Robot Ornithopter Bio-Inspired by Nature}, year = {2025}, publisher = {King's College London}, howpublished = {\url{https://github.com/Degas01/bio-inspired_ornithopter}}, }
- Millner et al. (2023) - "Opportunities and Risks of Aerial Monitoring for Biodiversity Conservation"
- WWF (2024) - Living Planet Report
- Macke et al. (2024) - "Drone Noise Impact on Wildlife"
- Tobalske & Dial (2007) - "Aerodynamics of Wing-Assisted Incline Running"
- Festo BionicSwift (2018)