class Group(xmlr.Object): def __init__(self, name=None): self.aggregate_init() self.name = name self.links = [] self.joints = [] self.chains = [] self.groups = [] self.subgroups = self.groups xmlr.reflect(Group, params=[ name_attribute, xmlr.AggregateElement('link', Link), xmlr.AggregateElement('joint', Joint), xmlr.AggregateElement('chain', Chain), xmlr.AggregateElement('group', Group) ]) class GroupState(xmlr.Object): def __init__(self, name=None, group=None): self.aggregate_init() self.name = name self.joints = [] self.group = group xmlr.reflect(GroupState,
class TransmissionJoint(xmlr.Object): def __init__(self, name=None): self.aggregate_init() self.name = name self.hardwareInterfaces = [] def check_valid(self): assert len(self.hardwareInterfaces) > 0, "no hardwareInterface defined" xmlr.reflect(TransmissionJoint, tag='joint', params=[ name_attribute, xmlr.AggregateElement('hardwareInterface', str), ]) class Transmission(xmlr.Object): """ New format: http://wiki.ros.org/urdf/XML/Transmission """ def __init__(self, name=None): self.aggregate_init() self.name = name self.joints = [] self.actuators = [] def check_valid(self): assert len(self.joints) > 0, "no joint defined" assert len(self.actuators) > 0, "no actuator defined"
@classmethod def from_parameter_server(cls, key='robot_description'): """ Retrieve the robot model on the parameter server and parse it to create a URDF robot structure. Warning: this requires roscore to be running. """ # Could move this into xml_reflection import rospy return cls.from_xml_string(rospy.get_param(key)) xmlr.reflect( Robot, tag='robot', params=[ # name_attribute, xmlr.Attribute('name', str, False), # Is 'name' a required attribute? xmlr.AggregateElement('link', Link), xmlr.AggregateElement('joint', Joint), xmlr.AggregateElement('gazebo', xmlr.RawType()), xmlr.AggregateElement('transmission', 'transmission'), xmlr.AggregateElement('material', Material) ]) # Make an alias URDF = Robot xmlr.end_namespace()
if self.collisions: self.collisions[0] = collision else: self.collisions.append(collision) # Properties for backwards compatibility visual = property(__get_visual, __set_visual) collision = property(__get_collision, __set_collision) xmlr.reflect(Link, tag='link', params=[ name_attribute, origin_element, xmlr.AggregateElement('visual', Visual), xmlr.AggregateElement('collision', Collision), xmlr.Element('inertial', Inertial, False), ]) class PR2Transmission(xmlr.Object): def __init__(self, name=None, joint=None, actuator=None, type=None, mechanicalReduction=1): self.name = name self.type = type self.joint = joint
]) class Link(Entity): def __init__(self, name=None, pose=None, inertial=None, kinematic=False): Entity.__init__(self, name, pose) self.inertial = inertial self.kinematic = kinematic xmlr.reflect(Link, parent_cls=Entity, params=[ xmlr.Element('inertial', Inertial), xmlr.Attribute('kinematic', bool, False), xmlr.AggregateElement('visual', Visual, var='visuals'), xmlr.AggregateElement('collision', Collision, var='collisions') ]) class Model(Entity): def __init__(self, name=None, pose=None): Entity.__init__(self, name, pose) self.links = [] self.joints = [] self.plugins = [] xmlr.reflect(Model,
class Link(Entity): def __init__(self, name=None, pose=None, inertial=None, kinematic=False): Entity.__init__(self, name, pose) self.inertial = inertial self.kinematic = kinematic xmlr.reflect( Link, parent_cls=Entity, params=[ xmlr.Element("inertial", Inertial), xmlr.Attribute("kinematic", bool, False), xmlr.AggregateElement("visual", Visual, var="visuals"), xmlr.AggregateElement("collision", Collision, var="collisions"), ], ) class Model(Entity): def __init__(self, name=None, pose=None): Entity.__init__(self, name, pose) self.links = [] self.joints = [] self.plugins = [] xmlr.reflect( Model,