Skip to content

Long Example Usage

Long Example


import os.path
from pathlib import Path

from commonroad.common.file_reader import CommonRoadFileReader
from commonroad.planning.planning_problem import PlanningProblem
from commonroad_route_planner.reference_path import ReferencePath
from commonroad_route_planner.fast_api.fast_api import generate_reference_path_from_lanelet_network_and_planning_problem

from commonroad_idm_planner.configuration.planner_config import IDMConfig, IDMConfigFactory

# typing
from typing import Union

from commonroad_idm_planner.idm_planner import IDMPlanner
from commonroad_idm_planner.idm_trajectory import IDMTrajectory
from commonroad_idm_planner.util.collision.collision_status import CollisionStatus
from commonroad_idm_planner.util.pp_util import PlanningProblemFactory
from commonroad_idm_planner.util.visualization.visualize_scenario import visualize_idm_trajectory, make_gif
from commonroad_idm_planner.util.visualization.visualize_physics import visualize_physics
from commonroad_idm_planner.util.visualization.visualize_inputs import visualize_inputs
from commonroad_idm_planner.idm_path import IDMPath, IDMPathFactory


def main(
        scenario_path: Union[Path, str],
        show_plots: bool = True,
        save_img: bool = False,
        save_dir: Union[str, Path] = None,
        save_gif: bool = False
) -> None:
    pp_factory: PlanningProblemFactory = PlanningProblemFactory()

    scenario, planning_problem_set = CommonRoadFileReader(scenario_path).open()
    planning_problem: PlanningProblem = list(planning_problem_set.planning_problem_dict.values())[0]

    config: IDMConfig = IDMConfigFactory().generate_default_config()

    reference_path: ReferencePath = generate_reference_path_from_lanelet_network_and_planning_problem(
        lanelet_network=scenario.lanelet_network,
        planning_problem=planning_problem
    )

    idm_path: IDMPath = IDMPathFactory().generate_idm_path_from_cr_route_planner_reference_path(
        cr_reference_path=reference_path
    )

    idm_planner = IDMPlanner(
        scenario=scenario,
        planning_problem=planning_problem,
        config=config,
        idm_path=idm_path
    )

    trajectory_one_cycle: IDMTrajectory = idm_planner.plan()

    collision_status: CollisionStatus = idm_planner.check_collision()
    if collision_status.collision_detected:
        idm_planner.logger.info(f"{collision_status}")


    if not idm_planner.is_goal_reached:
        for replan_cycle_idx in range(6):
            new_pp: PlanningProblem = pp_factory.planning_problem_from_idm_state(
                idm_state=trajectory_one_cycle.final_state,
                goal_region=planning_problem.goal,
                planning_problem_id=planning_problem.planning_problem_id + 20000 + replan_cycle_idx
            )

            new_rp: ReferencePath = generate_reference_path_from_lanelet_network_and_planning_problem(
                lanelet_network=scenario.lanelet_network,
                planning_problem=new_pp
            )

            new_idm_path: IDMPath = IDMPathFactory().generate_idm_path_from_cr_route_planner_reference_path(
                cr_reference_path=new_rp
            )

            trajectory_one_cycle: IDMTrajectory = idm_planner.re_plan(
                planning_problem=new_pp,
                idm_path=new_idm_path
            )

            collision_status: CollisionStatus = idm_planner.check_collision()

            if collision_status.collision_detected:
                idm_planner.logger.info(f"{collision_status}")

            if idm_planner.is_goal_reached:
                idm_planner.logger.info(
                    f"Goal is reached:  \n"
                    f"  planner goal state: {idm_planner.goal_state} \n"
                )
                # prune scenario trajectory so last state is goal state
                idm_planner.prune_scenario_trajectory()
                break

    # calculate reconstructed input trajectory from scenario trajectory
    idm_planner.calc_steering_angle_for_scenario_traj(
        dt=scenario.dt,
        wheelbase_rear_to_cog=2.5
    )
    idm_planner.calc_input_trajectory_from_scenario_trajectory()

    if show_plots:
        print(f"generating images")

        if save_img:
            save_path = os.path.join(save_dir, str(scenario.scenario_id))
            save_path_physics = os.path.join(save_dir, str(scenario.scenario_id), "physics")
            save_path_input = os.path.join(save_dir, str(scenario.scenario_id), "rec_input")
        else:
            save_path = None
            save_path_physics = None
            save_path_input = None

        visualize_idm_trajectory(
            scenario=scenario,
            planning_problem=planning_problem,
            idm_path=idm_path,
            idm_trajectory=idm_planner.trajectory_over_scenario,
            idm_config=config,
            save_img=save_img,
            save_path=save_path
        )


        if save_img and save_gif:
            make_gif(
                path_to_img_dir=save_path,
                scenario_name=str(scenario.scenario_id),
                num_imgs=idm_planner.trajectory_over_scenario.num_time_steps
            )

        visualize_physics(
            idm_trajectory=idm_planner.trajectory_over_scenario,
            idm_config=config,
            save_img=save_img,
            delta_t=scenario.dt,
            save_path=save_path_physics
        )

        if idm_planner.input_trajectory_over_scenario is not None:
            visualize_inputs(
                input_list=idm_planner.input_trajectory_over_scenario,
                save_img=save_img,
                save_path=save_path_input
            )

if __name__ == "__main__":

    dir_path = "PATH/TO/SCENARIO/FOLDER"
    filenames = sorted(os.listdir(dir_path))

    for file_name in filenames:
        print(f'Planning scenario {file_name}')

        scenario_path = os.path.join(dir_path, file_name)
        save_dir = "PATH/TO/SAVE/IMGS
        save_gif: bool = True
        main(
            scenario_path=scenario_path,
            save_img=True,
            save_dir=save_dir,
            save_gif=save_gif
        )