uav_energy_estimate
Calculate UAV flight time and energy consumption using configuration parameters and mission profiles for mission planning.
Instructions
Estimate UAV flight time and energy consumption for mission planning.
Args: uav_config: UAV configuration parameters battery_config: Battery configuration parameters mission_profile: Optional mission profile parameters
Returns: Formatted string with energy analysis results
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| uav_config | Yes | ||
| battery_config | Yes | ||
| mission_profile | No |
Implementation Reference
- aerospace_mcp/tools/propellers.py:87-208 (handler)The primary handler function for the 'uav_energy_estimate' tool. It validates inputs using Pydantic models, calls the core estimation logic from integrations, and formats a detailed human-readable output with recommendations and JSON data.def uav_energy_estimate( uav_config: dict, battery_config: dict, mission_profile: dict | None = None ) -> str: """Estimate UAV flight time and energy consumption for mission planning. Args: uav_config: UAV configuration parameters battery_config: Battery configuration parameters mission_profile: Optional mission profile parameters Returns: Formatted string with energy analysis results """ try: from ..integrations.propellers import ( BatteryConfiguration, UAVConfiguration, ) from ..integrations.propellers import ( uav_energy_estimate as _energy_estimate, ) # Create configuration objects uav = UAVConfiguration(**uav_config) battery = BatteryConfiguration(**battery_config) mission = mission_profile or {} # Run analysis result = _energy_estimate(uav, battery, mission) # Determine aircraft type aircraft_type = "Fixed-Wing" if uav.wing_area_m2 else "Multirotor" # Format response result_lines = [ f"UAV Energy Analysis ({aircraft_type})", "=" * 45, f"Aircraft Mass: {uav.mass_kg:.1f} kg", f"Battery: {battery.capacity_ah:.1f} Ah @ {battery.voltage_nominal_v:.1f}V ({battery.mass_kg:.2f} kg)", ] if uav.wing_area_m2: result_lines.extend( [ f"Wing Area: {uav.wing_area_m2:.2f} m²", f"Wing Loading: {uav.mass_kg * 9.81 / uav.wing_area_m2:.1f} N/m²", ] ) elif uav.disk_area_m2: result_lines.extend( [ f"Rotor Disk Area: {uav.disk_area_m2:.2f} m²", f"Disk Loading: {uav.mass_kg * 9.81 / uav.disk_area_m2:.1f} N/m²", ] ) result_lines.extend( [ "", "Energy Analysis:", f" Battery Energy: {result.battery_energy_wh:.0f} Wh", f" Usable Energy: {result.energy_consumed_wh:.0f} Wh", f" Power Required: {result.power_required_w:.0f} W", f" System Efficiency: {result.efficiency_overall:.1%}", "", "Mission Performance:", f" Flight Time: {result.flight_time_min:.1f} minutes ({result.flight_time_min / 60:.1f} hours)", ] ) if result.range_km: result_lines.append(f" Range: {result.range_km:.1f} km") if result.hover_time_min: result_lines.append(f" Hover Time: {result.hover_time_min:.1f} minutes") # Add recommendations result_lines.extend(["", "Recommendations:"]) if result.flight_time_min < 10: result_lines.append( " ⚠ Very short flight time - consider larger battery or lighter aircraft" ) elif result.flight_time_min < 20: result_lines.append( " ⚠ Short flight time - optimize for efficiency or add battery capacity" ) elif result.flight_time_min > 120: result_lines.append( " ✓ Excellent endurance - well optimized configuration" ) else: result_lines.append(" ✓ Good flight time for mission requirements") if result.efficiency_overall < 0.7: result_lines.append(" ⚠ Low system efficiency - check motor/ESC selection") else: result_lines.append(" ✓ Good system efficiency") # Add JSON data json_data = json.dumps( { "flight_time_min": result.flight_time_min, "range_km": result.range_km, "hover_time_min": result.hover_time_min, "power_required_w": result.power_required_w, "energy_consumed_wh": result.energy_consumed_wh, "battery_energy_wh": result.battery_energy_wh, "efficiency_overall": result.efficiency_overall, }, indent=2, ) result_lines.extend(["", "JSON Data:", json_data]) return "\n".join(result_lines) except ImportError: return "UAV energy analysis not available - install propulsion packages" except Exception as e: logger.error(f"UAV energy analysis error: {str(e)}", exc_info=True) return f"UAV energy analysis error: {str(e)}"
- aerospace_mcp/fastmcp_server.py:107-107 (registration)Registration of the uav_energy_estimate tool with the FastMCP server.mcp.tool(uav_energy_estimate)
- Pydantic models defining input schemas (UAVConfiguration, BatteryConfiguration) and output schema (EnergyAnalysisResult) used for validation and type hints in the tool.class UAVConfiguration(BaseModel): """UAV configuration parameters.""" mass_kg: float = Field(..., gt=0, description="Total UAV mass in kg") wing_area_m2: float | None = Field( None, gt=0, description="Wing area for fixed-wing" ) disk_area_m2: float | None = Field( None, gt=0, description="Total rotor disk area for multirotor" ) cd0: float = Field(0.03, ge=0, description="Zero-lift drag coefficient") cl_cruise: float | None = Field( None, description="Cruise lift coefficient for fixed-wing" ) num_motors: int = Field(1, ge=1, le=8, description="Number of motors/propellers") motor_efficiency: float = Field(0.85, gt=0, le=1, description="Motor efficiency") esc_efficiency: float = Field(0.95, gt=0, le=1, description="ESC efficiency") class BatteryConfiguration(BaseModel): """Battery pack configuration.""" capacity_ah: float = Field(..., gt=0, description="Battery capacity in Amp-hours") voltage_nominal_v: float = Field(..., gt=0, description="Nominal voltage") mass_kg: float = Field(..., gt=0, description="Battery mass in kg") energy_density_wh_kg: float = Field( 150, gt=0, description="Energy density in Wh/kg" ) discharge_efficiency: float = Field( 0.95, gt=0, le=1, description="Discharge efficiency" ) class EnergyAnalysisResult(BaseModel): """UAV energy analysis results.""" flight_time_min: float = Field(..., description="Estimated flight time in minutes") range_km: float | None = Field(None, description="Range in km (for fixed-wing)") hover_time_min: float | None = Field( None, description="Hover time in minutes (for multirotor)" ) power_required_w: float = Field(..., description="Average power required") energy_consumed_wh: float = Field(..., description="Energy consumed") battery_energy_wh: float = Field(..., description="Available battery energy") efficiency_overall: float = Field(..., description="Overall propulsive efficiency")
- Core implementation of the energy estimation algorithm, performing atmospheric corrections, aircraft-specific power calculations (fixed-wing vs multirotor), battery energy assessment, and returning structured results. Called by the main handler.def uav_energy_estimate( uav_config: UAVConfiguration, battery_config: BatteryConfiguration, mission_profile: dict[str, float], propeller_geometry: PropellerGeometry | None = None, ) -> EnergyAnalysisResult: """ Estimate UAV endurance and energy consumption. Args: uav_config: UAV configuration parameters battery_config: Battery configuration mission_profile: Mission parameters (velocity, altitude, etc.) propeller_geometry: Optional propeller geometry for detailed analysis Returns: EnergyAnalysisResult with flight time and energy analysis """ velocity_ms = mission_profile.get("velocity_ms", 15.0) altitude_m = mission_profile.get("altitude_m", 100.0) # Calculate atmospheric conditions if altitude_m < 11000: temp = 288.15 - 0.0065 * altitude_m pressure = 101325 * (temp / 288.15) ** 5.256 else: temp = 216.65 pressure = 22632 * math.exp(-0.0001577 * (altitude_m - 11000)) rho = pressure / (287.04 * temp) # Determine aircraft type and power requirements if uav_config.disk_area_m2: # Multirotor analysis power_required_w = _multirotor_power_analysis(uav_config, velocity_ms, rho) elif uav_config.wing_area_m2 and uav_config.cl_cruise: # Fixed-wing analysis power_required_w = _fixed_wing_power_analysis(uav_config, velocity_ms, rho) else: # Generic power estimation power_required_w = _generic_power_estimate(uav_config, velocity_ms) # Apply system efficiencies power_electrical_w = power_required_w / ( uav_config.motor_efficiency * uav_config.esc_efficiency ) # Battery analysis battery_energy_wh = battery_config.capacity_ah * battery_config.voltage_nominal_v usable_energy_wh = ( battery_energy_wh * battery_config.discharge_efficiency * 0.9 ) # 90% depth of discharge for UAV applications (more aggressive than automotive) # Flight time estimation flight_time_hours = usable_energy_wh / power_electrical_w flight_time_min = flight_time_hours * 60 # Range estimation (for fixed-wing) range_km = None hover_time_min = None if uav_config.wing_area_m2: range_km = velocity_ms * flight_time_hours * 3.6 # Convert m/s·h to km else: hover_time_min = flight_time_min # For multirotor, flight time = hover time return EnergyAnalysisResult( flight_time_min=flight_time_min, range_km=range_km, hover_time_min=hover_time_min, power_required_w=power_required_w, energy_consumed_wh=usable_energy_wh, battery_energy_wh=battery_energy_wh, efficiency_overall=uav_config.motor_efficiency * uav_config.esc_efficiency, )