AI-for-Defence-and-Military / radar_simulation.py
howardroark's picture
init commit
e78c327
import numpy as np
class Target:
def __init__(self, position, velocity, rcs):
self.position = np.array(position)
self.velocity = np.array(velocity)
self.rcs = rcs # Radar Cross Section
class RadarSimulation:
def __init__(self, radar_position, radar_range, radar_frequency, c=3e8):
self.radar_position = np.array(radar_position)
self.radar_range = radar_range
self.radar_frequency = radar_frequency * 1e9 # Convert GHz to Hz
self.c = c # Speed of light in m/s
self.targets = {}
self.positions = {}
self.doppler_shifts = {}
self.snr_values = {}
self.rssi_values = {}
def add_target(self, name, position, velocity, rcs):
target = Target(position, velocity, rcs)
self.targets[name] = target
self.positions[name] = []
self.doppler_shifts[name] = []
self.snr_values[name] = []
self.rssi_values[name] = []
def run_simulation(self, time_steps, dt, loop_frequency=0.1):
for step in range(time_steps):
# Example specific behavior: Drone makes loops
if "drone" in self.targets:
self.targets["drone"].velocity[1] = 10 * np.sin(loop_frequency * step)
for name, target in self.targets.items():
target.position += target.velocity * dt
distance = np.linalg.norm(target.position - self.radar_position)
if distance != 0:
relative_velocity = np.dot(target.velocity, target.position - self.radar_position) / distance
doppler_shift = self.radar_frequency * (relative_velocity / self.c)
signal_strength = target.rcs / (distance ** 2)
else:
relative_velocity = 0
doppler_shift = 0
signal_strength = np.inf
noise = 1e-3
snr = signal_strength / noise if distance != 0 else np.inf
rssi = (target.rcs * signal_strength * self.radar_frequency) / (distance ** 2) if distance != 0 else np.inf
rssi_dBm = 10 * np.log10(rssi / 1e-3) if rssi > 0 else -np.inf
self.positions[name].append(target.position.tolist() if distance <= self.radar_range else [np.nan, np.nan])
self.doppler_shifts[name].append(doppler_shift if distance <= self.radar_range else np.nan)
self.snr_values[name].append(snr if distance <= self.radar_range else np.nan)
self.rssi_values[name].append(rssi_dBm if distance <= self.radar_range else np.nan)
def get_simulation_data(self):
return {
"positions": self.positions,
"doppler_shifts": self.doppler_shifts,
"snr_values": self.snr_values,
"rssi_values": self.rssi_values
}