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])
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))
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)
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)
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)
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"))
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"))
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)
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())
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