deltaVision raises €10.2M to build the plumbing for in-orbit refuelling
Back to Tutorials
techTutorialintermediate

deltaVision raises €10.2M to build the plumbing for in-orbit refuelling

July 21, 202617 views5 min read

Learn to simulate spacecraft propellant management systems using Python, modeling the valves, pumps, and pressure regulators that enable in-orbit refueling operations.

Introduction

In the rapidly evolving space industry, in-orbit refueling is becoming a critical technology for extending satellite lifespans and reducing space debris. This tutorial will guide you through creating a simulation of a propellant management system using Python and NumPy. You'll build a model that represents the core components mentioned in deltaVision's funding - valves, pumps, and pressure regulators - to understand how these elements work together in orbital refueling systems.

Prerequisites

  • Intermediate Python knowledge
  • Basic understanding of spacecraft systems and fluid dynamics concepts
  • Python libraries: NumPy, Matplotlib, and SciPy

Step-by-Step Instructions

Step 1: Set Up Your Environment

Install Required Libraries

We need several Python libraries to simulate our propellant management system. The NumPy library will handle our numerical calculations, while Matplotlib will visualize the system behavior.

pip install numpy matplotlib scipy

Why: These libraries provide the mathematical and visualization capabilities necessary to model fluid dynamics and system behavior in our spacecraft simulation.

Step 2: Create the Basic System Architecture

Define Core Components

First, we'll create classes for the main components mentioned in deltaVision's focus areas: valves, pumps, and pressure regulators.

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint


class Valve:
    def __init__(self, flow_coefficient=1.0):
        self.flow_coefficient = flow_coefficient
        self.is_open = False
    
    def open(self):
        self.is_open = True
    
    def close(self):
        self.is_open = False
    
    def get_flow_rate(self, pressure_diff):
        if self.is_open:
            return self.flow_coefficient * np.sqrt(max(0, pressure_diff))
        return 0

class Pump:
    def __init__(self, pressure_output=100.0, flow_rate=10.0):
        self.pressure_output = pressure_output
        self.flow_rate = flow_rate
        self.is_running = False
    
    def start(self):
        self.is_running = True
    
    def stop(self):
        self.is_running = False
    
    def get_pressure(self, system_pressure):
        if self.is_running:
            return self.pressure_output
        return system_pressure
    
    def get_flow_rate(self):
        if self.is_running:
            return self.flow_rate
        return 0

class PressureRegulator:
    def __init__(self, target_pressure=50.0):
        self.target_pressure = target_pressure
        self.current_pressure = 0
    
    def regulate(self, current_pressure):
        self.current_pressure = current_pressure
        return self.target_pressure

Why: These classes represent the physical components that deltaVision focuses on. Each component has specific behaviors that affect fluid flow in the spacecraft system.

Step 3: Build the Propellant Management System

Create the Main System Class

Now we'll create a system that connects our components and simulates propellant flow dynamics.

class PropellantSystem:
    def __init__(self, tank_capacity=1000.0):
        self.tank_capacity = tank_capacity
        self.propellant_level = tank_capacity
        self.valve = Valve()
        self.pump = Pump()
        self.regulator = PressureRegulator()
        self.pressure = 0
        
    def update_system(self, time_step=0.1):
        # Simulate pump operation
        if self.pump.is_running:
            # Pump adds pressure to the system
            self.pressure = self.pump.get_pressure(self.pressure)
            
        # Simulate valve operation
        flow_rate = self.valve.get_flow_rate(self.pressure)
        
        # Simulate propellant consumption
        if flow_rate > 0 and self.propellant_level > 0:
            self.propellant_level -= flow_rate * time_step
            
        # Regulate pressure
        regulated_pressure = self.regulator.regulate(self.pressure)
        self.pressure = regulated_pressure
        
        return flow_rate
    
    def get_system_state(self):
        return {
            'pressure': self.pressure,
            'propellant_level': self.propellant_level,
            'valve_open': self.valve.is_open,
            'pump_running': self.pump.is_running
        }

Why: This system class connects our components and simulates how they interact in a real spacecraft. It models the flow of propellant and pressure changes that occur during refueling operations.

Step 4: Implement the Simulation Loop

Create Time-Based Simulation

We'll now create a simulation that runs over time, showing how the system behaves during refueling operations.

def simulate_refueling_system(duration=100, time_step=0.1):
    system = PropellantSystem()
    
    # Store simulation results
    pressure_history = []
    propellant_history = []
    flow_history = []
    
    # Simulate refueling process
    for t in np.arange(0, duration, time_step):
        # Start pump at t=10
        if t > 10:
            system.pump.start()
            
        # Open valve at t=20
        if t > 20:
            system.valve.open()
            
        # Simulate system update
        flow_rate = system.update_system(time_step)
        
        # Record state
        state = system.get_system_state()
        pressure_history.append(state['pressure'])
        propellant_history.append(state['propellant_level'])
        flow_history.append(flow_rate)
        
    return pressure_history, propellant_history, flow_history

Why: This simulation models the real-world timing of operations that would occur during actual orbital refueling. It demonstrates how different system components are activated at different times.

Step 5: Visualize the Results

Plot System Behavior

Visualization helps us understand how our propellant management system behaves over time.

def plot_simulation_results(pressure_history, propellant_history, flow_history):
    fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 8))
    
    # Pressure over time
    ax1.plot(np.arange(0, len(pressure_history)), pressure_history)
    ax1.set_title('System Pressure Over Time')
    ax1.set_ylabel('Pressure (psi)')
    ax1.grid(True)
    
    # Propellant level over time
    ax2.plot(np.arange(0, len(propellant_history)), propellant_history)
    ax2.set_title('Propellant Level Over Time')
    ax2.set_ylabel('Propellant (kg)')
    ax2.grid(True)
    
    # Flow rate over time
    ax3.plot(np.arange(0, len(flow_history)), flow_history)
    ax3.set_title('Flow Rate Over Time')
    ax3.set_xlabel('Time (s)')
    ax3.set_ylabel('Flow Rate (kg/s)')
    ax3.grid(True)
    
    plt.tight_layout()
    plt.show()

Why: Graphical representation makes it easier to understand how the system components interact and how pressure and propellant levels change during operations.

Step 6: Run the Complete Simulation

Execute and Analyze Results

Finally, we'll run our complete simulation and analyze the results.

# Run simulation
pressure_history, propellant_history, flow_history = simulate_refueling_system(duration=100)

# Plot results
plot_simulation_results(pressure_history, propellant_history, flow_history)

# Print final system state
system = PropellantSystem()
print(f"Final propellant level: {system.propellant_level:.2f} kg")
print(f"Final system pressure: {system.pressure:.2f} psi")

Why: This final step executes our complete simulation, allowing us to see how our system behaves under realistic conditions and understand the practical implications of spacecraft propellant management.

Summary

This tutorial demonstrated how to build a simulation of a spacecraft propellant management system using Python. By creating classes for valves, pumps, and pressure regulators, we modeled how these components work together in orbital refueling operations. The simulation shows how pressure and propellant levels change over time, providing insight into the engineering challenges faced by companies like deltaVision as they develop in-orbit refueling technology. This approach can be extended to include more complex systems, multiple tanks, and advanced control algorithms that would be essential for real spacecraft applications.

Source: TNW Neural

Related Articles