Skip to content

Commit a777ef3

Browse files
johnwasonLevi-Armstrong
authored andcommitted
Add unit tests for improved mesh parser and fix normals loading bug (#509)
1 parent f2b9677 commit a777ef3

File tree

2 files changed

+199
-0
lines changed

2 files changed

+199
-0
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
from tesseract import tesseract_scene_graph
2+
from tesseract import tesseract_collision
3+
from tesseract import tesseract_environment
4+
from tesseract.tesseract_common import Isometry3d, Translation3d, AngleAxisd
5+
from tesseract import tesseract_common
6+
from tesseract import tesseract_collision
7+
from tesseract import tesseract_collision_bullet
8+
from tesseract import tesseract_urdf
9+
import os
10+
import re
11+
import traceback
12+
import numpy.testing as nptest
13+
14+
mesh_urdf="""
15+
<robot name="mesh_viewer">
16+
17+
<link name="world"/>
18+
<link name="mesh_dae_link">
19+
<visual>
20+
<geometry>
21+
<mesh filename="package://tesseract_support/meshes/tesseract_material_mesh.dae"/>
22+
</geometry>
23+
</visual>
24+
</link>
25+
26+
<joint name="mesh_dae_joint" type="revolute">
27+
<parent link="world"/>
28+
<child link="mesh_dae_link"/>
29+
<axis xyz="0 1 0"/>
30+
<origin xyz="0 1 0.25"/>
31+
<limit effort="0" lower="-2.0944" upper="2.0944" velocity="6.2832"/>
32+
</joint>
33+
34+
</robot>
35+
"""
36+
37+
def _locate_resource(url):
38+
try:
39+
url_match = re.match(r"^package:\/\/tesseract_support\/(.*)$",url)
40+
if (url_match is None):
41+
return ""
42+
if not "TESSERACT_SUPPORT_DIR" in os.environ:
43+
return ""
44+
tesseract_support = os.environ["TESSERACT_SUPPORT_DIR"]
45+
return os.path.join(tesseract_support, os.path.normpath(url_match.group(1)))
46+
except:
47+
traceback.print_exc()
48+
49+
def get_scene_graph():
50+
locator_fn = tesseract_scene_graph.SimpleResourceLocatorFn(_locate_resource)
51+
locator = tesseract_scene_graph.SimpleResourceLocator(locator_fn)
52+
return tesseract_urdf.parseURDFString(mesh_urdf, locator)
53+
54+
def test_mesh_material_loading():
55+
scene = get_scene_graph()
56+
visual = scene.getLinks()[0].visual
57+
assert len(visual) == 4
58+
59+
mesh0 = visual[1].geometry
60+
mesh1 = visual[2].geometry
61+
mesh2 = visual[3].geometry
62+
mesh3 = visual[0].geometry
63+
64+
assert mesh0.getTriangleCount() == 34
65+
assert mesh0.getVerticeCount() == 68
66+
assert mesh1.getTriangleCount() == 15
67+
assert mesh1.getVerticeCount() == 17
68+
assert mesh2.getTriangleCount() == 15
69+
assert mesh2.getVerticeCount() == 17
70+
assert mesh3.getTriangleCount() == 2
71+
assert mesh3.getVerticeCount() == 4
72+
73+
mesh0_normals = mesh0.getNormals()
74+
assert mesh0_normals is not None
75+
assert len(mesh0_normals) == 68
76+
mesh1_normals = mesh1.getNormals()
77+
assert mesh1_normals is not None
78+
assert len(mesh1_normals) == 17
79+
mesh2_normals = mesh2.getNormals()
80+
assert mesh2_normals is not None
81+
assert len(mesh2_normals) == 17
82+
mesh3_normals = mesh3.getNormals()
83+
assert mesh3_normals is not None
84+
assert len(mesh3_normals) == 4
85+
86+
mesh0_material = mesh0.getMaterial()
87+
nptest.assert_allclose(mesh0_material.getBaseColorFactor().flatten(),[0.7,0.7,0.7,1], atol=0.01)
88+
nptest.assert_almost_equal(mesh0_material.getMetallicFactor(), 0.0)
89+
nptest.assert_almost_equal(mesh0_material.getRoughnessFactor(), 0.5)
90+
nptest.assert_allclose(mesh0_material.getEmissiveFactor().flatten(), [0,0,0,1], atol = 0.01)
91+
92+
mesh1_material = mesh1.getMaterial()
93+
nptest.assert_allclose(mesh1_material.getBaseColorFactor().flatten(),[0.8,0.0,0.0,1], atol=0.01)
94+
nptest.assert_almost_equal(mesh1_material.getMetallicFactor(), 0.0)
95+
nptest.assert_almost_equal(mesh1_material.getRoughnessFactor(), 0.5)
96+
nptest.assert_allclose(mesh1_material.getEmissiveFactor().flatten(), [0,0,0,1], atol = 0.01)
97+
98+
mesh2_material = mesh2.getMaterial()
99+
nptest.assert_allclose(mesh2_material.getBaseColorFactor().flatten(),[0.05,0.8,0.05,1], atol=0.01)
100+
nptest.assert_almost_equal(mesh2_material.getMetallicFactor(), 0.0)
101+
nptest.assert_almost_equal(mesh2_material.getRoughnessFactor(), 0.5)
102+
nptest.assert_allclose(mesh2_material.getEmissiveFactor().flatten(), [0.1,0.1,0.5,1], atol = 0.01)
103+
104+
mesh3_material = mesh3.getMaterial()
105+
nptest.assert_allclose(mesh3_material.getBaseColorFactor().flatten(),[1,1,1,1], atol=0.01)
106+
nptest.assert_almost_equal(mesh3_material.getMetallicFactor(), 0.0)
107+
nptest.assert_almost_equal(mesh3_material.getRoughnessFactor(), 0.5)
108+
nptest.assert_allclose(mesh3_material.getEmissiveFactor().flatten(), [0,0,0,1], atol = 0.01)
109+
110+
assert mesh0.getTextures() is None
111+
assert mesh1.getTextures() is None
112+
assert mesh2.getTextures() is None
113+
114+
assert mesh3.getTextures() is not None
115+
assert len(mesh3.getTextures()) == 1
116+
117+
texture = mesh3.getTextures()[0]
118+
assert len(texture.getTextureImage().getResourceContents()) == 38212
119+
assert len(texture.getUVs()) == 4
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from tesseract.tesseract_environment import Environment
2+
from tesseract.tesseract_scene_graph import SimpleResourceLocator, SimpleResourceLocatorFn
3+
import os
4+
import re
5+
import traceback
6+
from tesseract_viewer import TesseractViewer
7+
import numpy as np
8+
import time
9+
import sys
10+
11+
shapes_urdf="""
12+
<robot name="mesh_viewer">
13+
14+
<link name="world"/>
15+
<link name="mesh_gltf2_link">
16+
<visual>
17+
<geometry>
18+
<mesh filename="package://tesseract_support/meshes/tesseract_material_mesh.glb"/>
19+
</geometry>
20+
</visual>
21+
</link>
22+
23+
<joint name="mesh_gltf2_joint" type="revolute">
24+
<parent link="world"/>
25+
<child link="mesh_gltf2_link"/>
26+
<axis xyz="0 1 0"/>
27+
<origin xyz="0 -1 0.25"/>
28+
<limit effort="0" lower="-2.0944" upper="2.0944" velocity="6.2832"/>
29+
</joint>
30+
31+
<link name="mesh_dae_link">
32+
<visual>
33+
<geometry>
34+
<mesh filename="package://tesseract_support/meshes/tesseract_material_mesh.dae"/>
35+
</geometry>
36+
</visual>
37+
</link>
38+
39+
<joint name="mesh_dae_joint" type="revolute">
40+
<parent link="world"/>
41+
<child link="mesh_dae_link"/>
42+
<axis xyz="0 1 0"/>
43+
<origin xyz="0 1 0.25"/>
44+
<limit effort="0" lower="-2.0944" upper="2.0944" velocity="6.2832"/>
45+
</joint>
46+
47+
</robot>
48+
"""
49+
50+
TESSERACT_SUPPORT_DIR = os.environ["TESSERACT_SUPPORT_DIR"]
51+
52+
def _locate_resource(url):
53+
try:
54+
url_match = re.match(r"^package:\/\/tesseract_support\/(.*)$",url)
55+
if (url_match is None):
56+
return ""
57+
if not "TESSERACT_SUPPORT_DIR" in os.environ:
58+
return ""
59+
tesseract_support = os.environ["TESSERACT_SUPPORT_DIR"]
60+
return os.path.join(tesseract_support, os.path.normpath(url_match.group(1)))
61+
except:
62+
traceback.print_exc()
63+
64+
t_env = Environment()
65+
66+
# locator_fn must be kept alive by maintaining a reference
67+
locator_fn = SimpleResourceLocatorFn(_locate_resource)
68+
t_env.init(shapes_urdf, SimpleResourceLocator(locator_fn))
69+
70+
viewer = TesseractViewer()
71+
72+
viewer.update_environment(t_env, [0,0,0])
73+
74+
viewer.start_serve_background()
75+
76+
if sys.version_info[0] < 3:
77+
raw_input("press enter")
78+
else:
79+
input("press enter")
80+

0 commit comments

Comments
 (0)