def test_init_warn(self): print("Testing Warnings...") self.patchSumoConfig(vtypes_fn="input_types2.typ.xml") self.connectToSumo(self.SUMO_CFG) #print (self.cfg_body1) self.patchConfigFile(self.cfg_body1) simpla.load(self.CFG1) #simpla.load(self.SIMPLA_CFG_WARN) expected_warnings = [ "WARNING: Restricting given control rate (= 1000 per sec.) to 1 per timestep (= 10 per sec.) (PlatoonManager)", "WARNING: emergencyDecel of mapped vType 'connected_pCatchupFollower' (10.5m.) does not equal emergencyDecel of original vType 'connected' (4.5m.) (PlatoonManager)", "WARNING: emergencyDecel of mapped vType 'connected_pFollower' (1.7m.) does not equal emergencyDecel of original vType 'connected' (4.5m.) (PlatoonManager)", "WARNING: emergencyDecel of mapped vType 'connected_pCatchup' (0.5m.) does not equal emergencyDecel of original vType 'connected' (4.5m.) (PlatoonManager)", "WARNING: length of mapped vType 'connected_pLeader' (10.0m.) does not equal length of original vType 'connected' (5.0m.)\nThis will probably lead to collisions. (PlatoonManager)", "WARNING: length of mapped vType 'connected_pCatchupFollower' (3.0m.) does not equal length of original vType 'connected' (5.0m.)\nThis will probably lead to collisions. (PlatoonManager)", ] warnings_list = [r for t, r in rp.WARNING_LOG] #for w in warnings_list: # print(w) for w in expected_warnings: self.assertIn(w, warnings_list) self.assertListEqual( [], list(set(warnings_list).difference(expected_warnings))) traci.simulationStep(1000) self.assertEqual(rp.WARNING_LOG[-1][0], "1.0") self.assertEqual( rp.WARNING_LOG[-1][1], "WARNING: Step lengths that differ from SUMO's simulation step length are not supported and probably lead to undesired behavior.\nConsider decreasing simpla's control rate instead. (PlatoonManager)" )
def test_platoon_formation(self): print("Testing platoon formation...") self.patchSumoConfig(net_fn="input_net2.net.xml", routes_fn="input_routes2.rou.xml") self.connectToSumo(self.SUMO_CFG) self.patchConfigFile(self.cfg_body0) simpla.load(self.CFG1) # simpla.load(self.SIMPLA_CFG) mgr = simpla._mgr while traci.simulation.getCurrentTime() <= 5000: traci.simulationStep() self.assertIn("connected.1", mgr._connectedVehicles) self.assertIn("connected.2", mgr._connectedVehicles) veh1 = mgr._connectedVehicles["connected.1"] self.assertEqual(veh1.getCurrentPlatoonMode(), PlatoonMode.NONE) veh2 = mgr._connectedVehicles["connected.2"] self.assertEqual(veh2.getCurrentPlatoonMode(), PlatoonMode.CATCHUP) while traci.simulation.getCurrentTime() <= 20000: traci.simulationStep() # self.assertEqual(rp.REPORT_LOG[-1][0], "13.7") # self.assertEqual(rp.REPORT_LOG[-1][1], "Platoon '1' joined Platoon '0', which now contains vehicles:\n['connected.1', 'connected.2'] (PlatoonManager)") self.assertEqual(veh1.getCurrentPlatoonMode(), PlatoonMode.LEADER) self.assertEqual(veh2.getCurrentPlatoonMode(), PlatoonMode.FOLLOWER) vehs = mgr.getPlatoonLeaders()[0].getPlatoon().getVehicles() vehIDs = [v.getID() for v in vehs] self.assertEqual(len(vehIDs), 2) self.assertIn("connected.1", vehIDs) self.assertIn("connected.2", vehIDs) while traci.vehicle.getLaneID(vehIDs[0]) == traci.vehicle.getLaneID( vehIDs[1]): traci.simulationStep() self.assertFalse(veh1.state.laneID == veh2.state.laneID) t0 = traci.simulation.getCurrentTime() self.assertEqual(t0, 71400) expected_split_time = t0 + mgr._DeltaT * 1000 + cfg.PLATOON_SPLIT_TIME * 1000 while traci.simulation.getCurrentTime() <= expected_split_time: traci.simulationStep() self.assertAlmostEqual(veh2._timeUntilSplit, 0.0, 9) while traci.simulation.getCurrentTime() <= expected_split_time + 1000: traci.simulationStep() self.assertEqual( rp.REPORT_LOG[-1][1], "Platoon '0' splits (ID of new platoon: '6'):\n Platoon '0': ['connected.1']\n Platoon '6': ['connected.2'] (PlatoonManager)" )
def test_unknown_vtypes(self): print("Testing Exceptions for unknown vTypes...") self.patchSumoConfig(vtypes_fn="input_types2.typ.xml") self.connectToSumo(self.SUMO_CFG) #print (self.cfg_body1) self.patchConfigFile(self.cfg_body2) try: simpla.load(self.CFG1) self.assertTrue(False, "PlatoonManager() should raise an exception in case of unknown vtypes") except simpla.SimplaException as e: self.assertEqual(str(e), "vType 'unknownVTypeID' is unknown to sumo! Note: Platooning vTypes must be defined at startup.")
def test_init(self): print("Testing platoon manager initialization...") self.patchSumoConfig() self.connectToSumo(self.SUMO_CFG) self.patchConfigFile(self.cfg_body0) simpla.load(self.CFG1) self.assertListEqual([r for t,r in rp.WARNING_LOG],[]) expectedVTypes = ["connected", "connected_pLeader", "connected_pFollower", "connected_pCatchup", "connected_pCatchupFollower"] registeredPlatoonVTypes = list(set(reduce(lambda x,y: x+y, [[orig]+list(mapped.values()) for orig,mapped in cfg.PLATOON_VTYPES.items()]))) expectedVTypes.sort() registeredPlatoonVTypes.sort() self.assertListEqual(expectedVTypes, registeredPlatoonVTypes)
def test_add_and_remove(self): print("Testing adding and removing connected vehicles...") self.patchSumoConfig() self.connectToSumo(self.SUMO_CFG) self.patchConfigFile(self.cfg_body0) simpla.load(self.CFG1) # simpla.load(self.SIMPLA_CFG) mgr = simpla._mgr # # load simpla without adding a step listener # simpla._config.load(self.SIMPLA_CFG) # simpla._mgr = simpla._platoonmanager.PlatoonManager() self.assertListEqual([], traci.vehicle.getIDList()) traci.simulationStep() self.assertListEqual(['connected.1'], traci.vehicle.getIDList()) self.assertListEqual( ['connected.1'], [vehID for vehID in mgr._connectedVehicles.keys()]) self.assertEqual(rp.REPORT_LOG[-1][0], "0.1") self.assertEqual(rp.REPORT_LOG[-1][1], "Adding vehicle 'connected.1' (PlatoonManager)") while traci.simulation.getCurrentTime() < 2000: traci.simulationStep() self.assertListEqual(list(sorted(['connected.1', 'conventional.1'])), list(sorted(traci.vehicle.getIDList()))) self.assertListEqual( ['connected.1'], [vehID for vehID in mgr._connectedVehicles.keys()]) while traci.simulation.getCurrentTime() <= 5000: traci.simulationStep() self.assertEqual(rp.REPORT_LOG[-1][0], "3.1") self.assertEqual(rp.REPORT_LOG[-1][1], "Adding vehicle 'IAMconnectedTOO' (PlatoonManager)") self.assertTrue(mgr._hasConnectedType("IAMconnectedTOO")) self.assertListEqual( list(sorted(['connected.1', 'conventional.1', 'IAMconnectedTOO'])), list(sorted(traci.vehicle.getIDList()))) self.assertListEqual( list(sorted(['connected.1', 'IAMconnectedTOO'])), list(sorted([vehID for vehID in mgr._connectedVehicles.keys()]))) while traci.simulation.getCurrentTime() <= 14000: traci.simulationStep() self.assertEqual(rp.REPORT_LOG[-1][0], "11.4") self.assertEqual( rp.REPORT_LOG[-1][1], "Platoon '1' joined Platoon '0', which now contains vehicles:\n['connected.1', 'IAMconnectedTOO'] (PlatoonManager)" ) while traci.simulation.getCurrentTime() <= 17000: traci.simulationStep() self.assertEqual(rp.REPORT_LOG[-1][0], "16.0") self.assertEqual( rp.REPORT_LOG[-1][1], "Platoon '0' splits (ID of new platoon: '2'):\n Platoon '0': ['connected.1']\n Platoon '2': ['IAMconnectedTOO'] (PlatoonManager)" ) while traci.simulation.getCurrentTime() <= 18000: traci.simulationStep() self.assertEqual(rp.REPORT_LOG[-1][0], "17.3") self.assertEqual( rp.REPORT_LOG[-1][1], "Removing arrived vehicle 'connected.1' (PlatoonManager)") self.assertListEqual( list(sorted(['conventional.1', 'IAMconnectedTOO'])), list(sorted(traci.vehicle.getIDList()))) self.assertListEqual( ['IAMconnectedTOO'], [vehID for vehID in mgr._connectedVehicles.keys()]) while traci.simulation.getCurrentTime() <= 20000: traci.simulationStep() self.assertEqual(rp.REPORT_LOG[-1][0], "19.8") self.assertEqual( rp.REPORT_LOG[-1][1], "Removing arrived vehicle 'IAMconnectedTOO' (PlatoonManager)")
def prepare_sim(self): if self.is_enabled: # self.add_vtypes()# done in get_writexmlinfo means in get_vtypes() self.export_config() print 'Simplaconfig.prepare_sim', self.configfilepath, self.is_enabled simpla.load(self.configfilepath)
#!/usr/bin/env python3 import os, sys if 'SUMO_HOME' in os.environ: tools = os.path.join(os.environ['SUMO_HOME'], 'tools') sys.path.append(tools) else: sys.exit("please declare environment variable 'SUMO_HOME'") sumoBinary = "../../bin/sumo" sumoCmd = [sumoBinary, "-c", "./circular.sumocfg", "--fcd-output", "./circularTrace.xml", "--begin", "0", "--end", "10000", "--log", "log.txt"] import traci, simpla traci.start(sumoCmd) simpla.load("simpla.cfg") step = 0 while step < 10000: traci.simulationStep() step += 1 simpla.stop() traci.close()