From 3ef779ec9ac0a392802d221476b1fe79be478224 Mon Sep 17 00:00:00 2001 From: lola Date: Fri, 14 Feb 2025 11:37:40 -0800 Subject: [PATCH] -Improve error messages for missing or non-car initial object -Add skip for MetaDrive tests -Update test_pedestrian_movement to have specific coordinates for Car and Pedestrian --- src/scenic/simulators/metadrive/__init__.py | 10 +++++----- src/scenic/simulators/metadrive/model.scenic | 1 - src/scenic/simulators/metadrive/simulator.py | 9 +++++++-- tests/simulators/metadrive/test_metadrive.py | 12 +++++++++--- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/scenic/simulators/metadrive/__init__.py b/src/scenic/simulators/metadrive/__init__.py index 1db933373..5855846df 100644 --- a/src/scenic/simulators/metadrive/__init__.py +++ b/src/scenic/simulators/metadrive/__init__.py @@ -1,8 +1,8 @@ -metadrive = None try: import metadrive except ImportError: - raise ImportError("Metadrive is required. Please install the 'metadrive' package.") -if metadrive: - from .simulator import MetaDriveSimulator -del metadrive + raise ImportError( + "Metadrive is required. Please install the 'metadrive' package (and sumolib) or use scenic[metadrive]." + ) + +from .simulator import MetaDriveSimulator diff --git a/src/scenic/simulators/metadrive/model.scenic b/src/scenic/simulators/metadrive/model.scenic index 64c90188f..18070db55 100644 --- a/src/scenic/simulators/metadrive/model.scenic +++ b/src/scenic/simulators/metadrive/model.scenic @@ -31,7 +31,6 @@ from scenic.simulators.metadrive.simulator import MetaDriveSimulator from scenic.simulators.metadrive.actions import * from scenic.simulators.metadrive.behaviors import * from scenic.simulators.metadrive.utils import scenicToMetaDriveHeading -from metadrive.utils.math import norm if globalParameters.get("sumo_map") is None: diff --git a/src/scenic/simulators/metadrive/simulator.py b/src/scenic/simulators/metadrive/simulator.py index d24406fbc..f9850b5fb 100644 --- a/src/scenic/simulators/metadrive/simulator.py +++ b/src/scenic/simulators/metadrive/simulator.py @@ -97,11 +97,16 @@ def __init__( sumo_map_boundary, **kwargs, ): - # NOTE: MetaDrive requires at least one agent to be defined per simulation run + # NOTE: MetaDrive requires at least one agent to be defined per simulation run, + # and the first object must be a car (to serve as the ego vehicle). try: if len(scene.objects) == 0: raise SimulationCreationError( - "The Metadrive interface requires you to define at least one Scenic object." + "Metadrive requires you to define at least one Scenic object." + ) + if not scene.objects[0].isCar: + raise SimulationCreationError( + "The first object must be a car to serve as the ego vehicle in Metadrive." ) except SimulationCreationError as e: print(e) diff --git a/tests/simulators/metadrive/test_metadrive.py b/tests/simulators/metadrive/test_metadrive.py index 2d38e88eb..061382468 100644 --- a/tests/simulators/metadrive/test_metadrive.py +++ b/tests/simulators/metadrive/test_metadrive.py @@ -2,7 +2,13 @@ import pytest -from scenic.simulators.metadrive import MetaDriveSimulator +try: + import metadrive + + from scenic.simulators.metadrive import MetaDriveSimulator +except ModuleNotFoundError: + pytest.skip("MetaDrive package not installed", allow_module_level=True) + from tests.utils import compileScenic, pickle_test, sampleScene, tryPickling @@ -110,8 +116,8 @@ def test_pedestrian_movement(getMetadriveSimulator): do WalkForward() for 2 steps do StopWalking() for 2 steps - ego = new Car - pedestrian = new Pedestrian with behavior WalkThenStop + ego = new Car at (30, 2) + pedestrian = new Pedestrian at (50, 6), with behavior WalkThenStop record initial pedestrian.position as InitialPos record final pedestrian.position as FinalPos