From 9c79460a7bcb6813a2aaadc63a21d0b215327876 Mon Sep 17 00:00:00 2001 From: Chengshu Li Date: Fri, 23 Feb 2024 13:40:16 -0800 Subject: [PATCH 1/4] correct melted substance system name --- omnigibson/transition_rules.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/omnigibson/transition_rules.py b/omnigibson/transition_rules.py index 1ac848aad..7be925ee7 100644 --- a/omnigibson/transition_rules.py +++ b/omnigibson/transition_rules.py @@ -1011,7 +1011,10 @@ def transition(cls, object_candidates): # Convert the meltable object into its melted substance for meltable_obj in object_candidates["meltable"]: - system = get_system(f"melted__{meltable_obj.category}") + # All meltable xyz, half_xyz and diced__xyz transform into melted__xyz + root_category = meltable_obj.category.removeprefix("half_").remove_prefix("diced__") + system_name = f"melted__{root_category}") + system = get_system(system_name) system.generate_particles_from_link(meltable_obj, meltable_obj.root_link, check_contact=False, use_visual_meshes=False) # Delete original object from stage. From 31787bf4c5155a6f05490e1c02a590077078be13 Mon Sep 17 00:00:00 2001 From: Chengshu Li Date: Fri, 23 Feb 2024 13:41:37 -0800 Subject: [PATCH 2/4] set default physics fps and render fps to 120 and 30 --- omnigibson/envs/env_base.py | 4 ++-- .../examples/robots/robot_control_example.py | 2 +- omnigibson/simulator.py | 24 +++++++++---------- tests/benchmark/profiling.py | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/omnigibson/envs/env_base.py b/omnigibson/envs/env_base.py index 4644a84ca..7aadbf205 100644 --- a/omnigibson/envs/env_base.py +++ b/omnigibson/envs/env_base.py @@ -700,8 +700,8 @@ def default_config(self): return { # Environment kwargs "env": { - "action_frequency": 60, - "physics_frequency": 60, + "action_frequency": 30, + "physics_frequency": 120, "device": None, "automatic_reset": False, "flatten_action_space": False, diff --git a/omnigibson/examples/robots/robot_control_example.py b/omnigibson/examples/robots/robot_control_example.py index af520720c..ee54c27b6 100644 --- a/omnigibson/examples/robots/robot_control_example.py +++ b/omnigibson/examples/robots/robot_control_example.py @@ -75,7 +75,7 @@ def main(random_selection=False, headless=False, short_exec=False): # Create the config for generating the environment we want env_cfg = dict() env_cfg["action_frequency"] = 10 - env_cfg["physics_frequency"] = 60 + env_cfg["physics_frequency"] = 120 scene_cfg = dict() if scene_model == "empty": diff --git a/omnigibson/simulator.py b/omnigibson/simulator.py index ab5a71e4a..1542bfacf 100644 --- a/omnigibson/simulator.py +++ b/omnigibson/simulator.py @@ -163,10 +163,10 @@ class Simulator(lazy.omni.isaac.core.simulation_context.SimulationContext, Seria Args: gravity (float): gravity on z direction. - physics_dt (float): dt between physics steps. Defaults to 1.0 / 60.0. + physics_dt (float): dt between physics steps. Defaults to 1.0 / 120.0. rendering_dt (float): dt between rendering steps. Note: rendering means rendering a frame of the current application and not only rendering a frame to the viewports/ cameras. So UI elements of Isaac Sim will - be refreshed with this dt as well if running non-headless. Defaults to 1.0 / 60.0. + be refreshed with this dt as well if running non-headless. Defaults to 1.0 / 30.0. stage_units_in_meters (float): The metric units of assets. This will affect gravity value..etc. Defaults to 0.01. viewer_width (int): width of the camera image, in pixels @@ -178,8 +178,8 @@ class Simulator(lazy.omni.isaac.core.simulation_context.SimulationContext, Seria def __init__( self, gravity=9.81, - physics_dt=1.0 / 60.0, - rendering_dt=1.0 / 60.0, + physics_dt=1.0 / 120.0, + rendering_dt=1.0 / 30.0, stage_units_in_meters=1.0, viewer_width=gm.DEFAULT_VIEWER_WIDTH, viewer_height=gm.DEFAULT_VIEWER_HEIGHT, @@ -254,8 +254,8 @@ def __init__( def __new__( cls, gravity=9.81, - physics_dt=1.0 / 60.0, - rendering_dt=1.0 / 60.0, + physics_dt=1.0 / 120.0, + rendering_dt=1.0 / 30.0, stage_units_in_meters=1.0, viewer_width=gm.DEFAULT_VIEWER_WIDTH, viewer_height=gm.DEFAULT_VIEWER_HEIGHT, @@ -1194,12 +1194,12 @@ def _open_new_stage(self): # Store physics dt and rendering dt to reuse later # Note that the stage may have been deleted previously; if so, we use the default values - # of 1/60, 1/60 + # of 1/120, 1/30 try: physics_dt = self.get_physics_dt() except: - print("WARNING: Invalid or non-existent physics scene found. Setting physics dt to 1/60.") - physics_dt = 1 / 60. + print("WARNING: Invalid or non-existent physics scene found. Setting physics dt to 1/120.") + physics_dt = 1 / 120. rendering_dt = self.get_rendering_dt() # Open new stage -- suppressing warning that we're opening a new stage @@ -1230,12 +1230,12 @@ def _load_stage(self, usd_path): # Store physics dt and rendering dt to reuse later # Note that the stage may have been deleted previously; if so, we use the default values - # of 1/60, 1/60 + # of 1/120, 1/30 try: physics_dt = self.get_physics_dt() except: - print("WARNING: Invalid or non-existent physics scene found. Setting physics dt to 1/60.") - physics_dt = 1/60. + print("WARNING: Invalid or non-existent physics scene found. Setting physics dt to 1/120.") + physics_dt = 1/120. rendering_dt = self.get_rendering_dt() # Open new stage -- suppressing warning that we're opening a new stage diff --git a/tests/benchmark/profiling.py b/tests/benchmark/profiling.py index ea671f160..6720cf693 100644 --- a/tests/benchmark/profiling.py +++ b/tests/benchmark/profiling.py @@ -46,8 +46,8 @@ def main(): cfg = { "env": { - "action_frequency": 60, - "physics_frequency": 300, + "action_frequency": 30, + "physics_frequency": 120, } } if args.robot > 0: From 28964f12943237a8e9797ad3b807bc51f788ea63 Mon Sep 17 00:00:00 2001 From: Chengshu Li Date: Fri, 23 Feb 2024 14:19:37 -0800 Subject: [PATCH 3/4] fix minor typo --- omnigibson/transition_rules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/omnigibson/transition_rules.py b/omnigibson/transition_rules.py index 7be925ee7..9b47e488b 100644 --- a/omnigibson/transition_rules.py +++ b/omnigibson/transition_rules.py @@ -1013,7 +1013,7 @@ def transition(cls, object_candidates): for meltable_obj in object_candidates["meltable"]: # All meltable xyz, half_xyz and diced__xyz transform into melted__xyz root_category = meltable_obj.category.removeprefix("half_").remove_prefix("diced__") - system_name = f"melted__{root_category}") + system_name = f"melted__{root_category}" system = get_system(system_name) system.generate_particles_from_link(meltable_obj, meltable_obj.root_link, check_contact=False, use_visual_meshes=False) From b707e46f0bb7f140deb036040b2f8ebea9c726af Mon Sep 17 00:00:00 2001 From: Chengshu Li Date: Fri, 23 Feb 2024 17:25:20 -0800 Subject: [PATCH 4/4] fix tests --- omnigibson/transition_rules.py | 2 +- tests/test_object_states.py | 8 +- tests/test_transition_rules.py | 181 ++++++++++++++------------------- tests/utils.py | 15 ++- 4 files changed, 84 insertions(+), 122 deletions(-) diff --git a/omnigibson/transition_rules.py b/omnigibson/transition_rules.py index 9b47e488b..463077c24 100644 --- a/omnigibson/transition_rules.py +++ b/omnigibson/transition_rules.py @@ -1012,7 +1012,7 @@ def transition(cls, object_candidates): # Convert the meltable object into its melted substance for meltable_obj in object_candidates["meltable"]: # All meltable xyz, half_xyz and diced__xyz transform into melted__xyz - root_category = meltable_obj.category.removeprefix("half_").remove_prefix("diced__") + root_category = meltable_obj.category.removeprefix("half_").removeprefix("diced__") system_name = f"melted__{root_category}" system = get_system(system_name) system.generate_particles_from_link(meltable_obj, meltable_obj.root_link, check_contact=False, use_visual_meshes=False) diff --git a/tests/test_object_states.py b/tests/test_object_states.py index 0a7cb6d8e..c06eb34dd 100644 --- a/tests/test_object_states.py +++ b/tests/test_object_states.py @@ -633,7 +633,7 @@ def test_toggled_on(): robot = og.sim.scene.object_registry("name", "robot0") stove.set_position_orientation([1.46, 0.3, 0.45], T.euler2quat([0, 0, -np.pi / 2.0])) - robot.set_position_orientation([0.01, 0.38, 0.01], [0, 0, 0, 1]) + robot.set_position_orientation([0.0, 0.38, 0.01], [0, 0, 0, 1]) assert not stove.states[ToggledOn].get_value() @@ -641,7 +641,7 @@ def test_toggled_on(): jnt_idxs = {name: i for i, name in enumerate(robot.joints.keys())} q[jnt_idxs["torso_lift_joint"]] = 0.0 q[jnt_idxs["shoulder_pan_joint"]] = np.deg2rad(90.0) - q[jnt_idxs["shoulder_lift_joint"]] = np.deg2rad(8.0) + q[jnt_idxs["shoulder_lift_joint"]] = np.deg2rad(9.0) q[jnt_idxs["upperarm_roll_joint"]] = 0.0 q[jnt_idxs["elbow_flex_joint"]] = 0.0 q[jnt_idxs["forearm_roll_joint"]] = 0.0 @@ -1147,12 +1147,10 @@ def test_covered(): og.sim.step() assert obj.states[Covered].set_value(system, True) - for _ in range(10): - og.sim.step() + og.sim.step() assert obj.states[Covered].get_value(system) assert obj.states[Covered].set_value(system, False) - # We don't call og.sim.step() here because it's possible for the "second" layer of particles to fall down # and make Covered to be True again. Instead, we clear the caches and check that Covered is False. obj.states[Covered].clear_cache() diff --git a/tests/test_transition_rules.py b/tests/test_transition_rules.py index b5c9924e2..dadc563c4 100644 --- a/tests/test_transition_rules.py +++ b/tests/test_transition_rules.py @@ -10,7 +10,7 @@ from omnigibson.macros import macros as m from scipy.spatial.transform import Rotation as R -from utils import og_test, get_random_pose, place_objA_on_objB_bbox, place_obj_on_floor_plane, retrieve_obj_cfg +from utils import og_test, get_random_pose, place_objA_on_objB_bbox, place_obj_on_floor_plane, retrieve_obj_cfg, remove_all_systems import pytest import numpy as np @@ -59,8 +59,7 @@ def test_dryer_rule(): assert not clothes_dryer.states[Contains].get_value(water) # Clean up - water.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_washer_rule(): @@ -80,8 +79,8 @@ def test_washer_rule(): og.sim.step() # Place the two objects inside the washer - remover_dishtowel.set_position_orientation([0.0, 0.0, 0.4], [0, 0, 0, 1]) - bowl.set_position_orientation([0.0, 0.0, 0.5], [0, 0, 0, 1]) + remover_dishtowel.set_position_orientation([0.0, 0.0, 0.03], [0, 0, 0, 1]) + bowl.set_position_orientation([0.10, 0.0, 0.06], [0, 0, 0, 1]) og.sim.step() assert bowl.states[Covered].set_value(dust, True) @@ -126,14 +125,7 @@ def test_washer_rule(): assert bowl.states[Covered].get_value(water) # Clean up - water.remove_all_particles() - dust.remove_all_particles() - salt.remove_all_particles() - rust.remove_all_particles() - spray_paint.remove_all_particles() - acetone.remove_all_particles() - cooking_oil.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_slicing_rule(): @@ -193,6 +185,7 @@ def test_dicing_rule_cooked(): deleted_objs = [half_apple] deleted_objs_cfg = [retrieve_obj_cfg(obj) for obj in deleted_objs] + half_apple.set_orientation(R.from_euler("xyz", [0, -np.pi / 2, 0]).as_quat()) place_obj_on_floor_plane(half_apple) og.sim.step() @@ -208,17 +201,20 @@ def test_dicing_rule_cooked(): for obj in deleted_objs: assert og.sim.scene.object_registry("name", obj.name) is not None - table_knife.set_position_orientation([-0.05, 0.0, 0.10], R.from_euler("xyz", [-np.pi / 2, 0, 0]).as_quat()) + table_knife.set_position_orientation([-0.05, 0.0, 0.07], R.from_euler("xyz", [-np.pi / 2, 0, 0]).as_quat()) og.sim.step() assert cooked_diced_apple.n_particles > 0 for obj in deleted_objs: assert og.sim.scene.object_registry("name", obj.name) is None - # Clean up - cooked_diced_apple.remove_all_particles() + # Move the knife away so that it doesn't immediately dice the half_apple again once it's imported back + table_knife.set_position_orientation([-0.05, 0.0, 1.15], R.from_euler("xyz", [-np.pi / 2, 0, 0]).as_quat()) og.sim.step() + # Clean up + remove_all_systems() + for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) og.sim.import_object(obj) @@ -234,6 +230,7 @@ def test_dicing_rule_uncooked(): deleted_objs = [half_apple] deleted_objs_cfg = [retrieve_obj_cfg(obj) for obj in deleted_objs] + half_apple.set_orientation(R.from_euler("xyz", [0, -np.pi / 2, 0]).as_quat()) place_obj_on_floor_plane(half_apple) og.sim.step() @@ -247,17 +244,20 @@ def test_dicing_rule_uncooked(): for obj in deleted_objs: assert og.sim.scene.object_registry("name", obj.name) is not None - table_knife.set_position_orientation([-0.05, 0.0, 0.10], R.from_euler("xyz", [-np.pi / 2, 0, 0]).as_quat()) + table_knife.set_position_orientation([-0.05, 0.0, 0.07], R.from_euler("xyz", [-np.pi / 2, 0, 0]).as_quat()) og.sim.step() assert diced_apple.n_particles > 0 for obj in deleted_objs: assert og.sim.scene.object_registry("name", obj.name) is None - # Clean up - diced_apple.remove_all_particles() + # Move the knife away so that it doesn't immediately dice the half_apple again once it's imported back + table_knife.set_position_orientation([-0.05, 0.0, 1.15], R.from_euler("xyz", [-np.pi / 2, 0, 0]).as_quat()) og.sim.step() + # Clean up + remove_all_systems() + for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) og.sim.import_object(obj) @@ -305,8 +305,7 @@ def test_melting_rule(): assert og.sim.scene.object_registry("name", obj.name) is None # Clean up - melted_swiss_cheese.remove_all_particles() - og.sim.step() + remove_all_systems() for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) @@ -350,9 +349,7 @@ def test_cooking_physical_particle_rule_failure_recipe_systems(): assert cooked_arborio_rice.n_particles == 0 # Clean up - water.remove_all_particles() - arborio_rice.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_cooking_physical_particle_rule_success(): @@ -398,8 +395,7 @@ def test_cooking_physical_particle_rule_success(): assert cooked_arborio_rice.n_particles > 0 # Clean up - cooked_arborio_rice.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_mixing_rule_failure_recipe_systems(): @@ -439,9 +435,7 @@ def test_mixing_rule_failure_recipe_systems(): assert granulated_sugar.n_particles == 0 # Clean up - sludge.remove_all_particles() - lemon_juice.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_mixing_rule_failure_nonrecipe_systems(): @@ -486,8 +480,7 @@ def test_mixing_rule_failure_nonrecipe_systems(): assert salt.n_particles == 0 # Clean up - sludge.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_mixing_rule_success(): @@ -524,8 +517,7 @@ def test_mixing_rule_success(): assert lemon_juice.n_particles == 0 # Clean up - lemonade.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_cooking_system_rule_failure_recipe_systems(): @@ -547,13 +539,13 @@ def test_cooking_system_rule_failure_recipe_systems(): og.sim.step() assert stockpot.states[OnTop].get_value(stove) - chicken.set_position_orientation([-0.24, 0.11, 0.88], [0, 0, 0, 1]) + chicken.set_position_orientation([-0.24, 0.11, 0.87], [0, 0, 0, 1]) # This fails the recipe because chicken broth (recipe system) is not in the stockpot chicken_broth.generate_particles(positions=[[-0.33, 0.05, 1.95]]) diced_carrot.generate_particles(positions=[[-0.28, 0.05, 0.95]]) diced_celery.generate_particles(positions=[[-0.23, 0.05, 0.95]]) salt.generate_particles(positions=[[-0.33, 0.15, 0.95]]) - rosemary.generate_particles(positions=[[-0.22, 0.15, 0.95]]) + rosemary.generate_particles(positions=[[-0.28, 0.15, 0.95]]) og.sim.step() assert chicken.states[Inside].get_value(stockpot) @@ -579,12 +571,7 @@ def test_cooking_system_rule_failure_recipe_systems(): assert og.sim.scene.object_registry("name", "chicken") is not None # Clean up - chicken_broth.remove_all_particles() - diced_carrot.remove_all_particles() - diced_celery.remove_all_particles() - salt.remove_all_particles() - rosemary.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_cooking_system_rule_failure_nonrecipe_systems(): @@ -607,14 +594,14 @@ def test_cooking_system_rule_failure_nonrecipe_systems(): og.sim.step() assert stockpot.states[OnTop].get_value(stove) - chicken.set_position_orientation([-0.24, 0.11, 0.88], [0, 0, 0, 1]) + chicken.set_position_orientation([-0.24, 0.11, 0.87], [0, 0, 0, 1]) # This fails the recipe because water (nonrecipe system) is inside the stockpot water.generate_particles(positions=[[-0.24, 0.11, 0.95]]) chicken_broth.generate_particles(positions=[[-0.33, 0.05, 0.95]]) diced_carrot.generate_particles(positions=[[-0.28, 0.05, 0.95]]) diced_celery.generate_particles(positions=[[-0.23, 0.05, 0.95]]) salt.generate_particles(positions=[[-0.33, 0.15, 0.95]]) - rosemary.generate_particles(positions=[[-0.22, 0.15, 0.95]]) + rosemary.generate_particles(positions=[[-0.28, 0.15, 0.95]]) og.sim.step() assert chicken.states[Inside].get_value(stockpot) @@ -642,13 +629,7 @@ def test_cooking_system_rule_failure_nonrecipe_systems(): assert og.sim.scene.object_registry("name", "chicken") is not None # Clean up - chicken_broth.remove_all_particles() - diced_carrot.remove_all_particles() - diced_celery.remove_all_particles() - salt.remove_all_particles() - rosemary.remove_all_particles() - water.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_cooking_system_rule_failure_nonrecipe_objects(): @@ -671,14 +652,14 @@ def test_cooking_system_rule_failure_nonrecipe_objects(): og.sim.step() assert stockpot.states[OnTop].get_value(stove) - chicken.set_position_orientation([-0.24, 0.11, 0.88], [0, 0, 0, 1]) + chicken.set_position_orientation([-0.24, 0.11, 0.87], [0, 0, 0, 1]) # This fails the recipe because the bowl (nonrecipe object) is inside the stockpot - bowl.set_position_orientation([-0.24, 0.11, 0.95], [0, 0, 0, 1]) + bowl.set_position_orientation([-0.23, 0.15, 1], [0, 0, 0, 1]) chicken_broth.generate_particles(positions=[[-0.33, 0.05, 0.95]]) diced_carrot.generate_particles(positions=[[-0.28, 0.05, 0.95]]) diced_celery.generate_particles(positions=[[-0.23, 0.05, 0.95]]) salt.generate_particles(positions=[[-0.33, 0.15, 0.95]]) - rosemary.generate_particles(positions=[[-0.22, 0.15, 0.95]]) + rosemary.generate_particles(positions=[[-0.28, 0.15, 0.95]]) og.sim.step() assert chicken.states[Inside].get_value(stockpot) @@ -706,12 +687,7 @@ def test_cooking_system_rule_failure_nonrecipe_objects(): assert og.sim.scene.object_registry("name", "bowl") is not None # Clean up - chicken_broth.remove_all_particles() - diced_carrot.remove_all_particles() - diced_celery.remove_all_particles() - salt.remove_all_particles() - rosemary.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_cooking_system_rule_success(): @@ -736,12 +712,12 @@ def test_cooking_system_rule_success(): og.sim.step() assert stockpot.states[OnTop].get_value(stove) - chicken.set_position_orientation([-0.24, 0.11, 0.88], [0, 0, 0, 1]) + chicken.set_position_orientation([-0.24, 0.11, 0.87], [0, 0, 0, 1]) chicken_broth.generate_particles(positions=[[-0.33, 0.05, 0.95]]) diced_carrot.generate_particles(positions=[[-0.28, 0.05, 0.95]]) diced_celery.generate_particles(positions=[[-0.23, 0.05, 0.95]]) salt.generate_particles(positions=[[-0.33, 0.15, 0.95]]) - rosemary.generate_particles(positions=[[-0.22, 0.15, 0.95]]) + rosemary.generate_particles(positions=[[-0.28, 0.15, 0.95]]) og.sim.step() assert chicken.states[Inside].get_value(stockpot) @@ -769,8 +745,7 @@ def test_cooking_system_rule_success(): assert og.sim.scene.object_registry("name", obj.name) is None # Clean up - chicken_soup.remove_all_particles() - og.sim.step() + remove_all_systems() for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) @@ -817,7 +792,7 @@ def test_cooking_object_rule_failure_wrong_container(): assert len(final_bagels) == len(initial_bagels) # Clean up - sesame_seed.remove_all_particles() + remove_all_systems() @og_test def test_cooking_object_rule_failure_recipe_objects(): @@ -858,7 +833,7 @@ def test_cooking_object_rule_failure_recipe_objects(): assert len(final_bagels) == len(initial_bagels) # Clean up - sesame_seed.remove_all_particles() + remove_all_systems() @og_test def test_cooking_object_rule_failure_unary_states(): @@ -900,7 +875,7 @@ def test_cooking_object_rule_failure_unary_states(): assert len(final_bagels) == len(initial_bagels) # Clean up - sesame_seed.remove_all_particles() + remove_all_systems() @og_test def test_cooking_object_rule_failure_binary_system_states(): @@ -942,7 +917,7 @@ def test_cooking_object_rule_failure_binary_system_states(): assert len(final_bagels) == len(initial_bagels) # Clean up - sesame_seed.remove_all_particles() + remove_all_systems() @og_test def test_cooking_object_rule_failure_binary_object_states(): @@ -984,7 +959,7 @@ def test_cooking_object_rule_failure_binary_object_states(): assert len(final_bagels) == len(initial_bagels) # Clean up - sesame_seed.remove_all_particles() + remove_all_systems() @og_test def test_cooking_object_rule_failure_wrong_heat_source(): @@ -1029,7 +1004,7 @@ def test_cooking_object_rule_failure_wrong_heat_source(): assert len(final_bagels) == len(initial_bagels) # Clean up - sesame_seed.remove_all_particles() + remove_all_systems() @og_test def test_cooking_object_rule_success(): @@ -1089,8 +1064,7 @@ def test_cooking_object_rule_success(): assert bagel.states[Inside].get_value(oven) # Clean up - sesame_seed.remove_all_particles() - og.sim.step() + remove_all_systems() og.sim.remove_object(new_bagels) og.sim.step() @@ -1117,9 +1091,9 @@ def test_single_toggleable_machine_rule_output_system_failure_wrong_container(): place_obj_on_floor_plane(food_processor) og.sim.step() - milk.generate_particles(positions=np.array([[0.02, 0, 0.25]])) - chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.25]])) - ice_cream.set_position([-0.04, 0.025, 0.3]) + milk.generate_particles(positions=np.array([[0.02, 0.06, 0.22]])) + chocolate_sauce.generate_particles(positions=np.array([[-0.05, -0.04, 0.22]])) + ice_cream.set_position_orientation([0.03, -0.02, 0.23], [0, 0, 0, 1]) og.sim.step() @@ -1142,8 +1116,7 @@ def test_single_toggleable_machine_rule_output_system_failure_wrong_container(): assert og.sim.scene.object_registry("name", obj.name) is None # Clean up - sludge.remove_all_particles() - og.sim.step() + remove_all_systems() for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) @@ -1167,10 +1140,9 @@ def test_single_toggleable_machine_rule_output_system_failure_recipe_systems(): og.sim.step() # This fails the recipe because it requires the milk to be in the blender - milk.generate_particles(positions=np.array([[0.02, 0, 1.5]])) - chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.5]])) - ice_cream.set_position([0, 0, 0.54]) - + milk.generate_particles(positions=np.array([[0.02, 0, 1.49]])) + chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.49]])) + ice_cream.set_position_orientation([0, 0, 0.51], [0, 0, 0, 1]) og.sim.step() assert not blender.states[Contains].get_value(milk) @@ -1191,9 +1163,7 @@ def test_single_toggleable_machine_rule_output_system_failure_recipe_systems(): assert og.sim.scene.object_registry("name", obj.name) is None # Clean up - sludge.remove_all_particles() - milk.remove_all_particles() - og.sim.step() + remove_all_systems() for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) @@ -1213,10 +1183,10 @@ def test_single_toggleable_machine_rule_output_system_failure_recipe_objects(): place_obj_on_floor_plane(blender) og.sim.step() - milk.generate_particles(positions=np.array([[0.02, 0, 0.5]])) - chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.5]])) + milk.generate_particles(positions=np.array([[0.02, 0, 0.49]])) + chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.49]])) # This fails the recipe because it requires the ice cream to be inside the blender - ice_cream.set_position([0, 0, 1.54]) + ice_cream.set_position_orientation([0, 0, 1.51], [0, 0, 0, 1]) og.sim.step() @@ -1237,8 +1207,7 @@ def test_single_toggleable_machine_rule_output_system_failure_recipe_objects(): assert chocolate_sauce.n_particles == 0 # Clean up - sludge.remove_all_particles() - og.sim.step() + remove_all_systems() @og_test def test_single_toggleable_machine_rule_output_system_failure_nonrecipe_systems(): @@ -1257,11 +1226,11 @@ def test_single_toggleable_machine_rule_output_system_failure_nonrecipe_systems( place_obj_on_floor_plane(blender) og.sim.step() - milk.generate_particles(positions=np.array([[0.02, 0, 0.5]])) - chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.5]])) + milk.generate_particles(positions=np.array([[0.02, 0, 0.49]])) + chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.49]])) # This fails the recipe because water (nonrecipe system) is in the blender - water.generate_particles(positions=np.array([[0, 0, 0.5]])) - ice_cream.set_position([0, 0, 0.54]) + water.generate_particles(positions=np.array([[0, 0, 0.49]])) + ice_cream.set_position_orientation([0, 0, 0.54], [0, 0, 0, 1]) og.sim.step() @@ -1284,8 +1253,7 @@ def test_single_toggleable_machine_rule_output_system_failure_nonrecipe_systems( assert water.n_particles == 0 # Clean up - sludge.remove_all_particles() - og.sim.step() + remove_all_systems() for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) og.sim.import_object(obj) @@ -1308,11 +1276,11 @@ def test_single_toggleable_machine_rule_output_system_failure_nonrecipe_objects( place_obj_on_floor_plane(blender) og.sim.step() - milk.generate_particles(positions=np.array([[0.02, 0, 0.5]])) - chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.5]])) - ice_cream.set_position([0, 0, 0.54]) + milk.generate_particles(positions=np.array([[0.02, 0, 0.49]])) + chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.49]])) + ice_cream.set_position_orientation([0, 0, 0.51], [0, 0, 0, 1]) # This fails the recipe because the bowl (nonrecipe object) is in the blender - bowl.set_position([0, 0, 0.6]) + bowl.set_position_orientation([0, 0, 0.58], [0, 0, 0, 1]) og.sim.step() @@ -1334,8 +1302,7 @@ def test_single_toggleable_machine_rule_output_system_failure_nonrecipe_objects( assert chocolate_sauce.n_particles == 0 # Clean up - sludge.remove_all_particles() - og.sim.step() + remove_all_systems() for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) og.sim.import_object(obj) @@ -1357,9 +1324,9 @@ def test_single_toggleable_machine_rule_output_system_success(): place_obj_on_floor_plane(blender) og.sim.step() - milk.generate_particles(positions=np.array([[0.02, 0, 0.5]])) - chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.5]])) - ice_cream.set_position([0, 0, 0.54]) + milk.generate_particles(positions=np.array([[0.02, 0, 0.49]])) + chocolate_sauce.generate_particles(positions=np.array([[0, -0.02, 0.49]])) + ice_cream.set_position_orientation([0, 0, 0.51], [0, 0, 0, 1]) og.sim.step() @@ -1382,8 +1349,7 @@ def test_single_toggleable_machine_rule_output_system_success(): assert og.sim.scene.object_registry("name", obj.name) is None # Clean up - milkshake.remove_all_particles() - og.sim.step() + remove_all_systems() for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) @@ -1456,8 +1422,7 @@ def test_single_toggleable_machine_rule_output_object_failure_unary_states(): assert sludge.n_particles > 0 # Clean up - sludge.remove_all_particles() - og.sim.step() + remove_all_systems() for obj_cfg in deleted_objs_cfg: obj = DatasetObject(**obj_cfg) @@ -1544,3 +1509,5 @@ def test_single_toggleable_machine_rule_output_object_success(): obj = DatasetObject(**obj_cfg) og.sim.import_object(obj) og.sim.step() + +test_single_toggleable_machine_rule_output_system_failure_wrong_container() \ No newline at end of file diff --git a/tests/utils.py b/tests/utils.py index 945b02d29..6da795e60 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -95,7 +95,7 @@ def assert_test_scene(): get_obj_cfg("food_processor", "food_processor", "gamkbo"), get_obj_cfg("electric_mixer", "electric_mixer", "qornxa"), get_obj_cfg("another_raw_egg", "raw_egg", "ydgivr"), - get_obj_cfg("chicken", "chicken", "nppsmz"), + get_obj_cfg("chicken", "chicken", "nppsmz", scale=np.ones(3) * 0.8), get_obj_cfg("tablespoon", "tablespoon", "huudhe"), get_obj_cfg("swiss_cheese", "swiss_cheese", "hwxeto"), get_obj_cfg("apple", "apple", "agveuv"), @@ -110,14 +110,6 @@ def assert_test_scene(): "obs_modalities": [], "position": [150, 150, 100], "orientation": [0, 0, 0, 1], - "controller_config": { - # Make sure to use null joint controller for the arm so that we can move the arm qpos - # accordingly - "arm_0": { - "name": "NullJointController", - "motor_type": "position", - }, - }, } ] } @@ -177,3 +169,8 @@ def place_obj_on_floor_plane(obj, x_offset=0.0, y_offset=0.0, z_offset=0.01): target_obj_aabb_pos = np.array([0, 0, obj_aabb_extent[2] / 2.0]) + np.array([x_offset, y_offset, z_offset]) obj.set_position(target_obj_aabb_pos + obj_aabb_offset) + +def remove_all_systems(): + for system in ParticleRemover.supported_active_systems.values(): + system.remove_all_particles() + og.sim.step() \ No newline at end of file