Source code for brom_drake.utils.model_instances

from pydrake.all import (
    MultibodyPlant,
    ModelInstanceIndex,
    Parser,
    RigidBody,
)

[docs] def find_number_of_positions_in_welded_model( path_to_model: str, ) -> int: """ Description ----------- This method will return the number of positions in the model described at path_to_model WHEN the base link is welded to the world frame. This is most useful for finding things like the number of positions in a robot. Returns ------- int The number of positions in the model. """ # Setup time_step = 1e-3 # Create a shadow plant shadow_plant = MultibodyPlant(time_step) model_idcs = Parser(plant=shadow_plant).AddModels(path_to_model) shadow_model_idx = model_idcs[0] # Weld the base link to the world frame gripper_bodies_indicies = shadow_plant.GetBodyIndices(shadow_model_idx) first_body_in_gripper = shadow_plant.get_body(gripper_bodies_indicies[0]) shadow_plant.WeldFrames( shadow_plant.world_frame(), first_body_in_gripper.body_frame(), ) # Finalize the shadow plant shadow_plant.Finalize() return shadow_plant.num_positions()
[docs] def get_first_body_in(plant: MultibodyPlant, model_instance: ModelInstanceIndex) -> RigidBody: """ *Description* This method returns the first body in the given model instance. """ return get_all_bodies_in(plant, model_instance)[0]
[docs] def get_all_bodies_in( plant: MultibodyPlant, model_instance: ModelInstanceIndex, ) -> list[RigidBody]: """ *Description* This method returns all the bodies in the given model instance. """ # Setup # Algorithm model_body_indices = plant.GetBodyIndices(model_instance) return [plant.get_body(body_index) for body_index in model_body_indices]
[docs] def get_name_of_first_body_in_urdf(urdf_in: str) -> str: """ Description ----------- This method returns the name of the first body found in the urdf given by urdf_in. """ return get_name_of_all_bodies_in_urdf(urdf_in)[0]
[docs] def get_name_of_all_bodies_in_urdf(urdf_in: str) -> list[str]: """ *Description* This method returns the name of the first body found in the urdf given by urdf_in. """ # Setup # Create Plant with this urdf plant = MultibodyPlant(time_step=1e-3) try: model_instances = Parser(plant).AddModels(urdf_in) except Exception as e: raise RuntimeError( f"Failed to parse the urdf file: {urdf_in}." ) from e if len(model_instances) > 1: raise RuntimeWarning( f"More than one model instance found in the urdf file: {urdf_in}." ) elif len(model_instances) == 0: raise RuntimeWarning( f"No model instance found in the urdf file: {urdf_in}." ) # Algorithm model_instance = model_instances[0] # TODO(kwesi): Do we need to finalize the plant? all_bodies = get_all_bodies_in(plant, model_instance) return [body.name() for body in all_bodies]