urdf.py
Go to the documentation of this file.
1 from __future__ import print_function
2 
3 import urdf_parser_py.urdf as urdf
4 
5 import PyKDL as kdl
6 
7 def treeFromFile(filename):
8  """
9  Construct a PyKDL.Tree from an URDF file.
10  :param filename: URDF file path
11  """
12 
13  with open(filename) as urdf_file:
14  return treeFromUrdfModel(urdf.URDF.from_xml_string(urdf_file.read()))
15 
16 def treeFromParam(param):
17  """
18  Construct a PyKDL.Tree from an URDF in a ROS parameter.
19  :param param: Parameter name, ``str``
20  """
21 
22  return treeFromUrdfModel(urdf.URDF.from_parameter_server(param))
23 
24 def treeFromString(xml):
25  """
26  Construct a PyKDL.Tree from an URDF xml string.
27  :param xml: URDF xml string, ``str``
28  """
29 
30  return treeFromUrdfModel(urdf.URDF.from_xml_string(xml))
31 
32 def _toKdlPose(pose):
33  # URDF might have RPY OR XYZ unspecified. Both default to zeros
34  rpy = pose.rpy if pose and pose.rpy and len(pose.rpy) == 3 else [0, 0, 0]
35  xyz = pose.xyz if pose and pose.xyz and len(pose.xyz) == 3 else [0, 0, 0]
36 
37  return kdl.Frame(
38  kdl.Rotation.RPY(*rpy),
39  kdl.Vector(*xyz))
40 
41 
43  # kdl specifies the inertia in the reference frame of the link, the urdf
44  # specifies the inertia in the inertia reference frame
45  origin = _toKdlPose(i.origin)
46  inertia = i.inertia
47  return origin.M * kdl.RigidBodyInertia(
48  i.mass, origin.p,
49  kdl.RotationalInertia(inertia.ixx, inertia.iyy, inertia.izz, inertia.ixy, inertia.ixz, inertia.iyz));
50 
51 def _toKdlJoint(jnt):
52 
53  fixed = lambda j,F: kdl.Joint(
54  j.name,
55  getattr(kdl.Joint, 'Fixed') if hasattr(kdl.Joint, 'Fixed') else getattr(kdl.Joint, 'None'))
56  rotational = lambda j,F: kdl.Joint(j.name, F.p, F.M * kdl.Vector(*j.axis), kdl.Joint.RotAxis)
57  translational = lambda j,F: kdl.Joint(j.name, F.p, F.M * kdl.Vector(*j.axis), kdl.Joint.TransAxis)
58 
59  type_map = {
60  'fixed': fixed,
61  'revolute': rotational,
62  'continuous': rotational,
63  'prismatic': translational,
64  'floating': fixed,
65  'planar': fixed,
66  'unknown': fixed,
67  }
68 
69  return type_map[jnt.type](jnt, _toKdlPose(jnt.origin))
70 
71 def _add_children_to_tree(robot_model, root, tree):
72 
73 
74  # constructs the optional inertia
75  inert = kdl.RigidBodyInertia(0)
76  if root.inertial:
77  inert = _toKdlInertia(root.inertial)
78 
79  # constructs the kdl joint
80  (parent_joint_name, parent_link_name) = robot_model.parent_map[root.name]
81  parent_joint = robot_model.joint_map[parent_joint_name]
82 
83  # construct the kdl segment
84  sgm = kdl.Segment(
85  root.name,
86  _toKdlJoint(parent_joint),
87  _toKdlPose(parent_joint.origin),
88  inert)
89 
90  # add segment to tree
91  if not tree.addSegment(sgm, parent_link_name):
92  return False
93 
94  if root.name not in robot_model.child_map:
95  return True
96 
97  children = [robot_model.link_map[l] for (j,l) in robot_model.child_map[root.name]]
98 
99  # recurslively add all children
100  for child in children:
101  if not _add_children_to_tree(robot_model, child, tree):
102  return False
103 
104  return True;
105 
106 def treeFromUrdfModel(robot_model, quiet=False):
107  """
108  Construct a PyKDL.Tree from an URDF model from urdf_parser_python.
109 
110  :param robot_model: URDF xml string, ``str``
111  :param quiet: If true suppress messages to stdout, ``bool``
112  """
113 
114  root = robot_model.link_map[robot_model.get_root()]
115 
116  if root.inertial and not quiet:
117  print("The root link %s has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF." % root.name);
118 
119  ok = True
120  tree = kdl.Tree(root.name)
121 
122  # add all children
123  for (joint,child) in robot_model.child_map[root.name]:
124  if not _add_children_to_tree(robot_model, robot_model.link_map[child], tree):
125  ok = False
126  break
127 
128  return (ok, tree)
kdl_parser_py.urdf._add_children_to_tree
def _add_children_to_tree(robot_model, root, tree)
Definition: urdf.py:71
kdl_parser_py.urdf.treeFromUrdfModel
def treeFromUrdfModel(robot_model, quiet=False)
Definition: urdf.py:106
kdl_parser_py.urdf.treeFromFile
def treeFromFile(filename)
Definition: urdf.py:7
kdl_parser_py.urdf.treeFromString
def treeFromString(xml)
Definition: urdf.py:24
kdl_parser_py.urdf._toKdlInertia
def _toKdlInertia(i)
Definition: urdf.py:42
kdl_parser_py.urdf._toKdlPose
def _toKdlPose(pose)
Definition: urdf.py:32
urdf_parser_py::urdf
kdl_parser_py.urdf.treeFromParam
def treeFromParam(param)
Definition: urdf.py:16
kdl_parser_py.urdf._toKdlJoint
def _toKdlJoint(jnt)
Definition: urdf.py:51


kdl_parser_py
Author(s): Jonathan Bohren , Jackie Kay
autogenerated on Fri Apr 15 2022 02:21:43