61 lines
30 KiB
JavaScript
61 lines
30 KiB
JavaScript
import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.DYF6f1aH.js";const n="/micromissiles-unity/assets/sim_visualizer.CwuQ1zYH.png",c=JSON.parse('{"title":"Simulation Logging","description":"","frontmatter":{},"headers":[],"relativePath":"Simulation_Logging.md","filePath":"Simulation_Logging.md"}'),l={name:"Simulation_Logging.md"};function p(h,s,r,o,d,k){return t(),a("div",null,s[0]||(s[0]=[e('<h1 id="simulation-logging" tabindex="-1">Simulation Logging <a class="header-anchor" href="#simulation-logging" aria-label="Permalink to "Simulation Logging""></a></h1><p>This guide provides instructions on how to access and interpret the simulation logs, how they are structured by the <code>SimMonitor</code> class, and how to utilize the provided <code>visualize_log.py</code> script to analyze simulation data. Additionally, it offers guidance on creating your own scripts for custom analysis.</p><h2 id="overview" tabindex="-1">Overview <a class="header-anchor" href="#overview" aria-label="Permalink to "Overview""></a></h2><p><img src="'+n+`" alt="Python simulation log visualizer"></p><p>Simulation logs capture detailed telemetry and event data from each simulation run. These logs are essential for debugging, performance analysis, and understanding the behavior of agents within the simulation.</p><p>Logs are exported to the <code>Telemetry/Logs</code> folder in your operating system's <a href="https://docs.unity3d.com/ScriptReference/Application-persistentDataPath.html" target="_blank" rel="noreferrer">persistent data path</a>.</p><p>For example, on Windows, the logs are exported to:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>C:\\Users\\<user>\\AppData\\LocalLow\\BAMLAB\\micromissiles\\Telemetry\\Logs</span></span></code></pre></div><p>On macOS, the logs are exported to:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>~/Library/Application Support/BAMLAB/micromissiles/Telemetry/Logs</span></span></code></pre></div><p><code>visualize_log.py</code> is an example script provided to help visualize and interpret the simulation logs. It is included in the <code>Tools</code> directory of the release download.</p><h2 id="understanding-log-files-and-directory-structure" tabindex="-1">Understanding Log Files and Directory Structure <a class="header-anchor" href="#understanding-log-files-and-directory-structure" aria-label="Permalink to "Understanding Log Files and Directory Structure""></a></h2><h3 id="log-directory-structure" tabindex="-1">Log Directory Structure <a class="header-anchor" href="#log-directory-structure" aria-label="Permalink to "Log Directory Structure""></a></h3><p>Simulation logs are organized into timestamped directories within the <code>Logs</code> folder. Each simulation run generates a new directory named with the timestamp of the run.</p><p>For example:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Telemetry/</span></span>
|
||
<span class="line"><span>└── Logs/</span></span>
|
||
<span class="line"><span> ├── 20241002_101305/</span></span>
|
||
<span class="line"><span> │ ├── sim_telemetry_20241002_101311.csv</span></span>
|
||
<span class="line"><span> │ ├── sim_events_20241002_101311.csv</span></span>
|
||
<span class="line"><span> │ │</span></span>
|
||
<span class="line"><span> │ ├── sim_telemetry_20241002_101306.csv</span></span>
|
||
<span class="line"><span> │ └── sim_events_20241002_101306.csv</span></span>
|
||
<span class="line"><span> ├── 20241002_012122/</span></span>
|
||
<span class="line"><span> │ ├── sim_telemetry_20241002_012122.csv</span></span>
|
||
<span class="line"><span> │ └── sim_events_20241002_012122.csv</span></span>
|
||
<span class="line"><span> └── ...</span></span></code></pre></div><p>Each simulation run produces two main CSV files:</p><ul><li><strong>Telemetry Log (<code>sim_telemetry_*.csv</code>)</strong>: Contains detailed state information for each agent at each time step.</li><li><strong>Event Log (<code>sim_events_*.csv</code>)</strong>: Records significant events such as hits, misses, agent creation, and destruction.</li></ul><h3 id="log-files-generated-by-simmonitor" tabindex="-1">Log Files Generated by <code>SimMonitor</code> <a class="header-anchor" href="#log-files-generated-by-simmonitor" aria-label="Permalink to "Log Files Generated by \`SimMonitor\`""></a></h3><p>The logging system is managed by the <code>SimMonitor</code> class in the simulation codebase.</p><div class="language-csharp vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">csharp</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> SimMonitor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> : </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">MonoBehaviour</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Responsible for logging simulation data</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // ...</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p><strong>Key Responsibilities of <code>SimMonitor</code>:</strong></p><ul><li>Collecting agent state data at each simulation step.</li><li>Writing telemetry data to <code>sim_telemetry_*.csv</code>.</li><li>Recording significant events to <code>sim_events_*.csv</code>.</li><li>Organizing logs into timestamped directories for each simulation run.</li></ul><h3 id="telemetry-log-structure" tabindex="-1">Telemetry Log Structure <a class="header-anchor" href="#telemetry-log-structure" aria-label="Permalink to "Telemetry Log Structure""></a></h3><p>The telemetry log provides a snapshot of the simulation at each time step for every agent. Key columns include:</p><ul><li><strong><code>Time</code></strong>: Simulation time at the log entry.</li><li><strong><code>AgentID</code></strong>: Unique identifier for each agent.</li><li><strong><code>AgentType</code></strong>: Type of the agent (e.g., interceptor, threat).</li><li><strong><code>AgentX</code></strong>, <strong><code>AgentY</code></strong>, <strong><code>AgentZ</code></strong>: Position coordinates of the agent.</li><li><strong><code>AgentVelocityX</code></strong>, <strong><code>AgentVelocityY</code></strong>, <strong><code>AgentVelocityZ</code></strong>: Velocity components.</li><li><strong><code>AgentStatus</code></strong>: Current status of the agent (e.g., active, destroyed).</li></ul><h3 id="event-log-structure" tabindex="-1">Event Log Structure <a class="header-anchor" href="#event-log-structure" aria-label="Permalink to "Event Log Structure""></a></h3><p>The event log records significant occurrences within the simulation. Key columns include:</p><ul><li><strong><code>Time</code></strong>: Time when the event occurred.</li><li><strong><code>PositionX</code></strong>, <strong><code>PositionY</code></strong>, <strong><code>PositionZ</code></strong>: Position where the event occurred.</li><li><strong><code>EventType</code></strong>: Type of event (e.g., <code>HIT</code>, <code>MISS</code>, <code>NEW_THREAT</code>, <code>NEW_INTERCEPTOR</code>).</li><li><strong><code>Details</code></strong>: Additional details about the event.</li></ul><h2 id="running-the-visualize-log-py-script" tabindex="-1">Running the <code>visualize_log.py</code> Script <a class="header-anchor" href="#running-the-visualize-log-py-script" aria-label="Permalink to "Running the \`visualize_log.py\` Script""></a></h2><p>The <code>visualize_log.py</code> script helps visualize agent trajectories and significant events in a 3D plot.</p><h3 id="locating-the-script" tabindex="-1">Locating the Script <a class="header-anchor" href="#locating-the-script" aria-label="Permalink to "Locating the Script""></a></h3><p>After downloading and extracting the release package, you can find the script at:</p><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Tools/visualize_log.py</span></span></code></pre></div><p>Make sure you have Python 3 installed on your system, along with the required libraries to run the script.</p><h3 id="required-python-libraries" tabindex="-1">Required Python Libraries <a class="header-anchor" href="#required-python-libraries" aria-label="Permalink to "Required Python Libraries""></a></h3><p>The script depends on the following Python libraries:</p><ul><li><strong><code>pandas</code></strong></li><li><strong><code>matplotlib</code></strong></li><li><strong><code>numpy</code></strong></li></ul><p>You can install them using <code>pip</code>:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">pip</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> pandas</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> matplotlib</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> numpy</span></span></code></pre></div><h3 id="usage" tabindex="-1">Usage <a class="header-anchor" href="#usage" aria-label="Permalink to "Usage""></a></h3><h4 id="navigate-to-the-tools-directory" tabindex="-1">Navigate to the Tools Directory <a class="header-anchor" href="#navigate-to-the-tools-directory" aria-label="Permalink to "Navigate to the Tools Directory""></a></h4><p>Open a terminal or command prompt and navigate to the <code>Tools</code> directory:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">cd</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> path/to/Tools/</span></span></code></pre></div><h4 id="run-the-script" tabindex="-1">Run the Script <a class="header-anchor" href="#run-the-script" aria-label="Permalink to "Run the Script""></a></h4><p>To visualize the most recent simulation logs:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> visualize_log.py</span></span></code></pre></div><p><strong>What the Script Does:</strong></p><ul><li><strong>Automatically Finds the Latest Logs</strong>: If no arguments are provided, it locates the most recent <code>sim_telemetry_*.csv</code> and <code>sim_events_*.csv</code> files.</li><li><strong>Prints a Summary</strong>: Outputs a summary of events, including total counts and timing of hits and misses.</li><li><strong>Generates a 3D Plot</strong>: Displays agent trajectories and marks events such as hits and misses.</li></ul><h4 id="specifying-log-files-manually" tabindex="-1">Specifying Log Files Manually <a class="header-anchor" href="#specifying-log-files-manually" aria-label="Permalink to "Specifying Log Files Manually""></a></h4><p>You can also provide specific file paths as arguments:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">python</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> visualize_log.py</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> path/to/sim_telemetry_file.csv</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> path/to/sim_events_file.csv</span></span></code></pre></div><h3 id="example-output" tabindex="-1">Example Output <a class="header-anchor" href="#example-output" aria-label="Permalink to "Example Output""></a></h3><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>Total number of events: 150</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>Event Counts:</span></span>
|
||
<span class="line"><span> HIT: 120</span></span>
|
||
<span class="line"><span> MISS: 30</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>First hit at 5.00 seconds, last hit at 15.00 seconds</span></span>
|
||
<span class="line"><span></span></span>
|
||
<span class="line"><span>[3D plot window opens showing trajectories and events]</span></span></code></pre></div><h3 id="interpreting-the-plot" tabindex="-1">Interpreting the Plot <a class="header-anchor" href="#interpreting-the-plot" aria-label="Permalink to "Interpreting the Plot""></a></h3><p>The 3D plot displays:</p><ul><li><strong>Agent Trajectories</strong>: Lines representing the paths of interceptors and threats. <ul><li><strong>Colors</strong> indicate agent types (e.g., blue for interceptors, red for threats).</li></ul></li><li><strong>Event Markers</strong>: Symbols marking where events occurred. <ul><li><strong>Hits</strong>: Marked with green circles.</li><li><strong>Misses</strong>: Marked with red crosses.</li></ul></li></ul><h3 id="adjusting-the-visualization" tabindex="-1">Adjusting the Visualization <a class="header-anchor" href="#adjusting-the-visualization" aria-label="Permalink to "Adjusting the Visualization""></a></h3><ul><li><strong>View Angle</strong>: You can rotate the 3D plot by clicking and dragging to view the simulation from different perspectives.</li><li><strong>Zoom</strong>: Use the scroll wheel to zoom in and out.</li></ul><h2 id="writing-your-own-scripts" tabindex="-1">Writing Your Own Scripts <a class="header-anchor" href="#writing-your-own-scripts" aria-label="Permalink to "Writing Your Own Scripts""></a></h2><p>The simulation logs are in CSV format, making them accessible for custom analysis and visualization.</p><h3 id="getting-started" tabindex="-1">Getting Started <a class="header-anchor" href="#getting-started" aria-label="Permalink to "Getting Started""></a></h3><ul><li><strong>Choose a Programming Language</strong>: Python or MATLAB are recommended for ease-of-use and data analysis capabilities.</li></ul><p>For example, using Python and the <code>pandas</code> library, you can load the telemetry and event data like this:</p><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pandas </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pd</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">telemetry_df </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pd.read_csv(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'path/to/sim_telemetry_*.csv'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event_df </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pd.read_csv(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'path/to/sim_events_*.csv'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></div><h3 id="visualization" tabindex="-1">Visualization <a class="header-anchor" href="#visualization" aria-label="Permalink to "Visualization""></a></h3><ul><li><strong>2D Plots</strong>: Use <code>matplotlib</code> to create time-series plots:</li></ul><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> matplotlib.pyplot </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> plt</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">plt.plot(telemetry_df[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Time'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">], telemetry_df[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'AgentY'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">])</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">plt.xlabel(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Time (s)'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">plt.ylabel(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Altitude (m)'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">plt.title(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Agent Altitude Over Time'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">plt.show()</span></span></code></pre></div><ul><li><strong>3D Plots</strong>: Use <code>mpl_toolkits.mplot3d</code> for 3D trajectory plots.</li></ul><h3 id="sample-script-calculating-miss-distances" tabindex="-1">Sample Script: Calculating Miss Distances <a class="header-anchor" href="#sample-script-calculating-miss-distances" aria-label="Permalink to "Sample Script: Calculating Miss Distances""></a></h3><div class="language-python vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">python</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pandas </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pd</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> numpy </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> np</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Load telemetry and event data</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">telemetry_df </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pd.read_csv(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'path/to/sim_telemetry_*.csv'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event_df </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pd.read_csv(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'path/to/sim_events_*.csv'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Filter miss events</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">miss_events </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> event_df[event_df[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Event'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'MISS'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Calculate miss distances</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">miss_distances </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> []</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> idx, miss </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> miss_events.iterrows():</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent_id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> miss[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'AgentID'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> time </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> miss[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Time'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Get agent position at the time of miss</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent_state </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> telemetry_df[(telemetry_df[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'AgentID'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent_id) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (telemetry_df[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Time'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> time)]</span></span>
|
||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> not</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent_state.empty:</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent_state[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'AgentX'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">].values[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> y </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent_state[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'AgentY'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">].values[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> z </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> agent_state[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'AgentZ'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">].values[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> # Calculate distance to target or predefined point</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distance </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> np.sqrt(x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">**</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> y</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">**</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> +</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> z</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">**</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> miss_distances.append(distance)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Output average miss distance</span></span>
|
||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">average_miss_distance </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> np.mean(miss_distances)</span></span>
|
||
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">print</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">f</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Average Miss Distance: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">{</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">average_miss_distance</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:.2f</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">}</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> meters'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></div><h3 id="suggestions-for-analysis" tabindex="-1">Suggestions for Analysis <a class="header-anchor" href="#suggestions-for-analysis" aria-label="Permalink to "Suggestions for Analysis""></a></h3><ul><li><strong>Performance Metrics</strong>: Determine interception success rates, average time to intercept, or hit accuracy.</li><li><strong>Behavioral Analysis</strong>: Examine how changes in simulation configurations affect agent behavior.</li><li><strong>Batch Processing</strong>: Automate analysis over multiple simulation runs to compare different scenarios.</li></ul><h2 id="additional-resources" tabindex="-1">Additional Resources <a class="header-anchor" href="#additional-resources" aria-label="Permalink to "Additional Resources""></a></h2><ul><li><strong>Python Documentation</strong>: <a href="https://pandas.pydata.org/" target="_blank" rel="noreferrer">pandas</a>, <a href="https://matplotlib.org/" target="_blank" rel="noreferrer">matplotlib</a>, <a href="https://numpy.org/" target="_blank" rel="noreferrer">NumPy</a></li></ul>`,75)]))}const u=i(l,[["render",p]]);export{c as __pageData,u as default};
|