Go to the documentation of this file.00001 from __future__ import print_function
00002
00003 import unittest
00004 import mock
00005 import os
00006 import sys
00007
00008
00009 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '.')))
00010 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
00011 '../src')))
00012
00013 from xml.dom import minidom
00014 from xml_matching import xml_matches
00015 from urdf_parser_py import urdf
00016
00017
00018 class ParseException(Exception):
00019 pass
00020
00021
00022 class TestURDFParser(unittest.TestCase):
00023 @mock.patch('urdf_parser_py.xml_reflection.on_error',
00024 mock.Mock(side_effect=ParseException))
00025 def parse(self, xml):
00026 return urdf.Robot.from_xml_string(xml)
00027
00028 def parse_and_compare(self, orig):
00029 xml = minidom.parseString(orig)
00030 robot = urdf.Robot.from_xml_string(orig)
00031 rewritten = minidom.parseString(robot.to_xml_string())
00032 self.assertTrue(xml_matches(xml, rewritten))
00033
00034 def test_new_transmission(self):
00035 xml = '''<?xml version="1.0"?>
00036 <robot name="test">
00037 <transmission name="simple_trans">
00038 <type>transmission_interface/SimpleTransmission</type>
00039 <joint name="foo_joint">
00040 <hardwareInterface>EffortJointInterface</hardwareInterface>
00041 </joint>
00042 <actuator name="foo_motor">
00043 <mechanicalReduction>50.0</mechanicalReduction>
00044 </actuator>
00045 </transmission>
00046 </robot>'''
00047 self.parse_and_compare(xml)
00048
00049 def test_new_transmission_multiple_joints(self):
00050 xml = '''<?xml version="1.0"?>
00051 <robot name="test">
00052 <transmission name="simple_trans">
00053 <type>transmission_interface/SimpleTransmission</type>
00054 <joint name="foo_joint">
00055 <hardwareInterface>EffortJointInterface</hardwareInterface>
00056 </joint>
00057 <joint name="bar_joint">
00058 <hardwareInterface>EffortJointInterface</hardwareInterface>
00059 <hardwareInterface>EffortJointInterface</hardwareInterface>
00060 </joint>
00061 <actuator name="foo_motor">
00062 <mechanicalReduction>50.0</mechanicalReduction>
00063 </actuator>
00064 </transmission>
00065 </robot>'''
00066 self.parse_and_compare(xml)
00067
00068 def test_new_transmission_multiple_actuators(self):
00069 xml = '''<?xml version="1.0"?>
00070 <robot name="test">
00071 <transmission name="simple_trans">
00072 <type>transmission_interface/SimpleTransmission</type>
00073 <joint name="foo_joint">
00074 <hardwareInterface>EffortJointInterface</hardwareInterface>
00075 </joint>
00076 <actuator name="foo_motor">
00077 <mechanicalReduction>50.0</mechanicalReduction>
00078 </actuator>
00079 <actuator name="bar_motor"/>
00080 </transmission>
00081 </robot>'''
00082 self.parse_and_compare(xml)
00083
00084 def test_new_transmission_missing_joint(self):
00085 xml = '''<?xml version="1.0"?>
00086 <robot name="test">
00087 <transmission name="simple_trans">
00088 <type>transmission_interface/SimpleTransmission</type>
00089 </transmission>
00090 </robot>'''
00091 self.assertRaises(Exception, self.parse, xml)
00092
00093 def test_new_transmission_missing_actuator(self):
00094 xml = '''<?xml version="1.0"?>
00095 <robot name="test">
00096 <transmission name="simple_trans">
00097 <type>transmission_interface/SimpleTransmission</type>
00098 <joint name="foo_joint">
00099 <hardwareInterface>EffortJointInterface</hardwareInterface>
00100 </joint>
00101 </transmission>
00102 </robot>'''
00103 self.assertRaises(Exception, self.parse, xml)
00104
00105 def test_old_transmission(self):
00106 xml = '''<?xml version="1.0"?>
00107 <robot name="test">
00108 <transmission name="PR2_trans" type="SimpleTransmission">
00109 <joint name="foo_joint"/>
00110 <actuator name="foo_motor"/>
00111 <mechanicalReduction>1.0</mechanicalReduction>
00112 </transmission>
00113 </robot>'''
00114 self.parse_and_compare(xml)
00115
00116 def test_link_material_missing_color_and_texture(self):
00117 xml = '''<?xml version="1.0"?>
00118 <robot name="test">
00119 <link name="link">
00120 <visual>
00121 <geometry>
00122 <cylinder length="1" radius="1"/>
00123 </geometry>
00124 <material name="mat"/>
00125 </visual>
00126 </link>
00127 </robot>'''
00128 self.parse_and_compare(xml)
00129
00130 def test_robot_material(self):
00131 xml = '''<?xml version="1.0"?>
00132 <robot name="test">
00133 <material name="mat">
00134 <color rgba="0.0 0.0 0.0 1.0"/>
00135 </material>
00136 </robot>'''
00137 self.parse_and_compare(xml)
00138
00139 def test_robot_material_missing_color_and_texture(self):
00140 xml = '''<?xml version="1.0"?>
00141 <robot name="test">
00142 <material name="mat"/>
00143 </robot>'''
00144 self.assertRaises(ParseException, self.parse, xml)
00145
00146
00147 class LinkOriginTestCase(unittest.TestCase):
00148 @mock.patch('urdf_parser_py.xml_reflection.on_error',
00149 mock.Mock(side_effect=ParseException))
00150 def parse(self, xml):
00151 return urdf.Robot.from_xml_string(xml)
00152
00153 def test_robot_link_defaults(self):
00154 xml = '''<?xml version="1.0"?>
00155 <robot name="test">
00156 <link name="test_link">
00157 <inertial>
00158 <mass value="10.0"/>
00159 <origin/>
00160 </inertial>
00161 </link>
00162 </robot>'''
00163 robot = self.parse(xml)
00164 origin = robot.links[0].inertial.origin
00165 self.assertEquals(origin.xyz, [0, 0, 0])
00166 self.assertEquals(origin.rpy, [0, 0, 0])
00167
00168 def test_robot_link_defaults_xyz_set(self):
00169 xml = '''<?xml version="1.0"?>
00170 <robot name="test">
00171 <link name="test_link">
00172 <inertial>
00173 <mass value="10.0"/>
00174 <origin xyz="1 2 3"/>
00175 </inertial>
00176 </link>
00177 </robot>'''
00178 robot = self.parse(xml)
00179 origin = robot.links[0].inertial.origin
00180 self.assertEquals(origin.xyz, [1, 2, 3])
00181 self.assertEquals(origin.rpy, [0, 0, 0])
00182
00183
00184 if __name__ == '__main__':
00185 unittest.main()
urdfdom_py
Author(s): Thomas Moulard, David Lu, Kelsey Hawkins, Antonio El Khoury, Eric Cousineau, Ioan Sucan
, Jackie Kay
autogenerated on Wed Aug 2 2017 02:23:35