From eb7679754831c5a5c5c49280f02ced71ec51bf73 Mon Sep 17 00:00:00 2001 From: Jean Meurice Date: Sat, 5 Dec 2020 14:59:13 +0100 Subject: [PATCH 1/2] Vis Update, New Task based scenarios --- install/autopilots/TestEMADLAP.dll | Bin 0 -> 59392 bytes install/autopilots/TestEMAMAP.dll | Bin 0 -> 59392 bytes install/scenarios/EMA.json | 223 ------------------ install/scenarios/EMADL_native.json | 68 ++++++ install/scenarios/EMAM_emu.json | 76 ++++++ .../{minimal.json => EMAM_native.json} | 25 +- install/scenarios/cppautopilot.json | 183 ++------------ install/scenarios/cppautopilot_native.json | 185 ++------------- .../{EMA_native.json => explicit.json} | 39 +-- install/scenarios/java_autopilot.json | 198 ++-------------- install/scenarios/two_cars.json | 122 ++++++++++ install/scenarios/vcg.json | 169 ++----------- pom.xml | 8 +- .../de/rwth/montisim/basic_simulator/App.java | 33 +-- .../montisim/basic_simulator/gui/Browser.java | 52 +++- .../montisim/basic_simulator/gui/MapVis.java | 7 +- .../basic_simulator/gui/ScenarioVis.java | 218 ++++++++++++----- 17 files changed, 607 insertions(+), 999 deletions(-) create mode 100644 install/autopilots/TestEMADLAP.dll create mode 100644 install/autopilots/TestEMAMAP.dll delete mode 100644 install/scenarios/EMA.json create mode 100644 install/scenarios/EMADL_native.json create mode 100644 install/scenarios/EMAM_emu.json rename install/scenarios/{minimal.json => EMAM_native.json} (69%) rename install/scenarios/{EMA_native.json => explicit.json} (89%) create mode 100644 install/scenarios/two_cars.json diff --git a/install/autopilots/TestEMADLAP.dll b/install/autopilots/TestEMADLAP.dll new file mode 100644 index 0000000000000000000000000000000000000000..0949f0f0d1dcc8937e3fddbca1531252496b9fd8 GIT binary patch literal 59392 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�~G0sFacjha}cTOV0o;a(XiQ7rZ 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 literal 0 HcmV?d00001 diff --git a/install/scenarios/EMA.json b/install/scenarios/EMA.json deleted file mode 100644 index ad966d1..0000000 --- a/install/scenarios/EMA.json +++ /dev/null @@ -1,223 +0,0 @@ -{ - "name": "new_basic", - "map_name": "aachen", - "cars": [ - { - "name": "TestVehicle", - "start_coords": [ - 0, - 0 - ], - "end_coords": [ - -63.83, - -171.96 - ], - "body": { - "mass": 1642.0, - "length": 4.971, - "width": 1.87, - "height": 1.383, - "center_of_gravity_height": 0.34575 - }, - "wheels": { - "diameter": 0.6612, - "width": 0.255, - "front_wheel_axis_offset": 1.0, - "max_turning_angle": 30.0, - "front_track_width": 1.57988, - "back_track_dist": 1.60274, - "wheelbase": 2.812, - "wheelbase_offset": 0.0 - }, - "powertrain": { - "type": "electrical", - "traction": "rear", - "braking": "front", - "max_braking_force": 5000.0, - "motor": { - "motor_efficiency": 0.7, - "regen_efficiency": 0.5, - "motor_peek_torque": 450.0 - }, - "battery": { - "type": "infinite", - "capacity": 1.8E8, - "critical_charge": 10.0 - }, - "transmission_ratio": 9.0 - }, - "physics": { - "type": "rigidbody" - }, - "components": [ - { - "type": "actuator", - "name": "SteeringActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "steering", - "change_rate": 60.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } - }, - { - "type": "actuator", - "name": "BrakingActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "braking", - "change_rate": 10.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } - }, - { - "type": "actuator", - "name": "GasActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "gas", - "change_rate": "Infinity", - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } - }, - { - "type": "sensor", - "name": "TrueVelocitySensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_velocity", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false - }, - { - "type": "sensor", - "name": "TruePositionSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_position", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false - }, - { - "type": "sensor", - "name": "TrueCompassSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_compass", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false - }, - { - "type": "navigation", - "name": "Navigation", - "priority": {}, - "buses": [ - "DefaultBus" - ] - }, - { - "type": "constant_bus", - "name": "DefaultBus", - "priority": {}, - "mode": "instant", - "rate": 0.0 - }, - { - "type": "computer", - "software_name": "BasicAutopilot", - "emulator_type": "emu", - "os": "windows", - "time_model": { - "type": "models", - "cpu_frequency": 4000000000, - "memory_frequency": 2500000000, - "caches": [ - {"type": "I", "level": 1, "size": 262144, "read_ticks": 4, "write_ticks": 4}, - {"type": "D", "level": 1, "size": 262144, "read_ticks": 4, "write_ticks": 4}, - {"type": "shared", "level": 2, "size": 2097152, "read_ticks": 6, "write_ticks": 6}, - {"type": "shared", "level": 3, "size": 12582912, "read_ticks": 40, "write_ticks": 40} - ] - } - } - ] - } - ] -} \ No newline at end of file diff --git a/install/scenarios/EMADL_native.json b/install/scenarios/EMADL_native.json new file mode 100644 index 0000000..330ec14 --- /dev/null +++ b/install/scenarios/EMADL_native.json @@ -0,0 +1,68 @@ +{ + "name": "EMADL_native", + "map_name": "aachen", + "cars": [ + { + "name": "EMADLTestVehicle", + "start_pos": [ 0, 0 ], + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] + }, + "components": [ + { "type": "constant_bus" }, + { + "type": "actuator", + "name": "SteeringActuator", + "physical_value_name": "steering", + "change_rate": 60.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "BrakingActuator", + "physical_value_name": "braking", + "change_rate": 10.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "GasActuator", + "physical_value_name": "gas", + "sensor": { "type": "sensor" } + }, + { + "type": "sensor", + "name": "TrueVelocitySensor", + "physical_value_name": "true_velocity" + }, + { + "type": "sensor", + "name": "TruePositionSensor", + "physical_value_name": "true_position" + }, + { + "type": "sensor", + "name": "TrueCompassSensor", + "physical_value_name": "true_compass" + }, + { "type": "navigation" }, + { + "type": "computer", + "software_name": "TestEMADLAP", + "emulator_type": "direct", + "os": "windows", + "time_model": { + "type": "instant" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/install/scenarios/EMAM_emu.json b/install/scenarios/EMAM_emu.json new file mode 100644 index 0000000..135ef54 --- /dev/null +++ b/install/scenarios/EMAM_emu.json @@ -0,0 +1,76 @@ +{ + "name": "EMAM_emu", + "map_name": "aachen", + "cars": [ + { + "name": "EMAMTestVehicle", + "start_pos": [ 0, 0 ], + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] + }, + "components": [ + { "type": "constant_bus" }, + { + "type": "actuator", + "name": "SteeringActuator", + "physical_value_name": "steering", + "change_rate": 60.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "BrakingActuator", + "physical_value_name": "braking", + "change_rate": 10.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "GasActuator", + "physical_value_name": "gas", + "sensor": { "type": "sensor" } + }, + { + "type": "sensor", + "name": "TrueVelocitySensor", + "physical_value_name": "true_velocity" + }, + { + "type": "sensor", + "name": "TruePositionSensor", + "physical_value_name": "true_position" + }, + { + "type": "sensor", + "name": "TrueCompassSensor", + "physical_value_name": "true_compass" + }, + { "type": "navigation" }, + { + "type": "computer", + "software_name": "TestEMAMAP", + "emulator_type": "emu", + "os": "windows", + "time_model": { + "type": "models", + "cpu_frequency": 4000000000, + "memory_frequency": 2500000000, + "caches": [ + {"type": "I", "level": 1, "size": 262144, "read_ticks": 4, "write_ticks": 4}, + {"type": "D", "level": 1, "size": 262144, "read_ticks": 4, "write_ticks": 4}, + {"type": "shared", "level": 2, "size": 2097152, "read_ticks": 6, "write_ticks": 6}, + {"type": "shared", "level": 3, "size": 12582912, "read_ticks": 40, "write_ticks": 40} + ] + } + } + ] + } + ] +} \ No newline at end of file diff --git a/install/scenarios/minimal.json b/install/scenarios/EMAM_native.json similarity index 69% rename from install/scenarios/minimal.json rename to install/scenarios/EMAM_native.json index 528f9c2..33f0377 100644 --- a/install/scenarios/minimal.json +++ b/install/scenarios/EMAM_native.json @@ -1,10 +1,20 @@ { - "name": "new_basic", + "name": "EMAM_native", "map_name": "aachen", "cars": [ { - "start_coords": [ 0, 0 ], - "end_coords": [ -63.83, -171.96 ], + "name": "EMAMTestVehicle", + "start_pos": [ 0, 0 ], + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] + }, "components": [ { "type": "constant_bus" }, { @@ -44,8 +54,13 @@ }, { "type": "navigation" }, { - "type": "java_autopilot", - "maxVehicleAccel": 7.460690450979396 + "type": "computer", + "software_name": "TestEMAMAP", + "emulator_type": "direct", + "os": "windows", + "time_model": { + "type": "instant" + } } ] } diff --git a/install/scenarios/cppautopilot.json b/install/scenarios/cppautopilot.json index 3c5b1c3..3f8e766 100755 --- a/install/scenarios/cppautopilot.json +++ b/install/scenarios/cppautopilot.json @@ -4,202 +4,55 @@ "cars": [ { "name": "TestVehicle", - "start_coords": [ - 0, - 0 - ], - "end_coords": [ - -63.83, - -171.96 - ], - "body": { - "mass": 1642.0, - "length": 4.971, - "width": 1.87, - "height": 1.383, - "center_of_gravity_height": 0.34575 - }, - "wheels": { - "diameter": 0.6612, - "width": 0.255, - "front_wheel_axis_offset": 1.0, - "max_turning_angle": 30.0, - "front_track_width": 1.57988, - "back_track_dist": 1.60274, - "wheelbase": 2.812, - "wheelbase_offset": 0.0 - }, - "powertrain": { - "type": "electrical", - "traction": "rear", - "braking": "front", - "max_braking_force": 5000.0, - "motor": { - "motor_efficiency": 0.7, - "regen_efficiency": 0.5, - "motor_peek_torque": 450.0 - }, - "battery": { - "type": "infinite", - "capacity": 1.8E8, - "critical_charge": 10.0 - }, - "transmission_ratio": 9.0 - }, - "physics": { - "type": "rigidbody" + "start_pos": [ 0, 0 ], + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] }, "components": [ + { "type": "constant_bus" }, { "type": "actuator", "name": "SteeringActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "steering", "change_rate": 60.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "actuator", "name": "BrakingActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "braking", "change_rate": 10.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "actuator", "name": "GasActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "gas", - "change_rate": "Infinity", - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "sensor", "name": "TrueVelocitySensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_velocity", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false + "physical_value_name": "true_velocity" }, { "type": "sensor", "name": "TruePositionSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_position", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false + "physical_value_name": "true_position" }, { "type": "sensor", "name": "TrueCompassSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_compass", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false - }, - { - "type": "navigation", - "name": "Navigation", - "priority": {}, - "buses": [ - "DefaultBus" - ] - }, - { - "type": "constant_bus", - "name": "DefaultBus", - "priority": {}, - "mode": "instant", - "rate": 0.0 + "physical_value_name": "true_compass" }, + { "type": "navigation" }, { "type": "computer", "software_name": "cppautopilotzigzag", diff --git a/install/scenarios/cppautopilot_native.json b/install/scenarios/cppautopilot_native.json index 3076994..540bd0f 100755 --- a/install/scenarios/cppautopilot_native.json +++ b/install/scenarios/cppautopilot_native.json @@ -1,205 +1,58 @@ { - "name": "new_basic", + "name": "cppautopilot_native", "map_name": "aachen", "cars": [ { "name": "TestVehicle", - "start_coords": [ - 0, - 0 - ], - "end_coords": [ - -63.83, - -171.96 - ], - "body": { - "mass": 1642.0, - "length": 4.971, - "width": 1.87, - "height": 1.383, - "center_of_gravity_height": 0.34575 - }, - "wheels": { - "diameter": 0.6612, - "width": 0.255, - "front_wheel_axis_offset": 1.0, - "max_turning_angle": 30.0, - "front_track_width": 1.57988, - "back_track_dist": 1.60274, - "wheelbase": 2.812, - "wheelbase_offset": 0.0 - }, - "powertrain": { - "type": "electrical", - "traction": "rear", - "braking": "front", - "max_braking_force": 5000.0, - "motor": { - "motor_efficiency": 0.7, - "regen_efficiency": 0.5, - "motor_peek_torque": 450.0 - }, - "battery": { - "type": "infinite", - "capacity": 1.8E8, - "critical_charge": 10.0 - }, - "transmission_ratio": 9.0 - }, - "physics": { - "type": "rigidbody" + "start_pos": [ 0, 0 ], + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] }, "components": [ + { "type": "constant_bus" }, { "type": "actuator", "name": "SteeringActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "steering", "change_rate": 60.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "actuator", "name": "BrakingActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "braking", "change_rate": 10.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "actuator", "name": "GasActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "gas", - "change_rate": "Infinity", - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "sensor", "name": "TrueVelocitySensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_velocity", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false + "physical_value_name": "true_velocity" }, { "type": "sensor", "name": "TruePositionSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_position", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false + "physical_value_name": "true_position" }, { "type": "sensor", "name": "TrueCompassSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_compass", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false - }, - { - "type": "navigation", - "name": "Navigation", - "priority": {}, - "buses": [ - "DefaultBus" - ] - }, - { - "type": "constant_bus", - "name": "DefaultBus", - "priority": {}, - "mode": "instant", - "rate": 0.0 + "physical_value_name": "true_compass" }, + { "type": "navigation" }, { "type": "computer", "software_name": "cppautopilotzigzag", diff --git a/install/scenarios/EMA_native.json b/install/scenarios/explicit.json similarity index 89% rename from install/scenarios/EMA_native.json rename to install/scenarios/explicit.json index bc98651..44c6358 100644 --- a/install/scenarios/EMA_native.json +++ b/install/scenarios/explicit.json @@ -1,17 +1,20 @@ { - "name": "new_basic", + "name": "explicit", "map_name": "aachen", "cars": [ { "name": "TestVehicle", - "start_coords": [ - 0, - 0 - ], - "end_coords": [ - -63.83, - -171.96 - ], + "start_pos": [ -123.09, 21.64 ], + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] + }, "body": { "mass": 1642.0, "length": 4.971, @@ -201,13 +204,17 @@ "rate": 0.0 }, { - "type": "computer", - "software_name": "BasicAutopilot", - "emulator_type": "direct", - "os": "windows", - "time_model": { - "type": "instant" - } + "type": "java_autopilot", + "name": "TestAutopilot", + "priority": {}, + "buses": [ + "DefaultBus" + ], + "compute_time": [ + 0, + 0 + ], + "maxVehicleAccel": 7.460690450979396 } ] } diff --git a/install/scenarios/java_autopilot.json b/install/scenarios/java_autopilot.json index 3eef0a4..b0bc2e2 100755 --- a/install/scenarios/java_autopilot.json +++ b/install/scenarios/java_autopilot.json @@ -1,216 +1,62 @@ { - "name": "new_basic", + "name": "java_autopilot", "map_name": "aachen", + "max_duration": [60,0], + "tick_duration": [0,10000000], "cars": [ { - "name": "TestVehicle", - "start_coords": [ - 0, - 0 - ], - "end_coords": [ - -63.83, - -171.96 - ], - "body": { - "mass": 1642.0, - "length": 4.971, - "width": 1.87, - "height": 1.383, - "center_of_gravity_height": 0.34575 - }, - "wheels": { - "diameter": 0.6612, - "width": 0.255, - "front_wheel_axis_offset": 1.0, - "max_turning_angle": 30.0, - "front_track_width": 1.57988, - "back_track_dist": 1.60274, - "wheelbase": 2.812, - "wheelbase_offset": 0.0 - }, - "powertrain": { - "type": "electrical", - "traction": "rear", - "braking": "front", - "max_braking_force": 5000.0, - "motor": { - "motor_efficiency": 0.7, - "regen_efficiency": 0.5, - "motor_peek_torque": 450.0 - }, - "battery": { - "type": "infinite", - "capacity": 1.8E8, - "critical_charge": 10.0 - }, - "transmission_ratio": 9.0 - }, - "physics": { - "type": "rigidbody" + "start_pos": [ -123.09, 21.64 ], + "start_orientation": -30.0, + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] }, "components": [ + { "type": "constant_bus" }, { "type": "actuator", "name": "SteeringActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "steering", "change_rate": 60.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "actuator", "name": "BrakingActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "braking", "change_rate": 10.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "actuator", "name": "GasActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "gas", - "change_rate": "Infinity", - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "sensor", "name": "TrueVelocitySensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_velocity", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false + "physical_value_name": "true_velocity" }, { "type": "sensor", "name": "TruePositionSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_position", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false + "physical_value_name": "true_position" }, { "type": "sensor", "name": "TrueCompassSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_compass", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false - }, - { - "type": "navigation", - "name": "Navigation", - "priority": {}, - "buses": [ - "DefaultBus" - ] - }, - { - "type": "constant_bus", - "name": "DefaultBus", - "priority": {}, - "mode": "instant", - "rate": 0.0 + "physical_value_name": "true_compass" }, + { "type": "navigation" }, { "type": "java_autopilot", - "name": "TestAutopilot", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "compute_time": [ - 0, - 0 - ], "maxVehicleAccel": 7.460690450979396 } ] diff --git a/install/scenarios/two_cars.json b/install/scenarios/two_cars.json new file mode 100644 index 0000000..a4f9f62 --- /dev/null +++ b/install/scenarios/two_cars.json @@ -0,0 +1,122 @@ +{ + "name": "java_autopilot", + "map_name": "aachen", + "cars": [ + { + "name": "Car1", + "start_pos": [ -123.09, 21.64 ], + "start_orientation": -30.0, + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] + }, + "components": [ + { "type": "constant_bus" }, + { + "type": "actuator", + "name": "SteeringActuator", + "physical_value_name": "steering", + "change_rate": 60.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "BrakingActuator", + "physical_value_name": "braking", + "change_rate": 10.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "GasActuator", + "physical_value_name": "gas", + "sensor": { "type": "sensor" } + }, + { + "type": "sensor", + "name": "TrueVelocitySensor", + "physical_value_name": "true_velocity" + }, + { + "type": "sensor", + "name": "TruePositionSensor", + "physical_value_name": "true_position" + }, + { + "type": "sensor", + "name": "TrueCompassSensor", + "physical_value_name": "true_compass" + }, + { "type": "navigation" }, + { + "type": "java_autopilot", + "maxVehicleAccel": 7.460690450979396 + } + ] + }, + { + "name": "Car2", + "start_pos": [ -265.85, -56.34 ], + "start_orientation": 40.0, + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-159.65, -48.59] ], + "range": 5 + } + ] + }, + "components": [ + { "type": "constant_bus" }, + { + "type": "actuator", + "name": "SteeringActuator", + "physical_value_name": "steering", + "change_rate": 60.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "BrakingActuator", + "physical_value_name": "braking", + "change_rate": 10.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "GasActuator", + "physical_value_name": "gas", + "sensor": { "type": "sensor" } + }, + { + "type": "sensor", + "name": "TrueVelocitySensor", + "physical_value_name": "true_velocity" + }, + { + "type": "sensor", + "name": "TruePositionSensor", + "physical_value_name": "true_position" + }, + { + "type": "sensor", + "name": "TrueCompassSensor", + "physical_value_name": "true_compass" + }, + { "type": "navigation" }, + { + "type": "java_autopilot", + "maxVehicleAccel": 7.460690450979396 + } + ] + } + ] +} \ No newline at end of file diff --git a/install/scenarios/vcg.json b/install/scenarios/vcg.json index 8debd4b..feb788d 100644 --- a/install/scenarios/vcg.json +++ b/install/scenarios/vcg.json @@ -1,189 +1,58 @@ { - "name": "new_basic", + "name": "vcg", "map_name": "aachen", "cars": [ { "name": "VCGTestVehicle", - "start_coords": [ 0, 0 ], - "end_coords": [ -63.83, -171.96 ], - "body": { - "mass": 1642.0, - "length": 4.971, - "width": 1.87, - "height": 1.383, - "center_of_gravity_height": 0.34575 - }, - "wheels": { - "diameter": 0.6612, - "width": 0.255, - "front_wheel_axis_offset": 1.0, - "max_turning_angle": 30.0, - "front_track_width": 1.57988, - "back_track_dist": 1.60274, - "wheelbase": 2.812, - "wheelbase_offset": 0.0 - }, - "powertrain": { - "type": "electrical", - "traction": "rear", - "braking": "front", - "max_braking_force": 5000.0, - "motor": { - "motor_efficiency": 0.7, - "regen_efficiency": 0.5, - "motor_peek_torque": 450.0 - }, - "battery": { - "type": "infinite", - "capacity": 1.8E8, - "critical_charge": 10.0 - }, - "transmission_ratio": 9.0 - }, - "physics": { - "type": "rigidbody" + "start_pos": [ 0, 0 ], + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] }, "components": [ + { "type": "constant_bus" }, { "type": "actuator", "name": "SteeringActuator", - "priority": {}, - "buses": [ "DefaultBus" ], "physical_value_name": "steering", "change_rate": 60.0, - "sensor": { - "type": "sensor", - "name": "SteeringFeedbackSensor", - "priority": {}, - "buses": [ "DefaultBus" ], - "update_interval": [ 0, 100000000 ], - "read_time": [ 0, 1000000 ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "actuator", "name": "BrakingActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "braking", "change_rate": 10.0, - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "actuator", "name": "GasActuator", - "priority": {}, - "buses": [ - "DefaultBus" - ], "physical_value_name": "gas", - "change_rate": "Infinity", - "sensor": { - "type": "sensor", - "name": "UnnamedComponent", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 1000000 - ], - "send_only_changed": false - } + "sensor": { "type": "sensor" } }, { "type": "sensor", "name": "TrueVelocitySensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_velocity", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false + "physical_value_name": "true_velocity" }, { "type": "sensor", "name": "TruePositionSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_position", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false + "physical_value_name": "true_position" }, { "type": "sensor", "name": "TrueCompassSensor", - "priority": {}, - "buses": [ - "DefaultBus" - ], - "physical_value_name": "true_compass", - "update_interval": [ - 0, - 100000000 - ], - "read_time": [ - 0, - 10000000 - ], - "send_only_changed": false - }, - { - "type": "navigation", - "name": "Navigation", - "priority": {}, - "buses": [ - "DefaultBus" - ] - }, - { - "type": "constant_bus", - "name": "DefaultBus", - "priority": {}, - "mode": "instant", - "rate": 0.0 + "physical_value_name": "true_compass" }, + { "type": "navigation" }, { "type": "vcg", "name": "VCG", diff --git a/pom.xml b/pom.xml index 9f35aad..30e9aec 100644 --- a/pom.xml +++ b/pom.xml @@ -9,15 +9,15 @@ montisim basic-simulator - 2.0 + 2.1.2 basic-simulator - 2.0.6 - 2.0.1 - 3.0.1 + 2.0.10 + 2.0.3 + 3.1.1 UTF-8 diff --git a/src/main/java/de/rwth/montisim/basic_simulator/App.java b/src/main/java/de/rwth/montisim/basic_simulator/App.java index 2052054..427f308 100644 --- a/src/main/java/de/rwth/montisim/basic_simulator/App.java +++ b/src/main/java/de/rwth/montisim/basic_simulator/App.java @@ -6,28 +6,18 @@ package de.rwth.montisim.basic_simulator; import de.rwth.montisim.basic_simulator.filesystem.FileSystem; import de.rwth.montisim.basic_simulator.gui.Browser; import de.rwth.montisim.commons.map.Pathfinding; +import de.rwth.montisim.commons.simulation.TaskStatus; import de.rwth.montisim.commons.utils.LibraryService; import de.rwth.montisim.commons.utils.json.*; import de.rwth.montisim.hardware_emulator.CppBridge; import de.rwth.montisim.hardware_emulator.computer.ComputerProperties; import de.rwth.montisim.hardware_emulator.vcg.VCGProperties; -import de.rwth.montisim.simulation.eecomponents.autopilots.*; -import de.rwth.montisim.simulation.eecomponents.navigation.NavigationProperties; -import de.rwth.montisim.simulation.eesimulator.actuator.ActuatorProperties; -import de.rwth.montisim.simulation.eesimulator.bridge.BridgeProperties; -import de.rwth.montisim.simulation.eesimulator.bus.can.CANProperties; -import de.rwth.montisim.simulation.eesimulator.bus.constant.ConstantBusProperties; import de.rwth.montisim.simulation.eesimulator.message.MessageTypeManager; -import de.rwth.montisim.simulation.eesimulator.sensor.SensorProperties; -import de.rwth.montisim.simulation.eesimulator.testcomponents.TestCompProperties; import de.rwth.montisim.simulation.environment.world.World; import de.rwth.montisim.simulation.environment.osmmap.*; import de.rwth.montisim.simulation.environment.pathfinding.PathfindingImpl; import de.rwth.montisim.simulation.simulator.*; import de.rwth.montisim.simulation.simulator.visualization.ui.UIInfo; -import de.rwth.montisim.simulation.vehicle.physicsmodel.rigidbody.RigidbodyPhysicsProperties; -import de.rwth.montisim.simulation.vehicle.powertrain.electrical.ElectricalPTProperties; -import de.rwth.montisim.simulation.vehicle.powertrain.fuel.FuelPTProperties; import javax.swing.*; @@ -37,20 +27,9 @@ import java.io.IOException; public class App { static { - Json.registerType(ElectricalPTProperties.class); - Json.registerType(FuelPTProperties.class); - Json.registerType(NavigationProperties.class); - Json.registerType(JavaAutopilotProperties.class); - Json.registerType(TestAutopilotProperties.class); - Json.registerType(RigidbodyPhysicsProperties.class); - Json.registerType(ActuatorProperties.class); - Json.registerType(BridgeProperties.class); - Json.registerType(CANProperties.class); - Json.registerType(ConstantBusProperties.class); - Json.registerType(SensorProperties.class); - Json.registerType(TestCompProperties.class); Json.registerType(ComputerProperties.class); Json.registerType(VCGProperties.class); + Simulator.registerJsonTypes(); } public static void main( String[] args ) @@ -109,14 +88,16 @@ public class App File scenarioFile = new File(path); SimulationConfig config = SimulationConfig.fromFile(scenarioFile); File mapPath = new File(config.map_name + ".osm"); - World world = new OsmToWorldLoader(new OsmMap(config.map_name, mapPath)).getWorld(); + OsmMap map = new OsmMap(config.map_name, mapPath); + World world = new OsmToWorldLoader(map).getWorld(); Pathfinding pathfinding = new PathfindingImpl(world); MessageTypeManager mtManager = new MessageTypeManager(); - Simulator simulator = new Simulator(config, world, pathfinding, mtManager); + Simulator simulator = config.build(world, pathfinding, mtManager, map); // Run simulation SimulationLoop simLoop = new SimulationLoop(simulator, config); - simLoop.run(); + TaskStatus res = simLoop.run(); + if (res == TaskStatus.FAILED) throw new IllegalStateException("Not all tasks were completed."); } catch (Exception e1) { e1.printStackTrace(); return; diff --git a/src/main/java/de/rwth/montisim/basic_simulator/gui/Browser.java b/src/main/java/de/rwth/montisim/basic_simulator/gui/Browser.java index c65e43f..6e59047 100644 --- a/src/main/java/de/rwth/montisim/basic_simulator/gui/Browser.java +++ b/src/main/java/de/rwth/montisim/basic_simulator/gui/Browser.java @@ -4,18 +4,22 @@ package de.rwth.montisim.basic_simulator.gui; import de.rwth.montisim.basic_simulator.filesystem.FileSystem; +import de.rwth.montisim.simulation.simulator.visualization.ui.UIInfo; import javax.swing.*; +import javax.swing.border.Border; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.*; import java.awt.*; +import java.awt.event.*; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; public class Browser extends JFrame implements TreeSelectionListener { private static final long serialVersionUID = -7491494784879564019L; + public static Border paneBorder; protected static class BrowserTree extends JTree { private static final long serialVersionUID = -3212587123492957572L; @@ -48,7 +52,8 @@ public class Browser extends JFrame implements TreeSelectionListener { public Browser(FileSystem file_system) throws IOException { super("MontiSim basic-simulator"); this.file_system = file_system; - setBackground(new Color(238,238,238)); + //setBackground(new Color(238,238,238)); + //getContentPane().setBackground(Color.WHITE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setSize(1200, 900); @@ -60,6 +65,7 @@ public class Browser extends JFrame implements TreeSelectionListener { //Add browser JScrollPane browser = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + paneBorder = browser.getBorder(); tree_root = new DefaultMutableTreeNode("Categories"); tree_model = new DefaultTreeModel(tree_root); @@ -85,10 +91,46 @@ public class Browser extends JFrame implements TreeSelectionListener { browser.setMinimumSize(new Dimension(300, 200)); browser.setViewportView(tree); - getContentPane().add(BorderLayout.LINE_START, browser); - - - + + + JPanel interm = new JPanel(); + + JCheckBox checkBox1 = new JCheckBox("Antialiasing", UIInfo.antialiasing); + checkBox1.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + UIInfo.antialiasing = e.getStateChange() == 1; + repaint(); + } + }); + checkBox1.setBackground(Color.WHITE); + interm.add(checkBox1); + + JCheckBox checkBox2 = new JCheckBox("Show Road Segments", UIInfo.showSegments); + checkBox2.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + UIInfo.showSegments = e.getStateChange() == 1; + repaint(); + } + }); + checkBox2.setBackground(Color.WHITE); + interm.add(checkBox2); + + interm.setBackground(Color.WHITE); + JPanel optionPanel = new JPanel(); + optionPanel.setLayout(new BoxLayout(optionPanel, BoxLayout.Y_AXIS)); + optionPanel.setBorder(paneBorder); + optionPanel.add(interm); + + + JPanel sidePanel = new JPanel(); + sidePanel.setLayout(new BorderLayout()); + sidePanel.add(browser, BorderLayout.CENTER); + sidePanel.add(optionPanel, BorderLayout.PAGE_END); + + getContentPane().add(BorderLayout.LINE_START, sidePanel); + + + setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH); setVisible(true); //making the frame visible } diff --git a/src/main/java/de/rwth/montisim/basic_simulator/gui/MapVis.java b/src/main/java/de/rwth/montisim/basic_simulator/gui/MapVis.java index 8912397..1776081 100644 --- a/src/main/java/de/rwth/montisim/basic_simulator/gui/MapVis.java +++ b/src/main/java/de/rwth/montisim/basic_simulator/gui/MapVis.java @@ -6,7 +6,7 @@ package de.rwth.montisim.basic_simulator.gui; import java.awt.BorderLayout; import java.io.File; -import javax.swing.*; +import java.awt.Color; import de.rwth.montisim.simulation.environment.osmmap.*; import de.rwth.montisim.simulation.environment.pathfinding.PathfindingImpl; @@ -16,7 +16,6 @@ import de.rwth.montisim.simulation.simulator.visualization.map.*; import de.rwth.montisim.simulation.simulator.visualization.ui.Viewer2D; public class MapVis extends SimVis { - public static final boolean SHOW_SEGMENTS = true; Viewer2D viewer; FileSystem fileSystem; @@ -24,8 +23,8 @@ public class MapVis extends SimVis { public MapVis(FileSystem fileSystem){ this.fileSystem = fileSystem; setLayout(new BorderLayout()); - add(new JLabel("Visualization of available maps."), BorderLayout.NORTH); viewer = new Viewer2D(); + viewer.setBackground(Color.WHITE); add( viewer, BorderLayout.CENTER ); } @@ -35,7 +34,7 @@ public class MapVis extends SimVis { File map_path = fileSystem.getPath("maps", elem.name + ".osm"); World world = new OsmToWorldLoader(new OsmMap("aachen", map_path)).getWorld(); viewer.clearRenderers(); - viewer.addRenderer(new WorldRenderer(world, SHOW_SEGMENTS)); + viewer.addRenderer(new WorldRenderer(world)); viewer.addRenderer(new PathfinderRenderer(new PathfindingImpl(world))); viewer.repaint(); } catch (Exception e) { diff --git a/src/main/java/de/rwth/montisim/basic_simulator/gui/ScenarioVis.java b/src/main/java/de/rwth/montisim/basic_simulator/gui/ScenarioVis.java index 45451d0..03fa00d 100644 --- a/src/main/java/de/rwth/montisim/basic_simulator/gui/ScenarioVis.java +++ b/src/main/java/de/rwth/montisim/basic_simulator/gui/ScenarioVis.java @@ -5,13 +5,11 @@ package de.rwth.montisim.basic_simulator.gui; import de.rwth.montisim.basic_simulator.filesystem.FileSystem; import de.rwth.montisim.commons.map.Pathfinding; +import de.rwth.montisim.commons.simulation.TaskStatus; import de.rwth.montisim.commons.simulation.TimeUpdate; +import de.rwth.montisim.commons.utils.IPM; import de.rwth.montisim.commons.utils.Vec2; -import de.rwth.montisim.commons.utils.Vec3; import de.rwth.montisim.commons.utils.json.SerializationException; -import de.rwth.montisim.simulation.eecomponents.navigation.Navigation; -import de.rwth.montisim.simulation.eesimulator.exceptions.EEMessageTypeException; -import de.rwth.montisim.simulation.eesimulator.exceptions.EESetupException; import de.rwth.montisim.simulation.eesimulator.message.MessageTypeManager; import de.rwth.montisim.simulation.environment.pathfinding.PathfindingImpl; import de.rwth.montisim.simulation.environment.osmmap.*; @@ -23,32 +21,37 @@ import de.rwth.montisim.simulation.simulator.visualization.map.PathfinderRendere import de.rwth.montisim.simulation.simulator.visualization.map.WorldRenderer; import de.rwth.montisim.simulation.simulator.visualization.ui.Control; import de.rwth.montisim.simulation.simulator.visualization.ui.SimulationRunner; +import de.rwth.montisim.simulation.simulator.visualization.ui.UIInfo; import de.rwth.montisim.simulation.simulator.visualization.ui.Viewer2D; import de.rwth.montisim.simulation.vehicle.Vehicle; -import de.rwth.montisim.simulation.vehicle.VehicleProperties; import javax.swing.*; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.*; import java.awt.BorderLayout; import java.io.File; import java.time.*; import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class ScenarioVis extends SimVis implements SimulationRunner { private static final long serialVersionUID = 7903217594061845406L; - public static final boolean SHOW_SEGMENTS = true; - final FileSystem fileSystem; String current_scenario = ""; JLabel scenario_name; - final Control control; - final Viewer2D viewer; + Control control; + Viewer2D viewer; private List carRenderers = new ArrayList<>(); Simulator simulator; + SimulationConfig simConfig; World world; + OsmMap map; Pathfinding pathfinding; MessageTypeManager mtManager; @@ -58,87 +61,105 @@ public class ScenarioVis extends SimVis implements SimulationRunner { Duration dt = Duration.ofMillis(PHYSICS_TICK_DURATION_MS); public ScenarioVis(FileSystem fileSystem) { + UIInfo.inspectAutopilots = false; + // setBackground(Color.WHITE); this.fileSystem = fileSystem; - viewer = new Viewer2D(); - viewer.setZoom(20); - - control = new Control(Control.Mode.SIMULATION, Instant.EPOCH, this, (int)PHYSICS_TICK_DURATION_MS, 30, 3); - - JPanel topPanel = new JPanel(); - topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS)); - topPanel.add(control); - topPanel.add(new JSeparator()); - - setLayout(new BorderLayout()); - add(topPanel, BorderLayout.PAGE_START); - add(viewer, BorderLayout.CENTER); - // add(plotter, BorderLayout.PAGE_END); + setupUI(); } - // public void setScenario(String scenario){ - // if (scenario != current_scenario){ - // current_scenario = scenario; - // scenario_name.setText(scenario); - // } - // } - private void setup() { + // Cleanup if a sim is here + if (simulator != null) { + simulator.destroy(); + simulator = null; + viewer.clearRenderers(); + carRenderers.clear(); + } + File scenarioFile = fileSystem.getPath("scenarios", current_scenario + ".json"); - SimulationConfig config; try { - config = SimulationConfig.fromFile(scenarioFile); + simConfig = SimulationConfig.fromFile(scenarioFile); } catch (SerializationException e1) { e1.printStackTrace(); return; } + control.init(simConfig.tick_duration, simConfig.start_time); // Create simulator from scenario file - File map_path = fileSystem.getPath("maps", config.map_name + ".osm"); + File map_path = fileSystem.getPath("maps", simConfig.map_name + ".osm"); World world; try { - world = new OsmToWorldLoader(new OsmMap(config.map_name, map_path)).getWorld(); + map = new OsmMap(simConfig.map_name, map_path); + world = new OsmToWorldLoader(map).getWorld(); pathfinding = new PathfindingImpl(world); } catch (Exception e1) { e1.printStackTrace(); return; } mtManager = new MessageTypeManager(); - simulator = new Simulator(config, world, pathfinding, mtManager); + simulator = simConfig.build(world, pathfinding, mtManager, map); // Setup visualizer - viewer.clearRenderers(); - viewer.addRenderer(new WorldRenderer(world, SHOW_SEGMENTS)); + viewer.addRenderer(new WorldRenderer(world)); viewer.addRenderer(new PathfinderRenderer(pathfinding)); - carRenderers.clear(); - for (VehicleProperties car_config : config.cars) { - Vehicle car; - try { - car = simulator.getVehicleBuilder(car_config).build(); - - simulator.addSimulationObject(car); - - car.physicsModel.setGroundPosition(new Vec3(car_config.start_coords, 0), new Vec2(1,0)); - - Navigation nav = (Navigation) car.eesystem.getComponentManager().getComponent("Navigation").get(); - nav.pushTargetPos(car_config.end_coords); - car.addTarget(car_config.end_coords); - - CarRenderer cr = new CarRenderer(); - cr.setCar(car); - viewer.addRenderer(cr); - carRenderers.add(cr); - } catch (SerializationException | EEMessageTypeException | EESetupException e) { - e.printStackTrace(); - } - + // Init CarRenderers and find view for all Vehicles + Collection vehicles = simulator.getVehicles(); + setView(vehicles); + + for (Vehicle v : vehicles) { + CarRenderer cr = new CarRenderer(); + cr.setCar(v); + viewer.addRenderer(cr); + carRenderers.add(cr); } viewer.repaint(); + } + void setView(Collection vehicles) { + Vec2 avg_pos = new Vec2(0, 0); + int count = 0; + Vec2 min_pos = new Vec2(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY); + Vec2 max_pos = new Vec2(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY); + Vec2 vpos = new Vec2(); + for (Vehicle v : vehicles) { + vpos.set(v.physicalObject.pos); + IPM.add(avg_pos, vpos); + if (vpos.x < min_pos.x) + min_pos.x = vpos.x; + if (vpos.y < min_pos.y) + min_pos.y = vpos.y; + if (vpos.x > max_pos.x) + max_pos.x = vpos.x; + if (vpos.y > max_pos.y) + max_pos.y = vpos.y; + ++count; + } + if (count == 0) { + viewer.setCenter(avg_pos); + viewer.setZoom(4); + return; + } + + IPM.multiply(avg_pos, 1.0 / (double) count); + viewer.setCenter(avg_pos); + + Vec2 range = new Vec2(); + IPM.subtractTo(range, max_pos, min_pos); + IPM.add(range, new Vec2(16, 16)); // Margin + Dimension d = viewer.getSize(); + double xscale = d.getWidth() / range.x; + double yscale = d.getHeight() / range.y; + double scale = 20; + if (xscale < scale) + scale = xscale; + if (yscale < scale) + scale = yscale; + viewer.setZoom(scale); } @Override @@ -164,4 +185,83 @@ public class ScenarioVis extends SimVis implements SimulationRunner { if (simulator != null) simulator.update(newTime); } + + void setupUI() { + viewer = new Viewer2D(); + viewer.setZoom(20); + + control = new Control(Control.Mode.SIMULATION, Instant.EPOCH, this, Duration.ofMillis(PHYSICS_TICK_DURATION_MS), 30, 3); + control.setBackground(Color.WHITE); + + JPanel topPanel = new JPanel(); + topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS)); + topPanel.setBorder(Browser.paneBorder); + topPanel.add(control); + + setLayout(new BorderLayout()); + add(topPanel, BorderLayout.PAGE_START); + + viewer.setBackground(Color.WHITE); + JPanel viewerContainer = new JPanel(); + viewerContainer.setLayout(new BoxLayout(viewerContainer, BoxLayout.Y_AXIS)); + viewerContainer.setBorder(Browser.paneBorder); + viewerContainer.add(viewer); + add(viewerContainer, BorderLayout.CENTER); + + JPanel interm = new JPanel(); + interm.setLayout(new FlowLayout()); + interm.setBackground(Color.WHITE); + + JCheckBox checkBox1 = new JCheckBox("Inspect Autopilot I/O", UIInfo.inspectAutopilots); + checkBox1.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + UIInfo.inspectAutopilots = e.getStateChange() == 1; + viewer.repaint(); + } + }); + interm.add(checkBox1); + + JCheckBox checkBox2 = new JCheckBox("Show Planned Path", UIInfo.drawPlannedPath); + checkBox2.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + UIInfo.drawPlannedPath = e.getStateChange() == 1; + viewer.setDirty(); + viewer.repaint(); + } + }); + interm.add(checkBox2); + + JCheckBox checkBox3 = new JCheckBox("Show Trajectory (Navigation output)", UIInfo.drawPlannedTrajectory); + checkBox3.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + UIInfo.drawPlannedTrajectory = e.getStateChange() == 1; + viewer.setDirty(); + viewer.repaint(); + } + }); + interm.add(checkBox3); + + JCheckBox checkBox4 = new JCheckBox("Show Actuators", UIInfo.drawActuators); + checkBox4.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + UIInfo.drawActuators = e.getStateChange() == 1; + viewer.setDirty(); + viewer.repaint(); + } + }); + interm.add(checkBox4); + + JPanel bottomPanel = new JPanel(); + bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.Y_AXIS)); + bottomPanel.setBorder(Browser.paneBorder); + bottomPanel.add(interm); + add(bottomPanel, BorderLayout.PAGE_END); + + // add(plotter, BorderLayout.PAGE_END); + } + + @Override + public TaskStatus status() { + return simulator.status(); + } } -- GitLab From 23db3dca670a1728e11f83edbad7a232431252ed Mon Sep 17 00:00:00 2001 From: Jean Meurice Date: Sat, 5 Dec 2020 15:04:43 +0100 Subject: [PATCH 2/2] CLI --- install/cli_test.json | 65 +++++++++++++++++++ install/cli_test_fail.json | 65 +++++++++++++++++++ .../de/rwth/montisim/basic_simulator/App.java | 7 +- 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 install/cli_test.json create mode 100644 install/cli_test_fail.json diff --git a/install/cli_test.json b/install/cli_test.json new file mode 100644 index 0000000..7b22792 --- /dev/null +++ b/install/cli_test.json @@ -0,0 +1,65 @@ +{ + "name": "cli_test", + "map_name": "maps/aachen", + "max_duration": [60,0], + "tick_duration": [0,10000000], + "cars": [ + { + "start_pos": [ -123.09, 21.64 ], + "start_orientation": -30.0, + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] + }, + "components": [ + { "type": "constant_bus" }, + { + "type": "actuator", + "name": "SteeringActuator", + "physical_value_name": "steering", + "change_rate": 60.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "BrakingActuator", + "physical_value_name": "braking", + "change_rate": 10.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "GasActuator", + "physical_value_name": "gas", + "sensor": { "type": "sensor" } + }, + { + "type": "sensor", + "name": "TrueVelocitySensor", + "physical_value_name": "true_velocity" + }, + { + "type": "sensor", + "name": "TruePositionSensor", + "physical_value_name": "true_position" + }, + { + "type": "sensor", + "name": "TrueCompassSensor", + "physical_value_name": "true_compass" + }, + { "type": "navigation" }, + { + "type": "java_autopilot", + "maxVehicleAccel": 7.460690450979396 + } + ] + } + ] +} \ No newline at end of file diff --git a/install/cli_test_fail.json b/install/cli_test_fail.json new file mode 100644 index 0000000..d84e4e0 --- /dev/null +++ b/install/cli_test_fail.json @@ -0,0 +1,65 @@ +{ + "name": "cli_test_fail", + "map_name": "maps/aachen", + "max_duration": [5,0], + "tick_duration": [0,10000000], + "cars": [ + { + "start_pos": [ -123.09, 21.64 ], + "start_orientation": -30.0, + "task": { + "goals": [ + { + "type": "path", + "ltl_operator": "eventually", + "path": [ [-63.83, -171.96] ], + "range": 5 + } + ] + }, + "components": [ + { "type": "constant_bus" }, + { + "type": "actuator", + "name": "SteeringActuator", + "physical_value_name": "steering", + "change_rate": 60.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "BrakingActuator", + "physical_value_name": "braking", + "change_rate": 10.0, + "sensor": { "type": "sensor" } + }, + { + "type": "actuator", + "name": "GasActuator", + "physical_value_name": "gas", + "sensor": { "type": "sensor" } + }, + { + "type": "sensor", + "name": "TrueVelocitySensor", + "physical_value_name": "true_velocity" + }, + { + "type": "sensor", + "name": "TruePositionSensor", + "physical_value_name": "true_position" + }, + { + "type": "sensor", + "name": "TrueCompassSensor", + "physical_value_name": "true_compass" + }, + { "type": "navigation" }, + { + "type": "java_autopilot", + "maxVehicleAccel": 7.460690450979396 + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/java/de/rwth/montisim/basic_simulator/App.java b/src/main/java/de/rwth/montisim/basic_simulator/App.java index 427f308..05d66bb 100644 --- a/src/main/java/de/rwth/montisim/basic_simulator/App.java +++ b/src/main/java/de/rwth/montisim/basic_simulator/App.java @@ -97,7 +97,12 @@ public class App // Run simulation SimulationLoop simLoop = new SimulationLoop(simulator, config); TaskStatus res = simLoop.run(); - if (res == TaskStatus.FAILED) throw new IllegalStateException("Not all tasks were completed."); + if (res == TaskStatus.SUCCEEDED) { + System.out.println("Simulation SUCCEEDED."); + } else { + System.out.println("Simulation FAILED."); + System.exit(-1); + } } catch (Exception e1) { e1.printStackTrace(); return; -- GitLab