Overview
Master-slave architecture enabling multiple drones to coordinate search zones efficiently, reducing search time by 40% in simulations with robust failure handling.
The Problem
Search and rescue in large areas is slow with single agents. Manual coordination of multiple drones is complex and error-prone.
The Solution
Developed distributed coordination system where master drone assigns search zones to slave drones based on area coverage optimization. Drones communicate findings in real-time and adapt to individual drone failures.
Project Gallery
Technical Architecture
Distributed multi-agent system with centralized coordination
Master Coordinator
Assigns search zones, aggregates findings, handles drone failures
Slave Drones
Execute assigned search patterns, report findings, request reassignment
Communication Layer
ROS-based messaging for inter-drone coordination
Path Planning
A* algorithm for collision-free navigation
Methodology
- Simulation environment: Gazebo with custom search scenarios
- Drone count: 4 slave drones + 1 master
- Search area: 1km² with obstacles
- Communication: ROS topics with 10Hz update rate
- Failure scenarios: Battery depletion, communication loss, GPS errors
Results & Impact
Key Impact
- Demonstrated viability of swarm search
- Robust to individual drone failures
- Scalable to larger swarm sizes
- Potential for real-world SAR deployment
Challenges & Solutions
Communication Latency
Predictive position updates and local decision-making autonomy
Zone Assignment Optimization
Greedy algorithm with dynamic reassignment based on progress
Collision Avoidance
Distributed collision detection with priority-based resolution
Key Implementation
Master Coordinator Logic
class MasterCoordinator:
def __init__(self, search_area, num_drones):
self.search_area = search_area
self.drones = self.initialize_drones(num_drones)
self.zones = self.partition_area(search_area, num_drones)
def assign_zones(self):
"""Assign search zones to available drones"""
for drone, zone in zip(self.drones, self.zones):
if drone.is_available():
drone.assign_zone(zone)
print(f"Assigned {zone} to {drone.id}")
def handle_failure(self, failed_drone_id):
"""Reassign zone when drone fails"""
failed_zone = self.get_zone(failed_drone_id)
available_drone = self.find_nearest_available()
if available_drone:
available_drone.assign_zone(failed_zone)
print(f"Reassigned {failed_zone} to {available_drone.id}")
def aggregate_findings(self):
"""Collect and merge findings from all drones"""
findings = []
for drone in self.drones:
findings.extend(drone.get_findings())
return self.merge_overlapping(findings)