Beispiel #1
0
def geometryFromAffordance(aff):

    if isinstance(aff, affordanceitems.SphereAffordanceItem):
        radius = aff.getProperty('Radius')
        return urdf.Sphere(radius=radius)

    if isinstance(aff, affordanceitems.BoxAffordanceItem):
        dimensions = aff.getProperty('Dimensions')
        return urdf.Box(size=dimensions)

    if isinstance(aff, affordanceitems.CylinderAffordanceItem):
        return urdf.Cylinder(length=aff.getProperty('Length'),
                             radius=aff.getProperty('Radius'))

    if isinstance(aff, affordanceitems.CapsuleAffordanceItem):
        return urdf.Cylinder(length=aff.getProperty('Length'),
                             radius=aff.getProperty('Radius'))

    if isinstance(aff, affordanceitems.CapsuleRingAffordanceItem):
        raise Exception('not supported yet')

    if isinstance(aff, affordanceitems.MeshAffordanceItem):
        filename = aff.getProperty('Filename')
        filename = affordanceitems.MeshAffordanceItem.getMeshManager(
        ).getFilesystemFilename(filename)
        return urdf.Mesh(filename=filename, scale=[1.0, 1.0, 1.0])
Beispiel #2
0
 def test_xml_and_urdfdom_robot_only_supported_since_melodic(self):
     robot = urdf.Robot(name='test', version='1.0')
     link = urdf.Link(name='link')
     link.add_aggregate(
         'visual',
         urdf.Visual(geometry=urdf.Cylinder(length=1, radius=1),
                     material=urdf.Material(name='mat')))
     link.add_aggregate(
         'visual',
         urdf.Visual(geometry=urdf.Cylinder(length=4, radius=0.5),
                     material=urdf.Material(name='mat2')))
     link.add_aggregate(
         'collision',
         urdf.Collision(geometry=urdf.Cylinder(length=1, radius=1)))
     link.add_aggregate(
         'collision',
         urdf.Collision(geometry=urdf.Cylinder(length=4, radius=0.5)))
     robot.add_link(link)
     link = urdf.Link(name='link2')
     robot.add_link(link)
     #
     robot_xml_string = robot.to_xml_string()
     robot_xml = minidom.parseString(robot_xml_string)
     orig_xml = minidom.parseString(self.xml)
     self.assertTrue(xml_matches(robot_xml, orig_xml))
Beispiel #3
0
    def test_link_multiple_collision(self):
        xml = '''<?xml version="1.0"?>
<robot name="test" version="1.0">
  <link name="link">
    <collision>
      <geometry>
        <cylinder length="1" radius="1"/>
      </geometry>
    </collision>
    <collision>
      <geometry>
        <cylinder length="4" radius="0.5"/>
      </geometry>
    </collision>
  </link>
</robot>'''
        self.parse_and_compare(xml)

        robot = urdf.Robot(name='test', version='1.0')
        link = urdf.Link(name='link')
        link.collision = urdf.Collision(
            geometry=urdf.Cylinder(length=1, radius=1))
        link.collision = urdf.Collision(
            geometry=urdf.Cylinder(length=4, radius=0.5))
        robot.add_link(link)
        self.xml_and_compare(robot, xml)
Beispiel #4
0
    def test_link_multiple_visual(self):
        xml = '''<?xml version="1.0"?>
<robot name="test" version="1.0">
  <link name="link">
    <visual>
      <geometry>
        <cylinder length="1" radius="1"/>
      </geometry>
      <material name="mat"/>
    </visual>
    <visual>
      <geometry>
        <cylinder length="4" radius="0.5"/>
      </geometry>
      <material name="mat2"/>
    </visual>
  </link>
</robot>'''
        self.parse_and_compare(xml)

        robot = urdf.Robot(name='test', version='1.0')
        link = urdf.Link(name='link')
        link.visual = urdf.Visual(geometry=urdf.Cylinder(length=1, radius=1),
                                  material=urdf.Material(name='mat'))
        link.visual = urdf.Visual(geometry=urdf.Cylinder(length=4, radius=0.5),
                                  material=urdf.Material(name='mat2'))
        robot.add_link(link)
        self.xml_and_compare(robot, xml)
Beispiel #5
0
def default_collision(geometry=None, origin=None):
    """ Return default collision """
    if geometry is None:
        geometry = urdf.Cylinder(radius=0.05, length=n_len)
    if origin is None:
        origin = urdf.Pose(xyz=[0, 0, n_len / 2], rpy=[0, 0, 0])
    return urdf.Collision(geometry=geometry, origin=origin)
Beispiel #6
0
def default_visual(geometry=None, origin=None):
    if geometry is None:
        geometry = urdf.Cylinder(radius=0.05, length=n_len)
    if origin is None:
        origin = urdf.Pose(xyz=[0, 0, n_len / 2], rpy=[0, 0, 0])
    return urdf.Visual(geometry=geometry,
                       origin=origin,
                       material=urdf.Material("Gazebo/Black"))
Beispiel #7
0
def frame_visual(geometry=None, origin=None):
    if geometry is None:
        geometry = urdf.Cylinder(radius=l_f_rad, length=l_f_len)
    if origin is None:
        origin = urdf.Pose(xyz=[0, 0, l_f_len / 2], rpy=[0, 0, 0])
    return urdf.Visual(geometry=geometry,
                       origin=origin,
                       material=urdf.Material(name="Gazebo/Orange"))
Beispiel #8
0
 def test_xml_and_urdfdom_robot_compatible_with_kinetic(self):
     robot = urdf.Robot(name='test', version='1.0')
     link = urdf.Link(name='link')
     link.visual = urdf.Visual(geometry=urdf.Cylinder(length=1, radius=1),
                               material=urdf.Material(name='mat'))
     link.visual = urdf.Visual(geometry=urdf.Cylinder(length=4, radius=0.5),
                               material=urdf.Material(name='mat2'))
     link.collision = urdf.Collision(geometry=urdf.Cylinder(length=1, radius=1))
     link.collision = urdf.Collision(geometry=urdf.Cylinder(length=4, radius=0.5))
     robot.add_link(link)
     link = urdf.Link(name='link2')
     robot.add_link(link)
     #
     robot_xml_string = robot.to_xml_string()
     robot_xml = minidom.parseString(robot_xml_string)
     orig_xml = minidom.parseString(self.xml)
     self.assertTrue(xml_matches(robot_xml, orig_xml))
def frame_collision(scale=1):
    """ Return default collision """
    # if geometry is None:
    _x = (0.033 / 2) * scale
    _y = (0.022 / 2) * scale
    _z = (0.103 / 2) * scale
    geometry = urdf.Cylinder(length=_z, radius=_x)
    # if origin is None:
    origin = urdf.Pose(xyz=[0, 0, 0], rpy=[0, 0, 0])
    return urdf.Collision(geometry=geometry, origin=origin)
Beispiel #10
0
 def from_world_body(cls, world_body, *args, **kwargs):
     """
     :type world_body: giskard_msgs.msg._WorldBody.WorldBody
     :rtype: URDFObject
     """
     links = []
     joints = []
     if world_body.type == world_body.PRIMITIVE_BODY or world_body.type == world_body.MESH_BODY:
         if world_body.shape.type == world_body.shape.BOX:
             geometry = up.Box(world_body.shape.dimensions)
         elif world_body.shape.type == world_body.shape.SPHERE:
             geometry = up.Sphere(world_body.shape.dimensions[0])
         elif world_body.shape.type == world_body.shape.CYLINDER:
             geometry = up.Cylinder(
                 world_body.shape.dimensions[
                     world_body.shape.CYLINDER_RADIUS],
                 world_body.shape.dimensions[
                     world_body.shape.CYLINDER_HEIGHT])
         elif world_body.shape.type == world_body.shape.CONE:
             raise TypeError(u'primitive shape cone not supported')
         elif world_body.type == world_body.MESH_BODY:
             geometry = up.Mesh(world_body.mesh)
         else:
             raise CorruptShapeException(
                 u'primitive shape \'{}\' not supported'.format(
                     world_body.shape.type))
         # FIXME test if this works on 16.04
         try:
             link = up.Link(world_body.name)
             link.add_aggregate(
                 u'visual',
                 up.Visual(geometry,
                           material=up.Material(u'green',
                                                color=up.Color(0, 1, 0,
                                                               1))))
             link.add_aggregate(u'collision', up.Collision(geometry))
         except AssertionError:
             link = up.Link(world_body.name,
                            visual=up.Visual(geometry,
                                             material=up.Material(
                                                 u'green',
                                                 color=up.Color(0, 1, 0,
                                                                1))),
                            collision=up.Collision(geometry))
         links.append(link)
     elif world_body.type == world_body.URDF_BODY:
         o = cls(world_body.urdf, *args, **kwargs)
         o.set_name(world_body.name)
         return o
     else:
         raise CorruptShapeException(
             u'world body type \'{}\' not supported'.format(
                 world_body.type))
     return cls.from_parts(world_body.name, links, joints, *args, **kwargs)
def frame_visual(scale=10):
    """ Return default collision """
    # if geometry is None:
    _x = (0.033 / 2) * scale
    _y = (0.022 / 2) * scale
    _z = (0.103 / 2) * scale
    # geometry = urdf.Box(size=[_x, _y,
    #                           _z])
    geometry = urdf.Cylinder(length=_z, radius=_x)
    # if origin is None:
    origin = urdf.Pose(xyz=[0, 0, 0], rpy=[0, 0, 0])
    return urdf.Visual(geometry=geometry, origin=origin, material=orange())
Beispiel #12
0
def generate_robot(namespace):
    """ Generate Inverted Pendulum URDF """
    # Robot
    robot = urdf.Robot(name)

    # Base
    l_world = urdf.Link("world")
    robot.add_link(l_world)

    # Frame
    frame_geometry = urdf.Cylinder(radius=l_f_rad, length=l_f_len)

    l_frame = urdf.Link("l_frame")
    l_frame.collision = frame_collision(geometry=frame_geometry)
    l_frame.inertial = frame_inertial()
    l_frame.visual = frame_visual(geometry=frame_geometry)
    robot.add_link(l_frame)

    # World Joint
    j_world = urdf.Joint(name="fixed",
                         parent="world",
                         child="l_frame",
                         joint_type="fixed",
                         origin=urdf.Pose([0, 0, 0], [0, 0, 0]))
    robot.add_joint(j_world)

    # Links
    l_link = [urdf.Link("l_{}".format(i)) for i in range(n_links)]
    j_link = [urdf.Joint("j_{}".format(i)) for i in range(n_links)]
    for i in range(n_links):
        l_y = (0.1 if i == 0 else 2 * l_link_rad)
        l_z = ((l_f_len - 0.05) if i == 0 else (l_link_len - 0.05))
        l_pos = urdf.Pose(xyz=[0, l_y, l_z], rpy=[0, 0, 0])
        l_link[i].visual = default_visual()
        l_link[i].inertial = default_inertial()
        l_link[i].collision = default_collision()
        robot.add_link(l_link[i])

        j_link[i] = urdf.Joint(
            name="j_{}".format(i),
            parent=("l_frame" if i == 0 else "l_{}".format(i - 1)),
            child="l_{}".format(i),
            origin=l_pos,
            joint_type="continuous",
            axis=[0, 1, 0],
            dynamics=default_dynamics())
        robot.add_joint(j_link[i])

    for joint in j_link:
        # Transmission
        t = urdf.Transmission(joint.name + "_trans")
        t.type = "transmission_interface/SimpleTransmission"
        transjoint = urdf.TransmissionJoint(name=joint.name)
        transjoint.add_aggregate("hardwareInterface", "EffortJointInterface")
        t.add_aggregate("joint", transjoint)
        actuator = urdf.Actuator(joint.name + "_motor")
        actuator.mechanicalReduction = 1
        t.add_aggregate("actuator", actuator)
        robot.add_aggregate("transmission", t)

    # joint force-torque sensors
    if use_ftSensors:
        joints = get_continous_joints(robot)
        for joint_i, joint in enumerate(joints):
            # Provide feedback
            a = etree.Element("gazebo", {"reference": joint.name})
            b = etree.SubElement(a, "provideFeedback")
            b.text = "true"
            robot.add_aggregate("gazebo", a)
            # Sensor
            a = etree.Element("gazebo")
            b = etree.SubElement(
                a, "plugin", {
                    "name": "force_torque_plugin_" + joint.name,
                    "filename": "libgazebo_ros_ft_sensor.so"
                })
            c = etree.SubElement(b, "alwaysOn")
            c.text = "true"
            d = etree.SubElement(b, "updateRate")
            d.text = "100"
            d = etree.SubElement(b, "jointName")
            d.text = joint.name
            d = etree.SubElement(b, "topicName")
            d.text = namespace + "ftSensors/" + joint.name
            robot.add_aggregate("gazebo", a)

    # Gazebo Color Plugin for all links
    for link_i, link in enumerate(get_all_links(robot)):
        a = etree.Element("gazebo", {"reference": link.name})
        b = etree.SubElement(a, "material")
        b.text = "Gazebo/Black"
        robot.add_aggregate("gazebo", a)

    # Gazebo Color Plugin for Frame
    a = etree.Element("gazebo", {"reference": "l_frame"})
    b = etree.SubElement(a, "material")
    b.text = "Gazebo/Orange"
    robot.add_aggregate("gazebo", a)

    # Gazebo plugin
    a = etree.Element("gazebo")
    b = etree.SubElement(a, "plugin", {
        "name": "gazebo_ros_control",
        "filename": "libgazebo_ros_control.so"
    })
    c = etree.SubElement(b, "robotNamespace")
    c.text = namespace
    # d = etree.SubElement(b, "robotParam")
    # d.text = "/robot_description"
    robot.add_aggregate("gazebo", a)

    return robot