Esempio n. 1
0
 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)"
     )
Esempio n. 2
0
    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)"
        )
Esempio n. 3
0
 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.")
Esempio n. 4
0
 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)
Esempio n. 5
0
    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)")
Esempio n. 6
0
 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()