Skip to content

Latest commit

 

History

History
86 lines (64 loc) · 3.04 KB

openness.md

File metadata and controls

86 lines (64 loc) · 3.04 KB
Semantic States

Open and closed states

Open and closed states involve composite objects. If you haven't done so already, read the documentation for composite objects.

For hinges, motors, and springs it is possible to determine whether an object is "open" by defining an angle threshold; if the current angle is above the threshold, then the object is "open":

from tdw.controller import Controller
from tdw.tdw_utils import TDWUtils
from tdw.add_ons.composite_object_manager import CompositeObjectManager


class CompositeObjectOpen(Controller):
    """
    Determine when a composite object is "open".
    """

    def __init__(self, port: int = 1071, check_version: bool = True, launch_build: bool = True):
        super().__init__(port=port, check_version=check_version, launch_build=launch_build)
        self.communicate(TDWUtils.create_empty_room(12, 12))
        self.composite_object_manager = CompositeObjectManager()
        self.add_ons.append(self.composite_object_manager)

    def trial(self, open_at: float):
        # Reset the composite object manager.
        self.composite_object_manager.reset()
        # Add the object.
        object_id = Controller.get_unique_id()
        self.communicate(Controller.get_add_physics_object(model_name="b03_bosch_cbg675bs1b_2013__vray_composite",
                                                           object_id=object_id,
                                                           kinematic=True))
        # Get the hinge ID.
        hinge_id = list(self.composite_object_manager.static[object_id].hinges.keys())[0]
        # Apply a torque to the hinge.
        self.communicate({"$type": "apply_torque_to_object",
                          "id": hinge_id,
                          "torque": {"x": 0.5, "y": 0, "z": 0}})
        for i in range(200):
            # Get the angle of the hinge.
            angle = self.composite_object_manager.dynamic[object_id].hinges[hinge_id].angle
            # Check if the hinge is open.
            is_open = angle >= open_at
            if is_open:
                print(f"Microwave door is open on frame {i} at angle {angle}.")
                break
            self.communicate([])
        # Destroy the object.
        self.communicate({"$type": "destroy_object",
                          "id": object_id})


if __name__ == "__main__":
    c = CompositeObjectOpen()
    c.trial(open_at=30)
    c.communicate({"$type": "terminate"})


if __name__ == "__main__":
    c = CompositeObjectOpen()
    c.trial(open_at=30)
    c.communicate({"$type": "terminate"})

Output:

Microwave door is open on frame 16 at angle 30.119487762451172.

Next: Grasped objects

Return to the README


Example controllers:

Python API: