Source code for brom_drake.utils.ground

from enum import IntEnum
import numpy as np
from pydrake.all import (
    MultibodyPlant,
    RotationMatrix, RigidTransform,
    CoulombFriction,
    HalfSpace, Box,
)

# Class Definition
[docs] class GroundShape(IntEnum): """ Description: This class defines the different shapes that the ground can have. """ kHalfSpace = 0 kBox = 1
[docs] def AddGround( plant: MultibodyPlant, shape: GroundShape = GroundShape.kBox, z_ground: float = None, ground_thickness: float = 0.1, ): """ Description ----------- Add a flat ground with friction Arguments --------- plant: MultibodyPlant The plant to add the ground to. shape: GroundShape The shape of the ground. Defaults to a box. z_ground: float The height at which the "top" of the ground will be placed. """ # Constants transparent_color = np.array([0.5, 0.5, 0.5, 0]) nontransparent_color = np.array([0.5, 0.5, 0.5, 0.1]) # Setup # Input Processing if z_ground is None: p_GroundOrigin = [0, 0.0, 0.0] R_GroundOrigin = RotationMatrix.MakeXRotation(0.0) X_GroundOrigin = RigidTransform(R_GroundOrigin,p_GroundOrigin) else: p_GroundOrigin = [0, 0.0, z_ground - ground_thickness/2.0] R_GroundOrigin = RotationMatrix.MakeXRotation(0.0) X_GroundOrigin = RigidTransform(R_GroundOrigin,p_GroundOrigin) # Input Processing if shape == GroundShape.kHalfSpace: shape = HalfSpace() elif shape == GroundShape.kBox: shape = Box(10, 10, ground_thickness) else: raise ValueError(f"Invalid shape: {shape}!") # Set Up Ground on Plant surface_friction = CoulombFriction( static_friction = 0.7, dynamic_friction = 0.5) plant.RegisterCollisionGeometry( plant.world_body(), X_GroundOrigin, shape, "ground_collision", surface_friction) plant.RegisterVisualGeometry( plant.world_body(), X_GroundOrigin, shape, "ground_visual", transparent_color) # transparent