File size: 5,522 Bytes
e78c327
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import streamlit as st
from radar_simulation import RadarSimulation  # Ensure this is your radar simulation module
from spectrometer_simulation import SpectrometerSimulation  # Ensure this is your spectrometer simulation module
import plotly.graph_objects as go
import numpy as np
from seismic_simulation import SeismicSimulation  # Ensure this is your seismic simulation module

def main():
    st.title("Raders and Sensors Simulation")
    tab1, tab2, tab3 = st.tabs(["Radar Simulation", "Spectrometer Simulation", "Laser Simulation"])

    with tab1:
        radar_simulation()

    with tab2:
        spectrometer_simulation()

    with tab3:
        seismic_simulation()

def radar_simulation():
    st.subheader("Radar Data Simulation")
    radar_range = st.number_input("Radar Range (meters)", 50, 200, 100, key='radar_range')
    radar_frequency = st.number_input("Radar Frequency (GHz)", 1.0, 20.0, 10.0, key='radar_freq')
    time_steps = st.number_input("Number of Time Steps", min_value=10, max_value=100, value=50, key='time_steps')
    loop_frequency = st.number_input("Drone Loop Frequency", 0.01, 0.5, 0.1, key='loop_freq')

    radar = RadarSimulation(radar_position=[0, 0], radar_range=radar_range, radar_frequency=radar_frequency)
    radar.add_target("missile", [50, 80], [-2, -6], rcs=1.0)
    radar.add_target("drone", [20, -50], [-5, 0], rcs=0.5)
    radar.add_target("plane", [70, 0], [-5, 0], rcs=2.0)

    if st.button("Run Radar Simulation"):
        radar.run_simulation(time_steps, dt=1, loop_frequency=loop_frequency)
        data = radar.get_simulation_data()
        plot_radar_results(data)

def plot_radar_results(data):
    # Radar target movement plot
    fig = go.Figure()
    for name, values in data['positions'].items():
        x, y = zip(*values) if values else ([], [])
        fig.add_trace(go.Scatter(x=x, y=y, mode='lines+markers', name=name))
    fig.update_layout(title='Radar Target Movement', xaxis_title='Distance X (m)', yaxis_title='Distance Y (m)', legend_title='Targets')
    st.plotly_chart(fig, use_container_width=True)

    # Additional plots for Doppler Shifts, SNR, and RSSI
    metrics = ['doppler_shifts', 'snr_values', 'rssi_values']
    titles = ["Doppler Shifts", "Signal-to-Noise Ratio (SNR)", "RSSI (dBm)"]
    units = ['Hz', '', 'dBm']
    
    for metric, title, unit in zip(metrics, titles, units):
        fig = go.Figure()
        for name, values in data[metric].items():
            fig.add_trace(go.Scatter(y=values, mode='lines+markers', name=name))
        fig.update_layout(title=title, xaxis_title="Time Step", yaxis_title=f"{title} ({unit})", legend_title="Targets")
        st.plotly_chart(fig, use_container_width=True)

def spectrometer_simulation():
    st.subheader("Spectrometer Data Simulation")
    sim = SpectrometerSimulation()

    # Pre-defined characteristics for different events
    event_types = ['APFSDS launch', 'HE projectile launch', 'RPG launch', 'TNT explosion']
    event_name = st.selectbox("Event Type", event_types, key="event_type")
    center_time = st.number_input("Center Time (ms)", 0, 100, 20, key="center_time")
    rise_time = st.number_input("Rise Time (ms)", 1, 20, 2, key="rise_time")
    fall_time = st.number_input("Fall Time (ms)", 1, 30, 10, key="fall_time")
    peak_amplitude = st.number_input("Peak Amplitude (a.u.)", 1, 100, 80, key="peak_amplitude")

    # Set the characteristics based on user inputs
    sim.set_characteristics({
        event_name: {
            'center_time': center_time,
            'rise_time': rise_time,
            'fall_time': fall_time,
            'peak_amplitude': peak_amplitude
        }
    })

    if st.button("Update and Visualize Spectrometer Characteristics"):
        time_ms, emissions = sim.generate_data()
        plot_spectrometer_results(time_ms, emissions)

def plot_spectrometer_results(time_ms, emissions):
    fig = go.Figure()
    for event, emission in emissions.items():
        fig.add_trace(go.Scatter(x=time_ms, y=emission, mode='lines', name=event))
    fig.update_layout(title='Spectrometer Emissions', xaxis_title='Time [ms]', yaxis_title='Normalized power [a.u.]', legend_title='Events')
    st.plotly_chart(fig, use_container_width=True)

def seismic_simulation():
    st.subheader("Seismic Response Simulation")
    frequencies = np.linspace(50, 1500, 1451)
    seismic = SeismicSimulation(frequencies)
    soil_impact_on = st.slider("Soil Impact on Mine", 0.0, 1.0, 0.1)
    noise_level_on = st.slider("Noise Level on Mine", 0.0, 0.01, 0.001, step=0.0001)
    soil_impact_off = st.slider("Soil Impact off Mine", 0.0, 1.0, 0.5)
    noise_level_off = st.slider("Noise Level off Mine", 0.0, 0.01, 0.002, step=0.0001)

    if st.button("Run Seismic Simulation"):
        results = seismic.generate_data(soil_impact_on, noise_level_on, soil_impact_off, noise_level_off)
        plot_seismic_results(frequencies, results)

def plot_seismic_results(frequencies, results):
    for mine, (on_response, off_response) in results.items():
        fig = go.Figure()
        fig.add_trace(go.Scatter(x=frequencies, y=on_response, mode='lines', name='Laser on Mine', line=dict(color='red')))
        fig.add_trace(go.Scatter(x=frequencies, y=off_response, mode='lines', name='Laser off Mine', line=dict(dash='dash', color='black')))
        fig.update_layout(title=f'{mine} Mine Response', xaxis_title='Frequency (Hz)', yaxis_title='Velocity (nm/sec)')
        st.plotly_chart(fig, use_container_width=True)



if __name__ == "__main__":
    main()