Skip to content
Snippets Groups Projects
Commit 90d2e4e9 authored by rojas's avatar rojas
Browse files

Merge origin/master

parents 57d812ac ea5b3d9e
No related branches found
No related tags found
No related merge requests found
## Homework 3: Example Simulation Recording using OpenDIS Network Streams
<!-- Viewable at https://gitlab.nps.edu/Savage/NetworkedGraphicsMV3500/-/blob/master/assignments/src/MV3500Cohort2024JulySeptember/homework3/README.md -->
### Assignment
1. Adapt the functionality for [OpenDIS ExampleSimulationProgram](../../../../examples/src/OpenDis7Examples/ExampleSimulationProgram.java), modifying provided code
2. Experiment with the enumeration values that set up each entity and PDU. What works for you? What makes sense for your future work?
3. Adapt or replace the UML diagrams to describe what you have going on.
4. Record, save and replay your result stream using [PduRecorder](https://savage.nps.edu/opendis7-java/javadoc/edu/nps/moves/dis7/utilities/stream/PduRecorder.html) or [Wireshark](https://www.wireshark.org)
* see local [assignments/src/pduLog](../../../pduLog) subdirectory for latest opendis log files
* Coming soon, we will also (again have) [X3D-Edit](https://savage.nps.edu/X3D-Edit) for DIS stream recording/replay
5. Observe good-practice conventions in the [assignments README](../../../README.md) and [current-course README](../README.md) instructions.
This assignment presents a Problem Prototyping opportunity.
While some minimal functionality is expected, the general outline of
a networking problem and proposed solution holds great interest.
Think of it as warmup preparation for your future work.
This is also a freeplay opportunity.
You have the option to pick one or more of the provided course example programs
and adapt the source to demonstrate a new client-server handshake protocol of interest.
Be sure to provide a rationale that justifies why the networking choices you made
(TCP/UDP, unicast/multicast, etc.) are the best for the problem you are addressing.
You may find that the prior [homework2 README](../homework2/README.md) still provides
helpful details on what specific deliverables are expected in each homework assignment.
Team efforts are encouraged, though if you choose a team approach be sure to justify why.
This is a good warmup prior to final projects. Have fun with Java networking!
### Prior Assignment, August 2019
In 2019, students worked together on a single project to check wireless multicast connectivity recently deployed on NPS campus.
See their experimental results in the [NPS Multicast Connectivity Report](../../MV3500Cohort2019JulySeptember/homework3).
/**
* Final project assignments supporting the NPS MOVES MV3500 Networked Graphics course.
*
* @see <a href="https://gitlab.nps.edu/Savage/NetworkedGraphicsMV3500/-/tree/master/assignments" target="_blank">networkedGraphicsMV3500 assignments</a>
* @see java.lang.Package
* @see <a href="https://stackoverflow.com/questions/22095487/why-is-package-info-java-useful" target="_blank">StackOverflow: why-is-package-info-java-useful</a>
* @see <a href="https://stackoverflow.com/questions/624422/how-do-i-document-packages-in-java" target="_blank">StackOverflow: how-do-i-document-packages-in-java</a>
*/
package MV3500Cohort2024JulySeptember.homework3.Bavlsik;
......@@ -8,7 +8,6 @@
*/
package MV3500Cohort2024JulySeptember.homework3.Williams;
import edu.nps.moves.dis7.entities.swe.platform.surface._001Poseidon;
import edu.nps.moves.dis7.entities.swe.platform.surface._002Triton;
import edu.nps.moves.dis7.enumerations.*;
......@@ -25,9 +24,9 @@ import java.util.logging.Logger;
* tasks of interest, and then reporting activity via PDUs to the network.
* Default program initialization includes PDU recording turned on by default.
*
* Homework 3 Networking choices:
* Homework 3 networking choices:
* This simulation uses UDP multicast for efficient distribution of PDUs to
* multiple participants, which is suitable for large-scale simulations where
* multiple participants, which is great for large-scale simulations where
* state updates need to reach all networked participants. UDP is chosen over
* TCP due to its lower latency, which is essential for real-time simulations.
*
......@@ -39,65 +38,38 @@ import java.util.logging.Logger;
*/
public class ExampleSimulationProgram
{
/* **************************** infrastructure code, modification is seldom needed ************************* */
private String descriptor = this.getClass().getSimpleName();
/** DIS channel defined by network address/port combination includes multiple utility capabilities */
protected DisChannel disChannel;
/** Factory object used to create new PDU instances */
protected PduFactory pduFactory;
/** seconds per loop for real-time or simulation execution */
private double simulationTimeStepDuration = 1.0; // seconds TODO encapsulate
/** initial simulation time in seconds */
private double simulationTimeStepDuration = 1.0;
double simulationTimeInitial = 0.0;
/** current simulation time in seconds */
double simulationTimeSeconds = simulationTimeInitial;
/** Maximum number of simulation loops */
int MAX_LOOP_COUNT = 4;
String narrativeMessage1 = new String();
String narrativeMessage2 = new String();
String narrativeMessage3 = new String();
/** EntityID settings for entity 1 */
protected EntityID entityID_1 = new EntityID();
/** EntityID settings for entity 2 */
protected EntityID entityID_2 = new EntityID();
/** ESPDU for entity 1 */
protected EntityStatePdu entityStatePdu_1;
/** ESPDU for entity 2 */
protected EntityStatePdu entityStatePdu_2;
/** FirePdu for entity 1 first weapon (if any) */
protected FirePdu firePdu_1a;
/** FirePdu for entity 1 second weapon (if any) */
protected FirePdu firePdu_1b;
/** MunitionDescriptor for these weapons */
protected MunitionDescriptor munitionDescriptor1;
/**
* Constructor to create an instance of this class.
* Design goal: additional built-in initialization conveniences can go here
* to keep your efforts focused on the runSimulation() method.
*/
public ExampleSimulationProgram()
{
initialize();
}
/**
* Constructor to create an instance of this class.
* @param newDescriptor describes this program, useful for logging and debugging
*/
public ExampleSimulationProgram(String newDescriptor)
{
descriptor = newDescriptor;
initialize();
}
/**
* Utility Constructor that allows your example simulation program to override default network address and port
* @param address network address to use
* @param port corresponding network port to use
*/
public ExampleSimulationProgram(String address, int port)
{
disChannel.setNetworkAddress(address);
......@@ -108,9 +80,6 @@ public class ExampleSimulationProgram
initialize();
}
/** Initialize channel setup for OpenDis7 and report a test PDU
* @see initializeDisChannel
* @see initializeSimulationEntities */
private void initialize()
{
initializeDisChannel();
......@@ -122,7 +91,6 @@ public class ExampleSimulationProgram
disChannel.sendCommentPdu(simulationTimeSeconds, DisChannel.COMMENTPDU_SIMULATION_TIMESTEP, timeStepMessage);
}
/** Initialize channel setup for OpenDis7 and report a test PDU */
private void initializeDisChannel()
{
if (disChannel == null)
......@@ -143,8 +111,6 @@ public class ExampleSimulationProgram
disChannel.getPduRecorder().setVerbose(true);
}
/** Initialize simulation entities.
*/
public void initializeSimulationEntities()
{
if (pduFactory == null)
......@@ -155,30 +121,31 @@ public class ExampleSimulationProgram
firePdu_1b = pduFactory.makeFirePdu();
munitionDescriptor1 = new MunitionDescriptor();
// Define participants
entityID_1.setSiteID(1).setApplicationID(2).setEntityID(3);
entityID_1.setSiteID((int)(Math.random() * 100))
.setApplicationID((int)(Math.random() * 100))
.setEntityID((int)(Math.random() * 100));
disChannel.addEntity(entityID_1);
entityID_2.setSiteID(1).setApplicationID(2).setEntityID(4);
entityID_2.setSiteID((int)(Math.random() * 100))
.setApplicationID((int)(Math.random() * 100))
.setEntityID((int)(Math.random() * 100));
disChannel.addEntity(entityID_2);
entityStatePdu_1.setEntityID(entityID_1);
entityStatePdu_1.setForceId(ForceID.FRIENDLY);
entityStatePdu_1.setEntityType(new _001Poseidon());
entityStatePdu_1.setMarking("Entity #53");
entityStatePdu_1.setMarking("Ethan's Poseidon #1");
entityStatePdu_2.setEntityID(entityID_2);
entityStatePdu_2.setForceId(ForceID.OPPOSING);
entityStatePdu_2.setEntityType(new _002Triton());
entityStatePdu_2.setMarking("Entity #2");
entityStatePdu_2.setMarking("Ethan's Triton #2");
munitionDescriptor1.setQuantity(1);
firePdu_1a.setDescriptor(munitionDescriptor1).setRange(1000.0f);
}
/**
* This runSimulationLoops() method is customizable for running new simulations.
*/
@SuppressWarnings("SleepWhileInLoop")
public void runSimulationLoops ()
{
......@@ -195,13 +162,14 @@ public class ExampleSimulationProgram
{
simulationLoopCount++;
entityStatePdu_1.getEntityLocation().setX(entityStatePdu_1.getEntityLocation().getX() + 1.0);
entityStatePdu_1.getEntityLocation().setX(entityStatePdu_1.getEntityLocation().getX() + (Math.random() * 2));
System.out.println ("... My simulation just did something...");
System.out.flush();
narrativeMessage1 = "MV3500 ExampleSimulationProgram";
narrativeMessage2 = "runSimulation() loop " + simulationLoopCount;
narrativeMessage1 = "Ethan's Custom Simulation Program";
narrativeMessage2 = "Loop " + simulationLoopCount + " - MV3500 Custom Version";
narrativeMessage3 = "Simulation developed by Ethan Williams";
if (simulationLoopCount > MAX_LOOP_COUNT)
{
......@@ -242,14 +210,6 @@ public class ExampleSimulationProgram
}
}
/**
* Send EntityState, Fire, Comment PDUs for this loop.
* @param simTimeSeconds simulation time in seconds
* @param entityStatePdu the ESPDU to send
* @param firePdu the FirePDU to send
* @param commentType enumeration value describing purpose of the narrative comment PDU
* @param comments String array of narrative comments
*/
public void sendAllPdusForLoopTimestep(double simTimeSeconds,
EntityStatePdu entityStatePdu,
FirePdu firePdu,
......@@ -265,10 +225,6 @@ public class ExampleSimulationProgram
disChannel.sendCommentPdu(simTimeSeconds, commentType, comments);
}
/**
* Initial execution via main() method: handle args array of command-line initialization (CLI) arguments here
* @param args command-line parameters: network address and port
*/
protected void handleArguments (String[] args)
{
if (args.length == 2)
......@@ -285,47 +241,26 @@ public class ExampleSimulationProgram
}
}
/**
* Get simple descriptor for this network interface, used in trace statements
* @return simple descriptor name
*/
public String getDescriptor() {
return descriptor;
}
/**
* Set new simple descriptor for this network interface, used in trace statements
* @param newDescriptor simple descriptor name for this interface
*/
public void setDescriptor(String newDescriptor) {
if (newDescriptor == null)
newDescriptor = "";
this.descriptor = newDescriptor;
}
/**
* parameter accessor method
* @return the simulationTimeStepDuration in seconds
*/
public double getSimulationTimeStepDuration() {
return simulationTimeStepDuration;
}
/**
* parameter accessor method
* @param timeStepDurationSeconds the simulationTimeStepDuration in seconds to set
*/
public void setSimulationTimeStepDuration(double timeStepDurationSeconds) {
this.simulationTimeStepDuration = timeStepDurationSeconds;
}
/** Locally instantiable copy of program, can be subclassed. */
protected static ExampleSimulationProgram thisProgram;
/**
* Main method is first executed when a program instance is loaded.
* @param args command-line parameters: network address and port.
*/
public static void main(String[] args)
{
thisProgram = new ExampleSimulationProgram("test constructor");
......@@ -342,4 +277,4 @@ public class ExampleSimulationProgram
System.exit(0);
}
}
\ No newline at end of file
}
For Homework 3, I modified the OpenDIS ExampleSimulationProgram to enhance its functionality
by experimenting with entity enumeration values and adjusting the network communication setup.
On the networking side, I configured the program to use UDP multicast for distribution of the PDUs across
multiple participants in the simulation. I did this to attempt to create the
low-latency communication needed in large-scale simulations, where UDP's minimal overhead is
advantageous, and multicast ensures that updates reach all clients at the same time. I also
enabled verbose logging to facilitate debugging. Additionally, I adjusted
the simulation loop to increment Entity 1’s position in each iteration, simulating movement, and set
the loop to run for a maximum of 10 iterations.
\ No newline at end of file
For Homework 3, I altered the ExampleSimulationProgram by randomizing the entity IDs
and I also introduced randomized movement patterns for the entities during the simulation loop.
These changes make the simulation more realistic and ensuring variability in each run.
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment