| .. _start: |
|
|
| Quick Start |
| =========== |
|
|
| Installation |
| ------------ |
|
|
| If you have not installed CityFlow yet, :ref:`install` is a simple guide for installation. |
|
|
|
|
| Create Engine |
| ------------- |
|
|
| .. code-block:: python |
| |
| import cityflow |
| eng = cityflow.Engine(config_path, thread_num=1) |
|
|
|
|
| - ``config_path``: path for config file. |
| - ``thread_num``: number of threads. |
|
|
| Arguments In Config File |
| ^^^^^^^^^^^^^^^^^^^^^^^^ |
| - ``interval``: time of each simulation step (in seconds). An ``interval`` of 0.5 means for each simulation step, the system will move 0.5 seconds forward. For example, if a car is at location 0 with speed 10m/s, after one simulation step, it will move to location 10*0.5=5. |
| - ``seed``: random seed. |
| - ``dir``: root directory, all file path will be relative to this directory. |
| - ``roadnetFile``: path for roadnet file. |
| - ``flowFile``: path for flow file. |
| - ``rlTrafficLight``: whether to enable traffic light control through python API. If set to ``false``, default traffic light plan defined in ``roadnetFile`` will be used. |
| - ``saveReplay``: whether to save simulation for replay. If set to ``true``, ``roadnetLogFile`` and ``replayLogFile`` are required. |
| - ``roadnetLogFile``: path for roadnet replay file. This is a special roadnet file for replay, not the same as ``roadnetFile``. |
| - ``replayLogFile``: path for replay. This file contains vehicle positions and traffic light situation of each simulation step. |
| - ``laneChange``: whether to enable lane changing. The default value is 'false'. |
|
|
| For format of ``roadnetFile`` and ``flowFile``, please see :ref:`roadnet`, :ref:`flow` |
|
|
| .. note:: |
| Runnable sample roadnet and flow files can be found in ``examples`` folder. |
|
|
| You can generate grid roadnet and flow files using `tools/generate_grid_scenario.py` |
|
|
| For example, you can generate a 2x3 roadnet with predefined traffic light plan and a corresponding flow file with |
|
|
| .. code-block:: shell |
|
|
| python generate_grid_scenario.py 2 3 --roadnetFile roadnet.json --flowFile flow.json --dir . --tlPlan |
|
|
| Sample Config File |
| ^^^^^^^^^^^^^^^^^^^ |
|
|
| .. note:: |
| Runnable sample config files can be found in ``examples`` folder. |
|
|
| .. code-block:: json |
|
|
| { |
| "interval": 1.0, |
| "seed": 0, |
| "dir": "data/", |
| "roadnetFile": "roadnet/testcase_roadnet_3x3.json", |
| "flowFile": "flow/testcase_flow_3x3.json", |
| "rlTrafficLight": false, |
| "saveReplay": true, |
| "roadnetLogFile": "frontend/web/testcase_roadnet_3x3.json", |
| "replayLogFile": "frontend/web/testcase_replay_3x3.txt" |
| } |
|
|
| Simulation |
| ---------- |
|
|
| To simulate one step, simply call ``eng.next_step()`` |
|
|
| .. code-block:: python |
|
|
| eng.next_step() |
|
|
| Data Access API |
| --------------- |
|
|
| ``get_vehicle_count()``: |
|
|
| - Get number of total running vehicles. |
| - Return an ``int`` |
|
|
| ``get_vehicles(include_waiting=False)``: |
|
|
| - Get all vehicle ids |
| - Include vehicles in lane's waiting buffer if ``include_waiting=True`` |
| - Return an ``list`` of vehicle ids |
| |
| ``get_lane_vehicle_count()``: |
| |
| - Get number of running vehicles on each lane. |
| - Return a ``dict`` with lane id as key and corresponding number as value. |
| |
| ``get_lane_waiting_vehicle_count()``: |
| |
| - Get number of waiting vehicles on each lane. Currently, vehicles with speed less than 0.1m/s is considered as waiting. |
| - Return a ``dict`` with lane id as key and corresponding number as value. |
| |
| ``get_lane_vehicles()``: |
| |
| - Get vehicle ids on each lane. |
| - Return a ``dict`` with lane id as key and list of vehicle id as value. |
| |
| ``get_vehicle_info(vehicle_id)``: |
| |
| - Return a ``dict`` which contains information of the given vehicle. |
| - The items include: |
| |
| + ``running``: whether the vehicle is running. |
| + If the vehicle is running: |
| |
| * ``speed``: The speed of the vehicle. |
| * ``distance``: The distance the vehicle has travelled on the current lane or lanelink. |
| * ``drivable``: The id of the current drivable(lane or lanelink) |
| * ``road``: The id of the current road if the vehicle is running on a lane. |
| * ``intersection``: The next intersection if the vehicle is running on a lane. |
| * ``route``: A string contains ids of following roads in the vehicle's route which are separated by ``' '``. |
|
|
| - Note that all items are stored as ``str``. |
|
|
| ``get_vehicle_speed()``: |
|
|
| - Get speed of each vehicle |
| - Return a ``dict`` with vehicle id as key and corresponding speed as value. |
|
|
| ``get_vehicle_distance()``: |
|
|
| - Get distance travelled on current lane of each vehicle. |
| - Return a ``dict`` with vehicle id as key and corresponding distance as value. |
|
|
| ``get_leader(vehicle_id)`` |
|
|
| - Return the id of the vehicle in front of ``vehicle_id``. |
| - Return an empty string ``""`` when ``vehicle_id`` does not have a leader |
|
|
| ``get_current_time()``: |
|
|
| - Get simulation time (in seconds) |
| - Return a ``double`` |
|
|
| ``get_average_travel_time()``: |
|
|
| - Get average travel time (in seconds) |
| - Return a ``double`` |
|
|
| Control API |
| ----------- |
|
|
| ``set_tl_phase(intersection_id, phase_id)``: |
|
|
| - Set the phase of traffic light of ``intersection_id`` to ``phase_id``. Only works when ``rlTrafficLight`` is set to ``true``. |
| - The ``intersection_id`` should be defined in ``roadnetFile`` |
| - ``phase_id`` is the index of phase in array ``"lightphases"``, defined in ``roadnetFile``. |
|
|
| ``set_vehicle_speed(vehicle_id, speed)``: |
|
|
| - Set the speed of ``vehicle_id`` to ``speed``. |
| - The vehicles have to obey fundamental rules to avoid collisions so the real speed might be different from ``speed``. |
|
|
| ``reset(seed=False)``: |
|
|
| - Reset the simulation (clear all vehicles and set simulation time back to zero) |
| - Reset random seed if ``seed`` is set to ``True`` |
| - This does not clear old replays, instead, it appends new replays to ``replayLogFile``. |
|
|
| ``snapshot()``: |
|
|
| - Take a snapshot of current simulation state |
| - This will generate an ``Archive`` object which can be loaded later |
| - You can save an ``Archive`` object to a file using its ``dump`` method. |
|
|
| ``load(archive)``: |
|
|
| - Load an ``Archive`` object and restore simulation state |
|
|
| ``load_from_file(path)`` |
|
|
| - Load a snapshot file created by ``dump`` method and restore simulation state. |
| - The whole process of saving and loading file is like: |
|
|
| .. code-block:: python |
|
|
| archive = eng.snapshot() # create an archive object |
| archive.dump("save.json") # if you want to save the snapshot to a file |
|
|
| # do something |
|
|
| eng.load(archive) |
| # load 'archive' and the simulation will start from the status when 'archive'is created |
|
|
| # or if you want to load from 'save.json' |
| eng.load_from_file("save.json") |
|
|
|
|
| ``set_random_seed(seed)``: |
|
|
| - Set seed of random generator to ``seed`` |
|
|
| .. _set-replay-file: |
|
|
|
|
| ``set_vehicle_route(vehicle_id, route)``: |
|
|
| - To change the route of a vehicle during its travelling. |
| - `route` is a list of road ids (doesn't include the current road) |
| - Return true if the route is available and can be connected. |
| |
| |
| |
| Other API |
| --------- |
| |
| ``set_replay_file(replay_file)``: |
| |
| - ``replay_file`` should be a path related to ``dir`` in config file |
| - Set ``replayLogFile`` to ``replay_file``, newly generated replays will be output into ``replay_file`` |
| - This is useful when you want to look at a specific episode for debugging purposes |
| - This API works only when ``saveReplay`` is ``true`` in config json |
| |
| ``set_save_replay(open)``: |
| |
| - Open or close replay saving |
| - Set ``open`` to False to stop replay saving |
| - Set ``open`` to True to start replay saving |
| - This API works only when ``saveReplay`` is ``true`` in config json |