Skip to content

Commit 28e290f

Browse files
committed
added factory pattern to URDFParser
1 parent 95a268a commit 28e290f

File tree

10 files changed

+52
-41
lines changed

10 files changed

+52
-41
lines changed

cli/rr_cam_swarm.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,9 @@ def main() -> None:
301301
device=device,
302302
)
303303

304-
urdf_parser = URDFParser()
305-
urdf_parser.from_ros_xacro(ros_package=args.ros_package, xacro_path=args.xacro_path)
304+
urdf_parser = URDFParser.from_ros_xacro(
305+
ros_package=args.ros_package, xacro_path=args.xacro_path
306+
)
306307
robot = rrd.Robot.from_urdf_parser(
307308
urdf_parser=urdf_parser,
308309
root_link_name=args.root_link_name,

cli/rr_hydra.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,9 @@ def main():
162162
height, width, intrinsics = parse_camera_info(args.camera_info_file)
163163

164164
# instantiate kinematics
165-
urdf_parser = URDFParser()
166-
urdf_parser.from_ros_xacro(ros_package=args.ros_package, xacro_path=args.xacro_path)
165+
urdf_parser = URDFParser.from_ros_xacro(
166+
ros_package=args.ros_package, xacro_path=args.xacro_path
167+
)
167168
root_link_name = args.root_link_name
168169
end_link_name = args.end_link_name
169170
if root_link_name == "":
@@ -225,7 +226,9 @@ def main():
225226
mesh_normals = []
226227
for i in range(batch_size):
227228
mesh_normals.append(
228-
compute_vertex_normals(vertices=mesh_vertices[i], faces=robot.faces)
229+
compute_vertex_normals(
230+
vertices=mesh_vertices[i], faces=robot.mesh_container.faces
231+
)
229232
)
230233

231234
# clean observed vertices and turn into tensor

roboreg/io/parsers.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,44 @@
1212
class 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.

roboreg/util/factories.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ def create_robot_scene(
4242
target_reduction: float = 0.0,
4343
) -> RobotScene:
4444
# create URDF parser
45-
urdf_parser = URDFParser()
46-
urdf_parser.from_ros_xacro(ros_package=ros_package, xacro_path=xacro_path)
45+
urdf_parser = URDFParser.from_ros_xacro(
46+
ros_package=ros_package, xacro_path=xacro_path
47+
)
4748
if root_link_name == "":
4849
root_link_name = urdf_parser.link_names_with_meshes(collision=collision)[0]
4950
rich.print(

test/differentiable/test_kinematics.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ def test_torch_kinematics(
1919
root_link_name: str = "lbr_link_0",
2020
end_link_name: str = "lbr_link_7",
2121
) -> None:
22-
urdf_parser = URDFParser()
23-
urdf_parser.from_ros_xacro(ros_package=ros_package, xacro_path=xacro_path)
22+
urdf_parser = URDFParser.from_ros_xacro(
23+
ros_package=ros_package, xacro_path=xacro_path
24+
)
2425
device = "cuda" if torch.cuda.is_available() else "cpu"
2526
kinematics = TorchKinematics(
2627
urdf=urdf_parser.urdf,
@@ -43,8 +44,9 @@ def test_torch_kinematics_on_mesh(
4344
root_link_name: str = "lbr_link_0",
4445
end_link_name: str = "lbr_link_7",
4546
) -> None:
46-
urdf_parser = URDFParser()
47-
urdf_parser.from_ros_xacro(ros_package=ros_package, xacro_path=xacro_path)
47+
urdf_parser = URDFParser.from_ros_xacro(
48+
ros_package=ros_package, xacro_path=xacro_path
49+
)
4850
device = "cuda" if torch.cuda.is_available() else "cpu"
4951
kinematics = TorchKinematics(
5052
urdf=urdf_parser.urdf,
@@ -103,8 +105,7 @@ def test_display_xyz(vertices: torch.Tensor) -> None:
103105

104106
@pytest.mark.skip(reason="To be fixed.")
105107
def test_diff_kinematics() -> None:
106-
urdf_parser = URDFParser()
107-
urdf_parser.from_ros_xacro(
108+
urdf_parser = URDFParser.from_ros_xacro(
108109
ros_package="lbr_description", xacro_path="urdf/med7/med7.xacro"
109110
)
110111
device = "cuda" if torch.cuda.is_available() else "cpu"

test/differentiable/test_rendering.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ def __init__(
6262
)
6363

6464
# instantiate URDF parser
65-
self.urdf_parser = URDFParser()
66-
self.urdf_parser.from_ros_xacro(
65+
self.urdf_parser = URDFParser.from_ros_xacro(
6766
ros_package="lbr_description", xacro_path="urdf/med7/med7.xacro"
6867
)
6968

test/differentiable/test_robot.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77

88
@pytest.mark.skip(reason="To be fixed.")
99
def test_robot() -> None:
10-
urdf_parser = URDFParser()
11-
urdf_parser.from_ros_xacro(
10+
urdf_parser = URDFParser.from_ros_xacro(
1211
ros_package="lbr_description", xacro_path="urdf/med7/med7.xacro"
1312
)
1413
collision = True

test/io/test_parsers.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515

1616
@pytest.mark.skip(reason="To be fixed.")
1717
def test_urdf_parser() -> None:
18-
urdf_parser = URDFParser()
19-
urdf_parser.from_ros_xacro("lbr_description", "urdf/med7/med7.xacro")
18+
urdf_parser = URDFParser.from_ros_xacro("lbr_description", "urdf/med7/med7.xacro")
2019
print(urdf_parser.chain_link_names("lbr_link_0", "lbr_link_ee"))
2120
print(urdf_parser.raw_mesh_paths("lbr_link_0", "lbr_link_ee"))
2221
print(urdf_parser.ros_package_mesh_paths("lbr_link_0", "lbr_link_ee"))

test/test_hydra_icp.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,9 @@ def test_hydra_icp():
128128
)
129129

130130
# instantiate kinematics
131-
urdf_parser = URDFParser()
132-
urdf_parser.from_ros_xacro(ros_package=ros_package, xacro_path=xacro_path)
131+
urdf_parser = URDFParser.from_ros_xacro(
132+
ros_package=ros_package, xacro_path=xacro_path
133+
)
133134
kinematics = TorchKinematics(
134135
urdf=urdf_parser.urdf,
135136
root_link_name=root_link_name,
@@ -258,8 +259,9 @@ def test_hydra_robust_icp() -> None:
258259
)
259260

260261
# instantiate kinematics
261-
urdf_parser = URDFParser()
262-
urdf_parser.from_ros_xacro(ros_package=ros_package, xacro_path=xacro_path)
262+
urdf_parser = URDFParser.from_ros_xacro(
263+
ros_package=ros_package, xacro_path=xacro_path
264+
)
263265
kinematics = TorchKinematics(
264266
urdf=urdf_parser.urdf,
265267
root_link_name=root_link_name,

test/util/test_viz.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,7 @@ def test_visualize_robot():
8787
end_link_name = "lbr_link_7"
8888

8989
# parse URDF
90-
urdf_parser = URDFParser()
91-
urdf_parser.from_ros_xacro("lbr_description", "urdf/med7/med7.xacro")
92-
paths = urdf_parser.ros_package_mesh_paths(
93-
root_link_name=root_link_name, end_link_name=end_link_name
94-
)
90+
urdf_parser = URDFParser.from_ros_xacro("lbr_description", "urdf/med7/med7.xacro")
9591

9692
# load meshes
9793
meshes = rrd.TorchMeshContainer(

0 commit comments

Comments
 (0)