diff --git a/docs/conf.py b/docs/conf.py index 1d8bc672..f44baa4d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -23,7 +23,7 @@ author = "Quentin Gallouédec" # The full version, including alpha/beta/rc tags -release = "v3.0.6" +release = "v3.0.7" # -- General configuration --------------------------------------------------- diff --git a/panda_gym/__init__.py b/panda_gym/__init__.py index af1077cf..3b2599e2 100644 --- a/panda_gym/__init__.py +++ b/panda_gym/__init__.py @@ -5,50 +5,20 @@ with open(os.path.join(os.path.dirname(__file__), "version.txt"), "r") as file_handler: __version__ = file_handler.read().strip() -for reward_type in ["sparse", "dense"]: - for control_type in ["ee", "joints"]: - reward_suffix = "Dense" if reward_type == "dense" else "" - control_suffix = "Joints" if control_type == "joints" else "" - kwargs = {"reward_type": reward_type, "control_type": control_type} - - register( - id="PandaReach{}{}-v3".format(control_suffix, reward_suffix), - entry_point="panda_gym.envs:PandaReachEnv", - kwargs=kwargs, - max_episode_steps=50, - ) - - register( - id="PandaPush{}{}-v3".format(control_suffix, reward_suffix), - entry_point="panda_gym.envs:PandaPushEnv", - kwargs=kwargs, - max_episode_steps=50, - ) - - register( - id="PandaSlide{}{}-v3".format(control_suffix, reward_suffix), - entry_point="panda_gym.envs:PandaSlideEnv", - kwargs=kwargs, - max_episode_steps=50, - ) - - register( - id="PandaPickAndPlace{}{}-v3".format(control_suffix, reward_suffix), - entry_point="panda_gym.envs:PandaPickAndPlaceEnv", - kwargs=kwargs, - max_episode_steps=50, - ) - - register( - id="PandaStack{}{}-v3".format(control_suffix, reward_suffix), - entry_point="panda_gym.envs:PandaStackEnv", - kwargs=kwargs, - max_episode_steps=100, - ) - - register( - id="PandaFlip{}{}-v3".format(control_suffix, reward_suffix), - entry_point="panda_gym.envs:PandaFlipEnv", - kwargs=kwargs, - max_episode_steps=50, - ) +ENV_IDS = [] + +for task in ["Reach", "Slide", "Push", "PickAndPlace", "Stack", "Flip"]: + for reward_type in ["sparse", "dense"]: + for control_type in ["ee", "joints"]: + reward_suffix = "Dense" if reward_type == "dense" else "" + control_suffix = "Joints" if control_type == "joints" else "" + env_id = f"Panda{task}{control_suffix}{reward_suffix}-v3" + + register( + id=env_id, + entry_point=f"panda_gym.envs:Panda{task}Env", + kwargs={"reward_type": reward_type, "control_type": control_type}, + max_episode_steps=100 if task == "Stack" else 50, + ) + + ENV_IDS.append(env_id) diff --git a/panda_gym/pybullet.py b/panda_gym/pybullet.py index a6760cbf..f4211af5 100644 --- a/panda_gym/pybullet.py +++ b/panda_gym/pybullet.py @@ -70,7 +70,8 @@ def step(self) -> None: def close(self) -> None: """Close the simulation.""" - self.physics_client.disconnect() + if self.physics_client.isConnected(): + self.physics_client.disconnect() def save_state(self) -> int: """Save the current simulation state. diff --git a/panda_gym/version.txt b/panda_gym/version.txt index 8ffc1ad6..3a8b9717 100644 --- a/panda_gym/version.txt +++ b/panda_gym/version.txt @@ -1 +1 @@ -3.0.6 \ No newline at end of file +3.0.7 \ No newline at end of file diff --git a/test/envs_test.py b/test/envs_test.py index fcf45ee1..0e9f9bb5 100644 --- a/test/envs_test.py +++ b/test/envs_test.py @@ -1,4 +1,5 @@ import gymnasium as gym +import pytest import panda_gym @@ -12,123 +13,12 @@ def run_env(env): if terminated or truncated: env.reset() env.close() + # check that it allows to be closed multiple times + env.close() -def test_reach(): - env = gym.make("PandaReach-v3") - run_env(env) - - -def test_slide(): - env = gym.make("PandaSlide-v3") - run_env(env) - - -def test_push(): - env = gym.make("PandaPush-v3") - run_env(env) - - -def test_pickandplace(): - env = gym.make("PandaPickAndPlace-v3") - run_env(env) - - -def test_stack(): - env = gym.make("PandaStack-v3") - run_env(env) - - -def test_flip(): - env = gym.make("PandaFlip-v3") - run_env(env) - - -def test_dense_reach(): - env = gym.make("PandaReachDense-v3") - run_env(env) - - -def test_dense_slide(): - env = gym.make("PandaSlideDense-v3") - run_env(env) - - -def test_dense_push(): - env = gym.make("PandaPushDense-v3") - run_env(env) - - -def test_dense_pickandplace(): - env = gym.make("PandaPickAndPlaceDense-v3") - run_env(env) - - -def test_dense_stack(): - env = gym.make("PandaStackDense-v3") - run_env(env) - - -def test_dense_flip(): - env = gym.make("PandaFlipDense-v3") - run_env(env) - - -def test_reach_joints(): - env = gym.make("PandaReachJoints-v3") - run_env(env) - - -def test_slide_joints(): - env = gym.make("PandaSlideJoints-v3") - run_env(env) - - -def test_push_joints(): - env = gym.make("PandaPushJoints-v3") - run_env(env) - - -def test_pickandplace_joints(): - env = gym.make("PandaPickAndPlaceJoints-v3") - run_env(env) - - -def test_stack_joints(): - env = gym.make("PandaStackJoints-v3") - run_env(env) - - -def test_flip_joints(): - env = gym.make("PandaFlipJoints-v3") - run_env(env) - - -def test_dense_reach_joints(): - env = gym.make("PandaReachJointsDense-v3") - run_env(env) - - -def test_dense_slide_joints(): - env = gym.make("PandaSlideDense-v3") - run_env(env) - - -def test_dense_push_joints(): - env = gym.make("PandaPushJointsDense-v3") - run_env(env) - - -def test_dense_pickandplace_joints(): - env = gym.make("PandaPickAndPlaceJointsDense-v3") - run_env(env) - - -def test_dense_stack_joints(): - env = gym.make("PandaStackJointsDense-v3") - run_env(env) - - -def test_dense_flip_joints(): - env = gym.make("PandaFlipJointsDense-v3") +@pytest.mark.parametrize("env_id", panda_gym.ENV_IDS) +def test_env(env_id): + """Tests running panda gym envs.""" + env = gym.make(env_id) run_env(env)