import logging
import time
from typing import List
from commonroad.geometry.shape import Shape
from commonroad_reach.data_structure.configuration import Configuration
from commonroad_reach.data_structure.reach.driving_corridor import DrivingCorridor
from commonroad_reach.data_structure.reach.driving_corridor_extractor import DrivingCorridorExtractor
from commonroad_reach.data_structure.reach.reach_set import ReachableSet
import commonroad_reach.utility.logger as util_logger
logger = logging.getLogger(__name__)
[docs]class ReachableSetInterface:
"""
Interface for reachable set computation.
"""
def __init__(self, config: Configuration):
self.config = None
self._reach = None
self._reachable_set_computed = False
self._driving_corridor_extractor = None
self.reset(config)
util_logger.print_and_log_debug(logger, "Reachable set interface initialized.")
@property
def step_start(self):
return self._reach.step_start
@property
def step_end(self):
return self._reach.step_end
@property
def drivable_area(self):
return self._reach.drivable_area
@property
def reachable_set(self):
return self._reach.reachable_set
[docs] def reset(self, config: Configuration):
"""
Resets configuration of the interface.
"""
self.config = config
self._reach = None
self._reachable_set_computed = False
self._driving_corridor_extractor = None
if self.config.reachable_set.mode_computation in [1, 2, 3, 4]:
self._reach = ReachableSet.instantiate(self.config)
else:
message = "Specified mode ID is invalid."
util_logger.print_and_log_error(logger, message)
raise Exception(message)
[docs] def drivable_area_at_step(self, step: int):
if not self._reachable_set_computed and step != 0:
util_logger.print_and_log_warning(logger, "Reachable set is not computed, retrieving drivable area failed.")
return []
else:
return self._reach.drivable_area_at_step(step)
[docs] def reachable_set_at_step(self, step: int):
if not self._reachable_set_computed and step != 0:
util_logger.print_and_log_warning(logger, "Reachable set is not computed, retrieving reachable set failed.")
return []
else:
return self._reach.reachable_set_at_step(step)
[docs] def compute_reachable_sets(self, step_start: int = 0, step_end: int = 0):
"""
Computes reachable sets between the given start and end steps.
"""
util_logger.print_and_log_info(logger, "* Computing reachable sets...")
if not self._reach:
util_logger.print_and_log_warning(logger, "Reachable set is not initialized, aborting computation.")
return None
step_start = step_start if step_start else self.step_start + 1
step_end = step_end if step_end else self.step_end
if not (0 < step_start < step_end):
util_logger.print_and_log_warning(logger, "Steps for computation are invalid, aborting computation.")
return None
time_start = time.time()
self._reach.compute(step_start, step_end)
self._reachable_set_computed = True
time_computation = time.time() - time_start
util_logger.print_and_log_info(logger, f"\tTook: \t{time_computation:.3f}s")