1212class URDFParser :
1313 __slots__ = ["_urdf" , "_robot" ]
1414
15- def __init__ (self ) -> None :
16- self ._urdf = None
17- self ._robot = None
15+ def __init__ (self , urdf : str ) -> None :
16+ self ._urdf = urdf
17+ self ._robot = urdf_parser_py . urdf . Robot . from_xml_string ( urdf )
1818
19- def from_urdf (self , urdf : str ) -> None :
19+ @classmethod
20+ def from_file (cls , path : Union [Path , str ]) -> None :
2021 r"""Instantiate URDF parser from URDF string.
2122
2223 Args:
23- urdf ( str): URDF string .
24+ path (Union[Path, str] ): Path to URDF file .
2425 """
25- self ._urdf = urdf
26- self ._robot = urdf_parser_py .urdf .Robot .from_xml_string (urdf )
26+ path = Path (path )
27+ if not path .exists ():
28+ raise FileNotFoundError (f"URDF file { path } does not exist." )
29+ if not path .suffix == ".urdf" :
30+ raise ValueError (f"URDF file { path } must have .urdf extension." )
2731
28- def from_ros_xacro (self , ros_package : str , xacro_path : str ) -> None :
32+ with open (path , "r" ) as f :
33+ urdf = f .read ()
34+
35+ return cls (urdf = urdf )
36+
37+ @classmethod
38+ def from_ros_xacro (cls , ros_package : str , xacro_path : str ) -> None :
2939 r"""Instantiate URDF parser from ROS xacro file.
3040
3141 Args:
3242 ros_package (str): Internally finds the path to ros_package.
3343 xacro_path (str): Path to xacro file relative to ros_package.
3444 """
35- self . from_urdf (
36- urdf = self . urdf_from_ros_xacro (
45+ return cls (
46+ urdf = cls . _urdf_from_ros_xacro (
3747 ros_package = ros_package , xacro_path = xacro_path
3848 )
3949 )
4050
41- def urdf_from_ros_xacro (self , ros_package : str , xacro_path : str ) -> str :
51+ @staticmethod
52+ def _urdf_from_ros_xacro (ros_package : str , xacro_path : str ) -> str :
4253 r"""Convert ROS xacro file to URDF.
4354
4455 Args:
@@ -52,10 +63,9 @@ def urdf_from_ros_xacro(self, ros_package: str, xacro_path: str) -> str:
5263 import xacro
5364 from ament_index_python import get_package_share_directory
5465
55- self . _urdf = xacro .process (
66+ return xacro .process (
5667 os .path .join (get_package_share_directory (ros_package ), xacro_path )
5768 )
58- return self ._urdf
5969
6070 def chain_link_names (self , root_link_name : str , end_link_name : str ) -> List [str ]:
6171 r"""Get link names in chain from root to end link.
0 commit comments