Source code for brom_drake.file_manipulation.urdf.drake_ready_urdf_converter.util
from pathlib import Path
import xml.etree.ElementTree as ET
from typing import Union
URDF_CONVERSION_LOG_LEVEL_NAME = "BROM_URDF_CONVERSION"
URDF_CONVERSION_LEVEL = 21
[docs]
def does_drake_parser_support(filename: str) -> bool:
"""
*Description*
This function cleanly answers whether the given 3d object
file is supported by Drake.
*Parameters*
filename: str
The name of the file to check.
*Returns*
does_support: bool
True if the file is supported by Drake, False otherwise.
"""
return ".obj" in filename # TODO(kwesi): Determine if .sdf should be put here.
[docs]
def create_transmission_element_for_joint(
actuated_joint_name: str,
) -> ET.Element:
"""
*Description*
This function creates a transmission element for the given joint.
*Parameters*
actuated_joint_name: str
The name of the joint that will be actuated
*Returns*
transmission_element: xml.etree.ElementTree.Element
The transmission element for the given joint.
"""
# Create the transmission element
transmission = ET.Element("transmission")
# Create an inner type element
transmission_type_element = ET.Element("type")
transmission_type_element.text = "transmission_interface/SimpleTransmission"
# Create inner joint element (reference to the actuated_joint_name
joint_element = ET.Element("joint")
joint_element.set("name", actuated_joint_name)
# Create inner actuator element
actuator_element = ET.Element("actuator")
actuator_element.set("name", f"{actuated_joint_name}_actuator")
# Assemble transmission element
transmission.append(transmission_type_element)
transmission.append(joint_element)
transmission.append(actuator_element)
return transmission
[docs]
def tree_contains_transmission_for_joint(
tree: ET.ElementTree,
actuated_joint_name: str,
) -> bool:
"""
*Description*
This function determines if the given tree contains a transmission
element for the given actuated joint.
*Parameters*
tree: xml.etree.ElementTree.ElementTree
The tree to search for the transmission element.
actuated_joint_name: str
The name of the joint that will be actuated.
*Returns*
transmission_exists: bool
True if the tree contains a transmission element for the given joint,
"""
# Setup
root = tree.getroot()
# Check to see if the root is a transmission element
if root.tag == "transmission":
# Check if the transmission element contains the actuated joint
for child in root:
if child.tag == "joint" and child.attrib["name"] == actuated_joint_name:
return True
# Check each of the tree's children to see if there is a transmission element
for child in root:
child_tree_contains_transmission_for_joint = tree_contains_transmission_for_joint(
ET.ElementTree(child),
actuated_joint_name,
)
if child_tree_contains_transmission_for_joint:
return True
# If we've searched through the full sub-tree and don't see the actuated joint,
# then we return False
return False
[docs]
def get_mesh_element_in(collision_element: ET.Element) -> Union[ET.Element, None]:
"""
*Description*
This function finds the mesh element in the given collision element.
*Parameters*
collision_element: ET.Element
The collision element to search for a mesh element
*Returns*
new_element: ET.Element or None
The mesh element if found, otherwise None
"""
# Check if the collision element has a <geometry> child
geometry = collision_element.find("geometry")
if geometry is not None:
# Check if the geometry has a <mesh> child
mesh = geometry.find("mesh")
if mesh is not None:
return mesh
# If no mesh element is found, return None
return None
[docs]
def find_mesh_file_path_in(collision_element: ET.Element) -> Union[Path, None]:
"""
*Description*
This function finds the mesh filename in the given collision element.
*Parameters*
collision_element: ET.Element
The collision element to search for a mesh filename
*Returns*
mesh_file_path: Path|None
The mesh filename if found, otherwise None
"""
# Setup
# Algorithm
mesh_elt = get_mesh_element_in(collision_element)
if mesh_elt is not None:
# Return the filename attribute of the mesh element
return Path(
mesh_elt.attrib.get("filename", None)
)
# If no mesh filename is found, return None
return None