Skip to content

Commit 2c0dd5b

Browse files
committed
Helper function _find_standard_joint(joint)
This will be used heavily later but can already replace some ugly code. Signed-off-by: elian-WSL22H <[email protected]>
1 parent 7f1bcae commit 2c0dd5b

File tree

1 file changed

+54
-32
lines changed

1 file changed

+54
-32
lines changed

roboticstoolbox/tools/urdf/urdf.py

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,56 @@
2323
# Global variable for the base path of the robot meshes
2424
_base_path = None
2525

26+
def _find_standard_joint(joint: "Joint") -> "rtb.ET | None":
27+
"""
28+
Finds a pure rtb.ET joint corresponding to the URDF joint axis.
29+
30+
If urdf joint is fixed, returns an empty rtb.ET.SE3.
31+
If none exists (axis is not +- 1 over x, y or z) returns None.
32+
33+
Attributes
34+
----------
35+
joint
36+
joint object read from the urdf.
37+
38+
Returns
39+
-------
40+
std_joint: rtb.ET or None
41+
if a rtb.ET joint exists:
42+
Returns rtb.ET of type joint. This is rtb.ET.[SE(), Rx(), Ry(), ..., tz].
43+
else:
44+
Returns None.
45+
"""
46+
std_joint = None
47+
if joint.joint_type in ("revolute", "continuous"): # pragma nocover # noqa
48+
if joint.axis[0] == 1:
49+
std_joint = rtb.ET.Rx()
50+
elif joint.axis[0] == -1:
51+
std_joint = rtb.ET.Rx(flip=True)
52+
elif joint.axis[1] == 1:
53+
std_joint = rtb.ET.Ry()
54+
elif joint.axis[1] == -1:
55+
std_joint = rtb.ET.Ry(flip=True)
56+
elif joint.axis[2] == 1:
57+
std_joint = rtb.ET.Rz()
58+
elif joint.axis[2] == -1:
59+
std_joint = rtb.ET.Rz(flip=True)
60+
elif joint.joint_type == "prismatic": # pragma nocover
61+
if joint.axis[0] == 1:
62+
std_joint = rtb.ET.tx()
63+
elif joint.axis[0] == -1:
64+
std_joint = rtb.ET.tx(flip=True)
65+
elif joint.axis[1] == 1:
66+
std_joint = rtb.ET.ty()
67+
elif joint.axis[1] == -1:
68+
std_joint = rtb.ET.ty(flip=True)
69+
elif joint.axis[2] == 1:
70+
std_joint = rtb.ET.tz()
71+
elif joint.axis[2] == -1:
72+
std_joint = rtb.ET.tz(flip=True)
73+
elif joint.joint_type == "fixed":
74+
std_joint = rtb.ET.SE3(SE3())
75+
return std_joint
2676

2777
class URDFType(object):
2878
"""Abstract base class for all URDF types.
@@ -1718,38 +1768,10 @@ def __init__(
17181768

17191769
joint.axis = [0, 0, 1]
17201770

1721-
# variable part of link transform
1722-
var = None
1723-
if joint.joint_type in ("revolute", "continuous"): # pragma nocover # noqa
1724-
if joint.axis[0] == 1:
1725-
var = rtb.ET.Rx()
1726-
elif joint.axis[0] == -1:
1727-
var = rtb.ET.Rx(flip=True)
1728-
elif joint.axis[1] == 1:
1729-
var = rtb.ET.Ry()
1730-
elif joint.axis[1] == -1:
1731-
var = rtb.ET.Ry(flip=True)
1732-
elif joint.axis[2] == 1:
1733-
var = rtb.ET.Rz()
1734-
elif joint.axis[2] == -1:
1735-
var = rtb.ET.Rz(flip=True)
1736-
elif joint.joint_type == "prismatic": # pragma nocover
1737-
if joint.axis[0] == 1:
1738-
var = rtb.ET.tx()
1739-
elif joint.axis[0] == -1:
1740-
var = rtb.ET.tx(flip=True)
1741-
elif joint.axis[1] == 1:
1742-
var = rtb.ET.ty()
1743-
elif joint.axis[1] == -1:
1744-
var = rtb.ET.ty(flip=True)
1745-
elif joint.axis[2] == 1:
1746-
var = rtb.ET.tz()
1747-
elif joint.axis[2] == -1:
1748-
var = rtb.ET.tz(flip=True)
1749-
elif joint.joint_type == "fixed":
1750-
var = None
1751-
1752-
if var is not None:
1771+
var = _find_standard_joint(joint)
1772+
1773+
is_not_fixed = joint.joint_type != "fixed"
1774+
if var is not None and is_not_fixed:
17531775
ets = ets * var
17541776

17551777
if isinstance(ets, rtb.ET):

0 commit comments

Comments
 (0)