micromissiles-unity/assets/Simulation_Logging.md.t33KQ...

61 lines
30 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

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 &quot;Simulation Logging&quot;"></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 &quot;Overview&quot;"></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&#39;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\\&lt;user&gt;\\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 &quot;Understanding Log Files and Directory Structure&quot;"></a></h2><h3 id="log-directory-structure" tabindex="-1">Log Directory Structure <a class="header-anchor" href="#log-directory-structure" aria-label="Permalink to &quot;Log Directory Structure&quot;"></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 &quot;Log Files Generated by \`SimMonitor\`&quot;"></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 &quot;Telemetry Log Structure&quot;"></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 &quot;Event Log Structure&quot;"></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 &quot;Running the \`visualize_log.py\` Script&quot;"></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 &quot;Locating the Script&quot;"></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 &quot;Required Python Libraries&quot;"></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 &quot;Usage&quot;"></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 &quot;Navigate to the Tools Directory&quot;"></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 &quot;Run the Script&quot;"></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 &quot;Specifying Log Files Manually&quot;"></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 &quot;Example Output&quot;"></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 &quot;Interpreting the Plot&quot;"></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 &quot;Adjusting the Visualization&quot;"></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 &quot;Writing Your Own Scripts&quot;"></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 &quot;Getting Started&quot;"></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;">&#39;path/to/sim_telemetry_*.csv&#39;</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;">&#39;path/to/sim_events_*.csv&#39;</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 &quot;Visualization&quot;"></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;">&#39;Time&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">], telemetry_df[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;AgentY&#39;</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;">&#39;Time (s)&#39;</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;">&#39;Altitude (m)&#39;</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;">&#39;Agent Altitude Over Time&#39;</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 &quot;Sample Script: Calculating Miss Distances&quot;"></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;">&#39;path/to/sim_telemetry_*.csv&#39;</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;">&#39;path/to/sim_events_*.csv&#39;</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;">&#39;Event&#39;</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;"> &#39;MISS&#39;</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;">&#39;AgentID&#39;</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;">&#39;Time&#39;</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;">&#39;AgentID&#39;</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;">&amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (telemetry_df[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;Time&#39;</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;">&#39;AgentX&#39;</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;">&#39;AgentY&#39;</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;">&#39;AgentZ&#39;</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;">&#39;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&#39;</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 &quot;Suggestions for Analysis&quot;"></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 &quot;Additional Resources&quot;"></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};