lirui commited on
Commit
796fad1
1 Parent(s): c577f34
LICENSE.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ Copyright 2021 Google LLC. SPDX-License-Identifier: Apache-2.0
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
4
+
5
+ https://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
app.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import numpy as np
3
+ from tempfile import NamedTemporaryFile
4
+ import copy
5
+ import shapely
6
+ from shapely.geometry import *
7
+ from shapely.affinity import *
8
+ from omegaconf import OmegaConf
9
+ from moviepy.editor import ImageSequenceClip
10
+ import gradio as gr
11
+
12
+ from lmp import LMP, LMPFGen
13
+ from sim import PickPlaceEnv, LMP_wrapper
14
+ from consts import ALL_BLOCKS, ALL_BOWLS
15
+ from md_logger import MarkdownLogger
16
+
17
+
18
+ class DemoRunner:
19
+
20
+ def __init__(self):
21
+ self._cfg = OmegaConf.to_container(OmegaConf.load('cfg.yaml'), resolve=True)
22
+ self._env = None
23
+ self._md_logger = MarkdownLogger()
24
+
25
+ def make_LMP(self, env):
26
+ # LMP env wrapper
27
+ cfg = copy.deepcopy(self._cfg)
28
+ cfg['env'] = {
29
+ 'init_objs': list(env.obj_name_to_id.keys()),
30
+ 'coords': cfg['tabletop_coords']
31
+ }
32
+
33
+ LMP_env = LMP_wrapper(env, cfg)
34
+ # creating APIs that the LMPs can interact with
35
+ fixed_vars = {
36
+ 'np': np
37
+ }
38
+ fixed_vars.update({
39
+ name: eval(name)
40
+ for name in shapely.geometry.__all__ + shapely.affinity.__all__
41
+ })
42
+ variable_vars = {
43
+ k: getattr(LMP_env, k)
44
+ for k in [
45
+ 'get_bbox', 'get_obj_pos', 'get_color', 'is_obj_visible', 'denormalize_xy',
46
+ 'put_first_on_second', 'get_obj_names',
47
+ 'get_corner_name', 'get_side_name',
48
+ ]
49
+ }
50
+ variable_vars['say'] = lambda msg: self._md_logger.log_text(f'Robot says: "{msg}"')
51
+
52
+ # creating the function-generating LMP
53
+ lmp_fgen = LMPFGen(cfg['lmps']['fgen'], fixed_vars, variable_vars, self._md_logger)
54
+
55
+ # creating other low-level LMPs
56
+ variable_vars.update({
57
+ k: LMP(k, cfg['lmps'][k], lmp_fgen, fixed_vars, variable_vars, self._md_logger)
58
+ for k in ['parse_obj_name', 'parse_position', 'parse_question', 'transform_shape_pts']
59
+ })
60
+
61
+ # creating the LMP that deals w/ high-level language commands
62
+ lmp_tabletop_ui = LMP(
63
+ 'tabletop_ui', cfg['lmps']['tabletop_ui'], lmp_fgen, fixed_vars, variable_vars, self._md_logger
64
+ )
65
+
66
+ return lmp_tabletop_ui
67
+
68
+ def setup(self, api_key, n_blocks, n_bowls):
69
+ openai.api_key = api_key
70
+
71
+ self._env = PickPlaceEnv(render=True, high_res=True, high_frame_rate=False)
72
+ list_idxs = np.random.choice(len(ALL_BLOCKS), size=max(n_blocks, n_bowls), replace=False)
73
+ block_list = [ALL_BLOCKS[i] for i in list_idxs[:n_blocks]]
74
+ bowl_list = [ALL_BOWLS[i] for i in list_idxs[:n_bowls]]
75
+ obj_list = block_list + bowl_list
76
+ self._env.reset(obj_list)
77
+
78
+ self._lmp_tabletop_ui = self.make_LMP(self._env)
79
+
80
+ info = '### Available Objects: \n- ' + '\n- '.join(obj_list)
81
+ img = self._env.get_camera_image()
82
+
83
+ return info, img
84
+
85
+ def run(self, instruction):
86
+ if self._env is None:
87
+ return 'Please run setup first!', None, None
88
+
89
+ self._env.cache_video = []
90
+ self._md_logger.clear()
91
+
92
+ try:
93
+ self._lmp_tabletop_ui(instruction, f'objects = {self._env.object_list}')
94
+ except Exception as e:
95
+ return f'Error: {e}', None, None
96
+
97
+ video_file_name = None
98
+ if self._env.cache_video:
99
+ rendered_clip = ImageSequenceClip(self._env.cache_video, fps=25)
100
+ video_file_name = NamedTemporaryFile(suffix='.mp4').name
101
+ rendered_clip.write_videofile(video_file_name, fps=25)
102
+
103
+ return self._md_logger.get_log(), self._env.get_camera_image(), video_file_name
104
+
105
+
106
+ def setup(api_key, n_blocks, n_bowls):
107
+ if not api_key:
108
+ return 'Please enter your OpenAI API key!', None, None
109
+
110
+ if n_blocks + n_bowls == 0:
111
+ return 'Please select at least one object!', None, None
112
+
113
+ demo_runner = DemoRunner()
114
+
115
+ info, img = demo_runner.setup(api_key, n_blocks, n_bowls)
116
+ return info, img, demo_runner
117
+
118
+
119
+ def run(instruction, demo_runner):
120
+ if demo_runner is None:
121
+ return 'Please run setup first!', None, None
122
+ return demo_runner.run(instruction)
123
+
124
+
125
+ if __name__ == '__main__':
126
+ with open('README.md', 'r') as f:
127
+ for _ in range(12):
128
+ next(f)
129
+ readme_text = f.read()
130
+
131
+ with gr.Blocks() as demo:
132
+ state = gr.State(None)
133
+
134
+ gr.Markdown(readme_text)
135
+ gr.Markdown('# Interactive Demo')
136
+ with gr.Row():
137
+ with gr.Column():
138
+ with gr.Row():
139
+ inp_api_key = gr.Textbox(label='OpenAI API Key (this is not stored anywhere)', lines=1)
140
+ with gr.Row():
141
+ inp_n_blocks = gr.Slider(label='Number of Blocks', minimum=0, maximum=4, value=3, step=1)
142
+ inp_n_bowls = gr.Slider(label='Number of Bowls', minimum=0, maximum=4, value=3, step=1)
143
+
144
+ btn_setup = gr.Button("Setup/Reset Simulation")
145
+ info_setup = gr.Markdown(label='Setup Info')
146
+ with gr.Column():
147
+ img_setup = gr.Image(label='Current Simulation')
148
+
149
+ with gr.Row():
150
+ with gr.Column():
151
+
152
+ inp_instruction = gr.Textbox(label='Instruction', lines=1)
153
+ btn_run = gr.Button("Run (this may take 30+ seconds)")
154
+ info_run = gr.Markdown(label='Generated Code')
155
+ with gr.Column():
156
+ video_run = gr.Video(label='Video of Last Instruction')
157
+
158
+ btn_setup.click(
159
+ setup,
160
+ inputs=[inp_api_key, inp_n_blocks, inp_n_bowls],
161
+ outputs=[info_setup, img_setup, state]
162
+ )
163
+ btn_run.click(
164
+ run,
165
+ inputs=[inp_instruction, state],
166
+ outputs=[info_run, img_setup, video_run]
167
+ )
168
+
169
+ demo.launch()
bowl/bowl.urdf ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" ?>
2
+ <robot name="bowl.urdf">
3
+ <link name="baseLink">
4
+ <contact>
5
+ <lateral_friction value="1.0"/>
6
+ <inertia_scaling value="3.0"/>
7
+ </contact>
8
+ <inertial>
9
+ <origin rpy="0 0 0" xyz="-0.025 0 0.02"/>
10
+ <mass value=".1"/>
11
+ <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1"/>
12
+ </inertial>
13
+ <visual>
14
+ <origin rpy="0 0 0" xyz="0 0 0"/>
15
+ <geometry>
16
+ <mesh filename="textured-0008192.obj" scale="1.25 1.25 0.25"/>
17
+ </geometry>
18
+ <material name="green">
19
+ <color rgba="0.34901961 0.6627451 0.30980392 1"/>
20
+ </material>
21
+ </visual>
22
+ <collision>
23
+ <origin rpy="0 0 0" xyz="0 0 0"/>
24
+ <geometry>
25
+ <mesh filename="cup.obj" scale="1.25 1.25 0.25"/>
26
+ </geometry>
27
+ </collision>
28
+ </link>
29
+ </robot>
bowl/cup.obj ADDED
@@ -0,0 +1,1413 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Blender v2.69 (sub 0) OBJ File: ''
2
+ # www.blender.org
3
+ mtllib cup_vhacd.mtl
4
+ o ShapeIndexedFaceSet.013_ShapeIndexedFaceSet
5
+ v 0.000000 0.000000 0.000000
6
+ v -0.018137 0.054263 0.137619
7
+ v -0.033504 0.036700 0.027862
8
+ v -0.033504 0.041091 0.027862
9
+ v -0.033504 0.052066 0.139822
10
+ v -0.018137 0.045481 0.122254
11
+ v -0.018137 0.043286 0.027862
12
+ v -0.033504 0.045481 0.139822
13
+ v -0.022528 0.036700 0.030065
14
+ v -0.029114 0.043286 0.027862
15
+ v -0.031308 0.041091 0.100303
16
+ v -0.018137 0.047673 0.139822
17
+ v -0.018137 0.038897 0.027862
18
+ v -0.029114 0.052066 0.122254
19
+ v -0.033504 0.036700 0.045430
20
+ v -0.020333 0.054263 0.135427
21
+ v -0.029114 0.043286 0.122254
22
+ v -0.033504 0.043286 0.041035
23
+ v -0.018137 0.045481 0.045430
24
+ v -0.018137 0.038897 0.041035
25
+ v -0.033504 0.052066 0.135427
26
+ v -0.018137 0.043286 0.098100
27
+ v -0.022528 0.045481 0.045430
28
+ v -0.031308 0.043286 0.032257
29
+ v -0.033504 0.041091 0.100303
30
+ v -0.018137 0.052066 0.139822
31
+ v -0.031308 0.036700 0.045430
32
+ v -0.031308 0.045481 0.139822
33
+ usemtl Shape.027
34
+ s off
35
+ f 17 12 28
36
+ f 4 3 5
37
+ f 3 4 7
38
+ f 2 6 7
39
+ f 5 3 8
40
+ f 7 4 10
41
+ f 6 2 12
42
+ f 5 8 12
43
+ f 3 7 13
44
+ f 7 6 13
45
+ f 9 3 13
46
+ f 8 3 15
47
+ f 3 9 15
48
+ f 5 2 16
49
+ f 10 14 16
50
+ f 11 9 17
51
+ f 6 12 17
52
+ f 4 5 18
53
+ f 2 7 19
54
+ f 7 10 19
55
+ f 16 2 19
56
+ f 13 6 20
57
+ f 9 13 20
58
+ f 5 16 21
59
+ f 16 14 21
60
+ f 18 5 21
61
+ f 6 17 22
62
+ f 17 9 22
63
+ f 20 6 22
64
+ f 9 20 22
65
+ f 10 16 23
66
+ f 19 10 23
67
+ f 16 19 23
68
+ f 10 4 24
69
+ f 14 10 24
70
+ f 4 18 24
71
+ f 21 14 24
72
+ f 18 21 24
73
+ f 8 15 25
74
+ f 15 11 25
75
+ f 17 8 25
76
+ f 11 17 25
77
+ f 2 5 26
78
+ f 12 2 26
79
+ f 5 12 26
80
+ f 9 11 27
81
+ f 15 9 27
82
+ f 11 15 27
83
+ f 12 8 28
84
+ f 8 17 28
85
+ o ShapeIndexedFaceSet.012_ShapeIndexedFaceSet.027
86
+ v 0.000000 0.000000 0.000000
87
+ v -0.033504 0.049872 0.139822
88
+ v -0.046676 0.025724 0.027862
89
+ v -0.046676 0.034505 0.027862
90
+ v -0.033504 0.034505 0.027862
91
+ v -0.046676 0.036704 0.133235
92
+ v -0.046676 0.045480 0.131032
93
+ v -0.035700 0.041091 0.027862
94
+ v -0.033504 0.043284 0.133235
95
+ v -0.042285 0.025724 0.030065
96
+ v -0.037896 0.049872 0.124446
97
+ v -0.044480 0.034505 0.117848
98
+ v -0.033504 0.041091 0.027862
99
+ v -0.044480 0.047676 0.135427
100
+ v -0.046676 0.038892 0.139822
101
+ v -0.042285 0.038892 0.036651
102
+ v -0.033504 0.049872 0.120062
103
+ v -0.035700 0.043284 0.139822
104
+ v -0.040090 0.049872 0.139822
105
+ v -0.046676 0.025724 0.034449
106
+ v -0.037896 0.041091 0.034449
107
+ v -0.033504 0.038892 0.084927
108
+ v -0.046676 0.045480 0.139822
109
+ v -0.044480 0.036704 0.133235
110
+ v -0.044480 0.036704 0.030065
111
+ v -0.033504 0.034505 0.032257
112
+ v -0.042285 0.047676 0.122254
113
+ v -0.046676 0.034505 0.117848
114
+ v -0.035700 0.043284 0.049824
115
+ v -0.042285 0.025724 0.027862
116
+ v -0.044480 0.025724 0.034449
117
+ v -0.033504 0.041091 0.111273
118
+ usemtl Shape.026
119
+ s off
120
+ f 38 50 60
121
+ f 31 32 33
122
+ f 32 31 34
123
+ f 32 34 35
124
+ f 33 32 36
125
+ f 33 30 37
126
+ f 38 37 40
127
+ f 30 33 41
128
+ f 33 36 41
129
+ f 35 34 43
130
+ f 39 30 45
131
+ f 30 41 45
132
+ f 37 30 46
133
+ f 30 43 46
134
+ f 30 39 47
135
+ f 39 42 47
136
+ f 43 30 47
137
+ f 34 31 48
138
+ f 31 38 48
139
+ f 33 37 50
140
+ f 42 35 51
141
+ f 35 43 51
142
+ f 47 42 51
143
+ f 43 47 51
144
+ f 34 40 52
145
+ f 40 37 52
146
+ f 43 34 52
147
+ f 37 46 52
148
+ f 46 43 52
149
+ f 32 35 53
150
+ f 36 32 53
151
+ f 35 42 53
152
+ f 42 44 53
153
+ f 49 36 53
154
+ f 44 49 53
155
+ f 38 33 54
156
+ f 33 50 54
157
+ f 50 38 54
158
+ f 42 39 55
159
+ f 44 42 55
160
+ f 39 49 55
161
+ f 49 44 55
162
+ f 40 34 56
163
+ f 34 48 56
164
+ f 48 40 56
165
+ f 41 36 57
166
+ f 39 45 57
167
+ f 45 41 57
168
+ f 36 49 57
169
+ f 49 39 57
170
+ f 31 33 58
171
+ f 38 31 58
172
+ f 33 38 58
173
+ f 38 40 59
174
+ f 48 38 59
175
+ f 40 48 59
176
+ f 37 38 60
177
+ f 50 37 60
178
+ o ShapeIndexedFaceSet.011_ShapeIndexedFaceSet.026
179
+ v 0.000000 0.000000 0.000000
180
+ v -0.066434 -0.002813 0.135413
181
+ v -0.051068 -0.007203 0.058606
182
+ v -0.051068 -0.009399 0.058606
183
+ v -0.057654 0.005965 0.038839
184
+ v -0.059846 0.005965 0.137608
185
+ v -0.057654 -0.009399 0.139812
186
+ v -0.057654 -0.009399 0.052024
187
+ v -0.053264 0.005965 0.038839
188
+ v -0.066434 0.005965 0.139812
189
+ v -0.064236 -0.009399 0.139812
190
+ v -0.051068 -0.009399 0.038839
191
+ v -0.059846 0.001575 0.049829
192
+ v -0.057654 -0.007203 0.041052
193
+ v -0.055458 -0.007203 0.122248
194
+ v -0.066434 -0.005009 0.137608
195
+ v -0.059846 0.005965 0.049829
196
+ v -0.057654 0.005965 0.109073
197
+ v -0.055458 -0.009399 0.038839
198
+ v -0.053264 0.005965 0.043247
199
+ v -0.066434 0.005965 0.135413
200
+ v -0.051068 -0.005009 0.038839
201
+ v -0.062042 0.005965 0.139812
202
+ v -0.055458 -0.009399 0.122248
203
+ v -0.064236 -0.009399 0.135413
204
+ v -0.057654 -0.007203 0.139812
205
+ v -0.057654 -0.005009 0.038839
206
+ v -0.053264 -0.007203 0.091519
207
+ usemtl Shape.025
208
+ s off
209
+ f 75 84 88
210
+ f 64 67 68
211
+ f 65 66 69
212
+ f 66 65 70
213
+ f 67 70 71
214
+ f 68 67 71
215
+ f 63 64 72
216
+ f 64 68 72
217
+ f 65 69 72
218
+ f 70 62 76
219
+ f 71 70 76
220
+ f 62 73 76
221
+ f 74 68 76
222
+ f 73 74 76
223
+ f 70 65 77
224
+ f 65 73 77
225
+ f 73 62 77
226
+ f 69 66 78
227
+ f 66 75 78
228
+ f 72 68 79
229
+ f 65 72 79
230
+ f 68 74 79
231
+ f 78 63 80
232
+ f 69 78 80
233
+ f 62 70 81
234
+ f 77 62 81
235
+ f 70 77 81
236
+ f 63 72 82
237
+ f 72 69 82
238
+ f 80 63 82
239
+ f 69 80 82
240
+ f 66 70 83
241
+ f 70 67 83
242
+ f 67 64 84
243
+ f 75 67 84
244
+ f 68 71 85
245
+ f 71 76 85
246
+ f 76 68 85
247
+ f 75 66 86
248
+ f 67 75 86
249
+ f 66 83 86
250
+ f 83 67 86
251
+ f 73 65 87
252
+ f 74 73 87
253
+ f 65 79 87
254
+ f 79 74 87
255
+ f 64 63 88
256
+ f 63 78 88
257
+ f 78 75 88
258
+ f 84 64 88
259
+ o ShapeIndexedFaceSet.010_ShapeIndexedFaceSet.025
260
+ v 0.000000 0.000000 0.000000
261
+ v -0.062040 -0.013792 0.122248
262
+ v -0.042286 -0.018180 0.049829
263
+ v -0.053261 -0.009401 0.104685
264
+ v -0.055455 -0.009401 0.038839
265
+ v -0.059844 -0.020377 0.139812
266
+ v -0.051069 -0.020377 0.049829
267
+ v -0.051069 -0.020377 0.139812
268
+ v -0.064236 -0.009401 0.139812
269
+ v -0.048873 -0.009401 0.038839
270
+ v -0.042286 -0.020377 0.038839
271
+ v -0.055455 -0.011597 0.139812
272
+ v -0.053261 -0.015986 0.038839
273
+ v -0.048873 -0.018180 0.122248
274
+ v -0.055455 -0.011597 0.038839
275
+ v -0.057651 -0.009401 0.139812
276
+ v -0.064236 -0.011597 0.137608
277
+ v -0.048873 -0.020377 0.038839
278
+ v -0.042286 -0.020377 0.049829
279
+ v -0.048873 -0.009401 0.045441
280
+ v -0.059844 -0.018180 0.122248
281
+ v -0.055455 -0.013792 0.047635
282
+ v -0.051069 -0.018180 0.139812
283
+ v -0.042286 -0.018180 0.038839
284
+ v -0.053261 -0.011597 0.122248
285
+ v -0.059844 -0.020377 0.137608
286
+ v -0.048873 -0.020377 0.122248
287
+ usemtl Shape.024
288
+ s off
289
+ f 107 102 115
290
+ f 94 95 96
291
+ f 92 93 97
292
+ f 94 96 97
293
+ f 93 92 98
294
+ f 96 95 99
295
+ f 93 98 99
296
+ f 97 96 100
297
+ f 93 99 101
298
+ f 93 101 103
299
+ f 92 97 104
300
+ f 100 92 104
301
+ f 97 100 104
302
+ f 97 93 105
303
+ f 94 97 105
304
+ f 93 103 105
305
+ f 99 95 106
306
+ f 95 101 106
307
+ f 101 99 106
308
+ f 99 91 107
309
+ f 96 99 107
310
+ f 91 102 107
311
+ f 92 91 108
312
+ f 98 92 108
313
+ f 91 98 108
314
+ f 103 101 110
315
+ f 90 105 110
316
+ f 105 103 110
317
+ f 109 90 110
318
+ f 101 109 110
319
+ f 100 96 111
320
+ f 96 102 111
321
+ f 102 100 111
322
+ f 98 91 112
323
+ f 91 99 112
324
+ f 99 98 112
325
+ f 91 92 113
326
+ f 92 100 113
327
+ f 102 91 113
328
+ f 100 102 113
329
+ f 95 94 114
330
+ f 101 95 114
331
+ f 105 90 114
332
+ f 94 105 114
333
+ f 90 109 114
334
+ f 109 101 114
335
+ f 102 96 115
336
+ f 96 107 115
337
+ o ShapeIndexedFaceSet.009_ShapeIndexedFaceSet.024
338
+ v 0.000000 0.000000 0.000000
339
+ v -0.018137 0.043284 0.036653
340
+ v 0.019183 0.034509 0.139822
341
+ v 0.019183 0.030119 0.139822
342
+ v -0.018137 0.047673 0.139822
343
+ v -0.004964 0.052067 0.135419
344
+ v 0.001618 0.038898 0.036653
345
+ v -0.000573 0.030119 0.038855
346
+ v 0.010401 0.030119 0.045439
347
+ v 0.012596 0.030119 0.137610
348
+ v -0.018137 0.038898 0.045439
349
+ v 0.008205 0.045480 0.139822
350
+ v -0.018137 0.052067 0.120048
351
+ v -0.007160 0.043284 0.038855
352
+ v 0.010401 0.032313 0.045439
353
+ v -0.018137 0.043284 0.100295
354
+ v -0.015942 0.045480 0.045439
355
+ v -0.018137 0.052067 0.139822
356
+ v 0.008205 0.045480 0.135419
357
+ v 0.008205 0.030119 0.036653
358
+ v 0.019183 0.030119 0.122250
359
+ v -0.018137 0.038898 0.036653
360
+ v 0.001618 0.047673 0.120048
361
+ v 0.019183 0.034509 0.135419
362
+ v 0.008205 0.030119 0.109071
363
+ v -0.011551 0.052067 0.122250
364
+ v -0.004964 0.052067 0.139822
365
+ v -0.018137 0.045480 0.122250
366
+ v 0.014792 0.038898 0.133217
367
+ v 0.008205 0.034509 0.045439
368
+ v 0.019183 0.032313 0.122250
369
+ v -0.018137 0.045480 0.045439
370
+ v -0.000573 0.041092 0.045439
371
+ v 0.014792 0.030119 0.139822
372
+ v -0.000573 0.030119 0.036653
373
+ v -0.011551 0.045480 0.052024
374
+ v -0.009355 0.043284 0.036653
375
+ v 0.008205 0.032313 0.036653
376
+ v -0.002769 0.049869 0.122250
377
+ v 0.006009 0.045480 0.122250
378
+ usemtl Shape.023
379
+ s off
380
+ f 148 138 155
381
+ f 119 118 120
382
+ f 119 123 124
383
+ f 123 119 125
384
+ f 120 117 126
385
+ f 120 118 127
386
+ f 117 120 128
387
+ f 120 126 131
388
+ f 120 127 133
389
+ f 128 120 133
390
+ f 121 128 133
391
+ f 121 127 134
392
+ f 117 122 135
393
+ f 124 123 135
394
+ f 130 124 135
395
+ f 118 119 136
396
+ f 119 124 136
397
+ f 124 130 136
398
+ f 123 126 137
399
+ f 126 117 137
400
+ f 117 135 137
401
+ f 121 134 138
402
+ f 118 136 139
403
+ f 123 125 140
404
+ f 126 123 140
405
+ f 125 131 140
406
+ f 131 126 140
407
+ f 128 121 141
408
+ f 132 128 141
409
+ f 127 121 142
410
+ f 133 127 142
411
+ f 121 133 142
412
+ f 125 120 143
413
+ f 120 131 143
414
+ f 131 125 143
415
+ f 127 118 144
416
+ f 134 127 144
417
+ f 118 139 144
418
+ f 139 130 144
419
+ f 122 134 145
420
+ f 134 144 145
421
+ f 144 130 145
422
+ f 136 130 146
423
+ f 130 139 146
424
+ f 139 136 146
425
+ f 117 128 147
426
+ f 132 117 147
427
+ f 128 132 147
428
+ f 122 129 148
429
+ f 119 120 149
430
+ f 125 119 149
431
+ f 120 125 149
432
+ f 135 123 150
433
+ f 123 137 150
434
+ f 137 135 150
435
+ f 121 129 151
436
+ f 129 132 151
437
+ f 141 121 151
438
+ f 132 141 151
439
+ f 122 117 152
440
+ f 129 122 152
441
+ f 117 132 152
442
+ f 132 129 152
443
+ f 135 122 153
444
+ f 130 135 153
445
+ f 122 145 153
446
+ f 145 130 153
447
+ f 129 121 154
448
+ f 121 138 154
449
+ f 148 129 154
450
+ f 138 148 154
451
+ f 134 122 155
452
+ f 138 134 155
453
+ f 122 148 155
454
+ o ShapeIndexedFaceSet.008_ShapeIndexedFaceSet.023
455
+ v 0.000000 0.000000 0.000000
456
+ v 0.014792 0.030114 0.139822
457
+ v 0.012598 0.005966 0.036653
458
+ v 0.016986 0.005966 0.036653
459
+ v 0.010404 0.030114 0.036653
460
+ v 0.025768 0.021331 0.139822
461
+ v 0.021376 0.005966 0.139822
462
+ v 0.003816 0.027919 0.049832
463
+ v 0.016986 0.019135 0.036653
464
+ v 0.025768 0.005966 0.120048
465
+ v 0.021376 0.030114 0.135419
466
+ v 0.003816 0.030114 0.036653
467
+ v 0.010404 0.027919 0.113464
468
+ v 0.019180 0.008162 0.043248
469
+ v 0.025768 0.016946 0.122250
470
+ v 0.019180 0.005966 0.122250
471
+ v 0.025768 0.005966 0.139822
472
+ v 0.012598 0.027919 0.036653
473
+ v 0.021376 0.027919 0.120048
474
+ v 0.012598 0.005966 0.041046
475
+ v 0.010404 0.030114 0.113464
476
+ v 0.025768 0.021331 0.135419
477
+ v 0.014792 0.025720 0.137610
478
+ v 0.019180 0.005966 0.043248
479
+ v 0.021376 0.030114 0.139822
480
+ v 0.003816 0.027919 0.036653
481
+ v 0.012598 0.030114 0.049832
482
+ v 0.003816 0.030114 0.049832
483
+ v 0.019180 0.012557 0.047631
484
+ v 0.014792 0.025720 0.045439
485
+ v 0.016986 0.005966 0.095902
486
+ v 0.025768 0.012557 0.120048
487
+ usemtl Shape.022
488
+ s off
489
+ f 169 170 187
490
+ f 159 158 160
491
+ f 158 159 162
492
+ f 161 157 162
493
+ f 159 160 164
494
+ f 162 159 165
495
+ f 160 157 166
496
+ f 160 158 167
497
+ f 157 160 167
498
+ f 159 164 169
499
+ f 161 165 170
500
+ f 158 162 171
501
+ f 168 163 171
502
+ f 162 168 171
503
+ f 161 162 172
504
+ f 165 161 172
505
+ f 162 165 172
506
+ f 164 160 173
507
+ f 163 158 175
508
+ f 158 171 175
509
+ f 157 167 176
510
+ f 163 168 176
511
+ f 168 157 176
512
+ f 166 161 177
513
+ f 161 170 177
514
+ f 170 164 177
515
+ f 174 166 177
516
+ f 164 174 177
517
+ f 162 157 178
518
+ f 157 168 178
519
+ f 168 162 178
520
+ f 165 159 179
521
+ f 159 169 179
522
+ f 169 165 179
523
+ f 157 161 180
524
+ f 166 157 180
525
+ f 161 166 180
526
+ f 158 163 181
527
+ f 167 158 181
528
+ f 163 167 181
529
+ f 160 166 182
530
+ f 173 160 182
531
+ f 166 174 182
532
+ f 174 173 182
533
+ f 167 163 183
534
+ f 176 167 183
535
+ f 163 176 183
536
+ f 169 164 184
537
+ f 170 169 184
538
+ f 164 170 184
539
+ f 164 173 185
540
+ f 173 174 185
541
+ f 174 164 185
542
+ f 171 163 186
543
+ f 163 175 186
544
+ f 175 171 186
545
+ f 165 169 187
546
+ f 170 165 187
547
+ o ShapeIndexedFaceSet.007_ShapeIndexedFaceSet.022
548
+ v 0.000000 0.000000 0.000000
549
+ v -0.051069 0.043286 0.139822
550
+ v -0.057651 0.005966 0.027862
551
+ v -0.057651 0.014748 0.027862
552
+ v -0.066430 0.016948 0.139822
553
+ v -0.059846 0.005966 0.135427
554
+ v -0.046678 0.023530 0.036651
555
+ v -0.046678 0.036700 0.139822
556
+ v -0.048875 0.032305 0.027862
557
+ v -0.051069 0.008162 0.030065
558
+ v -0.062040 0.030110 0.135427
559
+ v -0.066430 0.005966 0.139822
560
+ v -0.046678 0.043286 0.122254
561
+ v -0.046678 0.032305 0.027862
562
+ v -0.055459 0.023530 0.036651
563
+ v -0.057651 0.036700 0.135427
564
+ v -0.064235 0.025722 0.137619
565
+ v -0.053264 0.005966 0.027862
566
+ v -0.066430 0.016948 0.135427
567
+ v -0.046678 0.032305 0.115667
568
+ v -0.059846 0.005966 0.049824
569
+ v -0.051069 0.030110 0.030065
570
+ v -0.057651 0.005966 0.109081
571
+ v -0.051069 0.043286 0.135427
572
+ v -0.062040 0.005966 0.139822
573
+ v -0.046678 0.043286 0.139822
574
+ v -0.046678 0.023530 0.027862
575
+ v -0.062040 0.030110 0.139822
576
+ v -0.048875 0.043286 0.122254
577
+ v -0.066430 0.005966 0.135427
578
+ v -0.055459 0.021335 0.027862
579
+ v -0.053264 0.005966 0.043238
580
+ v -0.064235 0.021335 0.122254
581
+ v -0.057651 0.016948 0.034449
582
+ v -0.059846 0.008162 0.049824
583
+ usemtl Shape.021
584
+ s off
585
+ f 208 206 222
586
+ f 189 192 195
587
+ f 190 191 196
588
+ f 190 193 199
589
+ f 195 192 199
590
+ f 195 194 200
591
+ f 196 200 201
592
+ f 190 196 201
593
+ f 200 194 201
594
+ f 198 202 204
595
+ f 193 190 205
596
+ f 190 201 205
597
+ f 199 192 206
598
+ f 192 204 206
599
+ f 194 195 207
600
+ f 197 194 207
601
+ f 191 190 208
602
+ f 190 199 208
603
+ f 202 198 209
604
+ f 203 196 209
605
+ f 198 203 209
606
+ f 195 193 210
607
+ f 193 205 210
608
+ f 207 195 210
609
+ f 197 207 210
610
+ f 189 200 211
611
+ f 203 189 211
612
+ f 196 203 211
613
+ f 193 195 212
614
+ f 199 193 212
615
+ f 195 199 212
616
+ f 189 195 213
617
+ f 200 189 213
618
+ f 195 200 213
619
+ f 194 197 214
620
+ f 201 194 214
621
+ f 197 205 214
622
+ f 205 201 214
623
+ f 192 189 215
624
+ f 189 203 215
625
+ f 203 198 215
626
+ f 198 204 215
627
+ f 204 192 215
628
+ f 200 196 216
629
+ f 211 200 216
630
+ f 196 211 216
631
+ f 199 206 217
632
+ f 208 199 217
633
+ f 206 208 217
634
+ f 196 191 218
635
+ f 204 202 218
636
+ f 209 196 218
637
+ f 202 209 218
638
+ f 205 197 219
639
+ f 210 205 219
640
+ f 197 210 219
641
+ f 191 206 220
642
+ f 206 204 220
643
+ f 218 191 221
644
+ f 204 218 221
645
+ f 191 220 221
646
+ f 220 204 221
647
+ f 206 191 222
648
+ f 191 208 222
649
+ o ShapeIndexedFaceSet.006_ShapeIndexedFaceSet.021
650
+ v 0.000000 0.000000 0.000000
651
+ v 0.023572 -0.013791 0.139822
652
+ v 0.001623 -0.020377 0.041034
653
+ v 0.008210 -0.020377 0.041034
654
+ v 0.014791 0.005966 0.041034
655
+ v 0.021376 0.005966 0.139822
656
+ v 0.012600 -0.020377 0.139822
657
+ v 0.019181 0.001575 0.043239
658
+ v 0.025768 0.005966 0.120056
659
+ v 0.001623 -0.018180 0.045434
660
+ v 0.019181 -0.020377 0.124437
661
+ v 0.014791 -0.013791 0.045434
662
+ v 0.008210 -0.018180 0.113471
663
+ v 0.016987 0.005966 0.098096
664
+ v 0.025768 -0.007205 0.135422
665
+ v 0.025768 0.005966 0.139822
666
+ v 0.016987 -0.007205 0.041034
667
+ v 0.019181 0.005966 0.043239
668
+ v 0.014791 0.005966 0.067384
669
+ v 0.023572 -0.011594 0.122251
670
+ v 0.025768 -0.002819 0.122251
671
+ v 0.010404 -0.020377 0.045434
672
+ v 0.019181 -0.020377 0.139822
673
+ v 0.019181 0.005966 0.122251
674
+ v 0.012600 -0.018180 0.139822
675
+ v 0.008210 -0.020377 0.113471
676
+ v 0.025768 -0.005014 0.126642
677
+ v 0.012600 -0.018180 0.049824
678
+ v 0.012600 -0.015986 0.041034
679
+ v 0.001623 -0.018180 0.041034
680
+ v 0.025768 -0.007205 0.139822
681
+ v 0.021376 -0.018180 0.135422
682
+ v 0.006014 -0.018180 0.091520
683
+ v 0.019181 -0.002819 0.052019
684
+ v 0.016987 -0.009400 0.047629
685
+ v 0.025768 -0.000620 0.120056
686
+ v 0.021376 -0.015986 0.122251
687
+ usemtl Shape.020
688
+ s off
689
+ f 254 233 259
690
+ f 226 225 227
691
+ f 225 226 229
692
+ f 224 228 229
693
+ f 227 228 231
694
+ f 229 226 233
695
+ f 228 227 236
696
+ f 228 224 238
697
+ f 231 228 238
698
+ f 237 231 238
699
+ f 226 227 239
700
+ f 227 231 240
701
+ f 231 230 240
702
+ f 239 227 240
703
+ f 230 239 240
704
+ f 227 232 241
705
+ f 232 236 241
706
+ f 236 227 241
707
+ f 237 224 242
708
+ f 231 237 243
709
+ f 233 226 244
710
+ f 224 229 245
711
+ f 229 233 245
712
+ f 235 228 246
713
+ f 236 232 246
714
+ f 228 236 246
715
+ f 229 228 247
716
+ f 235 229 247
717
+ f 228 235 247
718
+ f 225 229 248
719
+ f 232 225 248
720
+ f 229 235 248
721
+ f 237 242 249
722
+ f 242 239 249
723
+ f 243 237 249
724
+ f 234 233 250
725
+ f 233 244 250
726
+ f 250 244 251
727
+ f 226 239 251
728
+ f 239 234 251
729
+ f 244 226 251
730
+ f 234 250 251
731
+ f 227 225 252
732
+ f 225 232 252
733
+ f 232 227 252
734
+ f 224 237 253
735
+ f 238 224 253
736
+ f 237 238 253
737
+ f 242 224 254
738
+ f 224 245 254
739
+ f 245 233 254
740
+ f 235 246 255
741
+ f 246 232 255
742
+ f 232 248 255
743
+ f 248 235 255
744
+ f 239 230 256
745
+ f 230 243 256
746
+ f 249 239 256
747
+ f 243 249 256
748
+ f 234 239 257
749
+ f 242 234 257
750
+ f 239 242 257
751
+ f 230 231 258
752
+ f 243 230 258
753
+ f 231 243 258
754
+ f 233 234 259
755
+ f 234 242 259
756
+ f 242 254 259
757
+ o ShapeIndexedFaceSet.005_ShapeIndexedFaceSet.020
758
+ v 0.000000 0.000000 0.000000
759
+ v -0.004961 -0.037936 0.122251
760
+ v 0.019183 -0.020377 0.139822
761
+ v 0.019183 -0.022576 0.139822
762
+ v 0.006008 -0.020377 0.041034
763
+ v -0.020333 -0.033546 0.133227
764
+ v -0.020333 -0.033546 0.045434
765
+ v -0.018136 -0.026966 0.043239
766
+ v -0.000575 -0.029160 0.045434
767
+ v 0.010398 -0.020377 0.139822
768
+ v -0.020333 -0.040133 0.139822
769
+ v 0.003815 -0.035741 0.139822
770
+ v -0.000575 -0.020377 0.052019
771
+ v 0.008205 -0.022576 0.045434
772
+ v 0.010398 -0.031351 0.135422
773
+ v -0.007154 -0.031351 0.041034
774
+ v -0.009351 -0.040133 0.135422
775
+ v -0.020333 -0.029160 0.071784
776
+ v -0.020333 -0.029160 0.041034
777
+ v -0.020333 -0.035741 0.139822
778
+ v -0.020333 -0.040133 0.128837
779
+ v -0.015939 -0.033546 0.045434
780
+ v -0.000575 -0.037936 0.137607
781
+ v 0.006008 -0.020377 0.111276
782
+ v -0.000575 -0.020377 0.041034
783
+ v 0.008205 -0.020377 0.045434
784
+ v 0.019183 -0.022576 0.137607
785
+ v -0.020333 -0.031351 0.104681
786
+ v 0.003815 -0.026966 0.052019
787
+ v 0.001618 -0.026966 0.041034
788
+ v 0.003815 -0.035741 0.137607
789
+ v -0.009351 -0.040133 0.139822
790
+ v 0.016985 -0.024771 0.135422
791
+ v -0.020333 -0.031351 0.041034
792
+ v -0.011545 -0.033546 0.054224
793
+ v -0.018136 -0.040133 0.128837
794
+ v 0.010398 -0.031351 0.139822
795
+ usemtl Shape.019
796
+ s off
797
+ f 274 292 296
798
+ f 263 262 269
799
+ f 262 264 269
800
+ f 265 266 270
801
+ f 263 269 270
802
+ f 263 270 271
803
+ f 269 264 272
804
+ f 275 261 276
805
+ f 266 265 277
806
+ f 264 275 278
807
+ f 266 277 278
808
+ f 277 267 278
809
+ f 269 265 279
810
+ f 265 270 279
811
+ f 270 269 279
812
+ f 270 266 280
813
+ f 276 270 280
814
+ f 266 275 281
815
+ f 280 266 281
816
+ f 261 275 282
817
+ f 275 268 282
818
+ f 276 261 282
819
+ f 272 267 283
820
+ f 269 272 283
821
+ f 267 277 283
822
+ f 272 264 284
823
+ f 267 272 284
824
+ f 264 278 284
825
+ f 278 267 284
826
+ f 264 262 285
827
+ f 273 264 285
828
+ f 273 285 286
829
+ f 262 263 286
830
+ f 285 262 286
831
+ f 265 269 287
832
+ f 277 265 287
833
+ f 269 283 287
834
+ f 283 277 287
835
+ f 274 268 288
836
+ f 273 274 288
837
+ f 264 273 289
838
+ f 275 264 289
839
+ f 268 275 289
840
+ f 288 268 289
841
+ f 273 288 289
842
+ f 268 274 290
843
+ f 274 271 290
844
+ f 282 268 290
845
+ f 271 282 290
846
+ f 271 270 291
847
+ f 270 276 291
848
+ f 282 271 291
849
+ f 276 282 291
850
+ f 274 273 292
851
+ f 273 286 292
852
+ f 286 263 292
853
+ f 275 266 293
854
+ f 266 278 293
855
+ f 278 275 293
856
+ f 275 276 294
857
+ f 276 281 294
858
+ f 281 275 294
859
+ f 276 280 295
860
+ f 281 276 295
861
+ f 280 281 295
862
+ f 263 271 296
863
+ f 271 274 296
864
+ f 292 263 296
865
+ o ShapeIndexedFaceSet.004_ShapeIndexedFaceSet.019
866
+ v 0.000000 0.000000 0.000000
867
+ v -0.046671 -0.022576 0.038839
868
+ v -0.020333 -0.035741 0.139812
869
+ v -0.020333 -0.040133 0.139812
870
+ v -0.057652 -0.020377 0.139812
871
+ v -0.022528 -0.026966 0.038839
872
+ v -0.037897 -0.037936 0.135413
873
+ v -0.024724 -0.033546 0.045441
874
+ v -0.048870 -0.020377 0.139812
875
+ v -0.040088 -0.020377 0.038839
876
+ v -0.046671 -0.033546 0.139812
877
+ v -0.033509 -0.031351 0.038839
878
+ v -0.020333 -0.031351 0.106879
879
+ v -0.020333 -0.033546 0.045441
880
+ v -0.048870 -0.022576 0.045441
881
+ v -0.031314 -0.040133 0.137608
882
+ v -0.057652 -0.022576 0.135413
883
+ v -0.040088 -0.029160 0.045441
884
+ v -0.048870 -0.020377 0.045441
885
+ v -0.020333 -0.029160 0.071781
886
+ v -0.040088 -0.020377 0.054218
887
+ v -0.053261 -0.026966 0.126637
888
+ v -0.020333 -0.033546 0.131025
889
+ v -0.020333 -0.040133 0.131025
890
+ v -0.020333 -0.031351 0.038839
891
+ v -0.046671 -0.033546 0.137608
892
+ v -0.046671 -0.024771 0.047635
893
+ v -0.022528 -0.026966 0.043247
894
+ v -0.046671 -0.020377 0.122248
895
+ v -0.042284 -0.026966 0.038839
896
+ v -0.031314 -0.040133 0.139812
897
+ v -0.020333 -0.029160 0.038839
898
+ v -0.044476 -0.033546 0.122248
899
+ v -0.022528 -0.033546 0.137608
900
+ v -0.057652 -0.022576 0.139812
901
+ v -0.046671 -0.020377 0.038839
902
+ v -0.022528 -0.040133 0.131025
903
+ v -0.035701 -0.031351 0.047635
904
+ v -0.057652 -0.020377 0.135413
905
+ usemtl Shape.018
906
+ s off
907
+ f 315 313 335
908
+ f 300 299 301
909
+ f 301 299 305
910
+ f 302 298 306
911
+ f 301 305 306
912
+ f 300 301 307
913
+ f 298 302 308
914
+ f 299 300 309
915
+ f 304 308 310
916
+ f 309 300 310
917
+ f 303 308 312
918
+ f 308 304 312
919
+ f 301 306 315
920
+ f 298 311 315
921
+ f 311 313 315
922
+ f 305 309 316
923
+ f 309 310 316
924
+ f 302 306 317
925
+ f 306 305 317
926
+ f 313 311 318
927
+ f 299 309 319
928
+ f 309 305 319
929
+ f 310 300 320
930
+ f 304 310 320
931
+ f 300 312 320
932
+ f 308 302 321
933
+ f 310 308 321
934
+ f 316 310 321
935
+ f 303 307 322
936
+ f 307 318 322
937
+ f 322 318 323
938
+ f 318 311 323
939
+ f 314 322 323
940
+ f 316 302 324
941
+ f 302 317 324
942
+ f 324 317 325
943
+ f 305 316 325
944
+ f 317 305 325
945
+ f 316 324 325
946
+ f 298 308 326
947
+ f 311 298 326
948
+ f 308 314 326
949
+ f 323 311 326
950
+ f 314 323 326
951
+ f 300 307 327
952
+ f 307 303 327
953
+ f 312 300 327
954
+ f 303 312 327
955
+ f 302 316 328
956
+ f 321 302 328
957
+ f 316 321 328
958
+ f 314 303 329
959
+ f 303 322 329
960
+ f 322 314 329
961
+ f 305 299 330
962
+ f 299 319 330
963
+ f 319 305 330
964
+ f 307 301 331
965
+ f 301 313 331
966
+ f 318 307 331
967
+ f 313 318 331
968
+ f 306 298 332
969
+ f 298 315 332
970
+ f 315 306 332
971
+ f 312 304 333
972
+ f 304 320 333
973
+ f 320 312 333
974
+ f 308 303 334
975
+ f 303 314 334
976
+ f 314 308 334
977
+ f 313 301 335
978
+ f 301 315 335
979
+ o ShapeIndexedFaceSet.003_ShapeIndexedFaceSet.018
980
+ v 0.000000 0.000000 0.000000
981
+ v 0.001618 0.038895 0.036643
982
+ v -0.004962 0.005966 -0.000677
983
+ v 0.014790 0.005966 -0.000677
984
+ v -0.013743 0.041091 -0.000677
985
+ v -0.018137 0.005966 0.025666
986
+ v 0.016987 0.005966 0.036643
987
+ v -0.018137 0.043286 0.036643
988
+ v 0.008206 0.030110 0.003714
989
+ v -0.018137 0.005966 0.001519
990
+ v 0.014790 0.023530 0.036643
991
+ v -0.018137 0.041091 -0.000677
992
+ v 0.014790 0.016948 0.001519
993
+ v -0.004962 0.038895 -0.000677
994
+ v 0.010400 0.005966 0.036643
995
+ v -0.009353 0.043286 0.030057
996
+ v -0.018137 0.038895 0.036643
997
+ v 0.016987 0.014748 0.023467
998
+ v 0.012597 0.021335 -0.000677
999
+ v 0.012597 0.027918 0.034448
1000
+ v 0.016987 0.005966 0.012500
1001
+ v 0.006009 0.032305 0.001519
1002
+ v -0.018137 0.023530 -0.000677
1003
+ v -0.018137 0.043286 0.019079
1004
+ v -0.002765 0.038895 0.005910
1005
+ v 0.016987 0.016948 0.036643
1006
+ v 0.008206 0.032305 0.023467
1007
+ v 0.012597 0.023530 0.005910
1008
+ v -0.009353 0.043286 0.036643
1009
+ v -0.009353 0.041091 0.003714
1010
+ v -0.002765 0.041091 0.032252
1011
+ v 0.014790 0.023530 0.032252
1012
+ v -0.013743 0.043286 0.019079
1013
+ v 0.003816 0.036700 0.027861
1014
+ v 0.001618 0.036700 0.010301
1015
+ v 0.016987 0.016948 0.030057
1016
+ v 0.008206 0.027918 -0.000677
1017
+ usemtl Shape.017
1018
+ s off
1019
+ f 357 344 372
1020
+ f 339 338 340
1021
+ f 338 339 341
1022
+ f 341 339 342
1023
+ f 342 337 343
1024
+ f 338 341 345
1025
+ f 341 343 345
1026
+ f 337 342 346
1027
+ f 340 338 347
1028
+ f 345 343 347
1029
+ f 339 340 349
1030
+ f 341 342 350
1031
+ f 342 343 350
1032
+ f 343 341 352
1033
+ f 341 350 352
1034
+ f 350 343 352
1035
+ f 348 339 354
1036
+ f 339 349 354
1037
+ f 337 346 355
1038
+ f 342 339 356
1039
+ f 339 348 356
1040
+ f 353 342 356
1041
+ f 348 353 356
1042
+ f 338 345 358
1043
+ f 347 338 358
1044
+ f 345 347 358
1045
+ f 340 347 359
1046
+ f 347 343 359
1047
+ f 343 351 359
1048
+ f 357 349 360
1049
+ f 346 342 361
1050
+ f 342 353 361
1051
+ f 355 344 362
1052
+ f 344 357 362
1053
+ f 354 344 363
1054
+ f 348 354 363
1055
+ f 344 355 363
1056
+ f 343 337 364
1057
+ f 351 343 364
1058
+ f 349 340 365
1059
+ f 351 360 365
1060
+ f 360 349 365
1061
+ f 337 360 366
1062
+ f 360 351 366
1063
+ f 364 337 366
1064
+ f 351 364 366
1065
+ f 355 346 367
1066
+ f 346 361 367
1067
+ f 348 363 367
1068
+ f 363 355 367
1069
+ f 340 359 368
1070
+ f 359 351 368
1071
+ f 365 340 368
1072
+ f 351 365 368
1073
+ f 337 355 369
1074
+ f 355 362 369
1075
+ f 362 357 369
1076
+ f 360 337 370
1077
+ f 357 360 370
1078
+ f 337 369 370
1079
+ f 369 357 370
1080
+ f 353 348 371
1081
+ f 361 353 371
1082
+ f 348 367 371
1083
+ f 367 361 371
1084
+ f 344 354 372
1085
+ f 354 349 372
1086
+ f 349 357 372
1087
+ o ShapeIndexedFaceSet.002_ShapeIndexedFaceSet.017
1088
+ v 0.000000 0.000000 0.000000
1089
+ v -0.053255 0.021335 0.001519
1090
+ v -0.018137 0.043286 0.027862
1091
+ v -0.018137 0.043286 0.016883
1092
+ v -0.018137 0.005966 0.025666
1093
+ v -0.057649 0.005966 0.027862
1094
+ v -0.018137 0.005966 0.001519
1095
+ v -0.046672 0.034504 0.027862
1096
+ v -0.026925 0.041091 -0.000677
1097
+ v -0.055452 0.005966 -0.000677
1098
+ v -0.018137 0.041091 -0.000677
1099
+ v -0.042283 0.034504 -0.000677
1100
+ v -0.035704 0.041091 0.023468
1101
+ v -0.057649 0.014748 0.027862
1102
+ v -0.018137 0.025722 -0.000677
1103
+ v -0.053255 0.025722 0.021272
1104
+ v -0.029117 0.043286 0.027862
1105
+ v -0.048865 0.027918 -0.000677
1106
+ v -0.040086 0.005966 -0.000677
1107
+ v -0.037893 0.038895 0.008106
1108
+ v -0.055452 0.016948 0.003718
1109
+ v -0.018137 0.036700 0.027862
1110
+ v -0.051062 0.005966 0.027862
1111
+ v -0.044476 0.034504 0.005911
1112
+ v -0.057649 0.008162 0.016883
1113
+ v -0.031314 0.041091 0.003718
1114
+ v -0.051062 0.027918 0.012500
1115
+ v -0.055452 0.021335 0.027862
1116
+ v -0.055452 0.012553 -0.000677
1117
+ v -0.040086 0.038895 0.021272
1118
+ v -0.026925 0.043286 0.021272
1119
+ v -0.040086 0.038895 0.027862
1120
+ v -0.053255 0.023530 0.008106
1121
+ v -0.055452 0.021335 0.023468
1122
+ v -0.035704 0.038895 0.001519
1123
+ usemtl Shape.016
1124
+ s off
1125
+ f 392 398 407
1126
+ f 376 375 377
1127
+ f 376 377 379
1128
+ f 377 378 379
1129
+ f 378 375 380
1130
+ f 379 378 382
1131
+ f 382 381 383
1132
+ f 376 379 383
1133
+ f 381 376 383
1134
+ f 381 382 384
1135
+ f 378 380 386
1136
+ f 382 383 387
1137
+ f 383 379 387
1138
+ f 375 376 389
1139
+ f 380 375 389
1140
+ f 384 382 390
1141
+ f 379 382 391
1142
+ f 387 379 391
1143
+ f 382 387 391
1144
+ f 377 375 394
1145
+ f 375 378 394
1146
+ f 394 378 395
1147
+ f 378 377 395
1148
+ f 377 394 395
1149
+ f 384 390 396
1150
+ f 382 378 397
1151
+ f 378 386 397
1152
+ f 386 393 397
1153
+ f 385 389 398
1154
+ f 392 385 398
1155
+ f 388 380 399
1156
+ f 380 396 399
1157
+ f 396 390 399
1158
+ f 386 380 400
1159
+ f 380 388 400
1160
+ f 374 390 401
1161
+ f 390 382 401
1162
+ f 393 374 401
1163
+ f 382 397 401
1164
+ f 397 393 401
1165
+ f 385 392 402
1166
+ f 396 380 402
1167
+ f 392 396 402
1168
+ f 376 381 403
1169
+ f 389 376 403
1170
+ f 381 398 403
1171
+ f 398 389 403
1172
+ f 380 389 404
1173
+ f 389 385 404
1174
+ f 402 380 404
1175
+ f 385 402 404
1176
+ f 390 374 405
1177
+ f 374 393 405
1178
+ f 388 399 405
1179
+ f 399 390 405
1180
+ f 393 386 406
1181
+ f 386 400 406
1182
+ f 400 388 406
1183
+ f 405 393 406
1184
+ f 388 405 406
1185
+ f 381 384 407
1186
+ f 384 396 407
1187
+ f 396 392 407
1188
+ f 398 381 407
1189
+ o ShapeIndexedFaceSet.001_ShapeIndexedFaceSet.016
1190
+ v 0.000000 0.000000 0.000000
1191
+ v 0.006010 -0.022571 0.023469
1192
+ v 0.016987 0.005966 0.041034
1193
+ v 0.012596 0.005966 0.041034
1194
+ v -0.004964 0.005966 -0.000677
1195
+ v -0.020333 -0.031353 0.041034
1196
+ v -0.020333 0.005966 0.025666
1197
+ v -0.020333 -0.029158 -0.000677
1198
+ v 0.014792 -0.002819 -0.000677
1199
+ v 0.012596 -0.015985 0.041034
1200
+ v -0.020333 0.005966 0.001520
1201
+ v -0.002765 -0.026962 0.001520
1202
+ v -0.007160 -0.031353 0.041034
1203
+ v 0.014792 0.005966 -0.000677
1204
+ v 0.010401 -0.013789 -0.000677
1205
+ v 0.016987 -0.007210 0.036641
1206
+ v -0.020333 -0.026962 0.041034
1207
+ v -0.015942 -0.031353 0.012503
1208
+ v 0.016987 0.005966 0.012503
1209
+ v 0.001619 -0.026962 0.041034
1210
+ v 0.010401 -0.015985 0.005913
1211
+ v -0.011551 -0.029158 -0.000677
1212
+ v 0.003814 -0.022571 0.001520
1213
+ v -0.020333 -0.013789 -0.000677
1214
+ v 0.014792 -0.007210 0.008106
1215
+ v -0.007160 -0.029158 0.005913
1216
+ v 0.012596 -0.015985 0.032247
1217
+ v 0.001619 -0.026962 0.034444
1218
+ v 0.016987 -0.000620 0.016888
1219
+ v -0.020333 -0.031353 0.012503
1220
+ v 0.016987 -0.007210 0.041034
1221
+ v -0.002765 -0.029158 0.030055
1222
+ v -0.000577 -0.024767 -0.000677
1223
+ v 0.012596 -0.011601 0.003717
1224
+ v -0.007160 -0.031353 0.036641
1225
+ v 0.008205 -0.020376 0.021273
1226
+ v 0.014792 -0.011601 0.030055
1227
+ v 0.008205 -0.018180 0.001520
1228
+ v 0.001619 -0.024767 0.005913
1229
+ usemtl Shape.015
1230
+ s off
1231
+ f 409 435 446
1232
+ f 411 410 412
1233
+ f 410 411 413
1234
+ f 411 412 414
1235
+ f 413 414 415
1236
+ f 415 412 416
1237
+ f 410 413 417
1238
+ f 414 412 418
1239
+ f 415 414 418
1240
+ f 417 413 420
1241
+ f 412 410 421
1242
+ f 416 412 421
1243
+ f 415 416 422
1244
+ f 413 411 424
1245
+ f 411 414 424
1246
+ f 414 413 424
1247
+ f 420 413 425
1248
+ f 421 410 426
1249
+ f 416 421 426
1250
+ f 410 423 426
1251
+ f 417 420 427
1252
+ f 415 422 429
1253
+ f 425 415 429
1254
+ f 412 415 431
1255
+ f 418 412 431
1256
+ f 415 418 431
1257
+ f 429 419 433
1258
+ f 425 429 433
1259
+ f 417 427 434
1260
+ f 434 427 435
1261
+ f 416 426 436
1262
+ f 426 423 436
1263
+ f 432 416 436
1264
+ f 423 432 436
1265
+ f 413 415 437
1266
+ f 425 413 437
1267
+ f 415 425 437
1268
+ f 410 417 438
1269
+ f 423 410 438
1270
+ f 427 420 439
1271
+ f 433 419 439
1272
+ f 419 435 439
1273
+ f 435 427 439
1274
+ f 419 429 440
1275
+ f 429 422 440
1276
+ f 430 419 440
1277
+ f 422 430 440
1278
+ f 422 416 441
1279
+ f 416 432 441
1280
+ f 434 428 441
1281
+ f 420 425 442
1282
+ f 425 433 442
1283
+ f 439 420 442
1284
+ f 433 439 442
1285
+ f 409 430 443
1286
+ f 428 434 443
1287
+ f 435 409 443
1288
+ f 434 435 443
1289
+ f 432 423 444
1290
+ f 417 434 444
1291
+ f 438 417 444
1292
+ f 423 438 444
1293
+ f 441 432 444
1294
+ f 434 441 444
1295
+ f 430 422 445
1296
+ f 422 441 445
1297
+ f 441 428 445
1298
+ f 443 430 445
1299
+ f 428 443 445
1300
+ f 430 409 446
1301
+ f 419 430 446
1302
+ f 435 419 446
1303
+ o ShapeIndexedFaceSet_ShapeIndexedFaceSet.015
1304
+ v 0.000000 0.000000 0.000000
1305
+ v -0.057652 -0.000620 0.021270
1306
+ v -0.022528 -0.031353 0.012498
1307
+ v -0.020333 -0.031353 0.012498
1308
+ v -0.020333 -0.031353 0.038838
1309
+ v -0.020333 0.005966 0.001520
1310
+ v -0.051066 -0.013789 -0.000677
1311
+ v -0.053261 0.005966 0.038838
1312
+ v -0.042284 -0.026962 0.038838
1313
+ v -0.020333 0.005966 0.025664
1314
+ v -0.055457 0.005966 -0.000677
1315
+ v -0.026919 -0.029158 -0.000677
1316
+ v -0.055457 -0.011601 0.038838
1317
+ v -0.037897 -0.026962 0.001520
1318
+ v -0.020333 -0.029158 -0.000677
1319
+ v -0.057652 0.005966 0.038838
1320
+ v -0.031314 -0.031353 0.030050
1321
+ v -0.020333 -0.026962 0.038838
1322
+ v -0.048870 -0.018180 0.001520
1323
+ v -0.055457 -0.005015 0.001520
1324
+ v -0.020333 -0.013789 -0.000677
1325
+ v -0.053261 -0.015985 0.036641
1326
+ v -0.040088 0.005966 -0.000677
1327
+ v -0.046671 -0.022571 0.023467
1328
+ v -0.057652 -0.005015 0.038838
1329
+ v -0.031314 -0.031353 0.038838
1330
+ v -0.033509 -0.029158 0.005911
1331
+ v -0.057652 0.005966 0.016892
1332
+ v -0.053261 -0.011601 0.005911
1333
+ v -0.037897 -0.029158 0.032247
1334
+ v -0.044476 -0.022571 0.001520
1335
+ v -0.040088 -0.024767 -0.000677
1336
+ v -0.057652 -0.005015 0.032247
1337
+ v -0.042284 -0.026962 0.034444
1338
+ v -0.055457 -0.011601 0.034444
1339
+ v -0.055457 -0.000620 -0.000677
1340
+ v -0.026919 -0.031353 0.016892
1341
+ v -0.031314 -0.029158 0.001520
1342
+ usemtl Shape.014
1343
+ s off
1344
+ f 449 483 484
1345
+ f 449 450 451
1346
+ f 451 450 452
1347
+ f 451 454 455
1348
+ f 451 452 456
1349
+ f 452 454 456
1350
+ f 454 452 457
1351
+ f 450 449 458
1352
+ f 453 457 458
1353
+ f 455 454 459
1354
+ f 452 450 461
1355
+ f 450 458 461
1356
+ f 458 457 461
1357
+ f 454 457 462
1358
+ f 459 454 462
1359
+ f 449 451 463
1360
+ f 454 451 464
1361
+ f 451 456 464
1362
+ f 456 454 464
1363
+ f 452 461 467
1364
+ f 461 457 467
1365
+ f 455 459 468
1366
+ f 457 452 469
1367
+ f 452 467 469
1368
+ f 467 457 469
1369
+ f 468 465 470
1370
+ f 462 448 471
1371
+ f 459 462 471
1372
+ f 451 455 472
1373
+ f 463 451 472
1374
+ f 448 462 474
1375
+ f 462 457 474
1376
+ f 466 448 474
1377
+ f 453 465 475
1378
+ f 466 453 475
1379
+ f 465 468 475
1380
+ f 472 455 476
1381
+ f 463 472 476
1382
+ f 460 473 476
1383
+ f 473 463 476
1384
+ f 470 465 477
1385
+ f 453 458 478
1386
+ f 465 453 478
1387
+ f 460 477 478
1388
+ f 477 465 478
1389
+ f 448 466 479
1390
+ f 471 448 479
1391
+ f 459 471 479
1392
+ f 455 468 480
1393
+ f 468 470 480
1394
+ f 476 455 480
1395
+ f 460 476 480
1396
+ f 477 460 480
1397
+ f 470 477 480
1398
+ f 468 459 481
1399
+ f 466 475 481
1400
+ f 475 468 481
1401
+ f 479 466 481
1402
+ f 459 479 481
1403
+ f 457 453 482
1404
+ f 453 466 482
1405
+ f 474 457 482
1406
+ f 466 474 482
1407
+ f 449 463 483
1408
+ f 463 473 483
1409
+ f 483 473 484
1410
+ f 458 449 484
1411
+ f 473 460 484
1412
+ f 478 458 484
1413
+ f 460 478 484
bowl/textured-0008192.obj ADDED
The diff for this file is too large to render. See raw diff
 
cfg.yaml ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ lmps:
3
+ tabletop_ui:
4
+ prompt_path: prompts/tabletop_ui.py
5
+ engine: text-davinci-003
6
+ max_tokens: 256
7
+ temperature: 0
8
+ query_prefix: '# '
9
+ query_suffix: '.'
10
+ stop: ['#', 'objects = [']
11
+ maintain_session: True
12
+ debug_mode: False
13
+ include_context: True
14
+ has_return: False
15
+ return_val_name: ret_val
16
+ parse_obj_name:
17
+ prompt_path: prompts/parse_obj_name.py
18
+ engine: text-davinci-003
19
+ max_tokens: 512
20
+ temperature: 0
21
+ query_prefix: '# '
22
+ query_suffix: '.'
23
+ stop: ['#', 'objects = [']
24
+ maintain_session: False
25
+ debug_mode: False
26
+ include_context: True
27
+ has_return: True
28
+ return_val_name: ret_val
29
+ parse_position:
30
+ prompt_path: prompts/parse_position.py
31
+ engine: text-davinci-003
32
+ max_tokens: 512
33
+ temperature: 0
34
+ query_prefix: '# '
35
+ query_suffix: '.'
36
+ stop: ['#']
37
+ maintain_session: False
38
+ debug_mode: False
39
+ include_context: True
40
+ has_return: True
41
+ return_val_name: ret_val
42
+ parse_question:
43
+ prompt_path: prompts/parse_question.py
44
+ engine: text-davinci-003
45
+ max_tokens: 512
46
+ temperature: 0
47
+ query_prefix: '# '
48
+ query_suffix: '.'
49
+ stop: ['#', 'objects = [']
50
+ maintain_session: False
51
+ debug_mode: False
52
+ include_context: True
53
+ has_return: True
54
+ return_val_name: ret_val
55
+ transform_shape_pts:
56
+ prompt_path: prompts/transform_shape_pts.py
57
+ engine: text-davinci-003
58
+ max_tokens: 512
59
+ temperature: 0
60
+ query_prefix: '# '
61
+ query_suffix: '.'
62
+ stop: ['#']
63
+ maintain_session: False
64
+ debug_mode: False
65
+ include_context: True
66
+ has_return: True
67
+ return_val_name: new_shape_pts
68
+ fgen:
69
+ prompt_path: prompts/fgen.py
70
+ engine: text-davinci-003
71
+ max_tokens: 512
72
+ temperature: 0
73
+ query_prefix: '# define function: '
74
+ query_suffix: '.'
75
+ stop: ['# define', '# example']
76
+ maintain_session: False
77
+ debug_mode: False
78
+ include_context: True
79
+
80
+ tabletop_coords:
81
+ top_left: [-0.25, -0.25]
82
+ top_side: [0, -0.25]
83
+ top_right: [0.25, -0.25]
84
+ left_side: [-0.25, -0.5]
85
+ middle: [0, -0.5]
86
+ right_side: [0.25, -0.5]
87
+ bottom_left: [-0.25, -0.75]
88
+ bottom_side: [0, -0.75]
89
+ bottom_right: [0.25, -0.75]
90
+ table_z: 0
consts.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+ # # Global constants: pick and place objects, colors, workspace bounds
4
+ COLORS = {
5
+ 'blue': (78/255, 121/255, 167/255, 255/255),
6
+ 'red': (255/255, 87/255, 89/255, 255/255),
7
+ 'green': (89/255, 169/255, 79/255, 255/255),
8
+ 'orange': (242/255, 142/255, 43/255, 255/255),
9
+ 'yellow': (237/255, 201/255, 72/255, 255/255),
10
+ 'purple': (176/255, 122/255, 161/255, 255/255),
11
+ 'pink': (255/255, 157/255, 167/255, 255/255),
12
+ 'cyan': (118/255, 183/255, 178/255, 255/255),
13
+ 'brown': (156/255, 117/255, 95/255, 255/255),
14
+ 'gray': (186/255, 176/255, 172/255, 255/255),
15
+ }
16
+
17
+ CORNER_POS = {
18
+ 'top left corner': (-0.3 + 0.05, -0.2 - 0.05, 0),
19
+ 'top side': (0, -0.2 - 0.05, 0),
20
+ 'top right corner': (0.3 - 0.05, -0.2 - 0.05, 0),
21
+ 'left side': (-0.3 + 0.05, -0.5, 0),
22
+ 'middle': (0, -0.5, 0),
23
+ 'right side': (0.3 - 0.05, -0.5, 0),
24
+ 'bottom left corner': (-0.3 + 0.05, -0.8 + 0.05, 0),
25
+ 'bottom side': (0, -0.8 + 0.05, 0),
26
+ 'bottom right corner': (0.3 - 0.05, -0.8 + 0.05, 0),
27
+ }
28
+
29
+ ALL_BLOCKS = ['blue block', 'red block', 'green block', 'orange block', 'yellow block', 'purple block', 'pink block', 'cyan block', 'brown block', 'gray block']
30
+ ALL_BOWLS = ['blue bowl', 'red bowl', 'green bowl', 'orange bowl', 'yellow bowl', 'purple bowl', 'pink bowl', 'cyan bowl', 'brown bowl', 'gray bowl']
31
+
32
+ PIXEL_SIZE = 0.00267857
33
+ BOUNDS = np.float32([[-0.3, 0.3], [-0.8, -0.2], [0, 0.15]]) # X Y Z
lmp.py ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from time import sleep
2
+ import ast
3
+ import astunparse
4
+ import openai
5
+ from openai.error import RateLimitError, APIConnectionError
6
+ from pygments import highlight
7
+ from pygments.lexers import PythonLexer
8
+ from pygments.formatters import TerminalFormatter
9
+
10
+
11
+ class LMP:
12
+
13
+ def __init__(self, name, cfg, lmp_fgen, fixed_vars, variable_vars, md_logger):
14
+ self._name = name
15
+ self._cfg = cfg
16
+ self._md_logger = md_logger
17
+
18
+ with open(self._cfg['prompt_path'], 'r') as f:
19
+ self._base_prompt = f.read()
20
+
21
+ self._stop_tokens = list(self._cfg['stop'])
22
+
23
+ self._lmp_fgen = lmp_fgen
24
+
25
+ self._fixed_vars = fixed_vars
26
+ self._variable_vars = variable_vars
27
+ self.exec_hist = ''
28
+
29
+ def clear_exec_hist(self):
30
+ self.exec_hist = ''
31
+
32
+ def build_prompt(self, query, context=''):
33
+ if len(self._variable_vars) > 0:
34
+ variable_vars_imports_str = f"from utils import {', '.join(self._variable_vars.keys())}"
35
+ else:
36
+ variable_vars_imports_str = ''
37
+ prompt = self._base_prompt.replace('{variable_vars_imports}', variable_vars_imports_str)
38
+
39
+ if self._cfg['maintain_session']:
40
+ prompt += f'\n{self.exec_hist}'
41
+
42
+ if context != '':
43
+ prompt += f'\n{context}'
44
+
45
+ use_query = f'{self._cfg["query_prefix"]}{query}{self._cfg["query_suffix"]}'
46
+ prompt += f'\n{use_query}'
47
+
48
+ return prompt, use_query
49
+
50
+ def __call__(self, query, context='', **kwargs):
51
+ prompt, use_query = self.build_prompt(query, context=context)
52
+
53
+ while True:
54
+ try:
55
+ code_str = openai.Completion.create(
56
+ prompt=prompt,
57
+ stop=self._stop_tokens,
58
+ temperature=self._cfg['temperature'],
59
+ engine=self._cfg['engine'],
60
+ max_tokens=self._cfg['max_tokens']
61
+ )['choices'][0]['text'].strip()
62
+ break
63
+ except (RateLimitError, APIConnectionError) as e:
64
+ print(f'OpenAI API got err {e}')
65
+ print('Retrying after 10s.')
66
+ sleep(10)
67
+
68
+ if self._cfg['include_context'] and context != '':
69
+ to_exec = f'{context}\n{code_str}'
70
+ to_log = f'{context}\n{use_query}\n{code_str}'
71
+ else:
72
+ to_exec = code_str
73
+ to_log = f'{use_query}\n{to_exec}'
74
+
75
+ to_log_pretty = highlight(to_log, PythonLexer(), TerminalFormatter())
76
+ print(f'LMP {self._name} generated code:\n{to_log_pretty}')
77
+ self._md_logger.log_text(f'LMP {self._name} Generated Code:')
78
+ self._md_logger.log_code(to_log)
79
+
80
+ new_fs = self._lmp_fgen.create_new_fs_from_code(code_str)
81
+ self._variable_vars.update(new_fs)
82
+
83
+ gvars = merge_dicts([self._fixed_vars, self._variable_vars])
84
+ lvars = kwargs
85
+
86
+ if not self._cfg['debug_mode']:
87
+ exec_safe(to_exec, gvars, lvars)
88
+
89
+ self.exec_hist += f'\n{to_exec}'
90
+
91
+ if self._cfg['maintain_session']:
92
+ self._variable_vars.update(lvars)
93
+
94
+ if self._cfg['has_return']:
95
+ return lvars[self._cfg['return_val_name']]
96
+
97
+
98
+ class LMPFGen:
99
+
100
+ def __init__(self, cfg, fixed_vars, variable_vars, md_logger):
101
+ self._cfg = cfg
102
+
103
+ self._stop_tokens = list(self._cfg['stop'])
104
+ self._fixed_vars = fixed_vars
105
+ self._variable_vars = variable_vars
106
+ self._md_logger = md_logger
107
+
108
+ with open(self._cfg['prompt_path'], 'r') as f:
109
+ self._base_prompt = f.read()
110
+
111
+ def create_f_from_sig(self, f_name, f_sig, other_vars=None, fix_bugs=False, return_src=False):
112
+ print(f'Creating function: {f_sig}')
113
+
114
+ use_query = f'{self._cfg["query_prefix"]}{f_sig}{self._cfg["query_suffix"]}'
115
+ prompt = f'{self._base_prompt}\n{use_query}'
116
+
117
+ while True:
118
+ try:
119
+ f_src = openai.Completion.create(
120
+ prompt=prompt,
121
+ stop=self._stop_tokens,
122
+ temperature=self._cfg['temperature'],
123
+ engine=self._cfg['engine'],
124
+ max_tokens=self._cfg['max_tokens']
125
+ )['choices'][0]['text'].strip()
126
+ break
127
+ except (RateLimitError, APIConnectionError) as e:
128
+ print(f'OpenAI API got err {e}')
129
+ print('Retrying after 10s.')
130
+ sleep(10)
131
+
132
+ if fix_bugs:
133
+ f_src = openai.Edit.create(
134
+ model='code-davinci-edit-001',
135
+ input='# ' + f_src,
136
+ temperature=0,
137
+ instruction='Fix the bug if there is one. Improve readability. Keep same inputs and outputs. Only small changes. No comments.',
138
+ )['choices'][0]['text'].strip()
139
+
140
+ if other_vars is None:
141
+ other_vars = {}
142
+ gvars = merge_dicts([self._fixed_vars, self._variable_vars, other_vars])
143
+ lvars = {}
144
+
145
+ exec_safe(f_src, gvars, lvars)
146
+
147
+ f = lvars[f_name]
148
+
149
+ to_print = f'{use_query}\n{f_src}'
150
+ to_print_pretty = highlight(to_print, PythonLexer(), TerminalFormatter())
151
+ print(f'LMPFGen generated code:\n{to_print_pretty}')
152
+ self._md_logger.log_text('Generated Function:')
153
+ self._md_logger.log_code(to_print)
154
+
155
+ if return_src:
156
+ return f, f_src
157
+ return f
158
+
159
+ def create_new_fs_from_code(self, code_str, other_vars=None, fix_bugs=False, return_src=False):
160
+ fs, f_assigns = {}, {}
161
+ f_parser = FunctionParser(fs, f_assigns)
162
+ f_parser.visit(ast.parse(code_str))
163
+ for f_name, f_assign in f_assigns.items():
164
+ if f_name in fs:
165
+ fs[f_name] = f_assign
166
+
167
+ if other_vars is None:
168
+ other_vars = {}
169
+
170
+ new_fs = {}
171
+ srcs = {}
172
+ for f_name, f_sig in fs.items():
173
+ all_vars = merge_dicts([self._fixed_vars, self._variable_vars, new_fs, other_vars])
174
+ if not var_exists(f_name, all_vars):
175
+ f, f_src = self.create_f_from_sig(f_name, f_sig, new_fs, fix_bugs=fix_bugs, return_src=True)
176
+
177
+ # recursively define child_fs in the function body if needed
178
+ f_def_body = astunparse.unparse(ast.parse(f_src).body[0].body)
179
+ child_fs, child_f_srcs = self.create_new_fs_from_code(
180
+ f_def_body, other_vars=all_vars, fix_bugs=fix_bugs, return_src=True
181
+ )
182
+
183
+ if len(child_fs) > 0:
184
+ new_fs.update(child_fs)
185
+ srcs.update(child_f_srcs)
186
+
187
+ # redefine parent f so newly created child_fs are in scope
188
+ gvars = merge_dicts([self._fixed_vars, self._variable_vars, new_fs, other_vars])
189
+ lvars = {}
190
+
191
+ exec_safe(f_src, gvars, lvars)
192
+
193
+ f = lvars[f_name]
194
+
195
+ new_fs[f_name], srcs[f_name] = f, f_src
196
+
197
+ if return_src:
198
+ return new_fs, srcs
199
+ return new_fs
200
+
201
+
202
+ class FunctionParser(ast.NodeTransformer):
203
+
204
+ def __init__(self, fs, f_assigns):
205
+ super().__init__()
206
+ self._fs = fs
207
+ self._f_assigns = f_assigns
208
+
209
+ def visit_Call(self, node):
210
+ self.generic_visit(node)
211
+ if isinstance(node.func, ast.Name):
212
+ f_sig = astunparse.unparse(node).strip()
213
+ f_name = astunparse.unparse(node.func).strip()
214
+ self._fs[f_name] = f_sig
215
+ return node
216
+
217
+ def visit_Assign(self, node):
218
+ self.generic_visit(node)
219
+ if isinstance(node.value, ast.Call):
220
+ assign_str = astunparse.unparse(node).strip()
221
+ f_name = astunparse.unparse(node.value.func).strip()
222
+ self._f_assigns[f_name] = assign_str
223
+ return node
224
+
225
+
226
+ def var_exists(name, all_vars):
227
+ try:
228
+ eval(name, all_vars)
229
+ except:
230
+ exists = False
231
+ else:
232
+ exists = True
233
+ return exists
234
+
235
+
236
+ def merge_dicts(dicts):
237
+ return {
238
+ k : v
239
+ for d in dicts
240
+ for k, v in d.items()
241
+ }
242
+
243
+
244
+ def exec_safe(code_str, gvars=None, lvars=None):
245
+ banned_phrases = ['import', '__']
246
+ for phrase in banned_phrases:
247
+ assert phrase not in code_str
248
+
249
+ if gvars is None:
250
+ gvars = {}
251
+ if lvars is None:
252
+ lvars = {}
253
+ empty_fn = lambda *args, **kwargs: None
254
+ custom_gvars = merge_dicts([
255
+ gvars,
256
+ {'exec': empty_fn, 'eval': empty_fn}
257
+ ])
258
+ exec(code_str, custom_gvars, lvars)
md_logger.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class MarkdownLogger:
2
+
3
+ def __init__(self):
4
+ self._log = ''
5
+
6
+ def log_text(self, text):
7
+ self._log += '\n' + text + '\n'
8
+
9
+ def log_code(self, code):
10
+ self._log += f'\n```python\n{code}\n```\n'
11
+
12
+ def clear(self):
13
+ self._log = ''
14
+
15
+ def get_log(self):
16
+ return self._log
prompts/fgen.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ from shapely.geometry import *
3
+ from shapely.affinity import *
4
+
5
+ from env_utils import get_obj_pos, get_obj_names
6
+ from ctrl_utils import put_first_on_second
7
+
8
+ # define function: total = get_total(xs=numbers).
9
+ def get_total(xs):
10
+ return np.sum(xs)
11
+
12
+ # define function: y = eval_line(x, slope, y_intercept=0).
13
+ def eval_line(x, slope, y_intercept):
14
+ return x * slope + y_intercept
15
+
16
+ # define function: pt = get_pt_to_the_left(pt, dist).
17
+ def get_pt_to_the_left(pt, dist):
18
+ return pt + [-dist, 0]
19
+
20
+ # define function: pt = get_pt_to_the_top(pt, dist).
21
+ def get_pt_to_the_top(pt, dist):
22
+ return pt + [0, dist]
23
+
24
+ # define function line = make_line_by_length(length=x).
25
+ def make_line_by_length(length):
26
+ line = LineString([[0, 0], [length, 0]])
27
+ return line
28
+
29
+ # define function: line = make_vertical_line_by_length(length=x).
30
+ def make_vertical_line_by_length(length):
31
+ line = make_line_by_length(length)
32
+ vertical_line = rotate(line, 90)
33
+ return vertical_line
34
+
35
+ # define function: pt = interpolate_line(line, t=0.5).
36
+ def interpolate_line(line, t):
37
+ pt = line.interpolate(t, normalized=True)
38
+ return np.array(pt.coords[0])
39
+
40
+ # example: scale a line by 2.
41
+ line = make_line_by_length(1)
42
+ new_shape = scale(line, xfact=2, yfact=2)
43
+
44
+ # example: put object1 on top of object0.
45
+ put_first_on_second('object1', 'object0')
46
+
47
+ # example: get the position of the first object.
48
+ obj_names = get_obj_names()
49
+ pos_2d = get_obj_pos(obj_names[0])
prompts/parse_obj_name.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ from env_utils import get_obj_pos, parse_position
3
+ from utils import get_obj_positions_np
4
+
5
+ objects = ['blue block', 'cyan block', 'purple bowl', 'gray bowl', 'brown bowl', 'pink block', 'purple block']
6
+ # the block closest to the purple bowl.
7
+ block_names = ['blue block', 'cyan block', 'purple block']
8
+ closest_block_idx = get_closest_idx(points=get_obj_positions_np(block_names), point=get_obj_pos('purple bowl'))
9
+ closest_block_name = block_names[closest_block_idx]
10
+ ret_val = closest_block_name
11
+ objects = ['brown bowl', 'banana', 'brown block', 'apple', 'blue bowl', 'blue block']
12
+ # the blocks.
13
+ ret_val = ['brown block', 'blue block']
14
+ objects = ['brown bowl', 'banana', 'brown block', 'apple', 'blue bowl', 'blue block']
15
+ # the brown objects.
16
+ ret_val = ['brown bowl', 'brown block']
17
+ objects = ['brown bowl', 'banana', 'brown block', 'apple', 'blue bowl', 'blue block']
18
+ # a fruit that's not the apple
19
+ fruit_names = ['banana', 'apple']
20
+ for fruit_name in fruit_names:
21
+ if fruit_name != 'apple':
22
+ ret_val = fruit_name
23
+ objects = ['blue block', 'cyan block', 'purple bowl', 'brown bowl', 'purple block']
24
+ # blocks above the brown bowl.
25
+ block_names = ['blue block', 'cyan block', 'purple block']
26
+ brown_bowl_pos = get_obj_pos('brown bowl')
27
+ use_block_names = []
28
+ for block_name in block_names:
29
+ if get_obj_pos(block_name)[1] > brown_bowl_pos[1]:
30
+ use_block_names.append(block_name)
31
+ ret_val = use_block_names
32
+ objects = ['blue block', 'cyan block', 'purple bowl', 'brown bowl', 'purple block']
33
+ # the blue block.
34
+ ret_val = 'blue block'
35
+ objects = ['blue block', 'cyan block', 'purple bowl', 'brown bowl', 'purple block']
36
+ # the block closest to the bottom right corner.
37
+ corner_pos = parse_position('bottom right corner')
38
+ block_names = ['blue block', 'cyan block', 'purple block']
39
+ closest_block_idx = get_closest_idx(points=get_obj_positions_np(block_names), point=corner_pos)
40
+ closest_block_name = block_names[closest_block_idx]
41
+ ret_val = closest_block_name
42
+ objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block']
43
+ # the left most block.
44
+ block_names = ['green block', 'brown block', 'blue block']
45
+ left_block_idx = np.argsort(get_obj_positions_np(block_names)[:, 0])[0]
46
+ left_block_name = block_names[left_block_idx]
47
+ ret_val = left_block_name
48
+ objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block']
49
+ # the bowl on near the top.
50
+ bowl_names = ['brown bowl', 'green bowl', 'blue bowl']
51
+ top_bowl_idx = np.argsort(get_obj_positions_np(bowl_names)[:, 1])[-1]
52
+ top_bowl_name = bowl_names[top_bowl_idx]
53
+ ret_val = top_bowl_name
54
+ objects = ['yellow bowl', 'purple block', 'yellow block', 'purple bowl', 'pink bowl', 'pink block']
55
+ # the third bowl from the right.
56
+ bowl_names = ['yellow bowl', 'purple bowl', 'pink bowl']
57
+ bowl_idx = np.argsort(get_obj_positions_np(bowl_names)[:, 0])[-3]
58
+ bowl_name = bowl_names[bowl_idx]
59
+ ret_val = bowl_name
prompts/parse_position.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ from shapely.geometry import *
3
+ from shapely.affinity import *
4
+ from env_utils import denormalize_xy, parse_obj_name, get_obj_names, get_obj_pos
5
+
6
+ # a 30cm horizontal line in the middle with 3 points.
7
+ middle_pos = denormalize_xy([0.5, 0.5])
8
+ start_pos = middle_pos + [-0.3/2, 0]
9
+ end_pos = middle_pos + [0.3/2, 0]
10
+ line = make_line(start=start_pos, end=end_pos)
11
+ points = interpolate_pts_on_line(line=line, n=3)
12
+ ret_val = points
13
+ # a 20cm vertical line near the right with 4 points.
14
+ middle_pos = denormalize_xy([1, 0.5])
15
+ start_pos = middle_pos + [0, -0.2/2]
16
+ end_pos = middle_pos + [0, 0.2/2]
17
+ line = make_line(start=start_pos, end=end_pos)
18
+ points = interpolate_pts_on_line(line=line, n=4)
19
+ ret_val = points
20
+ # a diagonal line from the top left to the bottom right corner with 5 points.
21
+ top_left_corner = denormalize_xy([0, 1])
22
+ bottom_right_corner = denormalize_xy([1, 0])
23
+ line = make_line(start=top_left_corner, end=bottom_right_corner)
24
+ points = interpolate_pts_on_line(line=line, n=5)
25
+ ret_val = points
26
+ # a triangle with size 10cm with 3 points.
27
+ polygon = make_triangle(size=0.1, center=denormalize_xy([0.5, 0.5]))
28
+ points = get_points_from_polygon(polygon)
29
+ ret_val = points
30
+ # the corner closest to the sun colored block.
31
+ block_name = parse_obj_name('the sun colored block', f'objects = {get_obj_names()}')
32
+ corner_positions = np.array([denormalize_xy(pos) for pos in [[0, 0], [0, 1], [1, 1], [1, 0]]])
33
+ closest_corner_pos = get_closest_point(points=corner_positions, point=get_obj_pos(block_name))
34
+ ret_val = closest_corner_pos
35
+ # the side farthest from the right most bowl.
36
+ bowl_name = parse_obj_name('the right most bowl', f'objects = {get_obj_names()}')
37
+ side_positions = np.array([denormalize_xy(pos) for pos in [[0.5, 0], [0.5, 1], [1, 0.5], [0, 0.5]]])
38
+ farthest_side_pos = get_farthest_point(points=side_positions, point=get_obj_pos(bowl_name))
39
+ ret_val = farthest_side_pos
40
+ # a point above the third block from the bottom.
41
+ block_name = parse_obj_name('the third block from the bottom', f'objects = {get_obj_names()}')
42
+ ret_val = get_obj_pos(block_name) + [0.1, 0]
43
+ # a point 10cm left of the bowls.
44
+ bowl_names = parse_obj_name('the bowls', f'objects = {get_obj_names()}')
45
+ bowl_positions = get_all_object_positions_np(obj_names=bowl_names)
46
+ left_obj_pos = bowl_positions[np.argmin(bowl_positions[:, 0])] + [-0.1, 0]
47
+ ret_val = left_obj_pos
48
+ # the bottom side.
49
+ bottom_pos = denormalize_xy([0.5, 0])
50
+ ret_val = bottom_pos
51
+ # the top corners.
52
+ top_left_pos = denormalize_xy([0, 1])
53
+ top_right_pos = denormalize_xy([1, 1])
54
+ ret_val = [top_left_pos, top_right_pos]
prompts/parse_question.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from utils import get_obj_pos, get_obj_names, parse_obj_name, bbox_contains_pt, is_obj_visible
2
+
3
+ objects = ['yellow bowl', 'blue block', 'yellow block', 'blue bowl', 'fruit', 'green block', 'black bowl']
4
+ # is the blue block to the right of the yellow bowl?
5
+ ret_val = get_obj_pos('blue block')[0] > get_obj_pos('yellow bowl')[0]
6
+ objects = ['yellow bowl', 'blue block', 'yellow block', 'blue bowl', 'fruit', 'green block', 'black bowl']
7
+ # how many yellow objects are there?
8
+ yellow_object_names = parse_obj_name('the yellow objects', f'objects = {get_obj_names()}')
9
+ ret_val = len(yellow_object_names)
10
+ objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl']
11
+ # what are the blocks left of the green bowl?
12
+ block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}')
13
+ green_bowl_pos = get_obj_pos('green bowl')
14
+ left_block_names = []
15
+ for block_name in block_names:
16
+ if get_obj_pos(block_name)[0] < green_bowl_pos[0]:
17
+ left_block_names.append(block_name)
18
+ ret_val = left_block_names
19
+ objects = ['pink block', 'yellow block', 'pink bowl', 'blue block', 'blue bowl', 'yellow bowl']
20
+ # is the sun colored block above the blue bowl?
21
+ sun_block_name = parse_obj_name('sun colored block', f'objects = {get_obj_names()}')
22
+ sun_block_pos = get_obj_pos(sun_block_name)
23
+ blue_bowl_pos = get_obj_pos('blue bowl')
24
+ ret_val = sun_block_pos[1] > blue_bowl_pos[1]
25
+ objects = ['pink block', 'yellow block', 'pink bowl', 'blue block', 'blue bowl', 'yellow bowl']
26
+ # is the green block below the blue bowl?
27
+ ret_val = get_obj_pos('green block')[1] < get_obj_pos('blue bowl')[1]
prompts/tabletop_ui.py ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python 2D robot control script
2
+ import numpy as np
3
+ from env_utils import put_first_on_second, get_obj_pos, get_obj_names, say, get_corner_name, get_side_name, is_obj_visible, stack_objects_in_order
4
+ from plan_utils import parse_obj_name, parse_position, parse_question, transform_shape_pts
5
+
6
+ objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl']
7
+ # place the yellow block on the yellow bowl.
8
+ say('Ok - putting the yellow block on the yellow bowl')
9
+ put_first_on_second('yellow block', 'yellow bowl')
10
+ objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl']
11
+ # which block did you move.
12
+ say('I moved the yellow block')
13
+ objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl']
14
+ # move the green block to the top right corner.
15
+ say('Got it - putting the green block on the top right corner')
16
+ corner_pos = parse_position('top right corner')
17
+ put_first_on_second('green block', corner_pos)
18
+ objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl']
19
+ # stack the blue bowl on the yellow bowl on the green block.
20
+ order_bottom_to_top = ['green block', 'yellow block', 'blue bowl']
21
+ say(f'Sure - stacking from top to bottom: {", ".join(order_bottom_to_top)}')
22
+ stack_objects_in_order(object_names=order_bottom_to_top)
23
+ objects = ['cyan block', 'white block', 'cyan bowl', 'blue block', 'blue bowl', 'white bowl']
24
+ # move the cyan block into its corresponding bowl.
25
+ matches = {'cyan block': 'cyan bowl'}
26
+ say('Got it - placing the cyan block on the cyan bowl')
27
+ for first, second in matches.items():
28
+ put_first_on_second(first, get_obj_pos(second))
29
+ objects = ['cyan block', 'white block', 'cyan bowl', 'blue block', 'blue bowl', 'white bowl']
30
+ # make a line of blocks on the right side.
31
+ say('No problem! Making a line of blocks on the right side')
32
+ block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}')
33
+ line_pts = parse_position(f'a 30cm vertical line on the right with {len(block_names)} points')
34
+ for block_name, pt in zip(block_names, line_pts):
35
+ put_first_on_second(block_name, pt)
36
+ objects = ['yellow block', 'red block', 'yellow bowl', 'gray block', 'gray bowl', 'red bowl']
37
+ # put the small banana colored thing in between the blue bowl and green block.
38
+ say('Sure thing - putting the yellow block between the blue bowl and the green block')
39
+ target_pos = parse_position('a point in the middle betweeen the blue bowl and the green block')
40
+ put_first_on_second('yellow block', target_pos)
41
+ objects = ['yellow block', 'red block', 'yellow bowl', 'gray block', 'gray bowl', 'red bowl']
42
+ # can you cut the bowls in half.
43
+ say('no, I can only move objects around')
44
+ objects = ['yellow block', 'green block', 'yellow bowl', 'gray block', 'gray bowl', 'green bowl']
45
+ # stack the blocks on the right side with the gray one on the bottom.
46
+ say('Ok. stacking the blocks on the right side with the gray block on the bottom')
47
+ right_side = parse_position('the right side')
48
+ put_first_on_second('gray block', right_side)
49
+ order_bottom_to_top = ['gray block', 'green block', 'yellow block']
50
+ stack_objects_in_order(object_names=order_bottom_to_top)
51
+ objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl']
52
+ # hide the blue bowl.
53
+ bowl_name = np.random.choice(['yellow bowl', 'green bowl'])
54
+ say(f'Sounds good! Hiding the blue bowl under the {bowl_name}')
55
+ put_first_on_second(bowl_name, 'blue bowl')
56
+ objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl']
57
+ # move the grass-colored bowl to the left.
58
+ say('Sure - moving the green bowl left by 10 centimeters')
59
+ left_pos = parse_position('a point 10cm left of the green bowl')
60
+ put_first_on_second('green bowl', left_pos)
61
+ objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl']
62
+ # why did you move the red bowl.
63
+ say(f'I did not move the red bowl')
64
+ objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl']
65
+ # undo that.
66
+ say('Sure - moving the green bowl right by 10 centimeters')
67
+ left_pos = parse_position('a point 10cm right of the green bowl')
68
+ put_first_on_second('green bowl', left_pos)
69
+ objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block']
70
+ # place the top most block to the corner closest to the bottom most block.
71
+ top_block_name = parse_obj_name('top most block', f'objects = {get_obj_names()}')
72
+ bottom_block_name = parse_obj_name('bottom most block', f'objects = {get_obj_names()}')
73
+ closest_corner_pos = parse_position(f'the corner closest to the {bottom_block_name}', f'objects = {get_obj_names()}')
74
+ say(f'Putting the {top_block_name} on the {get_corner_name(closest_corner_pos)}')
75
+ put_first_on_second(top_block_name, closest_corner_pos)
76
+ objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block']
77
+ # move the brown bowl to the side closest to the green block.
78
+ closest_side_position = parse_position('the side closest to the green block')
79
+ say(f'Got it - putting the brown bowl on the {get_side_name(closest_side_position)}')
80
+ put_first_on_second('brown bowl', closest_side_position)
81
+ objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block']
82
+ # place the green block to the right of the bowl that has the blue block.
83
+ bowl_name = parse_obj_name('the bowl that has the blue block', f'objects = {get_obj_names()}')
84
+ if bowl_name:
85
+ target_pos = parse_position(f'a point 10cm to the right of the {bowl_name}')
86
+ say(f'No problem - placing the green block to the right of the {bowl_name}')
87
+ put_first_on_second('green block', target_pos)
88
+ else:
89
+ say('There are no bowls that has the blue block')
90
+ objects = ['brown bowl', 'green block', 'brown block', 'green bowl', 'blue bowl', 'blue block']
91
+ # move the other blocks to the bottom corners.
92
+ block_names = parse_obj_name('blocks other than the blue block', f'objects = {get_obj_names()}')
93
+ corners = parse_position('the bottom corners')
94
+ for block_name, pos in zip(block_names, corners):
95
+ put_first_on_second(block_name, pos)
96
+ objects = ['pink block', 'gray block', 'orange block']
97
+ # move the pinkish colored block on the bottom side.
98
+ say('Ok - putting the pink block on the bottom side')
99
+ bottom_side_pos = parse_position('the bottom side')
100
+ put_first_on_second('pink block', bottom_side_pos)
101
+ objects = ['yellow bowl', 'blue block', 'yellow block', 'blue bowl']
102
+ # is the blue block to the right of the yellow bowl?
103
+ if parse_question('is the blue block to the right of the yellow bowl?', f'objects = {get_obj_names()}'):
104
+ say('yes, there is a blue block to the right of the yellow bow')
105
+ else:
106
+ say('no, there is\'t a blue block to the right of the yellow bow')
107
+ objects = ['yellow bowl', 'blue block', 'yellow block', 'blue bowl']
108
+ # how many yellow objects are there?
109
+ n_yellow_objs = parse_question('how many yellow objects are there', f'objects = {get_obj_names()}')
110
+ say(f'there are {n_yellow_objs} yellow object')
111
+ objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl']
112
+ # move the left most block to the green bowl.
113
+ left_block_name = parse_obj_name('left most block', f'objects = {get_obj_names()}')
114
+ say(f'Moving the {left_block_name} on the green bowl')
115
+ put_first_on_second(left_block_name, 'green bowl')
116
+ objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl']
117
+ # move the other blocks to different corners.
118
+ block_names = parse_obj_name(f'blocks other than the {left_block_name}', f'objects = {get_obj_names()}')
119
+ corners = parse_position('the corners')
120
+ say(f'Ok - moving the other {len(block_names)} blocks to different corners')
121
+ for block_name, pos in zip(block_names, corners):
122
+ put_first_on_second(block_name, pos)
123
+ objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl']
124
+ # is the pink block on the green bowl.
125
+ if parse_question('is the pink block on the green bowl', f'objects = {get_obj_names()}'):
126
+ say('Yes - the pink block is on the green bowl.')
127
+ else:
128
+ say('No - the pink block is not on the green bowl.')
129
+ objects = ['pink block', 'green block', 'pink bowl', 'blue block', 'blue bowl', 'green bowl']
130
+ # what are the blocks left of the green bowl.
131
+ left_block_names = parse_question('what are the blocks left of the green bowl', f'objects = {get_obj_names()}')
132
+ if len(left_block_names) > 0:
133
+ say(f'These blocks are left of the green bowl: {", ".join(left_block_names)}')
134
+ else:
135
+ say('There are no blocks left of the green bowl')
136
+ objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl']
137
+ # imagine that the bowls are different biomes on earth and imagine that the blocks are parts of a building.
138
+ say('ok')
139
+ objects = ['yellow block', 'green block', 'yellow bowl', 'blue block', 'blue bowl', 'green bowl']
140
+ # now build a tower in the grasslands.
141
+ order_bottom_to_top = ['green bowl', 'blue block', 'green block', 'yellow block']
142
+ say('stacking the blocks on the green bowl')
143
+ stack_objects_in_order(object_names=order_bottom_to_top)
144
+ objects = ['yellow block', 'green block', 'yellow bowl', 'gray block', 'gray bowl', 'green bowl']
145
+ # show me what happens when the desert gets flooded by the ocean.
146
+ say('putting the yellow bowl on the blue bowl')
147
+ put_first_on_second('yellow bowl', 'blue bowl')
148
+ objects = ['pink block', 'gray block', 'orange block']
149
+ # move all blocks 5cm toward the top.
150
+ say('Ok - moving all blocks 5cm toward the top')
151
+ block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}')
152
+ for block_name in block_names:
153
+ target_pos = parse_position(f'a point 5cm above the {block_name}')
154
+ put_first_on_second(block_name, target_pos)
155
+ objects = ['cyan block', 'white block', 'purple bowl', 'blue block', 'blue bowl', 'white bowl']
156
+ # make a triangle of blocks in the middle.
157
+ block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}')
158
+ triangle_pts = parse_position(f'a triangle with size 10cm around the middle with {len(block_names)} points')
159
+ say('Making a triangle of blocks around the middle of the workspace')
160
+ for block_name, pt in zip(block_names, triangle_pts):
161
+ put_first_on_second(block_name, pt)
162
+ objects = ['cyan block', 'white block', 'purple bowl', 'blue block', 'blue bowl', 'white bowl']
163
+ # make the triangle smaller.
164
+ triangle_pts = transform_shape_pts('scale it by 0.5x', shape_pts=triangle_pts)
165
+ say('Making the triangle smaller')
166
+ block_names = parse_obj_name('the blocks', f'objects = {get_obj_names()}')
167
+ for block_name, pt in zip(block_names, triangle_pts):
168
+ put_first_on_second(block_name, pt)
169
+ objects = ['brown bowl', 'red block', 'brown block', 'red bowl', 'pink bowl', 'pink block']
170
+ # put the red block on the farthest bowl.
171
+ farthest_bowl_name = parse_obj_name('the bowl farthest from the red block', f'objects = {get_obj_names()}')
172
+ say(f'Putting the red block on the {farthest_bowl_name}')
173
+ put_first_on_second('red block', farthest_bowl_name)
prompts/transform_shape_pts.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ from utils import get_obj_pos, get_obj_names, parse_position, parse_obj_name
3
+
4
+ # make it bigger by 1.5.
5
+ new_shape_pts = scale_pts_around_centroid_np(shape_pts, scale_x=1.5, scale_y=1.5)
6
+ # move it to the right by 10cm.
7
+ new_shape_pts = translate_pts_np(shape_pts, delta=[0.1, 0])
8
+ # move it to the top by 20cm.
9
+ new_shape_pts = translate_pts_np(shape_pts, delta=[0, 0.2])
10
+ # rotate it clockwise by 40 degrees.
11
+ new_shape_pts = rotate_pts_around_centroid_np(shape_pts, angle=-np.deg2rad(40))
12
+ # rotate by 30 degrees and make it slightly smaller
13
+ new_shape_pts = rotate_pts_around_centroid_np(shape_pts, angle=np.deg2rad(30))
14
+ new_shape_pts = scale_pts_around_centroid_np(new_shape_pts, scale_x=0.7, scale_y=0.7)
15
+ # move it toward the blue block.
16
+ block_name = parse_obj_name('the blue block', f'objects = {get_obj_names()}')
17
+ block_pos = get_obj_pos(block_name)
18
+ mean_delta = np.mean(block_pos - shape_pts, axis=1)
19
+ new_shape_pts = translate_pts_np(shape_pts, mean_delta)
requirements.txt ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ numpy
2
+ scipy
3
+ shapely
4
+ astunparse
5
+ pygments
6
+ openai
7
+ pybullet
8
+ imageio==2.4.1
9
+ imageio-ffmpeg
10
+ moviepy
11
+ omegaconf
sim.py ADDED
@@ -0,0 +1,655 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pybullet
2
+ from pybullet_utils.bullet_client import BulletClient
3
+ import pybullet_data
4
+ import threading
5
+ from time import sleep
6
+ import numpy as np
7
+ import os
8
+ from consts import BOUNDS, COLORS, PIXEL_SIZE, CORNER_POS
9
+ from shapely.geometry import box
10
+
11
+
12
+ # Gripper (Robotiq 2F85) code
13
+ class Robotiq2F85:
14
+ """Gripper handling for Robotiq 2F85."""
15
+
16
+ def __init__(self, robot, tool, p):
17
+ self.robot = robot
18
+ self.tool = tool
19
+ self._p = p
20
+ pos = [0.1339999999999999, -0.49199999999872496, 0.5]
21
+ rot = self._p.getQuaternionFromEuler([np.pi, 0, np.pi])
22
+ urdf = 'robotiq_2f_85/robotiq_2f_85.urdf'
23
+ self.body = self._p.loadURDF(urdf, pos, rot)
24
+ self.n_joints = self._p.getNumJoints(self.body)
25
+ self.activated = False
26
+
27
+ # Connect gripper base to robot tool.
28
+ self._p.createConstraint(self.robot, tool, self.body, 0, jointType=self._p.JOINT_FIXED, jointAxis=[0, 0, 0], parentFramePosition=[0, 0, 0], childFramePosition=[0, 0, -0.07], childFrameOrientation=self._p.getQuaternionFromEuler([0, 0, np.pi / 2]))
29
+
30
+ # Set friction coefficients for gripper fingers.
31
+ for i in range(self._p.getNumJoints(self.body)):
32
+ self._p.changeDynamics(self.body, i, lateralFriction=10.0, spinningFriction=1.0, rollingFriction=1.0, frictionAnchor=True)
33
+
34
+ # Start thread to handle additional gripper constraints.
35
+ self.motor_joint = 1
36
+ self.constraints_thread = threading.Thread(target=self.step)
37
+ self.constraints_thread.daemon = True
38
+ self.constraints_thread.start()
39
+
40
+ # Control joint positions by enforcing hard contraints on gripper behavior.
41
+ # Set one joint as the open/close motor joint (other joints should mimic).
42
+ def step(self):
43
+ while True:
44
+ try:
45
+ currj = [self._p.getJointState(self.body, i)[0] for i in range(self.n_joints)]
46
+ indj = [6, 3, 8, 5, 10]
47
+ targj = [currj[1], -currj[1], -currj[1], currj[1], currj[1]]
48
+ self._p.setJointMotorControlArray(self.body, indj, self._p.POSITION_CONTROL, targj, positionGains=np.ones(5))
49
+ except:
50
+ return
51
+ sleep(0.001)
52
+
53
+ # Close gripper fingers.
54
+ def activate(self):
55
+ self._p.setJointMotorControl2(self.body, self.motor_joint, self._p.VELOCITY_CONTROL, targetVelocity=1, force=10)
56
+ self.activated = True
57
+
58
+ # Open gripper fingers.
59
+ def release(self):
60
+ self._p.setJointMotorControl2(self.body, self.motor_joint, self._p.VELOCITY_CONTROL, targetVelocity=-1, force=10)
61
+ self.activated = False
62
+
63
+ # If activated and object in gripper: check object contact.
64
+ # If activated and nothing in gripper: check gripper contact.
65
+ # If released: check proximity to surface (disabled).
66
+ def detect_contact(self):
67
+ obj, _, ray_frac = self.check_proximity()
68
+ if self.activated:
69
+ empty = self.grasp_width() < 0.01
70
+ cbody = self.body if empty else obj
71
+ if obj == self.body or obj == 0:
72
+ return False
73
+ return self.external_contact(cbody)
74
+ # else:
75
+ # return ray_frac < 0.14 or self.external_contact()
76
+
77
+ # Return if body is in contact with something other than gripper
78
+ def external_contact(self, body=None):
79
+ if body is None:
80
+ body = self.body
81
+ pts = self._p.getContactPoints(bodyA=body)
82
+ pts = [pt for pt in pts if pt[2] != self.body]
83
+ return len(pts) > 0 # pylint: disable=g-explicit-length-test
84
+
85
+ def check_grasp(self):
86
+ while self.moving():
87
+ sleep(0.001)
88
+ success = self.grasp_width() > 0.01
89
+ return success
90
+
91
+ def grasp_width(self):
92
+ lpad = np.array(self._p.getLinkState(self.body, 4)[0])
93
+ rpad = np.array(self._p.getLinkState(self.body, 9)[0])
94
+ dist = np.linalg.norm(lpad - rpad) - 0.047813
95
+ return dist
96
+
97
+ def check_proximity(self):
98
+ ee_pos = np.array(self._p.getLinkState(self.robot, self.tool)[0])
99
+ tool_pos = np.array(self._p.getLinkState(self.body, 0)[0])
100
+ vec = (tool_pos - ee_pos) / np.linalg.norm((tool_pos - ee_pos))
101
+ ee_targ = ee_pos + vec
102
+ ray_data = self._p.rayTest(ee_pos, ee_targ)[0]
103
+ obj, link, ray_frac = ray_data[0], ray_data[1], ray_data[2]
104
+ return obj, link, ray_frac
105
+
106
+
107
+ # Gym-style environment code
108
+ class PickPlaceEnv():
109
+
110
+ def __init__(self, render=False, high_res=False, high_frame_rate=False):
111
+ self.dt = 1/480
112
+ self.sim_step = 0
113
+
114
+ # Configure and start PyBullet
115
+ # self._p = pybullet.connect(pybullet.DIRECT)
116
+ self._p = BulletClient(connection_mode=pybullet.DIRECT)
117
+ self._p.configureDebugVisualizer(self._p.COV_ENABLE_GUI, 0)
118
+ self._p.setPhysicsEngineParameter(enableFileCaching=0)
119
+ assets_path = os.path.dirname(os.path.abspath(""))
120
+ self._p.setAdditionalSearchPath(assets_path)
121
+ self._p.setAdditionalSearchPath(pybullet_data.getDataPath())
122
+ self._p.setTimeStep(self.dt)
123
+
124
+ self.home_joints = (np.pi / 2, -np.pi / 2, np.pi / 2, -np.pi / 2, 3 * np.pi / 2, 0) # Joint angles: (J0, J1, J2, J3, J4, J5).
125
+ self.home_ee_euler = (np.pi, 0, np.pi) # (RX, RY, RZ) rotation in Euler angles.
126
+ self.ee_link_id = 9 # Link ID of UR5 end effector.
127
+ self.tip_link_id = 10 # Link ID of gripper finger tips.
128
+ self.gripper = None
129
+
130
+ self.render = render
131
+ self.high_res = high_res
132
+ self.high_frame_rate = high_frame_rate
133
+
134
+ def reset(self, object_list):
135
+ self._p.resetSimulation(self._p.RESET_USE_DEFORMABLE_WORLD)
136
+ self._p.setGravity(0, 0, -9.8)
137
+ self.cache_video = []
138
+
139
+ # Temporarily disable rendering to load URDFs faster.
140
+ self._p.configureDebugVisualizer(self._p.COV_ENABLE_RENDERING, 0)
141
+
142
+ # Add robot.
143
+ self._p.loadURDF("plane.urdf", [0, 0, -0.001])
144
+ self.robot_id = self._p.loadURDF("ur5e/ur5e.urdf", [0, 0, 0], flags=self._p.URDF_USE_MATERIAL_COLORS_FROM_MTL)
145
+ self.ghost_id = self._p.loadURDF("ur5e/ur5e.urdf", [0, 0, -10]) # For forward kinematics.
146
+ self.joint_ids = [self._p.getJointInfo(self.robot_id, i) for i in range(self._p.getNumJoints(self.robot_id))]
147
+ self.joint_ids = [j[0] for j in self.joint_ids if j[2] == self._p.JOINT_REVOLUTE]
148
+
149
+ # Move robot to home configuration.
150
+ for i in range(len(self.joint_ids)):
151
+ self._p.resetJointState(self.robot_id, self.joint_ids[i], self.home_joints[i])
152
+
153
+ # Add gripper.
154
+ if self.gripper is not None:
155
+ while self.gripper.constraints_thread.is_alive():
156
+ self.constraints_thread_active = False
157
+ self.gripper = Robotiq2F85(self.robot_id, self.ee_link_id, self._p)
158
+ self.gripper.release()
159
+
160
+ # Add workspace.
161
+ plane_shape = self._p.createCollisionShape(self._p.GEOM_BOX, halfExtents=[0.3, 0.3, 0.001])
162
+ plane_visual = self._p.createVisualShape(self._p.GEOM_BOX, halfExtents=[0.3, 0.3, 0.001])
163
+ plane_id = self._p.createMultiBody(0, plane_shape, plane_visual, basePosition=[0, -0.5, 0])
164
+ self._p.changeVisualShape(plane_id, -1, rgbaColor=[0.2, 0.2, 0.2, 1.0])
165
+
166
+ # Load objects according to config.
167
+ self.object_list = object_list
168
+ self.obj_name_to_id = {}
169
+ obj_xyz = np.zeros((0, 3))
170
+ for obj_name in object_list:
171
+ if ('block' in obj_name) or ('bowl' in obj_name):
172
+
173
+ # Get random position 15cm+ from other objects.
174
+ while True:
175
+ rand_x = np.random.uniform(BOUNDS[0, 0] + 0.1, BOUNDS[0, 1] - 0.1)
176
+ rand_y = np.random.uniform(BOUNDS[1, 0] + 0.1, BOUNDS[1, 1] - 0.1)
177
+ rand_xyz = np.float32([rand_x, rand_y, 0.03]).reshape(1, 3)
178
+ if len(obj_xyz) == 0:
179
+ obj_xyz = np.concatenate((obj_xyz, rand_xyz), axis=0)
180
+ break
181
+ else:
182
+ nn_dist = np.min(np.linalg.norm(obj_xyz - rand_xyz, axis=1)).squeeze()
183
+ if nn_dist > 0.15:
184
+ obj_xyz = np.concatenate((obj_xyz, rand_xyz), axis=0)
185
+ break
186
+
187
+ object_color = COLORS[obj_name.split(' ')[0]]
188
+ object_type = obj_name.split(' ')[1]
189
+ object_position = rand_xyz.squeeze()
190
+ if object_type == 'block':
191
+ object_shape = self._p.createCollisionShape(self._p.GEOM_BOX, halfExtents=[0.02, 0.02, 0.02])
192
+ object_visual = self._p.createVisualShape(self._p.GEOM_BOX, halfExtents=[0.02, 0.02, 0.02])
193
+ object_id = self._p.createMultiBody(0.01, object_shape, object_visual, basePosition=object_position)
194
+ elif object_type == 'bowl':
195
+ object_position[2] = 0
196
+ object_id = self._p.loadURDF("bowl/bowl.urdf", object_position, useFixedBase=1)
197
+ self._p.changeVisualShape(object_id, -1, rgbaColor=object_color)
198
+ self.obj_name_to_id[obj_name] = object_id
199
+
200
+ # Re-enable rendering.
201
+ self._p.configureDebugVisualizer(self._p.COV_ENABLE_RENDERING, 1)
202
+
203
+ for _ in range(200):
204
+ self._p.stepSimulation()
205
+
206
+ # record object positions at reset
207
+ self.init_pos = {name: self.get_obj_pos(name) for name in object_list}
208
+
209
+ return self.get_observation()
210
+
211
+ def servoj(self, joints):
212
+ """Move to target joint positions with position control."""
213
+ self._p.setJointMotorControlArray(
214
+ bodyIndex=self.robot_id,
215
+ jointIndices=self.joint_ids,
216
+ controlMode=self._p.POSITION_CONTROL,
217
+ targetPositions=joints,
218
+ positionGains=[0.01]*6)
219
+
220
+ def movep(self, position):
221
+ """Move to target end effector position."""
222
+ joints = self._p.calculateInverseKinematics(
223
+ bodyUniqueId=self.robot_id,
224
+ endEffectorLinkIndex=self.tip_link_id,
225
+ targetPosition=position,
226
+ targetOrientation=self._p.getQuaternionFromEuler(self.home_ee_euler),
227
+ maxNumIterations=100)
228
+ self.servoj(joints)
229
+
230
+ def get_ee_pos(self):
231
+ ee_xyz = np.float32(self._p.getLinkState(self.robot_id, self.tip_link_id)[0])
232
+ return ee_xyz
233
+
234
+ def step(self, action=None):
235
+ """Do pick and place motion primitive."""
236
+ pick_pos, place_pos = action['pick'].copy(), action['place'].copy()
237
+
238
+ # Set fixed primitive z-heights.
239
+ hover_xyz = np.float32([pick_pos[0], pick_pos[1], 0.2])
240
+ if pick_pos.shape[-1] == 2:
241
+ pick_xyz = np.append(pick_pos, 0.025)
242
+ else:
243
+ pick_xyz = pick_pos
244
+ pick_xyz[2] = 0.025
245
+ if place_pos.shape[-1] == 2:
246
+ place_xyz = np.append(place_pos, 0.15)
247
+ else:
248
+ place_xyz = place_pos
249
+ place_xyz[2] = 0.15
250
+
251
+ # Move to object.
252
+ ee_xyz = self.get_ee_pos()
253
+ while np.linalg.norm(hover_xyz - ee_xyz) > 0.01:
254
+ self.movep(hover_xyz)
255
+ self.step_sim_and_render()
256
+ ee_xyz = self.get_ee_pos()
257
+
258
+ while np.linalg.norm(pick_xyz - ee_xyz) > 0.01:
259
+ self.movep(pick_xyz)
260
+ self.step_sim_and_render()
261
+ ee_xyz = self.get_ee_pos()
262
+
263
+ # Pick up object.
264
+ self.gripper.activate()
265
+ for _ in range(240):
266
+ self.step_sim_and_render()
267
+ while np.linalg.norm(hover_xyz - ee_xyz) > 0.01:
268
+ self.movep(hover_xyz)
269
+ self.step_sim_and_render()
270
+ ee_xyz = self.get_ee_pos()
271
+
272
+ for _ in range(50):
273
+ self.step_sim_and_render()
274
+
275
+ # Move to place location.
276
+ while np.linalg.norm(place_xyz - ee_xyz) > 0.01:
277
+ self.movep(place_xyz)
278
+ self.step_sim_and_render()
279
+ ee_xyz = self.get_ee_pos()
280
+
281
+ # Place down object.
282
+ while (not self.gripper.detect_contact()) and (place_xyz[2] > 0.03):
283
+ place_xyz[2] -= 0.001
284
+ self.movep(place_xyz)
285
+ for _ in range(3):
286
+ self.step_sim_and_render()
287
+ self.gripper.release()
288
+ for _ in range(240):
289
+ self.step_sim_and_render()
290
+ place_xyz[2] = 0.2
291
+ ee_xyz = self.get_ee_pos()
292
+ while np.linalg.norm(place_xyz - ee_xyz) > 0.01:
293
+ self.movep(place_xyz)
294
+ self.step_sim_and_render()
295
+ ee_xyz = self.get_ee_pos()
296
+ place_xyz = np.float32([0, -0.5, 0.2])
297
+ while np.linalg.norm(place_xyz - ee_xyz) > 0.01:
298
+ self.movep(place_xyz)
299
+ self.step_sim_and_render()
300
+ ee_xyz = self.get_ee_pos()
301
+
302
+ observation = self.get_observation()
303
+ reward = self.get_reward()
304
+ done = False
305
+ info = {}
306
+ return observation, reward, done, info
307
+
308
+ def set_alpha_transparency(self, alpha: float) -> None:
309
+ for id in range(20):
310
+ visual_shape_data = self._p.getVisualShapeData(id)
311
+ for i in range(len(visual_shape_data)):
312
+ object_id, link_index, _, _, _, _, _, rgba_color = visual_shape_data[i]
313
+ rgba_color = list(rgba_color[0:3]) + [alpha]
314
+ self._p.changeVisualShape(
315
+ self.robot_id, linkIndex=i, rgbaColor=rgba_color)
316
+ self._p.changeVisualShape(
317
+ self.gripper.body, linkIndex=i, rgbaColor=rgba_color)
318
+
319
+ def step_sim_and_render(self):
320
+ self._p.stepSimulation()
321
+ self.sim_step += 1
322
+
323
+ interval = 40 if self.high_frame_rate else 60
324
+ # Render current image at 8 FPS.
325
+ if self.sim_step % interval == 0 and self.render:
326
+ self.cache_video.append(self.get_camera_image())
327
+
328
+ def get_camera_image(self):
329
+ if not self.high_res:
330
+ image_size = (240, 240)
331
+ intrinsics = (120., 0, 120., 0, 120., 120., 0, 0, 1)
332
+ else:
333
+ image_size=(360, 360)
334
+ intrinsics=(180., 0, 180., 0, 180., 180., 0, 0, 1)
335
+ color, _, _, _, _ = self.render_image(image_size, intrinsics)
336
+ return color
337
+
338
+ def get_reward(self):
339
+ return None
340
+
341
+ def get_observation(self):
342
+ observation = {}
343
+
344
+ # Render current image.
345
+ color, depth, position, orientation, intrinsics = self.render_image()
346
+
347
+ # Get heightmaps and colormaps.
348
+ points = self.get_pointcloud(depth, intrinsics)
349
+ position = np.float32(position).reshape(3, 1)
350
+ rotation = self._p.getMatrixFromQuaternion(orientation)
351
+ rotation = np.float32(rotation).reshape(3, 3)
352
+ transform = np.eye(4)
353
+ transform[:3, :] = np.hstack((rotation, position))
354
+ points = self.transform_pointcloud(points, transform)
355
+ heightmap, colormap, xyzmap = self.get_heightmap(points, color, BOUNDS, PIXEL_SIZE)
356
+
357
+ observation["image"] = colormap
358
+ observation["xyzmap"] = xyzmap
359
+
360
+ return observation
361
+
362
+ def render_image(self, image_size=(720, 720), intrinsics=(360., 0, 360., 0, 360., 360., 0, 0, 1)):
363
+
364
+ # Camera parameters.
365
+ position = (0, -0.85, 0.4)
366
+ orientation = (np.pi / 4 + np.pi / 48, np.pi, np.pi)
367
+ orientation = self._p.getQuaternionFromEuler(orientation)
368
+ zrange = (0.01, 10.)
369
+ noise=True
370
+
371
+ # OpenGL camera settings.
372
+ lookdir = np.float32([0, 0, 1]).reshape(3, 1)
373
+ updir = np.float32([0, -1, 0]).reshape(3, 1)
374
+ rotation = self._p.getMatrixFromQuaternion(orientation)
375
+ rotm = np.float32(rotation).reshape(3, 3)
376
+ lookdir = (rotm @ lookdir).reshape(-1)
377
+ updir = (rotm @ updir).reshape(-1)
378
+ lookat = position + lookdir
379
+ focal_len = intrinsics[0]
380
+ znear, zfar = (0.01, 10.)
381
+ viewm = self._p.computeViewMatrix(position, lookat, updir)
382
+ fovh = (image_size[0] / 2) / focal_len
383
+ fovh = 180 * np.arctan(fovh) * 2 / np.pi
384
+
385
+ # Notes: 1) FOV is vertical FOV 2) aspect must be float
386
+ aspect_ratio = image_size[1] / image_size[0]
387
+ projm = self._p.computeProjectionMatrixFOV(fovh, aspect_ratio, znear, zfar)
388
+
389
+ # Render with OpenGL camera settings.
390
+ _, _, color, depth, segm = self._p.getCameraImage(
391
+ width=image_size[1],
392
+ height=image_size[0],
393
+ viewMatrix=viewm,
394
+ projectionMatrix=projm,
395
+ shadow=1,
396
+ flags=self._p.ER_SEGMENTATION_MASK_OBJECT_AND_LINKINDEX,
397
+ renderer=self._p.ER_BULLET_HARDWARE_OPENGL)
398
+
399
+ # Get color image.
400
+ color_image_size = (image_size[0], image_size[1], 4)
401
+ color = np.array(color, dtype=np.uint8).reshape(color_image_size)
402
+ color = color[:, :, :3] # remove alpha channel
403
+ if noise:
404
+ color = np.int32(color)
405
+ color += np.int32(np.random.normal(0, 3, color.shape))
406
+ color = np.uint8(np.clip(color, 0, 255))
407
+
408
+ # Get depth image.
409
+ depth_image_size = (image_size[0], image_size[1])
410
+ zbuffer = np.float32(depth).reshape(depth_image_size)
411
+ depth = (zfar + znear - (2 * zbuffer - 1) * (zfar - znear))
412
+ depth = (2 * znear * zfar) / depth
413
+ if noise:
414
+ depth += np.random.normal(0, 0.003, depth.shape)
415
+
416
+ intrinsics = np.float32(intrinsics).reshape(3, 3)
417
+ return color, depth, position, orientation, intrinsics
418
+
419
+ def get_pointcloud(self, depth, intrinsics):
420
+ """Get 3D pointcloud from perspective depth image.
421
+ Args:
422
+ depth: HxW float array of perspective depth in meters.
423
+ intrinsics: 3x3 float array of camera intrinsics matrix.
424
+ Returns:
425
+ points: HxWx3 float array of 3D points in camera coordinates.
426
+ """
427
+ height, width = depth.shape
428
+ xlin = np.linspace(0, width - 1, width)
429
+ ylin = np.linspace(0, height - 1, height)
430
+ px, py = np.meshgrid(xlin, ylin)
431
+ px = (px - intrinsics[0, 2]) * (depth / intrinsics[0, 0])
432
+ py = (py - intrinsics[1, 2]) * (depth / intrinsics[1, 1])
433
+ points = np.float32([px, py, depth]).transpose(1, 2, 0)
434
+ return points
435
+
436
+ def transform_pointcloud(self, points, transform):
437
+ """Apply rigid transformation to 3D pointcloud.
438
+ Args:
439
+ points: HxWx3 float array of 3D points in camera coordinates.
440
+ transform: 4x4 float array representing a rigid transformation matrix.
441
+ Returns:
442
+ points: HxWx3 float array of transformed 3D points.
443
+ """
444
+ padding = ((0, 0), (0, 0), (0, 1))
445
+ homogen_points = np.pad(points.copy(), padding,
446
+ 'constant', constant_values=1)
447
+ for i in range(3):
448
+ points[Ellipsis, i] = np.sum(transform[i, :] * homogen_points, axis=-1)
449
+ return points
450
+
451
+ def get_heightmap(self, points, colors, bounds, pixel_size):
452
+ """Get top-down (z-axis) orthographic heightmap image from 3D pointcloud.
453
+ Args:
454
+ points: HxWx3 float array of 3D points in world coordinates.
455
+ colors: HxWx3 uint8 array of values in range 0-255 aligned with points.
456
+ bounds: 3x2 float array of values (rows: X,Y,Z; columns: min,max) defining
457
+ region in 3D space to generate heightmap in world coordinates.
458
+ pixel_size: float defining size of each pixel in meters.
459
+ Returns:
460
+ heightmap: HxW float array of height (from lower z-bound) in meters.
461
+ colormap: HxWx3 uint8 array of backprojected color aligned with heightmap.
462
+ xyzmap: HxWx3 float array of XYZ points in world coordinates.
463
+ """
464
+ width = int(np.round((bounds[0, 1] - bounds[0, 0]) / pixel_size))
465
+ height = int(np.round((bounds[1, 1] - bounds[1, 0]) / pixel_size))
466
+ heightmap = np.zeros((height, width), dtype=np.float32)
467
+ colormap = np.zeros((height, width, colors.shape[-1]), dtype=np.uint8)
468
+ xyzmap = np.zeros((height, width, 3), dtype=np.float32)
469
+
470
+ # Filter out 3D points that are outside of the predefined bounds.
471
+ ix = (points[Ellipsis, 0] >= bounds[0, 0]) & (points[Ellipsis, 0] < bounds[0, 1])
472
+ iy = (points[Ellipsis, 1] >= bounds[1, 0]) & (points[Ellipsis, 1] < bounds[1, 1])
473
+ iz = (points[Ellipsis, 2] >= bounds[2, 0]) & (points[Ellipsis, 2] < bounds[2, 1])
474
+ valid = ix & iy & iz
475
+ points = points[valid]
476
+ colors = colors[valid]
477
+
478
+ # Sort 3D points by z-value, which works with array assignment to simulate
479
+ # z-buffering for rendering the heightmap image.
480
+ iz = np.argsort(points[:, -1])
481
+ points, colors = points[iz], colors[iz]
482
+ px = np.int32(np.floor((points[:, 0] - bounds[0, 0]) / pixel_size))
483
+ py = np.int32(np.floor((points[:, 1] - bounds[1, 0]) / pixel_size))
484
+ px = np.clip(px, 0, width - 1)
485
+ py = np.clip(py, 0, height - 1)
486
+ heightmap[py, px] = points[:, 2] - bounds[2, 0]
487
+ for c in range(colors.shape[-1]):
488
+ colormap[py, px, c] = colors[:, c]
489
+ xyzmap[py, px, c] = points[:, c]
490
+ colormap = colormap[::-1, :, :] # Flip up-down.
491
+ xv, yv = np.meshgrid(np.linspace(BOUNDS[0, 0], BOUNDS[0, 1], height),
492
+ np.linspace(BOUNDS[1, 0], BOUNDS[1, 1], width))
493
+ xyzmap[:, :, 0] = xv
494
+ xyzmap[:, :, 1] = yv
495
+ xyzmap = xyzmap[::-1, :, :] # Flip up-down.
496
+ heightmap = heightmap[::-1, :] # Flip up-down.
497
+ return heightmap, colormap, xyzmap
498
+
499
+ def on_top_of(self, obj_a, obj_b):
500
+ """
501
+ check if obj_a is on top of obj_b
502
+ condition 1: l2 distance on xy plane is less than a threshold
503
+ condition 2: obj_a is higher than obj_b
504
+ """
505
+ obj_a_pos = self.get_obj_pos(obj_a)
506
+ obj_b_pos = self.get_obj_pos(obj_b)
507
+ xy_dist = np.linalg.norm(obj_a_pos[:2] - obj_b_pos[:2])
508
+ if obj_b in CORNER_POS:
509
+ is_near = xy_dist < 0.06
510
+ return is_near
511
+ elif 'bowl' in obj_b:
512
+ is_near = xy_dist < 0.06
513
+ is_higher = obj_a_pos[2] > obj_b_pos[2]
514
+ return is_near and is_higher
515
+ else:
516
+ is_near = xy_dist < 0.04
517
+ is_higher = obj_a_pos[2] > obj_b_pos[2]
518
+ return is_near and is_higher
519
+
520
+ def get_obj_id(self, obj_name):
521
+ try:
522
+ if obj_name in self.obj_name_to_id:
523
+ obj_id = self.obj_name_to_id[obj_name]
524
+ else:
525
+ obj_name = obj_name.replace('circle', 'bowl').replace('square', 'block').replace('small', '').strip()
526
+ obj_id = self.obj_name_to_id[obj_name]
527
+ return obj_id
528
+ except:
529
+ raise Exception('Object name "{}" not found'.format(obj_name))
530
+
531
+ def get_obj_pos(self, obj_name):
532
+ obj_name = obj_name.replace('the', '').replace('_', ' ').strip()
533
+ if obj_name in CORNER_POS:
534
+ position = np.float32(np.array(CORNER_POS[obj_name]))
535
+ else:
536
+ pick_id = self.get_obj_id(obj_name)
537
+ pose = self._p.getBasePositionAndOrientation(pick_id)
538
+ position = np.float32(pose[0])
539
+ return position
540
+
541
+ def get_bounding_box(self, obj_name):
542
+ obj_id = self.get_obj_id(obj_name)
543
+ return self._p.getAABB(obj_id)
544
+
545
+
546
+ class LMP_wrapper():
547
+
548
+ def __init__(self, env, cfg, render=False):
549
+ self.env = env
550
+ self._cfg = cfg
551
+ self.object_names = list(self._cfg['env']['init_objs'])
552
+
553
+ self._min_xy = np.array(self._cfg['env']['coords']['bottom_left'])
554
+ self._max_xy = np.array(self._cfg['env']['coords']['top_right'])
555
+ self._range_xy = self._max_xy - self._min_xy
556
+
557
+ self._table_z = self._cfg['env']['coords']['table_z']
558
+ self.render = render
559
+
560
+ def is_obj_visible(self, obj_name):
561
+ return obj_name in self.object_names
562
+
563
+ def get_obj_names(self):
564
+ return self.object_names[::]
565
+
566
+ def denormalize_xy(self, pos_normalized):
567
+ return pos_normalized * self._range_xy + self._min_xy
568
+
569
+ def get_corner_positions(self):
570
+ unit_square = box(0, 0, 1, 1)
571
+ normalized_corners = np.array(list(unit_square.exterior.coords))[:4]
572
+ corners = np.array(([self.denormalize_xy(corner) for corner in normalized_corners]))
573
+ return corners
574
+
575
+ def get_side_positions(self):
576
+ side_xs = np.array([0, 0.5, 0.5, 1])
577
+ side_ys = np.array([0.5, 0, 1, 0.5])
578
+ normalized_side_positions = np.c_[side_xs, side_ys]
579
+ side_positions = np.array(([self.denormalize_xy(corner) for corner in normalized_side_positions]))
580
+ return side_positions
581
+
582
+ def get_obj_pos(self, obj_name):
583
+ # return the xy position of the object in robot base frame
584
+ return self.env.get_obj_pos(obj_name)[:2]
585
+
586
+ def get_obj_position_np(self, obj_name):
587
+ return self.get_pos(obj_name)
588
+
589
+ def get_bbox(self, obj_name):
590
+ # return the axis-aligned object bounding box in robot base frame (not in pixels)
591
+ # the format is (min_x, min_y, max_x, max_y)
592
+ bbox = self.env.get_bounding_box(obj_name)
593
+ return bbox
594
+
595
+ def get_color(self, obj_name):
596
+ for color, rgb in COLORS.items():
597
+ if color in obj_name:
598
+ return rgb
599
+
600
+ def pick_place(self, pick_pos, place_pos):
601
+ pick_pos_xyz = np.r_[pick_pos, [self._table_z]]
602
+ place_pos_xyz = np.r_[place_pos, [self._table_z]]
603
+ pass
604
+
605
+ def put_first_on_second(self, arg1, arg2):
606
+ # put the object with obj_name on top of target
607
+ # target can either be another object name, or it can be an x-y position in robot base frame
608
+ pick_pos = self.get_obj_pos(arg1) if isinstance(arg1, str) else arg1
609
+ place_pos = self.get_obj_pos(arg2) if isinstance(arg2, str) else arg2
610
+ self.env.step(action={'pick': pick_pos, 'place': place_pos})
611
+
612
+ def get_robot_pos(self):
613
+ # return robot end-effector xy position in robot base frame
614
+ return self.env.get_ee_pos()
615
+
616
+ def goto_pos(self, position_xy):
617
+ # move the robot end-effector to the desired xy position while maintaining same z
618
+ ee_xyz = self.env.get_ee_pos()
619
+ position_xyz = np.concatenate([position_xy, ee_xyz[-1]])
620
+ while np.linalg.norm(position_xyz - ee_xyz) > 0.01:
621
+ self.env.movep(position_xyz)
622
+ self.env.step_sim_and_render()
623
+ ee_xyz = self.env.get_ee_pos()
624
+
625
+ def follow_traj(self, traj):
626
+ for pos in traj:
627
+ self.goto_pos(pos)
628
+
629
+ def get_corner_positions(self):
630
+ normalized_corners = np.array([
631
+ [0, 1],
632
+ [1, 1],
633
+ [0, 0],
634
+ [1, 0]
635
+ ])
636
+ return np.array(([self.denormalize_xy(corner) for corner in normalized_corners]))
637
+
638
+ def get_side_positions(self):
639
+ normalized_sides = np.array([
640
+ [0.5, 1],
641
+ [1, 0.5],
642
+ [0.5, 0],
643
+ [0, 0.5]
644
+ ])
645
+ return np.array(([self.denormalize_xy(side) for side in normalized_sides]))
646
+
647
+ def get_corner_name(self, pos):
648
+ corner_positions = self.get_corner_positions()
649
+ corner_idx = np.argmin(np.linalg.norm(corner_positions - pos, axis=1))
650
+ return ['top left corner', 'top right corner', 'bottom left corner', 'botom right corner'][corner_idx]
651
+
652
+ def get_side_name(self, pos):
653
+ side_positions = self.get_side_positions()
654
+ side_idx = np.argmin(np.linalg.norm(side_positions - pos, axis=1))
655
+ return ['top side', 'right side', 'bottom side', 'left side'][side_idx]
ur5e/collision/base.stl ADDED
Binary file (21.1 kB). View file
 
ur5e/collision/forearm.stl ADDED
Binary file (53.3 kB). View file
 
ur5e/collision/shoulder.stl ADDED
Binary file (70.1 kB). View file
 
ur5e/collision/upperarm.stl ADDED
Binary file (99.7 kB). View file
 
ur5e/collision/wrist1.stl ADDED
Binary file (59.6 kB). View file
 
ur5e/collision/wrist2.stl ADDED
Binary file (67.6 kB). View file
 
ur5e/collision/wrist3.stl ADDED
Binary file (7.18 kB). View file
 
ur5e/ur5e.urdf ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" ?>
2
+ <!-- ============================================================================================= -->
3
+ <!-- | This document was autogenerated by xacro from ur_description/urdf/ur5_robot.urdf.xacro | -->
4
+ <!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | -->
5
+ <!-- ============================================================================================= -->
6
+ <robot name="ur5" xmlns:xacro="http://ros.org/wiki/xacro">
7
+ <material name="LightGrey">
8
+ <color rgba="0.8 0.8 0.8 1.0"/>
9
+ </material>
10
+
11
+ <material name="DarkGrey">
12
+ <color rgba="0.2 0.2 0.2 1.0"/>
13
+ </material>
14
+
15
+ <link name="base_link">
16
+ <visual>
17
+ <geometry>
18
+ <mesh filename="visual/base.dae"/>
19
+ </geometry>
20
+ <material name="LightGrey"/>
21
+ </visual>
22
+ <!-- <collision>
23
+ <geometry>
24
+ <mesh filename="collision/base.stl"/>
25
+ </geometry>
26
+ </collision> -->
27
+ <inertial>
28
+ <mass value="4.0"/>
29
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
30
+ <inertia ixx="0.00443333156" ixy="0.0" ixz="0.0" iyy="0.00443333156" iyz="0.0" izz="0.0072"/>
31
+ </inertial>
32
+ </link>
33
+ <joint name="shoulder_pan_joint" type="revolute">
34
+ <parent link="base_link"/>
35
+ <child link="shoulder_link"/>
36
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.163"/>
37
+ <axis xyz="0 0 1"/>
38
+ <limit effort="150.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.15"/>
39
+ <dynamics damping="0.0" friction="0.0"/>
40
+ </joint>
41
+ <link name="shoulder_link">
42
+ <visual>
43
+ <geometry>
44
+ <mesh filename="visual/shoulder.dae"/>
45
+ </geometry>
46
+ <material name="DarkGrey"/>
47
+ </visual>
48
+ <!-- <collision>
49
+ <geometry>
50
+ <mesh filename="collision/shoulder.stl"/>
51
+ </geometry>
52
+ </collision> -->
53
+ <inertial>
54
+ <mass value="3.7"/>
55
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
56
+ <inertia ixx="0.010267495893" ixy="0.0" ixz="0.0" iyy="0.010267495893" iyz="0.0" izz="0.00666"/>
57
+ </inertial>
58
+ </link>
59
+ <joint name="shoulder_lift_joint" type="revolute">
60
+ <parent link="shoulder_link"/>
61
+ <child link="upper_arm_link"/>
62
+ <origin rpy="0.0 1.57079632679 0.0" xyz="0.0 0.138 0.0"/>
63
+ <axis xyz="0 1 0"/>
64
+ <limit effort="150.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.15"/>
65
+ <dynamics damping="0.0" friction="0.0"/>
66
+ </joint>
67
+ <link name="upper_arm_link">
68
+ <visual>
69
+ <geometry>
70
+ <mesh filename="visual/upperarm.dae"/>
71
+ </geometry>
72
+ <material name="LightGrey"/>
73
+ </visual>
74
+ <!-- <collision>
75
+ <geometry>
76
+ <mesh filename="collision/upperarm.stl"/>
77
+ </geometry>
78
+ </collision> -->
79
+ <inertial>
80
+ <mass value="8.393"/>
81
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.28"/>
82
+ <inertia ixx="0.22689067591" ixy="0.0" ixz="0.0" iyy="0.22689067591" iyz="0.0" izz="0.0151074"/>
83
+ </inertial>
84
+ </link>
85
+ <joint name="elbow_joint" type="revolute">
86
+ <parent link="upper_arm_link"/>
87
+ <child link="forearm_link"/>
88
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 -0.131 0.425"/>
89
+ <axis xyz="0 1 0"/>
90
+ <limit effort="150.0" lower="-3.14159265359" upper="3.14159265359" velocity="3.15"/>
91
+ <dynamics damping="0.0" friction="0.0"/>
92
+ </joint>
93
+ <link name="forearm_link">
94
+ <visual>
95
+ <geometry>
96
+ <mesh filename="visual/forearm.dae"/>
97
+ </geometry>
98
+ <material name="DarkGrey"/>
99
+ </visual>
100
+ <!-- <collision>
101
+ <geometry>
102
+ <mesh filename="collision/forearm.stl"/>
103
+ </geometry>
104
+ </collision> -->
105
+ <inertial>
106
+ <mass value="2.275"/>
107
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.25"/>
108
+ <inertia ixx="0.049443313556" ixy="0.0" ixz="0.0" iyy="0.049443313556" iyz="0.0" izz="0.004095"/>
109
+ </inertial>
110
+ </link>
111
+ <joint name="wrist_1_joint" type="revolute">
112
+ <parent link="forearm_link"/>
113
+ <child link="wrist_1_link"/>
114
+ <origin rpy="0.0 1.57079632679 0.0" xyz="0.0 0.0 0.392"/>
115
+ <axis xyz="0 1 0"/>
116
+ <limit effort="28.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.2"/>
117
+ <dynamics damping="0.0" friction="0.0"/>
118
+ </joint>
119
+ <link name="wrist_1_link">
120
+ <visual>
121
+ <geometry>
122
+ <mesh filename="visual/wrist1.dae"/>
123
+ </geometry>
124
+ <material name="LightGrey"/>
125
+ </visual>
126
+ <!-- <collision>
127
+ <geometry>
128
+ <mesh filename="collision/wrist1.stl"/>
129
+ </geometry>
130
+ </collision> -->
131
+ <inertial>
132
+ <mass value="1.219"/>
133
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
134
+ <inertia ixx="0.111172755531" ixy="0.0" ixz="0.0" iyy="0.111172755531" iyz="0.0" izz="0.21942"/>
135
+ </inertial>
136
+ </link>
137
+ <joint name="wrist_2_joint" type="revolute">
138
+ <parent link="wrist_1_link"/>
139
+ <child link="wrist_2_link"/>
140
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.127 0.0"/>
141
+ <axis xyz="0 0 1"/>
142
+ <limit effort="28.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.2"/>
143
+ <dynamics damping="0.0" friction="0.0"/>
144
+ </joint>
145
+ <link name="wrist_2_link">
146
+ <visual>
147
+ <geometry>
148
+ <mesh filename="visual/wrist2.dae"/>
149
+ </geometry>
150
+ <material name="DarkGrey"/>
151
+ </visual>
152
+ <collision>
153
+ <geometry>
154
+ <mesh filename="collision/wrist2.stl"/>
155
+ </geometry>
156
+ </collision>
157
+ <inertial>
158
+ <mass value="1.219"/>
159
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
160
+ <inertia ixx="0.111172755531" ixy="0.0" ixz="0.0" iyy="0.111172755531" iyz="0.0" izz="0.21942"/>
161
+ </inertial>
162
+ </link>
163
+ <joint name="wrist_3_joint" type="revolute">
164
+ <parent link="wrist_2_link"/>
165
+ <child link="wrist_3_link"/>
166
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.100"/>
167
+ <axis xyz="0 1 0"/>
168
+ <limit effort="28.0" lower="-6.28318530718" upper="6.28318530718" velocity="3.2"/>
169
+ <dynamics damping="0.0" friction="0.0"/>
170
+ </joint>
171
+ <link name="wrist_3_link">
172
+ <visual>
173
+ <geometry>
174
+ <mesh filename="visual/wrist3.dae"/>
175
+ </geometry>
176
+ <material name="LightGrey"/>
177
+ </visual>
178
+ <collision>
179
+ <geometry>
180
+ <mesh filename="collision/wrist3.stl"/>
181
+ </geometry>
182
+ </collision>
183
+ <inertial>
184
+ <mass value="0.1879"/>
185
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
186
+ <inertia ixx="0.0171364731454" ixy="0.0" ixz="0.0" iyy="0.0171364731454" iyz="0.0" izz="0.033822"/>
187
+ </inertial>
188
+ </link>
189
+ <joint name="ee_fixed_joint" type="fixed">
190
+ <parent link="wrist_3_link"/>
191
+ <child link="ee_link"/>
192
+ <origin rpy="-1.5707963267948966 0.0 0.0" xyz="0.0 0.100 0.0"/>
193
+ </joint>
194
+ <link name="ee_link">
195
+ <!-- <collision>
196
+ <geometry>
197
+ <box size="0.01 0.01 0.01"/>
198
+ </geometry>
199
+ <origin rpy="0 0 0" xyz="-0.01 0 0"/>
200
+ </collision> -->
201
+ <inertial>
202
+ <mass value="0.0"/>
203
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
204
+ <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
205
+ </inertial>
206
+ </link>
207
+ <!-- nothing to do here at the moment -->
208
+ <!-- ROS base_link to UR 'Base' Coordinates transform -->
209
+ <link name="base">
210
+ <inertial>
211
+ <mass value="0.0"/>
212
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
213
+ <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
214
+ </inertial>
215
+ </link>
216
+ <joint name="base_link-base_fixed_joint" type="fixed">
217
+ <!-- NOTE: this rotation is only needed as long as base_link itself is
218
+ not corrected wrt the real robot (ie: rotated over 180
219
+ degrees)
220
+ -->
221
+ <origin rpy="0 0 -3.14159265359" xyz="0 0 0"/>
222
+ <parent link="base_link"/>
223
+ <child link="base"/>
224
+ </joint>
225
+ <!-- Frame coincident with all-zeros TCP on UR controller -->
226
+ <link name="tool0">
227
+ <inertial>
228
+ <mass value="0.0"/>
229
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
230
+ <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
231
+ </inertial>
232
+ </link>
233
+ <joint name="wrist_3_link-tool0_fixed_joint" type="fixed">
234
+ <origin rpy="-1.57079632679 0 0" xyz="0 0.0823 0"/>
235
+ <parent link="wrist_3_link"/>
236
+ <child link="tool0"/>
237
+ </joint>
238
+
239
+ <link name="tool_tip">
240
+ <inertial>
241
+ <mass value="0.0"/>
242
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
243
+ <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
244
+ </inertial>
245
+ <!-- <visual>
246
+ <geometry>
247
+ <box size="0.01 0.01 0.01"/>
248
+ </geometry>
249
+ <material name="DarkGrey"/>
250
+ <origin rpy="0 0 0" xyz="0 0 0"/>
251
+ </visual> -->
252
+ </link>
253
+ <joint name="tool0_fixed_joint-tool_tip" type="fixed">
254
+ <origin rpy="0 0 0" xyz="0 0 0.175"/>
255
+ <parent link="tool0"/>
256
+ <child link="tool_tip"/>
257
+ </joint>
258
+
259
+ <link name="world"/>
260
+ <joint name="world_joint" type="fixed">
261
+ <parent link="world"/>
262
+ <child link="rotated_base_link"/>
263
+ <origin rpy="0.0 0.0 0.0" xyz="0.0 0.0 0.0"/>
264
+ </joint>
265
+
266
+ <link name="rotated_base_link">
267
+ <inertial>
268
+ <mass value="0.0"/>
269
+ <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
270
+ <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
271
+ </inertial>
272
+ </link>>
273
+
274
+ <joint name="rotated_base-base_fixed_joint" type="fixed">
275
+ <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 3.141592653589793"/>
276
+ <parent link="rotated_base_link"/>
277
+ <child link="base_link"/>
278
+ </joint>
279
+ </robot>
ur5e/visual/base.dae ADDED
The diff for this file is too large to render. See raw diff
 
ur5e/visual/forearm.dae ADDED
The diff for this file is too large to render. See raw diff
 
ur5e/visual/shoulder.dae ADDED
The diff for this file is too large to render. See raw diff
 
ur5e/visual/upperarm.dae ADDED
The diff for this file is too large to render. See raw diff
 
ur5e/visual/wrist1.dae ADDED
The diff for this file is too large to render. See raw diff
 
ur5e/visual/wrist2.dae ADDED
The diff for this file is too large to render. See raw diff
 
ur5e/visual/wrist3.dae ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
3
+ <asset>
4
+ <contributor>
5
+ <author>Blender User</author>
6
+ <authoring_tool>Blender 2.78.0 commit date:2017-02-24, commit time:14:33, hash:e92f2352830</authoring_tool>
7
+ </contributor>
8
+ <created>2018-08-20T16:30:31</created>
9
+ <modified>2018-08-20T16:30:31</modified>
10
+ <unit name="meter" meter="1"/>
11
+ <up_axis>Z_UP</up_axis>
12
+ </asset>
13
+ <library_images/>
14
+ <library_effects>
15
+ <effect id="LinkGrey-effect">
16
+ <profile_COMMON>
17
+ <technique sid="common">
18
+ <phong>
19
+ <emission>
20
+ <color sid="emission">0 0 0 1</color>
21
+ </emission>
22
+ <ambient>
23
+ <color sid="ambient">0.25 0.25 0.25 1</color>
24
+ </ambient>
25
+ <diffuse>
26
+ <color sid="diffuse">0.8203922 0.8203922 0.8203922 1</color>
27
+ </diffuse>
28
+ <specular>
29
+ <color sid="specular">0.5 0.5 0.5 1</color>
30
+ </specular>
31
+ <shininess>
32
+ <float sid="shininess">0</float>
33
+ </shininess>
34
+ <index_of_refraction>
35
+ <float sid="index_of_refraction">1</float>
36
+ </index_of_refraction>
37
+ </phong>
38
+ </technique>
39
+ </profile_COMMON>
40
+ </effect>
41
+ </library_effects>
42
+ <library_materials>
43
+ <material id="LinkGrey-material" name="LinkGrey">
44
+ <instance_effect url="#LinkGrey-effect"/>
45
+ </material>
46
+ </library_materials>
47
+ <library_geometries>
48
+ <geometry id="eSeries_UR5e_058-mesh" name="eSeries UR5e.058">
49
+ <mesh>
50
+ <source id="eSeries_UR5e_058-mesh-positions">
51
+ <float_array id="eSeries_UR5e_058-mesh-positions-array" count="1455">1.911164 43.51731 66.91934 -1.930693 43.44939 65.90201 -2.183813 43.44381 68.34186 2.078753 43.41179 65.51548 -0.9332018 40.8521 72.15565 0.7674334 41.31041 72.13608 2.358598 41.3104 71.58493 3.696645 40.85204 70.56025 4.507632 41.55351 69.07719 4.866287 41.27283 67.03349 4.381724 41.34799 65.26049 3.403427 41.34797 63.8878 1.37716 41.15232 62.64779 -0.1223266 41.38584 62.53082 -1.586951 41.31039 62.76651 -3.384526 41.31544 63.83565 -4.529929 41.31043 65.61894 -4.854666 41.29059 67.28862 -4.499549 41.24213 69.25669 -2.916456 40.86779 71.31809 -1.182612 41.91432 71.79449 -1.508891 43.037 70.61665 -3.249703 42.14373 70.44701 -3.442518 43.0025 68.52941 -3.69445 42.94204 66.73839 -2.900552 42.63394 64.47216 -1.900191 43.16608 64.61894 -0.2247034 42.5634 63.18352 0.7821912 43.34275 64.43846 2.269175 42.18852 63.53231 3.325075 42.69643 65.15615 3.697303 42.97077 67.18048 3.332834 42.9069 68.9614 3.7092 41.90756 70.07672 1.438681 42.76676 71.03916 2.03089 43.34052 69.46076 0.0102477 43.43203 69.93967 -4.98148 39.43616 66.96067 -4.065622 39.43604 70.25263 -1.653111 39.43603 72.01772 0.9031314 39.43603 72.2187 3.21732 39.43603 71.11466 4.838231 39.43604 68.59597 4.745429 39.43603 66.03951 3.76642 39.43604 64.1311 1.247725 39.43604 62.51014 -1.735037 39.43603 62.70875 -3.822391 39.43603 64.19792 4.36633e-5 24.43604 90.89574 -3.028306 25.04068 92.69477 -2.538931 22.73727 92.69612 -0.8527937 21.50272 92.69612 0.982804 21.57116 92.69692 2.464757 22.63122 92.69612 3.052535 24.90377 92.69477 1.804748 26.90085 92.69612 -0.2015526 27.48427 92.69612 -1.902943 26.79244 92.69692 15.12117 12.94469 89.79833 18.21953 21.92053 89.79833 18.40644 12.37369 89.79833 12.97548 15.97892 89.79833 13.09358 18.4189 89.79833 14.63446 20.94197 89.79833 20.47263 20.97461 89.79833 22.31593 18.66407 89.79833 22.14703 15.37472 89.79833 20.67892 13.37312 89.79833 -20.23418 12.94469 89.79833 -17.13581 21.92053 89.79833 -16.9489 12.37369 89.79833 -22.37986 15.97892 89.79833 -22.26176 18.4189 89.79833 -20.72088 20.94197 89.79833 -14.17292 20.44786 89.79833 -13.05513 18.27573 89.79833 -13.0379 15.74564 89.79833 -14.67643 13.37312 89.79833 18.39885 -23.07856 89.79833 18.21953 -13.43482 89.79833 14.80481 -22.13334 89.79833 12.97548 -19.37643 89.79833 13.09358 -16.93644 89.79833 14.63446 -14.41338 89.79833 21.18243 -14.90749 89.79833 22.30022 -17.07962 89.79833 22.31744 -19.60971 89.79833 20.99526 -21.66389 89.79833 -16.95649 -23.07856 89.79833 -17.13581 -13.43482 89.79833 -20.55053 -22.13334 89.79833 -22.37986 -19.37643 89.79833 -22.26176 -16.93644 89.79833 -20.72088 -14.41338 89.79833 -14.17292 -14.90749 89.79833 -13.05513 -17.07962 89.79833 -13.0379 -19.60971 89.79833 -14.36008 -21.66389 89.79833 -1.294488 15.18517 92.69831 -13.829 7.079706 92.69832 3.847384 14.76277 92.6983 8.579229 12.70613 92.69829 14.89126 4.718681 92.69828 12.39584 9.235257 92.69828 15.79814 -0.3628844 92.69827 12.63268 -10.04805 92.69828 15.01805 -5.466911 92.69826 8.895459 -13.61575 92.6983 -1.394039 -16.32954 92.69837 4.203702 -15.78701 92.69834 -6.639836 -14.89454 92.69831 -14.01392 -7.855438 92.69827 -10.91075 -11.98588 92.69828 -15.618 -2.946669 92.69826 -15.55352 2.215297 92.69827 -10.62928 11.12834 92.69829 -6.296473 13.92945 92.6983 -4.753172 36.43603 66.06483 -3.791726 36.43603 64.1599 -1.29021 36.43603 62.52075 1.699404 36.43603 62.69474 3.798536 36.43603 64.1679 4.758208 36.43603 66.0833 4.878022 36.43603 68.21376 4.027591 36.43603 70.18016 2.108984 36.43603 71.87852 -1.296383 36.43603 72.17425 -3.488126 36.43603 70.82297 -4.827542 36.43603 68.63853 -0.796177 21.40692 98.79719 1.057285 21.51952 98.79102 2.679122 22.78203 98.79513 3.097666 25.05752 98.80152 2.006174 26.81396 98.80825 0.2584391 27.55746 98.79718 -1.534057 27.14595 98.81213 -2.726375 26.02113 98.80984 -3.108368 24.13763 98.78349 -2.379192 22.44515 98.79104 18.5739 12.40263 98.3852 20.78827 13.46295 98.39478 22.19683 15.50719 98.39478 22.39618 17.97457 98.40036 20.78649 20.88631 98.38842 17.21509 21.92837 98.39219 14.22862 20.50475 98.3922 12.94783 17.90803 98.39918 13.18309 15.43992 98.39478 15.27214 12.85817 98.38762 -16.80916 12.39683 98.39476 -14.5671 13.46292 98.39477 -12.99511 15.90183 98.39218 -13.46627 19.59595 98.38697 -16.46597 21.7963 98.39218 -18.95385 21.70631 98.39144 -21.12675 20.50472 98.3922 -22.40751 17.90803 98.39918 -21.88857 14.63089 98.38761 -19.28105 12.59358 98.3992 17.7136 -23.03766 98.39476 20.88128 -21.93258 98.36882 22.49953 -18.62217 98.39217 21.36855 -15.03789 98.36904 18.05827 -13.41981 98.39219 14.50148 -14.52569 98.38763 12.85589 -17.86102 98.39218 13.54399 -20.67367 98.39918 15.31039 -22.41283 98.39478 -18.05786 -23.06344 98.39218 -14.86942 -22.17975 98.39217 -13.15748 -19.84495 98.39918 -13.09943 -16.52801 98.38763 -15.3105 -14.07027 98.39476 -18.17379 -13.43112 98.37814 -21.12676 -14.85064 98.3922 -22.49945 -17.86103 98.39218 -21.81134 -20.67367 98.39918 -20.37591 -22.17103 98.39144 -1.169513 15.23702 97.89898 4.783272 14.49003 97.89467 8.417615 12.74799 97.89832 11.24462 10.5306 97.89543 14.14678 6.463265 97.91197 15.65487 1.551327 97.88961 15.53165 -3.447024 97.90504 13.81276 -8.230002 97.90513 10.60761 -12.27152 97.89031 6.412875 -15.00241 97.90515 2.526382 -16.11 97.89834 -1.610235 -16.2853 97.89176 -4.98762 -15.50326 97.89833 -8.659039 -13.77751 97.91379 -12.39965 -10.35237 97.90515 -14.86569 -5.908195 97.90509 -15.75635 -1.319583 97.9223 -15.43164 2.586563 97.89833 -14.13455 6.487237 97.90473 -11.16312 10.61073 97.90453 -7.026411 13.58142 97.9122 17.07917 22.42492 98.89673 13.80551 20.79762 98.89655 21.21146 21.29445 98.92314 22.24323 14.09945 98.8927 22.86974 18.12453 98.89781 12.22202 16.53511 98.89558 15.10148 12.36562 98.89522 18.80719 11.92415 98.89787 -22.61687 15.1919 98.89774 -20.25936 12.39149 98.8955 -20.44899 21.62375 98.89788 -22.77593 18.836 98.89491 -13.39862 20.49594 98.89619 -17.34495 22.44815 98.89673 -16.16577 11.98677 98.89718 -13.22431 14.15822 98.89673 -12.38884 17.11363 98.89786 18.9173 -12.92682 98.89311 14.09689 -14.19687 98.89523 12.34328 -17.90894 98.89673 22.30463 -20.80471 98.89775 22.88033 -20.6213 98.91772 22.46397 -15.8625 98.89688 20.87799 -22.63478 98.9365 13.61467 -21.80965 98.8954 17.3451 -23.57598 98.89673 -22.01652 -21.49654 98.93031 -19.35754 -23.35761 98.895 -21.55036 -14.55759 98.89699 -23.01221 -17.90893 98.89688 -13.05071 -20.80471 98.89775 -12.38488 -17.16317 98.89471 -14.72205 -13.78816 98.89688 -18.40409 -12.92756 98.89695 -15.29824 -23.0278 98.897 -4.018386 -16.8792 98.89761 -8.967308 -14.74846 98.89797 -13.90171 -10.15937 98.8968 -16.74091 -2.664334 98.89707 -16.13968 4.11133 98.89775 -13.8289 8.981401 98.89791 -9.947895 12.99927 98.89802 -5.320919 15.37438 98.89761 -0.2723121 16.2175 98.89787 4.946775 15.48297 98.89772 9.692212 13.1595 98.89808 13.59492 9.293125 98.89797 16.11474 4.233342 98.8977 16.74154 -2.664403 98.89762 14.55216 -8.965528 98.89785 11.3318 -12.94484 98.898 6.818603 -15.94503 98.89794 1.595023 -17.28679 98.89791 -4.885943 33.43282 68.17621 -4.7519 33.43282 66.05437 -3.774839 33.43282 64.13764 -1.66372 33.43282 62.68033 0.4492345 33.43282 62.44388 2.094844 33.39454 62.82079 3.817525 33.43282 64.18841 4.762338 33.43282 66.093 5.024706 33.40277 67.10101 4.071759 33.43282 70.24767 2.063234 33.43282 71.82031 0.4092838 33.43282 72.25626 -2.148192 33.43282 71.86166 -4.04567 33.43282 70.15679 -10.75566 28.06883 98.89849 -18.30907 23.90184 98.89844 15.58799 25.85326 98.8988 -2.13081 29.9102 98.89842 5.624785 29.49856 98.89843 26.80252 14.21256 98.89877 30.42261 3.587103 98.89894 -30.49541 -1.862897 98.89838 -23.94874 18.36002 98.89842 -29.30059 8.794404 98.89994 14.23392 -27.59361 98.89847 5.773744 -30.62265 98.89847 29.94952 -6.868041 98.89882 26.90606 -15.03025 98.89847 -15.94574 -26.80319 98.89886 -4.856221 -30.79422 98.89881 -28.30504 -12.60282 98.89981 -12.89702 28.2314 97.9186 -7.398867 30.05481 97.89833 -19.22258 24.45783 97.88661 -23.24171 20.698 97.89833 -31.48612 0.3695068 97.89833 -30.89889 5.826431 97.90331 -27.87339 14.41088 97.86993 -30.89025 -7.416829 97.86993 -27.57819 -15.89431 97.9033 -21.94001 -23.36618 97.87857 -5.426847 -31.73806 97.89318 -14.30896 -28.68566 97.90329 3.924966 -31.87036 97.91862 12.90067 -29.45804 97.90663 22.14208 -23.17009 97.87857 31.54193 -1.404008 97.88658 30.46607 -8.773863 97.9033 27.6855 -15.69981 97.9033 25.59338 17.79993 97.89833 28.43797 13.10599 97.9033 30.85324 6.043748 97.9033 21.83722 22.20974 97.91856 17.59742 25.56238 97.89833 12.54091 28.38831 97.91862 -1.980224 30.92668 97.90329 5.472026 30.5108 97.90329 2.200063 30.90948 92.39834 9.531154 29.51227 92.39834 16.32866 26.43229 92.39834 23.66116 20.44326 92.39834 28.62455 12.70468 92.39834 31.36034 3.641132 92.39834 31.15385 -5.549724 92.39834 29.11116 -12.72785 92.39834 24.27014 -20.86445 92.39834 17.34951 -26.91562 92.39834 10.67435 -30.25359 92.39834 3.40214 -31.93014 92.39834 -4.060378 -31.85173 92.39834 -11.29576 -30.02274 92.39834 -17.8993 -26.54525 92.39834 -24.86386 -20.13264 92.39834 -29.36023 -12.11349 92.39834 -31.25164 -4.894032 92.39834 -31.22112 4.57311 92.39834 -28.33934 13.30321 92.39834 -23.02488 21.13868 92.39834 -14.02717 27.79787 92.39834 -5.254286 30.54571 92.39834 4.333391 33.42885 64.31397 -0.4611958 33.42885 62.07835 -2.990505 33.43053 63.07731 -4.794441 33.42886 65.11261 -5.110973 33.43001 68.71771 -3.37191 33.42991 71.36682 -0.4609349 33.42918 72.61863 3.03423 33.42886 71.68182 4.929498 33.42991 69.14241 -34.58701 -6.718372 92.39891 -30.81139 -17.4399 92.39884 -25.2115 -24.90813 92.39849 -16.02919 -31.9569 92.39963 -3.323593 -35.53669 92.39891 22.40319 26.64915 92.39975 12.65914 32.11639 92.39849 3.323687 34.40895 92.39884 -8.017374 33.63941 92.39884 -16.71229 30.24114 92.39851 9.951461 -34.37851 92.39964 19.9451 -29.38142 92.39849 28.38611 -21.46109 92.39964 -25.9604 23.27966 92.39964 -32.80918 11.99394 92.39884 -34.87579 2.890646 92.39849 34.53695 -7.610457 92.39975 34.58715 5.590579 92.39884 30.81138 16.31227 92.39884 -35.74442 7.446655 53.14831 -36.4087 3.46582 53.14831 -34.64625 11.3302 53.14831 -33.12753 15.06934 53.14831 -31.20668 18.61878 53.14831 -28.90702 21.9353 53.14831 -23.2872 27.71216 53.14831 -26.25647 24.97888 53.14831 -20.03525 30.10242 53.14831 -16.54011 32.12036 53.14831 -12.84418 33.74158 53.14831 -8.992353 34.94629 53.14831 -5.031364 35.71997 53.14831 3.025014 35.94202 53.14831 -1.009301 36.05322 53.14831 7.02261 35.38769 53.14831 10.93496 34.39697 53.14831 14.71458 32.98181 53.14831 18.31558 31.15942 53.14831 21.69426 28.95203 53.14831 27.62378 23.49365 53.14831 24.8096 26.38648 53.14831 30.10265 20.30884 53.14831 32.21611 16.87061 53.14831 33.93851 13.2207 53.14831 36.13151 5.465332 53.14831 35.24895 9.403565 53.14831 36.57549 1.453979 53.14831 36.57549 -2.581909 53.14831 36.13151 -6.59314 53.14831 35.24895 -10.53137 53.14831 33.93851 -14.34851 53.14831 30.10265 -21.43665 53.14831 32.21611 -17.99841 53.14831 27.62378 -24.62146 53.14831 24.8096 -27.51428 53.14831 21.69426 -30.07996 53.14831 18.31558 -32.28735 53.14831 14.71458 -34.10962 53.14831 7.02261 -36.5155 53.14831 10.93496 -35.52478 53.14831 3.025014 -37.06982 53.14831 -1.009301 -37.18103 53.14831 -5.031364 -36.84778 53.14831 -12.84418 -34.86938 53.14831 -8.992353 -36.0741 53.14831 -16.54011 -33.24817 53.14831 -20.03525 -31.23023 53.14831 -23.2872 -28.84009 53.14831 -26.25647 -26.10669 53.14831 -28.90702 -23.06323 53.14831 -33.12753 -16.19727 53.14831 -31.20668 -19.74658 53.14831 -34.64625 -12.45801 53.14831 -35.74442 -8.574463 53.14831 -36.4087 -4.593628 53.14831 -36.63103 -0.5639649 53.14831 15.78429 33.43595 73.3589 -9.209785 35.7955 75.73618 2.124264 36.90701 76.84078 -15.78247 33.43601 61.33686 -12.92859 34.64598 60.11116 -8.152644 36.07307 58.69514 -2.101033 36.9058 57.85337 2.187032 36.89397 89.92891 9.507431 35.75517 89.9251 15.74588 33.47009 89.89833 20.97866 30.58213 89.90333 28.57853 23.93589 89.90625 34.0312 15.31305 89.90316 36.64859 7.626446 89.90317 37.55245 -0.4433306 89.90318 36.70043 -8.518769 89.90319 34.13227 -16.22247 89.90317 29.9684 -23.19337 89.9032 22.91747 -30.42631 89.90626 12.18255 -36.18077 89.90625 2.153662 -38.05477 89.90316 -5.955579 -37.64123 89.9032 -13.78725 -35.49402 89.90318 -22.6439 -30.63422 89.90623 -31.06011 -21.82977 89.90622 -35.54812 -12.66871 89.90319 -37.3192 -4.743949 89.90318 -37.17414 5.35657 89.90625 -34.1324 15.09412 89.90319 -29.96837 22.06552 89.90319 -24.40288 27.97894 89.90318 -19.33323 31.56824 89.89833 -13.04812 34.63294 89.91052 -5.497727 36.55691 89.9208 -36.74782 -8.28375 53.14831 -37.54822 -0.2036533 53.14831 -36.12794 9.998272 53.14831 -31.98751 19.10324 53.14831 -27.01192 25.51967 53.14831 -20.66014 30.80093 53.14831 -13.25021 34.54553 53.14901 -5.917582 36.51664 53.14883 3.584626 36.87557 53.1487 13.30772 34.52523 53.14881 20.70828 30.81143 53.14773 29.01682 23.41138 53.14831 34.22933 14.87488 53.14831 36.7479 7.155948 53.14831 37.55392 -3.112583 53.14831 35.46773 -12.89455 53.14831 30.86477 -22.10819 53.14831 22.3699 -30.83565 53.14831 13.56318 -35.57887 53.14831 5.718395 -37.67592 53.14831 -2.392536 -38.03765 53.14831 -12.50297 -36.06697 53.14831 -23.18488 -30.21605 53.14831 -30.11013 -22.99995 53.14831 -34.22904 -16.00325 53.14831 12.17738 34.93448 59.82674 15.7961 33.43609 61.31904 7.087593 36.26489 58.49852 3.270331 36.80754 57.94678 -15.79765 33.43607 73.37878 -4.103998 36.73905 76.66783 12.9903 34.62224 74.56211 -12.92607 34.65119 74.59443 8.396646 36.01351 75.94995</float_array>
52
+ <technique_common>
53
+ <accessor source="#eSeries_UR5e_058-mesh-positions-array" count="485" stride="3">
54
+ <param name="X" type="float"/>
55
+ <param name="Y" type="float"/>
56
+ <param name="Z" type="float"/>
57
+ </accessor>
58
+ </technique_common>
59
+ </source>
60
+ <source id="eSeries_UR5e_058-mesh-normals">
61
+ <float_array id="eSeries_UR5e_058-mesh-normals-array" count="2583">0.002150475 0.9972043 -0.07469272 -0.01779347 0.9998417 4.43543e-4 -0.01041597 0.9997109 0.02167063 -0.3783033 0.2171291 0.8998564 -0.1535174 0.963819 0.2179116 -0.7400171 0.5829507 0.3354749 -0.8154255 0.5560721 0.1608261 -0.7999817 0.5928488 0.09251844 -0.8319238 0.5326645 -0.1554718 -0.7317873 0.4948434 -0.4686335 -0.4220776 0.8667503 -0.2656963 -0.360688 0.9089055 -0.209273 -0.2875034 0.7159588 -0.6361956 0.195325 0.5340406 -0.8225866 0.2008437 0.7518067 -0.6280513 0.5979058 0.5673418 -0.5662438 0.3403425 0.8114426 -0.4751085 0.3384783 0.8208199 -0.4600948 0.7003772 0.5102028 -0.4991642 0.7999774 0.5676078 -0.1945707 0.8245098 0.5618029 0.06753683 0.7362138 0.6539651 0.1741235 0.2850727 0.9570316 0.05314314 0.798052 0.2430915 0.5513797 0.6978553 0.634234 0.3327842 0.6427119 0.3127328 0.6993709 0.4938904 0.5609467 0.6643878 0.2854714 0.4891712 0.8241467 0.1319622 0.9146882 0.3820099 -0.07153379 0.3059868 0.9493446 0.04103285 0.588993 0.8070958 -0.03364229 0.7187761 0.6944271 0.005223155 0.8585524 0.5126994 -0.3822332 0.6137039 0.690844 -0.4646356 0.4132941 0.7831359 -0.2868674 0.9246489 0.2504629 -0.4486727 0.7979454 0.4024625 -0.7523427 0.2259672 0.6188048 -0.2884664 0.9570884 -0.0277332 -0.3289158 0.9442497 0.01439255 -0.7248888 0.6015217 -0.33572 -0.07867342 0.9730561 -0.216731 -0.3330715 0.6032807 -0.7246488 -0.4367933 0.5160385 -0.7368283 -0.08954393 0.8767063 -0.4726182 -0.1638815 0.4673034 -0.8687753 0.002859473 0.9977222 -0.06739789 0.143306 0.4892879 -0.8602678 0.4778828 0.2949252 -0.8274341 0.29725 0.9541124 -0.03622466 0.4437423 0.8735571 -0.1999772 0.7756565 0.5905761 -0.2226594 0.3502865 0.9307309 0.1050688 0.4322614 0.7832224 0.4468923 0.4822725 0.7270469 0.4886883 0.06084287 0.9959357 0.06641036 -0.9600573 -0.08337664 0.2670924 -0.9833262 0.03571057 0.1783097 -0.7693659 0.1566568 0.619302 -0.5857934 -0.1256485 0.8006615 -0.3860917 0.1070378 0.9162293 -0.07825058 -0.05716335 0.9952936 -3.65875e-4 0.04400873 0.9990311 0.4303978 -0.02916222 0.9021682 0.3266109 0.0652064 0.942907 0.6250748 0.09189897 0.7751364 0.8386936 -0.07257521 0.5397462 0.8720682 0.02508276 0.4887412 0.9807304 0.1176787 0.1559483 0.9982805 -0.04607522 -0.03623843 0.8896276 -0.01671659 -0.4563807 0.9625689 0.07725268 -0.2597943 0.8117079 0.08049327 -0.5784906 0.5411733 -0.004260241 -0.8409003 0.5196999 0.02928692 -0.8538469 -0.06639337 -0.03607869 -0.9971411 0.08885699 0.0729689 -0.9933681 -0.1608988 0.04309797 -0.9860295 -0.5806413 -0.02160191 -0.8138729 -0.5099064 0.06671595 -0.857639 -0.9207525 -0.05470514 -0.3862931 -0.837975 0.09153521 -0.5379772 -0.9768903 0.100194 -0.1888031 0.5239365 0.1118105 0.8443868 0.3138871 0.4287039 0.8471648 -0.02001523 0.527216 0.8494957 -0.3064716 0.4290767 0.8496873 -0.5183449 0.1345685 0.8445175 -0.4540841 -0.284291 0.8443852 -0.1483583 -0.5101798 0.8471756 0.1990627 -0.4885797 0.8495081 0.4460645 -0.2876003 0.8475332 -2.44084e-7 0 1 0 0 1 -2.52343e-6 0 1 -4.35204e-6 0 1 4.18398e-6 0 1 -2.44084e-7 0 1 -2.1296e-6 0 1 5.04686e-6 0 1 -4.04877e-6 0 1 5.94784e-6 0 1 -4.61454e-6 0 1 2.78932e-6 0 1 2.40993e-6 0 1 -2.52343e-6 0 1 -6.37155e-6 0 1 5.52117e-6 0 1 -4.82629e-6 0 1 2.52342e-6 0 1 -2.97392e-6 0 1 -1.80986e-6 0 1 2.5988e-6 -3.65581e-7 1 1.25917e-6 -3.65248e-7 1 1.7252e-6 -8.47052e-7 1 1.22993e-6 -5.48993e-7 1 4.24437e-7 -1.23506e-6 1 1.50629e-6 1.81749e-6 1 2.3322e-6 -1.70483e-6 1 3.08224e-6 2.74328e-6 1 3.54379e-6 4.61392e-6 1 7.08553e-6 5.18635e-6 1 -1.04676e-5 -4.03946e-6 1 -1.5547e-5 -3.45798e-6 1 -7.53115e-6 -3.45466e-6 1 -7.364e-6 -3.38857e-6 1 -4.26408e-5 -1.13102e-6 1 -4.92149e-6 6.93268e-6 1 -7.11433e-6 1.8258e-5 1 -0.9973172 -0.06729 -0.0288186 -0.9211853 0.0453003 -0.3864787 -0.8927308 -0.003415346 -0.4505775 -0.5807706 0.004379689 -0.8140555 -0.5478512 -0.02883869 -0.8360786 -0.06634509 0.05260419 -0.9964092 0.05801963 -0.05260783 -0.9969284 0.5409435 0.02972376 -0.8405337 0.5744439 -0.003892362 -0.8185348 0.8897458 0.003925144 -0.4564397 0.894056 -0.002730786 -0.447947 0.9993349 0.003727436 -0.03627657 0.9982149 0.020392 -0.05613797 0.9171649 -0.03837043 0.3966564 0.8394768 0.0584473 0.5402432 0.6618474 -0.05414384 0.7476808 0.4295057 0.07055342 0.9003039 0.08625513 -0.07795453 0.9932186 -0.07831335 0.04265767 0.9960159 -0.5902373 -0.02809131 0.8067409 -0.5238412 0.06069082 0.8496512 -0.8507225 -0.0645948 0.521631 -0.9585838 0.09996539 0.2666909 -0.03725796 0.999177 0.01603502 -0.06060522 0.9981195 0.009198188 -0.5817298 0.8132616 0.01400017 -0.6142721 0.7890916 0.002077996 -0.9677634 0.25032 0.0278244 -0.9834991 0.180893 0.002713859 -0.8479029 -0.5297889 0.01960515 -0.8491474 -0.5277587 0.02048116 -0.3914582 -0.9201959 -1.8077e-4 -0.2790778 -0.9597166 0.03255605 0.2237115 -0.9746417 -0.005173087 0.3765071 -0.9259012 0.03081232 0.6862159 -0.7273977 6.55408e-4 0.8404667 -0.5399849 0.04508042 0.9799585 -0.1985127 -0.01655685 0.9772299 0.2076454 0.04364693 0.9183879 0.3956484 -0.005106568 0.5905987 0.8066324 0.0231831 0.5483855 0.836187 0.008040428 -0.4025804 0.9153723 0.004766762 -0.4318608 0.9019318 -0.003930687 -0.8063434 0.5914337 0.004077255 -0.8234443 0.5673834 -0.00397408 -0.9986721 0.0512759 0.004994153 -0.9966313 0.08048796 0.01574915 -0.8747062 -0.4836862 -0.03060972 -0.7815234 -0.623483 0.02214604 -0.3870938 -0.9220287 0.004665374 -0.2799884 -0.9594751 -0.03184854 0.2631894 -0.9642252 0.03164082 0.4301598 -0.90239 -0.02559542 0.8533495 -0.521157 0.0137853 0.8967754 -0.4423477 -0.01107895 0.9987322 -0.04833912 0.01405239 0.9953222 0.09490334 -0.01808655 0.8163662 0.5772994 0.01648217 0.777351 0.6290245 -0.007327675 0.1712327 0.9852064 0.0069139 0.1366679 0.9905988 -0.006002962 -0.4025803 0.9153757 0.004080653 -0.4294194 0.9030964 -0.003972887 -0.8228304 0.568269 0.004527926 -0.840521 0.5417493 -0.005660593 -0.9999639 -0.00680691 0.00510317 -0.9915698 -0.1265079 -0.02802079 -0.8888289 -0.4573978 0.02776038 -0.5912085 -0.8059114 -0.03129565 -0.4449841 -0.8952745 0.02174216 0.03614455 -0.9991975 -0.01726114 0.2631899 -0.9642249 0.03164649 0.4838058 -0.8749073 -0.02166467 0.8533506 -0.5211551 0.01378577 0.8967766 -0.442345 -0.01107829 0.9987322 -0.04833841 0.01405251 0.987173 0.1564322 -0.03191357 0.8156912 0.5768218 0.04387217 0.615378 0.7874073 -0.03605067 0.1711975 0.9850078 0.02123892 0.07933634 0.99684 -0.003972232 -0.3294599 0.9436687 -0.03075248 -0.4783406 0.8779194 0.02116221 -0.8408601 0.5412217 0.005785226 -0.8978714 0.4391341 -0.03143697 -0.9997356 -0.00680536 0.0219655 -0.9531061 -0.3009493 -0.03191316 -0.889104 -0.4575387 0.01234656 -0.4450858 -0.8954793 -0.003958046 -0.4391756 -0.8983765 -0.006672024 0.2633156 -0.9646871 0.006625711 0.2969003 -0.954876 -0.007888913 0.8534131 -0.5211962 0.006397783 0.8965438 -0.4423683 -0.02279627 0.9985798 -0.04833197 0.02241867 0.9709791 0.2374767 -0.02836334 0.8329167 0.5526741 0.02830344 0.7014523 0.7124869 -0.01809 0.2543118 0.9669818 0.01648187 0.2516022 0.9677074 0.0154525 -0.2669122 0.9630519 -0.0359016 -0.4783051 0.8778563 0.024347 -0.8407472 0.54115 -0.01734536 -0.806443 0.591291 0.004960894 -0.9997577 0.01745015 -0.01342183 -0.9999658 -0.006807029 -0.00472033 -0.8888977 -0.4574344 0.02479183 -0.7430663 -0.6683921 -0.03323489 -0.4449113 -0.8951273 0.02830249 -0.2176427 -0.9756845 -0.02590906 0.2631837 -0.9642064 0.03225594 0.4330126 -0.9010303 -0.02539342 0.8533496 -0.5211569 0.01378649 0.9097005 -0.4148086 -0.01946735 0.9985798 -0.04833257 0.02241867 0.9709788 0.2374777 -0.02836358 0.8329166 0.5526745 0.02830308 0.7217977 0.6920064 -0.01163232 0.3592764 0.9332257 -0.003207683 0.2542253 0.966652 0.03088015 -0.08186733 -0.9965721 0.01190471 -0.1244757 -0.9917801 -0.0296362 -0.3985033 -0.916862 0.02364897 -0.4322249 -0.9017448 -0.006174504 -0.6723827 -0.7393596 0.0353406 -0.617119 -0.786765 -0.01284658 -0.8746958 -0.4832726 0.03680944 -0.8134451 -0.5805583 -0.03548491 -0.98375 -0.1755653 0.03758728 -0.9553046 -0.2931285 -0.03832602 -0.987774 0.1509695 0.03886872 -0.9990289 0.02451646 -0.03661048 -0.8862646 0.4614721 0.03973317 -0.9403821 0.337952 -0.03834205 -0.6899474 0.7227312 0.0404033 -0.7828371 0.6209779 -0.03940105 -0.4196285 0.9067511 0.04140543 -0.5453147 0.837415 -0.03698474 -0.09642058 0.9948675 0.03069144 -0.2739133 0.9613278 -0.02864319 -0.04232019 0.9990514 -0.01027214 0.2637465 0.9641541 0.02906429 0.2255841 0.9742231 0.001091241 0.4251167 0.9046683 -0.02917236 0.5624254 0.8258373 0.04087239 0.6748779 0.7369394 -0.03821438 0.7988591 0.6001772 0.0401436 0.8737579 0.4848441 -0.03838491 0.9498013 0.3103757 0.03930205 0.9811083 0.1905602 -0.03336948 0.9994612 -0.01248431 0.030357 0.9964024 -0.08293652 -0.01743364 0.9423823 -0.334091 0.01728731 0.9489119 -0.3155411 2.86549e-4 0.7844194 -0.6199458 0.01879853 0.8111549 -0.5845257 -0.01891231 0.5428046 -0.8396222 0.0199477 0.5832011 -0.812058 -0.02093422 0.2434876 -0.9698965 0.003819048 0.2718688 -0.961979 -0.02614998 -0.20191 -0.6945081 0.6905729 -0.2024571 -0.7246862 0.6586661 0.3036103 -0.6369221 0.7086262 0.3319224 -0.6678031 0.6662331 0.6320966 -0.3098723 0.7102345 -0.6263728 -0.3433949 0.6998123 -0.6055538 -0.3225954 0.7274867 -0.3021122 0.6244406 0.7202792 -0.4815719 0.7616984 0.433479 -0.421014 0.2900964 0.8594135 -0.9497863 0.07604956 0.3035171 -0.7364646 0.1137897 0.6668371 0.8681538 -0.3225975 0.3771473 0.5026686 0.04637271 0.8632346 0.7722735 0.6245774 0.1161757 0.6338141 0.4376524 0.6377618 0.09679985 0.6978346 0.7096878 0.088642 0.7479806 0.6577748 0.9028256 0.1415306 0.4060481 0.5869852 0.02624905 0.809172 0.714221 0.6009756 0.3587712 0.3349164 0.4334057 0.8366545 0.2971219 -0.5368025 0.7896592 0.7150602 -0.5972582 0.3632789 0.5007281 -0.2447395 0.8302855 -0.3262887 -0.4467951 0.8330126 -0.4136654 -0.836306 0.3598241 0.02124214 -0.5938846 0.8042699 0.2202106 -0.8283915 0.5150485 0.0699799 0.8681054 0.4914225 0.08087921 0.8204182 0.5660148 -0.263486 0.5541101 0.7896438 -0.5365969 0.7269631 0.4284725 -0.4670118 0.3018907 0.831121 -0.8599454 0.2429301 0.4488641 -0.5534841 -0.06942343 0.8299614 -0.8099321 -0.2415341 0.5344824 -0.2252497 -0.4729936 0.8517861 0.2721373 -0.8768578 0.3963105 0.1963366 -0.7441219 0.6385409 0.6341481 -0.3119087 0.7075092 0.6794836 -0.3207229 0.659878 0.6833239 0.1689413 0.7103008 -0.4981902 0.2376498 0.8338639 -0.1078777 0.233492 0.966356 -0.9260568 -0.07940775 0.3689355 -0.5235453 -0.1598003 0.8368778 -0.6331622 -0.7647823 0.1192224 -0.6190473 0.4954888 0.6093204 0.8247778 0.2686597 0.4975577 0.3854806 0.3893973 0.8365254 0.4025263 0.8503766 0.338869 0.1593179 0.6127339 0.774064 -0.2556105 0.747117 0.6135793 -0.1736909 0.6196172 0.765445 0.4324235 0.4103958 0.8028606 0.4648499 0.6527881 0.5981491 0.299105 -0.6149514 0.7296376 0.3416686 -0.6594872 0.6695815 0.641959 -0.2927309 0.7086589 0.6835601 -0.2981994 0.6662003 0.68335 0.1689392 0.7102764 0.7522032 0.2145722 0.6230161 -0.8590294 0.1574763 0.4871035 -0.5710653 0.01285225 0.8208041 -0.7510111 -0.5203148 0.4065155 -0.4641892 -0.4198634 0.7798995 -0.1729077 -0.7582333 0.6286377 -0.1739067 -0.7441044 0.6450311 0.2015069 0.5241011 0.8274739 -0.07604038 0.9337522 0.3497496 -0.1558236 0.5622532 0.8121517 -0.6039784 0.6104393 0.5124198 -0.4912992 0.3578508 0.7940831 0.1516169 0.6485378 0.7459296 0.2967596 0.6891446 0.6610701 0.2994583 0.6306506 0.7159641 0.4971649 0.5347483 0.6832799 0.5067699 0.5551075 0.6595757 0.5515856 0.3060833 0.7759294 0.7985486 0.3024734 0.5204133 0.6140738 0.1162668 0.7806379 0.7409639 -0.05748802 0.6690796 0.7624616 -0.06772065 0.64348 0.6204832 -0.2075697 0.756251 0.7059682 -0.3349962 0.6240084 0.5147278 -0.3708814 0.7729829 0.5642214 -0.5450161 0.6201707 0.3645438 -0.5096313 0.7793484 0.351756 -0.6851531 0.6378346 0.1695873 -0.593656 0.7866467 0.1273255 -0.7626141 0.6341986 -0.09386134 -0.6670563 0.739071 -0.08742862 -0.7007966 0.7079834 -0.3171467 -0.6476383 0.6928079 -0.3181692 -0.6623607 0.6782674 -0.4126171 -0.5270186 0.7429661 -0.5568165 -0.562066 0.611586 -0.5223858 -0.3696209 0.7684358 -0.7063104 -0.351784 0.6143075 -0.6021003 -0.1883928 0.775876 -0.817753 -0.0743162 0.5707515 -0.6411595 0.01817548 0.7671924 -0.7063237 0.2538485 0.6608085 -0.6859372 0.2383581 0.687514 -0.5433589 0.4282752 0.7220398 -0.5554559 0.4495356 0.6995618 -0.4004907 0.6024643 0.6903941 -0.380333 0.588084 0.7137956 -0.1925175 0.6711386 0.7158982 -0.1841504 0.7169002 0.6724156 -0.02917951 0.6604265 0.7503236 0.0575627 0.7932412 0.6061807 -0.9980105 -2.03075e-4 -0.06304764 -0.8927373 0.001191437 -0.450576 -0.8909222 -0.001644194 -0.4541531 -0.5480773 0.003116428 -0.836422 -0.5678872 0.02691471 -0.8226664 -0.111127 -0.03894621 -0.9930428 0.0580008 0.05909937 -0.9965657 0.2229915 -0.01140475 -0.9747537 0.5739738 0.04073005 -0.8178601 0.6217871 -0.001416444 -0.7831852 0.8940544 0.002594172 -0.4479509 0.8958321 -2.02968e-4 -0.4443928 0.9984217 0.001191437 -0.05615019 0.9596759 0.1365488 -0.245717 0.9551824 -0.06013792 0.2898449 0.9176107 0.02241563 0.3968477 0.6625882 0.0265693 0.7485125 0.6163 -0.02464556 0.7871258 0.2548075 -0.02262002 0.9667272 0.08626967 0.07611984 0.9933597 -0.1522208 -0.05951213 0.9865531 -0.5238533 0.06014269 0.8496828 -0.6677834 -0.04089045 0.7432317 -0.8517411 0.04227775 0.5222546 -0.919759 -0.04218381 0.3902101 -0.9992978 0.02387785 -0.028876 0.006689131 0.01612097 0.9998477 0.001814842 0.02502256 0.9996852 0.005356311 0.03449791 0.9993904 -0.006877303 0.005575537 0.9999608 0.01261651 -0.004707694 0.9999094 0.008130729 0.007966101 0.9999352 0.007105767 -0.01542979 0.9998558 -0.007700681 -0.00138992 0.9999695 -0.008696138 0.002795517 0.9999583 0.0228641 -0.02626478 0.9993936 0.005033373 -0.02354222 0.9997102 0.01475703 -0.02801537 0.9994986 -0.006638109 -0.01804172 0.9998153 -0.002412676 -0.04543709 0.9989643 -0.01310139 -0.01592522 0.9997873 -0.01511096 -0.01322019 0.9997984 9.61306e-4 4.24752e-4 0.9999995 -6.90767e-4 2.19142e-4 0.9999998 -1.04367e-5 -1.4157e-5 1 6.15798e-4 5.94294e-4 0.9999997 5.72169e-4 3.10764e-4 0.9999998 -0.017062 -0.0169214 0.9997113 0.001658499 -2.53107e-4 0.9999987 -2.70497e-4 3.82581e-4 1 -0.001305878 -0.001066744 0.9999986 -0.001319289 -4.34345e-4 0.9999991 0.01167482 -0.004504442 0.9999217 -0.007438898 -0.003839135 0.999965 2.01217e-4 -5.15871e-4 0.9999999 -3.63314e-4 4.63325e-4 0.9999998 -4.78474e-4 -2.46196e-4 0.9999999 -3.00647e-4 2.63507e-4 1 9.54904e-5 -1.09887e-5 1 -1.97389e-5 2.30427e-4 1 -2.19821e-4 7.19249e-5 1 -0.001888751 6.64351e-5 0.9999982 5.80782e-4 -7.90271e-4 0.9999996 4.72077e-4 -8.64141e-4 0.9999995 -9.57899e-6 -3.0031e-4 1 0.005194544 -0.005391418 0.999972 0.002932488 -0.003127515 0.9999908 5.71517e-4 -2.1039e-4 0.9999998 6.04946e-4 -2.88786e-4 0.9999998 3.78189e-4 -5.42802e-5 1 0.002624034 8.91554e-4 0.9999962 -0.01432234 0.01152515 0.9998311 -1.11743e-4 5.18445e-4 1 -1.82592e-4 5.10687e-4 0.9999999 -0.05498623 0.063923 0.9964389 9.35328e-5 -4.19209e-4 1 -5.25281e-4 1.28107e-5 0.9999999 -7.30716e-4 3.95586e-4 0.9999997 -3.80062e-4 9.76727e-5 1 -0.001161813 0.004278361 0.9999902 5.66682e-4 -1.55769e-4 0.9999998 1.3916e-4 -2.26817e-4 1 9.74816e-4 -5.62352e-5 0.9999995 7.46949e-4 -5.65129e-4 0.9999997 0.002019166 -6.79532e-4 0.9999978 5.34311e-4 -3.27773e-4 0.9999999 -2.41626e-4 -9.16242e-5 1 1.70261e-4 4.63749e-4 1 -5.402e-4 5.85697e-4 0.9999998 9.25175e-5 -2.70097e-5 1 4.54775e-5 -1.93099e-5 1 2.4948e-5 1.55204e-5 1 3.5847e-4 7.67681e-4 0.9999997 -1.82369e-4 6.1849e-5 1 -3.33993e-4 -8.75355e-4 0.9999996 0.01370501 0.01312202 0.9998199 3.66285e-4 -1.92181e-4 1 4.82823e-4 2.32505e-4 0.9999999 4.98163e-5 -7.38703e-5 1 0.04572039 0.04638987 0.9978766 3.17673e-5 1.31674e-4 1 -5.89656e-4 -5.16885e-4 0.9999998 1.44981e-4 1.66542e-4 1 2.29044e-4 1.97358e-5 1 -1.62181e-5 3.69577e-5 1 -5.15186e-5 2.53036e-5 1 -2.56194e-5 2.3072e-4 1 0.001517891 9.54955e-4 0.9999984 2.09057e-4 5.84639e-4 0.9999998 -7.84725e-5 1.5517e-4 1 1.61326e-4 8.85292e-4 0.9999996 1.60542e-4 9.26526e-4 0.9999997 -0.2389619 0.7276921 0.6429319 -0.3765054 0.6253249 0.6835295 -0.3091064 0.5603009 0.7684506 -0.477755 0.5129357 0.7131951 -0.4549421 0.4629807 0.760708 -0.612339 0.06517565 0.7879042 -0.8374798 0.2969381 0.4587542 -0.4944101 0.2767471 0.8239961 -0.6267995 0.4589092 0.6297021 -0.6260499 0.07007396 0.7766281 -0.774376 -0.06155759 0.6297242 -0.5551677 -0.1131168 0.8240106 -0.8282616 -0.321788 0.4587323 -0.4585701 -0.3487271 0.8173756 -0.5892837 -0.4143003 0.6936138 -0.2015533 -0.589094 0.7825245 -0.4899526 -0.7004607 0.5189426 -0.3995826 -0.461811 0.791874 -0.2306082 -0.6407838 0.7322677 -0.01213711 -0.7256517 0.6879553 0.0101431 -0.6268507 0.7790734 0.209577 -0.7768514 0.593784 0.2038769 -0.5694348 0.7963532 0.4419319 -0.6467215 0.621649 0.3962486 -0.5366246 0.7449975 0.7778717 -0.1121536 0.6183342 0.6132687 -0.2287026 0.7560402 0.6636172 -0.2664275 0.6990198 0.5668957 -0.4057072 0.7169595 0.5967854 -0.4450643 0.6676564 0.4557566 -0.4460535 0.7702741 0.6585572 0.3997737 0.6375605 0.6069881 0.2068147 0.7673287 0.6034569 0.2063794 0.7702255 0.8333409 0.07583004 0.5475334 0.6010773 -0.02720725 0.7987277 0.5230273 0.4421549 0.7286574 0.4889497 0.3833248 0.7835753 0.4340823 0.5532323 0.7109899 0.4215942 0.5240064 0.7400512 0.395665 0.7037443 0.590079 -0.1309867 0.6135642 0.778705 -0.1138483 0.7035749 0.7014421 0.03695303 0.6962858 0.7168129 0.03925979 0.7035228 0.7095875 0.2091321 0.7014213 0.681375 0.2034358 0.556101 0.8058322 0.1870672 0.9815284 -0.0401023 0.2872882 0.9570809 0.03823322 0.4123927 0.9101482 -0.03953129 0.4877715 0.8725991 0.02549451 0.6202052 0.7842087 -0.01903671 0.6321102 0.7739067 -0.03879582 0.760635 0.6476831 0.04405999 0.8541122 0.5175502 -0.05132418 0.8416934 0.5398475 -0.01082783 0.9461615 0.3235841 0.008478999 0.9566506 0.2887612 -0.03790473 0.99444 0.09184056 0.051521 0.9983079 -0.02242887 -0.05365061 0.9887703 -0.1442528 0.03904759 0.96104 -0.2734847 -0.04010474 0.9272931 -0.372282 0.03916347 0.8581686 -0.5105831 -0.05340236 0.8014613 -0.5949361 0.06091773 0.6570082 -0.751411 -0.06100654 0.5612031 -0.8244779 0.07271355 0.4466621 -0.8932179 -0.05152446 0.2594392 -0.9651418 0.03453534 0.2246353 -0.974384 -0.01072341 -0.01417732 -0.9998255 0.01216912 -0.01050484 -0.9997816 0.01807069 -0.2448702 -0.9686948 -0.04085606 -0.3245124 -0.9444637 0.05177164 -0.4655774 -0.8840982 -0.04010319 -0.5711393 -0.8190733 0.05402821 -0.6755722 -0.733722 -0.07248634 -0.7961606 -0.6010044 0.07015776 -0.8709969 -0.4883714 -0.05345946 -0.9302618 -0.3632406 0.05166602 -0.9659988 -0.2530803 -0.05288523 -0.9966089 -0.07638013 0.03060799 -0.9989514 0.003221273 -0.04567039 -0.9936939 0.1069033 0.03382647 -0.9429661 0.3322603 -0.02044987 -0.9494575 0.3134129 0.0174067 -0.8268272 0.5608012 -0.04311686 -0.8050461 0.5930024 0.01577675 -0.6827699 0.7299511 0.03157025 -0.5932725 0.8016144 -0.07377165 -0.5121011 0.8581085 0.03745013 -0.3147987 0.9491049 -0.01008987 -0.2987533 0.9538151 -0.0313602 -0.1588267 0.9869599 0.02616018 -0.04870319 0.998008 -0.04010027 0.05567574 0.9976807 0.03916257 0.8401483 0.5026333 -0.2037416 0.008746087 0.9999524 -0.004340469 0.02087879 0.9983095 -0.05424183 0.0590744 0.9856919 -0.1578665 -9.48839e-4 0.9999638 -0.008466243 -0.009181439 0.9996473 -0.02492207 -0.003044724 0.9999856 -0.004404962 -0.02031427 0.9996464 -0.01716154 -0.007576525 0.9999638 -0.00386542 -0.03877758 0.9992449 -0.002449452 -0.0167731 0.9998578 -0.001797199 -0.006165266 0.9999776 0.002608835 -0.02370613 0.9995967 0.01563739 -0.00431925 0.9999791 0.004807651 -0.04352909 0.9938274 0.1020421 -0.001131713 0.9999727 0.007324934 0.007216811 0.9995988 0.02738857 0.008608102 0.9994566 0.03181958 0.004986047 0.9999673 0.006365418 0.1017125 0.9918677 0.07650518 -0.01461428 0.9997956 -0.0139752 1.46324e-4 3.87883e-5 1 1.60848e-4 5.08171e-5 1 1.1234e-4 6.36224e-5 1 9.98582e-5 2.34196e-5 1 2.23582e-5 2.84479e-5 1 8.02447e-5 2.65663e-4 1 1.54505e-4 2.91262e-4 1 1.0458e-4 4.11848e-4 1 1.06372e-4 1.74444e-4 1 -2.23131e-4 -2.72562e-4 1 -2.28079e-4 -1.71551e-4 1 -1.22804e-5 -3.60465e-5 1 1.74487e-5 -7.86134e-5 1 -2.46608e-5 -1.35593e-4 1 7.13099e-6 -1.46181e-4 1 1.02512e-5 -1.53462e-4 1 3.86596e-5 -1.27184e-4 1 -8.0392e-6 -7.77374e-5 1 2.22421e-6 1.53533e-4 1 -8.18367e-5 3.09842e-4 1 -7.6333e-5 3.27669e-4 1 -1.74931e-4 3.44632e-4 1 5.51728e-5 1.18016e-4 1 -2.60745e-5 3.06124e-5 1 -2.91909e-4 1.64901e-4 1 -2.88579e-4 1.72597e-4 1 9.75664e-5 3.58371e-5 1 2.2252e-4 -3.0068e-4 1 2.98259e-4 -2.00494e-4 1 1.64807e-4 -1.68648e-4 1 1.28133e-4 -4.11666e-5 1 6.96547e-5 -5.40427e-5 1 4.24003e-5 -1.28048e-7 1 1.46141e-4 4.79675e-5 1 -4.33226e-4 1.84561e-4 0.9999999 -3.55581e-4 1.01184e-4 1 -4.18273e-4 9.24682e-6 1 -1.95315e-4 6.95277e-5 1 -1.30614e-4 -3.98378e-5 1 -1.48192e-4 -5.1291e-5 1 -1.12156e-4 -7.17586e-5 1 -2.24343e-4 -2.73772e-4 1 -0.01439172 0.7281541 0.6852624 0.001472413 0.7056044 0.7086045 3.97761e-4 0.7061483 0.7080639 2.96073e-4 0.7070906 0.7071229 -6.22458e-4 0.7107927 0.7034013 6.42448e-4 0.7072328 0.7069804 -4.41978e-4 0.707781 -0.7064319 -4.98617e-4 0.7071241 -0.7070893 -8.90446e-4 0.7050478 -0.7091593 4.57125e-4 0.7091026 -0.7051052 0.001387536 0.7109299 -0.7032616 0.01216888 0.7260152 -0.687571 0.113295 0.7260004 0.6782977 0.1584908 0.6452634 0.7473392 0.253601 0.6843442 0.683637 0.3330044 0.5936692 0.7325742 0.323718 0.5878387 0.7413855 0.511249 0.5848796 0.6297146 0.4882578 0.3970912 0.7771248 0.6356387 0.4017118 0.6592353 0.6395879 0.2252364 0.7349802 0.6545177 0.2228748 0.7224496 0.734399 0.08225673 0.6737152 0.6410704 -0.002385556 0.7674783 0.7391986 -0.07799094 0.6689566 0.6922105 -0.2307602 0.6838088 0.5703911 -0.2533086 0.7813378 0.6381311 -0.381168 0.6689543 0.5223516 -0.5089176 0.6842161 0.4552749 -0.4853106 0.7464572 0.3310889 -0.6619867 0.6724238 0.3242376 -0.6048644 0.7273302 0.1380621 -0.7399269 0.658367 0.05571579 -0.6391038 0.7670997 -0.03793001 -0.7438522 0.667267 -0.1825998 -0.6482449 0.739213 -0.1753228 -0.6394535 0.7485727 -0.3735514 -0.6811707 0.6296554 -0.3908606 -0.5090436 0.7668785 -0.5527231 -0.5283459 0.6444748 -0.5285173 -0.3963288 0.7507284 -0.6796041 -0.3327223 0.6537845 -0.6173318 -0.2174006 0.7560678 -0.7269005 -0.1624516 0.6672519 -0.6823192 -0.02047443 0.7307677 -0.7299969 0.01027691 0.6833732 -0.6500359 0.1475392 0.7454432 -0.7176666 0.2243853 0.6592466 -0.5757516 0.3493458 0.7392345 -0.5692571 0.340018 0.7485547 -0.558748 0.5258736 0.6412939 -0.3987229 0.5298114 0.7485453 -0.4003402 0.5664267 0.7203393 -0.3207816 0.6551402 0.6840253 -0.2439303 0.6240524 0.7423319 -0.1854588 0.7242548 0.6641236 -0.04540723 0.6691927 0.7417003 -0.0313431 0.6973569 0.7160384 -3.74904e-6 0 -1 8.08159e-6 0 -1 0 0 -1 -9.47252e-6 0 -1 3.55559e-6 0 -1 6.13187e-6 0 -1 -4.15702e-6 0 -1 0 -2.47321e-6 -1 2.02631e-6 -3.29473e-6 -1 0 -3.60118e-6 -1 -1.56611e-4 5.03961e-4 -1 -3.13196e-4 7.06959e-4 -0.9999998 -2.31915e-4 7.4578e-4 -0.9999997 -2.37799e-4 7.96402e-4 -0.9999997 -1.05266e-4 5.34965e-4 -0.9999999 -4.90517e-5 5.96251e-4 -0.9999999 -4.08371e-5 6.9331e-4 -0.9999998 9.96386e-6 4.05993e-4 -1 5.28479e-5 3.81031e-4 -1 1.64278e-4 6.24175e-4 -0.9999999 1.69945e-4 6.64038e-4 -0.9999998 1.78693e-4 4.8403e-4 -1 2.95593e-4 5.9186e-4 -0.9999999 -2.8048e-4 -2.76577e-4 -1 -3.15886e-4 -4.80276e-4 -0.9999998 -4.58263e-4 -5.57218e-4 -0.9999998 -2.66403e-4 -3.82779e-4 -1 -5.02159e-7 0 -1 -2.16146e-5 0 -1 -3.89297e-6 0 -1 1.91743e-5 0 -1 -9.66026e-6 0 -1 -3.88077e-6 0 -1 -5.6659e-6 0 -1 7.45809e-6 0 -1 5.59922e-6 0 -1 -3.77256e-6 0 -1 1.21524e-7 0 -1 -1.38983e-6 0 -1 1.95305e-6 0 -1 1.81572e-6 0 -1 8.01841e-6 0 -1 -3.95351e-5 0 -1 7.9802e-6 0 -1 4.29145e-4 0.9999999 -4.16184e-4 4.53579e-4 1 -2.58531e-4 -2.11152e-6 0.9999586 -0.009105145 -5.86344e-4 0.9999998 -1.91221e-5 4.4364e-4 0.9999998 -2.8334e-4 2.87591e-6 0.9999541 0.009589672 -0.01049154 0.99985 -0.01378703 0.00170356 0.9999586 0.008940219 -3.43479e-4 0.9999986 -0.001619577 4.88153e-4 0.9999999 -4.40512e-4 0.001475036 0.9991536 0.04110884 -0.004766702 0.9998634 -0.01583307 -5.57881e-4 0.9999999 1.03363e-5 0.003806531 0.999984 0.004200398 4.28846e-4 1 -4.75394e-6 -0.4509496 0.8923569 -0.01854336 -0.4382839 0.8988027 0.007822573 -0.3889826 0.921243 -0.002001404 -0.2469236 0.9689529 0.01260703 -0.2939442 0.9558219 -0.001202344 -0.1807507 0.9835137 -0.005492329 -0.0438193 0.9990388 0.001205801 -0.02725774 0.9995694 0.01086944 0.1419976 0.9898422 0.007012188 0.1537168 0.988115 2.4715e-4 0.3904545 0.9206217 -9.93513e-4 0.3439618 0.938943 0.008736491 0.2884154 0.9574912 -0.005223631 0.4484482 0.8936384 -0.0174548 0.4718741 0.881666 4.7223e-4 0.3798751 0.9250065 0.007611811 0.2347455 0.9711118 -0.0428543 0.2567108 0.9663597 -0.01577144 0.1374405 0.990242 0.02304452 0.01802021 0.9997198 0.01535451 -0.03769648 0.9979371 -0.05196708 -0.1327598 0.9908139 0.02574241 -0.2595013 0.965355 -0.02736812 -0.3886397 0.9213781 0.004659652 -0.2864605 0.958092 -5.89001e-4 0.483195 0.8755126 -6.85041e-4 0.4766731 0.8790784 0.001977682 0.6583001 0.7527556 -1.46385e-4 0.6650986 0.7467507 -0.002725005 0.8451918 0.5344578 0.002451539 0.8534694 0.5211406 -0.001611709 0.9466233 0.3223397 0.00126034 0.9506736 0.31019 -0.00140196 0.993785 0.1113098 0.00126034 0.9969177 0.07825249 -0.005643069 0.9944508 -0.1049241 0.007659554 0.9779745 -0.2085725 -0.007968485 0.9486582 -0.3162494 0.005834102 0.8945484 -0.4469003 -0.007961273 0.8584914 -0.5127952 0.005796492 0.7160553 -0.6980366 -0.003146529 0.7165883 -0.6974904 -0.002907395 0.4724492 -0.8813536 0.002776801 0.4741849 -0.8804188 0.003393948 0.2582451 -0.9660601 -0.006119132 0.1836733 -0.9829574 0.007682025 0.04455351 -0.9989892 -0.005975723 -0.050929 -0.9986853 0.005834221 -0.1913098 -0.9814974 -0.007959425 -0.264407 -0.9643938 0.005794107 -0.4810544 -0.8766851 -0.003142714 -0.4803946 -0.8770478 -0.002907395 -0.722862 -0.6909869 0.002777755 -0.7214937 -0.6924127 0.003396391 -0.8617458 -0.5073033 -0.006121158 -0.8979996 -0.4399294 0.007683932 -0.9506565 -0.3101878 -0.005976378 -0.9759086 -0.2181019 0.005833983 -0.9951118 -0.09857439 -0.00597614 -0.999865 0.01435738 0.008003652 -0.9903905 0.137879 -0.01077741 -0.9544612 0.298151 0.01048386 -0.9102696 0.4139395 -0.007968783 -0.8584987 0.5127827 0.005833923 -0.7902306 0.6127806 -0.005975723 -0.7281927 0.6853477 0.005834102 -0.6393229 0.7689145 -0.006065666 -0.5778282 0.8161496 0.003822684 -0.4720804 0.8815544 -0.001360774 -0.4745242 0.8802423 -6.02649e-4</float_array>
62
+ <technique_common>
63
+ <accessor source="#eSeries_UR5e_058-mesh-normals-array" count="861" stride="3">
64
+ <param name="X" type="float"/>
65
+ <param name="Y" type="float"/>
66
+ <param name="Z" type="float"/>
67
+ </accessor>
68
+ </technique_common>
69
+ </source>
70
+ <vertices id="eSeries_UR5e_058-mesh-vertices">
71
+ <input semantic="POSITION" source="#eSeries_UR5e_058-mesh-positions"/>
72
+ </vertices>
73
+ <polylist material="LinkGrey-material" count="911">
74
+ <input semantic="VERTEX" source="#eSeries_UR5e_058-mesh-vertices" offset="0"/>
75
+ <input semantic="NORMAL" source="#eSeries_UR5e_058-mesh-normals" offset="1"/>
76
+ <vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
77
+ <p>0 0 3 0 1 0 1 1 2 1 0 1 0 2 2 2 36 2 19 3 4 3 20 3 21 4 36 4 2 4 18 5 22 5 23 5 17 6 18 6 23 6 17 7 23 7 24 7 16 8 17 8 24 8 15 9 16 9 25 9 25 10 24 10 26 10 26 11 24 11 1 11 27 12 25 12 26 12 29 13 12 13 27 13 29 14 27 14 28 14 11 15 29 15 30 15 30 16 29 16 28 16 30 17 28 17 3 17 10 18 11 18 30 18 9 19 10 19 31 19 8 20 9 20 31 20 8 21 31 21 32 21 31 22 0 22 35 22 7 23 8 23 33 23 33 24 8 24 32 24 6 25 7 25 33 25 6 26 33 26 34 26 5 27 6 27 34 27 34 28 35 28 36 28 4 29 5 29 20 29 20 30 5 30 34 30 20 31 34 31 21 31 21 32 34 32 36 32 21 33 22 33 20 33 20 34 22 34 19 34 2 35 23 35 21 35 21 36 23 36 22 36 22 37 18 37 19 37 2 38 1 38 24 38 2 39 24 39 23 39 24 40 25 40 16 40 1 41 28 41 26 41 25 42 27 42 14 42 25 43 14 43 15 43 26 44 28 44 27 44 27 45 13 45 14 45 28 46 1 46 3 46 27 47 12 47 13 47 29 48 11 48 12 48 0 49 31 49 3 49 3 50 31 50 30 50 30 51 31 51 10 51 31 52 35 52 32 52 32 53 35 53 34 53 32 54 34 54 33 54 0 55 36 55 35 55 38 56 18 56 37 56 37 57 18 57 17 57 38 58 19 58 18 58 39 59 19 59 38 59 39 60 4 60 19 60 40 61 4 61 39 61 40 62 5 62 4 62 41 63 6 63 40 63 40 64 6 64 5 64 41 65 7 65 6 65 42 66 7 66 41 66 42 67 8 67 7 67 42 68 9 68 8 68 43 69 9 69 42 69 44 70 10 70 43 70 43 71 10 71 9 71 44 72 11 72 10 72 45 73 11 73 44 73 45 74 12 74 11 74 46 75 13 75 45 75 45 76 13 76 12 76 46 77 14 77 13 77 47 78 15 78 46 78 46 79 15 79 14 79 37 80 16 80 47 80 47 81 16 81 15 81 37 82 17 82 16 82 48 83 49 83 50 83 50 84 51 84 48 84 51 85 52 85 48 85 52 86 53 86 48 86 48 87 53 87 54 87 54 88 55 88 48 88 48 89 55 89 56 89 56 90 57 90 48 90 57 91 49 91 48 91 59 92 58 92 60 92 59 93 61 93 58 93 59 94 62 94 61 94 59 93 63 93 62 93 65 93 64 93 59 93 59 95 66 95 65 95 59 93 67 93 66 93 59 96 60 96 67 96 69 97 68 97 70 97 69 98 71 98 68 98 69 99 72 99 71 99 69 100 73 100 72 100 69 93 75 93 74 93 69 101 76 101 75 101 69 102 77 102 76 102 69 103 70 103 77 103 80 93 78 93 79 93 79 104 81 104 80 104 79 105 82 105 81 105 79 93 83 93 82 93 79 106 85 106 84 106 79 93 86 93 85 93 79 107 87 107 86 107 79 108 78 108 87 108 90 93 88 93 89 93 89 93 91 93 90 93 89 109 92 109 91 109 89 93 93 93 92 93 89 93 95 93 94 93 89 110 96 110 95 110 89 93 97 93 96 93 89 111 88 111 97 111 98 112 99 112 100 112 99 113 101 113 100 113 102 114 103 114 99 114 99 115 103 115 101 115 99 116 104 116 102 116 105 117 106 117 99 117 99 118 106 118 104 118 99 119 107 119 105 119 108 120 109 120 99 120 99 121 109 121 107 121 99 122 110 122 108 122 111 123 112 123 99 123 99 124 112 124 110 124 99 125 113 125 111 125 99 126 114 126 113 126 98 127 116 127 99 127 99 128 116 128 115 128 128 129 37 129 117 129 117 130 37 130 47 130 117 131 47 131 118 131 118 132 47 132 46 132 118 133 46 133 119 133 119 134 46 134 45 134 119 135 45 135 120 135 120 136 45 136 44 136 120 137 44 137 121 137 121 138 44 138 43 138 121 139 43 139 122 139 122 140 43 140 42 140 122 141 42 141 123 141 123 142 42 142 124 142 124 143 42 143 41 143 124 144 41 144 125 144 125 145 41 145 40 145 125 146 40 146 126 146 126 147 40 147 39 147 126 148 39 148 38 148 126 149 38 149 127 149 127 150 38 150 128 150 128 151 38 151 37 151 51 152 129 152 52 152 52 153 129 153 130 153 52 154 130 154 53 154 53 155 130 155 131 155 53 156 131 156 54 156 54 157 131 157 132 157 54 158 132 158 55 158 55 159 132 159 133 159 55 160 133 160 134 160 55 161 134 161 56 161 56 162 134 162 135 162 56 163 135 163 57 163 57 164 135 164 136 164 57 165 136 165 49 165 49 166 136 166 137 166 49 167 137 167 50 167 50 168 137 168 138 168 50 169 138 169 51 169 51 170 138 170 129 170 60 171 139 171 67 171 67 172 139 172 140 172 67 173 140 173 66 173 66 174 140 174 141 174 66 175 141 175 65 175 65 176 141 176 142 176 65 177 142 177 143 177 65 178 143 178 64 178 64 179 143 179 59 179 59 180 143 180 144 180 59 181 144 181 63 181 63 182 144 182 145 182 63 183 145 183 62 183 62 184 145 184 146 184 62 185 146 185 61 185 61 186 146 186 147 186 61 187 147 187 58 187 58 188 147 188 148 188 58 189 148 189 60 189 60 190 148 190 139 190 70 191 149 191 77 191 77 192 149 192 150 192 77 193 150 193 76 193 76 194 150 194 151 194 76 195 151 195 75 195 75 196 151 196 152 196 75 197 152 197 74 197 74 198 152 198 153 198 74 199 153 199 69 199 69 200 153 200 154 200 69 201 154 201 73 201 73 202 154 202 155 202 73 203 155 203 72 203 72 204 155 204 156 204 72 205 156 205 71 205 71 206 156 206 157 206 71 207 157 207 68 207 68 208 157 208 158 208 68 209 158 209 70 209 70 210 158 210 149 210 78 211 159 211 160 211 78 212 160 212 87 212 87 213 160 213 86 213 86 214 160 214 161 214 86 215 161 215 85 215 85 216 161 216 162 216 85 217 162 217 84 217 84 218 162 218 79 218 79 219 162 219 163 219 79 220 163 220 83 220 83 221 163 221 164 221 83 222 164 222 82 222 82 223 164 223 165 223 82 224 165 224 81 224 81 225 165 225 166 225 81 226 166 226 80 226 80 227 166 227 167 227 80 228 167 228 78 228 78 229 167 229 159 229 88 230 168 230 169 230 88 231 169 231 97 231 97 232 169 232 96 232 96 233 169 233 170 233 96 234 170 234 171 234 96 235 171 235 95 235 95 236 171 236 94 236 94 237 171 237 172 237 94 238 172 238 89 238 89 239 172 239 173 239 89 240 173 240 93 240 93 241 173 241 174 241 93 242 174 242 92 242 92 243 174 243 175 243 92 244 175 244 91 244 91 245 175 245 176 245 91 246 176 246 90 246 90 247 176 247 177 247 90 248 177 248 168 248 90 249 168 249 88 249 178 250 98 250 100 250 100 251 179 251 178 251 101 252 179 252 100 252 101 253 180 253 179 253 103 254 181 254 101 254 101 255 181 255 180 255 102 256 182 256 103 256 103 257 182 257 181 257 104 258 183 258 102 258 102 259 183 259 182 259 106 260 184 260 104 260 104 261 184 261 183 261 105 262 185 262 106 262 106 263 185 263 184 263 107 264 186 264 105 264 105 265 186 265 185 265 109 266 187 266 107 266 107 267 187 267 186 267 108 268 188 268 109 268 109 269 188 269 187 269 108 270 189 270 188 270 110 271 190 271 108 271 108 272 190 272 189 272 110 273 191 273 190 273 112 274 191 274 110 274 112 275 192 275 191 275 111 276 192 276 112 276 111 277 193 277 192 277 113 278 193 278 111 278 113 279 194 279 193 279 114 280 194 280 113 280 114 281 195 281 194 281 99 282 196 282 114 282 114 283 196 283 195 283 115 284 197 284 99 284 99 285 197 285 196 285 116 286 198 286 115 286 115 287 198 287 197 287 98 288 178 288 116 288 116 289 178 289 198 289 143 290 201 290 144 290 144 291 201 291 199 291 144 292 199 292 145 292 145 293 199 293 200 293 145 294 200 294 146 294 142 295 203 295 143 295 143 296 203 296 201 296 139 297 206 297 140 297 140 298 206 298 202 298 140 299 202 299 141 299 141 300 202 300 142 300 142 301 202 301 203 301 200 302 204 302 146 302 146 303 204 303 147 303 147 304 204 304 148 304 148 305 204 305 205 305 148 306 205 306 139 306 139 307 205 307 206 307 156 308 210 308 157 308 157 309 210 309 207 309 157 310 207 310 208 310 157 311 208 311 158 311 154 312 209 312 155 312 155 313 209 313 210 313 155 314 210 314 156 314 152 315 211 315 153 315 153 316 211 316 212 316 153 317 212 317 154 317 154 318 212 318 209 318 158 319 208 319 149 319 149 320 208 320 213 320 149 321 213 321 150 321 150 322 213 322 214 322 150 323 214 323 151 323 151 324 214 324 215 324 151 325 215 325 152 325 152 326 215 326 211 326 162 327 216 327 163 327 163 328 216 328 164 328 164 329 216 329 217 329 164 330 217 330 165 330 165 331 217 331 218 331 165 332 218 332 166 332 160 333 219 333 161 333 161 334 219 334 220 334 161 335 220 335 221 335 161 336 221 336 162 336 162 337 221 337 216 337 160 338 222 338 219 338 218 339 223 339 166 339 166 340 223 340 167 340 167 341 223 341 224 341 167 342 224 342 159 342 159 343 224 343 160 343 160 344 224 344 222 344 176 345 225 345 177 345 177 346 225 346 226 346 173 347 232 347 174 347 174 348 232 348 227 348 174 349 227 349 175 349 175 350 227 350 228 350 175 351 228 351 176 351 176 352 228 352 225 352 170 353 229 353 230 353 170 354 230 354 171 354 171 355 230 355 231 355 171 356 231 356 172 356 172 357 231 357 173 357 173 358 231 358 232 358 177 359 226 359 168 359 168 360 226 360 233 360 168 361 233 361 169 361 169 362 233 362 229 362 169 363 229 363 170 363 189 364 190 364 234 364 234 365 190 365 235 365 235 366 190 366 191 366 235 367 191 367 236 367 191 368 192 368 236 368 192 369 193 369 236 369 236 370 193 370 237 370 193 371 194 371 237 371 237 372 194 372 195 372 237 373 195 373 238 373 195 374 196 374 238 374 238 375 196 375 239 375 196 376 197 376 239 376 239 377 197 377 240 377 240 378 197 378 198 378 240 379 198 379 241 379 198 380 178 380 241 380 241 381 178 381 242 381 242 382 178 382 243 382 178 383 179 383 243 383 243 384 179 384 244 384 244 385 179 385 180 385 180 386 181 386 244 386 244 387 181 387 245 387 181 388 182 388 245 388 245 389 182 389 246 389 246 390 182 390 183 390 246 391 183 391 247 391 247 392 183 392 184 392 247 393 184 393 185 393 247 394 185 394 248 394 248 395 185 395 186 395 248 396 186 396 249 396 249 397 186 397 250 397 250 398 186 398 187 398 250 399 187 399 188 399 250 400 188 400 251 400 251 401 188 401 189 401 251 402 189 402 234 402 252 403 117 403 253 403 253 404 117 404 118 404 253 405 118 405 254 405 254 406 118 406 119 406 254 407 119 407 255 407 255 408 119 408 256 408 256 409 119 409 120 409 256 410 120 410 257 410 257 411 120 411 121 411 257 412 121 412 258 412 258 413 121 413 122 413 258 414 122 414 259 414 259 415 122 415 123 415 259 416 123 416 260 416 260 417 123 417 261 417 261 418 123 418 124 418 261 419 124 419 125 419 261 420 125 420 262 420 262 421 125 421 263 421 263 422 125 422 126 422 263 423 126 423 264 423 264 424 126 424 127 424 264 425 127 425 265 425 265 426 127 426 128 426 265 427 128 427 252 427 252 428 128 428 117 428 211 429 129 429 138 429 204 430 130 430 129 430 204 431 129 431 211 431 204 432 131 432 130 432 137 433 266 433 211 433 137 434 211 434 138 434 266 435 137 435 136 435 268 436 132 436 131 436 268 437 131 437 204 437 135 438 269 438 136 438 136 439 269 439 266 439 134 440 269 440 135 440 270 441 132 441 268 441 134 442 270 442 269 442 134 443 133 443 270 443 270 444 133 444 132 444 205 445 245 445 246 445 205 446 246 446 206 446 206 447 246 447 247 447 245 448 205 448 244 448 244 449 205 449 204 449 203 450 271 450 201 450 206 451 247 451 202 451 202 452 247 452 272 452 203 453 202 453 271 453 271 454 202 454 272 454 200 455 268 455 204 455 268 456 199 456 201 456 200 457 199 457 268 457 213 458 208 458 273 458 215 459 214 459 240 459 240 460 214 460 239 460 273 461 237 461 213 461 239 462 214 462 213 462 239 463 213 463 238 463 238 464 213 464 237 464 209 465 212 465 267 465 267 466 212 466 266 466 266 467 212 467 211 467 274 468 210 468 209 468 274 469 209 469 267 469 273 470 208 470 275 470 275 471 208 471 207 471 275 472 207 472 274 472 274 473 207 473 210 473 222 474 224 474 276 474 276 475 224 475 223 475 276 476 223 476 277 476 220 477 219 477 222 477 247 478 216 478 272 478 272 479 216 479 278 479 278 480 216 480 221 480 278 481 221 481 279 481 279 482 221 482 220 482 277 483 223 483 218 483 250 484 218 484 249 484 249 485 218 485 217 485 249 486 217 486 248 486 248 487 217 487 247 487 247 488 217 488 216 488 281 489 229 489 233 489 281 490 233 490 280 490 280 491 233 491 226 491 273 492 232 492 237 492 237 493 232 493 236 493 236 494 232 494 231 494 277 495 230 495 229 495 236 496 231 496 235 496 235 497 231 497 230 497 225 498 228 498 282 498 282 499 228 499 227 499 282 500 227 500 273 500 273 501 227 501 232 501 280 502 226 502 225 502 281 503 277 503 229 503 235 504 230 504 277 504 235 505 277 505 234 505 218 506 250 506 277 506 250 507 251 507 277 507 277 508 251 508 234 508 241 509 211 509 240 509 240 510 211 510 215 510 244 511 204 511 243 511 211 512 241 512 242 512 211 513 242 513 204 513 204 514 242 514 243 514 283 515 266 515 284 515 285 516 267 516 283 516 283 517 267 517 266 517 286 518 267 518 285 518 286 519 274 519 267 519 287 520 275 520 288 520 288 521 275 521 289 521 289 522 275 522 274 522 289 523 274 523 286 523 287 524 273 524 275 524 287 525 290 525 273 525 273 526 290 526 282 526 282 527 290 527 291 527 282 528 291 528 292 528 282 529 292 529 225 529 293 530 280 530 294 530 294 531 280 531 292 531 292 532 280 532 225 532 293 533 281 533 280 533 281 534 293 534 295 534 281 535 295 535 277 535 277 536 295 536 296 536 277 537 296 537 276 537 276 538 296 538 297 538 276 539 297 539 222 539 298 540 278 540 299 540 299 541 278 541 279 541 299 542 279 542 300 542 300 543 279 543 220 543 300 544 220 544 297 544 297 545 220 545 222 545 301 546 271 546 302 546 302 547 271 547 272 547 302 548 272 548 303 548 303 549 272 549 298 549 298 550 272 550 278 550 304 551 201 551 301 551 301 552 201 552 271 552 305 553 268 553 304 553 304 554 268 554 201 554 306 555 268 555 305 555 284 556 266 556 269 556 284 557 269 557 307 557 307 558 269 558 270 558 307 559 270 559 308 559 308 560 270 560 306 560 306 561 270 561 268 561 309 562 308 562 310 562 310 563 308 563 306 563 310 564 306 564 311 564 311 565 306 565 305 565 311 566 305 566 304 566 311 567 304 567 312 567 312 568 304 568 301 568 312 569 301 569 302 569 312 570 302 570 313 570 313 571 302 571 303 571 313 572 303 572 314 572 314 573 303 573 298 573 314 574 298 574 315 574 315 575 298 575 299 575 315 576 299 576 316 576 316 577 299 577 300 577 316 578 300 578 317 578 317 579 300 579 297 579 317 580 297 580 318 580 318 581 297 581 296 581 318 582 296 582 319 582 319 583 296 583 295 583 319 584 295 584 320 584 320 585 295 585 293 585 320 586 293 586 321 586 321 587 293 587 322 587 322 588 293 588 294 588 322 589 294 589 323 589 323 590 294 590 292 590 323 591 292 591 324 591 324 592 292 592 291 592 324 593 291 593 325 593 325 594 291 594 290 594 325 595 290 595 326 595 326 596 290 596 287 596 326 597 287 597 327 597 327 598 287 598 288 598 327 599 288 599 289 599 327 600 289 600 328 600 328 601 289 601 329 601 329 602 289 602 286 602 329 603 286 603 285 603 329 604 285 604 330 604 330 605 285 605 283 605 330 606 283 606 284 606 330 607 284 607 331 607 331 608 284 608 307 608 331 609 307 609 309 609 309 610 307 610 308 610 259 611 260 611 332 611 259 612 332 612 258 612 258 613 332 613 257 613 256 614 257 614 333 614 256 615 333 615 255 615 255 616 333 616 334 616 255 617 334 617 254 617 254 618 334 618 335 618 254 619 335 619 253 619 253 620 335 620 252 620 252 621 335 621 336 621 252 622 336 622 265 622 265 623 336 623 337 623 265 624 337 624 264 624 264 625 337 625 338 625 264 626 338 626 263 626 263 627 338 627 262 627 262 628 338 628 339 628 262 629 339 629 261 629 261 630 339 630 340 630 261 631 340 631 260 631 326 632 341 632 325 632 325 633 341 633 342 633 325 634 342 634 324 634 324 635 342 635 343 635 324 636 343 636 323 636 323 637 343 637 344 637 323 638 344 638 322 638 322 639 344 639 321 639 321 640 344 640 345 640 312 641 346 641 311 641 311 642 346 642 347 642 311 643 347 643 310 643 310 644 347 644 348 644 310 645 348 645 309 645 309 646 348 646 331 646 331 647 348 647 349 647 331 648 349 648 330 648 330 649 349 649 350 649 321 650 345 650 320 650 320 651 345 651 351 651 320 652 351 652 319 652 319 653 351 653 318 653 318 654 351 654 352 654 318 655 352 655 317 655 317 656 352 656 353 656 317 657 353 657 316 657 330 658 350 658 354 658 330 659 354 659 329 659 329 660 354 660 328 660 328 661 354 661 355 661 328 662 355 662 327 662 327 663 355 663 356 663 327 664 356 664 326 664 326 665 356 665 341 665 353 666 357 666 316 666 316 667 357 667 315 667 315 668 357 668 314 668 314 669 357 669 358 669 314 670 358 670 313 670 313 671 358 671 359 671 313 672 359 672 312 672 312 673 359 673 346 673 421 674 420 674 422 674 422 675 420 675 423 675 477 676 476 676 420 676 420 677 476 677 478 677 478 678 479 678 420 678 479 679 423 679 420 679 483 680 417 680 480 680 417 681 483 681 418 681 417 682 418 682 481 682 481 683 419 683 417 683 417 684 419 684 484 684 417 685 484 685 482 685 424 686 348 686 425 686 425 687 348 687 347 687 425 688 347 688 426 688 426 689 347 689 346 689 426 690 346 690 427 690 427 691 346 691 428 691 428 692 346 692 359 692 428 693 359 693 429 693 429 694 359 694 358 694 429 695 358 695 430 695 430 696 358 696 431 696 431 697 358 697 357 697 431 698 357 698 432 698 432 699 357 699 433 699 433 700 357 700 353 700 433 701 353 701 434 701 434 702 353 702 435 702 435 703 353 703 352 703 435 704 352 704 351 704 435 705 351 705 436 705 436 706 351 706 437 706 437 707 351 707 345 707 437 708 345 708 438 708 438 709 345 709 344 709 438 710 344 710 439 710 439 711 344 711 440 711 440 712 344 712 343 712 440 713 343 713 441 713 441 714 343 714 342 714 441 715 342 715 442 715 442 716 342 716 341 716 442 717 341 717 443 717 443 718 341 718 356 718 443 719 356 719 444 719 444 720 356 720 355 720 444 721 355 721 445 721 445 722 355 722 354 722 445 723 354 723 446 723 446 724 354 724 447 724 447 725 354 725 350 725 447 726 350 726 448 726 448 727 350 727 449 727 449 728 350 728 349 728 449 729 349 729 450 729 450 730 349 730 348 730 450 731 348 731 424 731 451 732 452 732 416 732 416 733 452 733 361 733 361 734 452 734 453 734 361 735 453 735 360 735 360 736 453 736 362 736 362 734 453 734 363 734 363 734 453 734 454 734 363 734 454 734 364 734 364 734 454 734 365 734 365 734 454 734 455 734 365 737 455 737 367 737 367 738 455 738 366 738 366 739 455 739 456 739 366 740 456 740 368 740 368 741 456 741 369 741 369 742 456 742 457 742 369 743 457 743 370 743 370 744 457 744 371 744 371 745 457 745 458 745 371 746 458 746 372 746 372 747 458 747 374 747 374 748 458 748 459 748 374 749 459 749 373 749 373 750 459 750 375 750 375 751 459 751 376 751 376 752 459 752 460 752 376 753 460 753 377 753 377 754 460 754 378 754 378 755 460 755 461 755 378 756 461 756 379 756 379 757 461 757 381 757 381 758 461 758 462 758 381 759 462 759 380 759 380 734 462 734 382 734 382 760 462 760 383 760 383 734 462 734 463 734 383 734 463 734 384 734 384 734 463 734 386 734 386 734 463 734 464 734 386 761 464 761 385 761 385 734 464 734 387 734 387 762 464 762 465 762 387 763 465 763 388 763 388 734 465 734 389 734 389 734 465 734 390 734 390 734 465 734 466 734 390 764 466 764 391 764 391 734 466 734 393 734 393 734 466 734 467 734 393 765 467 765 392 765 392 766 467 766 394 766 394 734 467 734 395 734 395 734 467 734 468 734 395 767 468 767 396 767 396 768 468 768 397 768 397 734 468 734 398 734 398 734 468 734 469 734 398 769 469 769 400 769 400 734 469 734 399 734 399 734 469 734 470 734 399 734 470 734 401 734 401 770 470 770 402 770 402 734 470 734 471 734 402 771 471 771 403 771 403 734 471 734 405 734 405 734 471 734 472 734 405 772 472 772 404 772 404 734 472 734 406 734 406 734 472 734 407 734 407 734 472 734 473 734 407 734 473 734 408 734 408 773 473 773 409 773 409 774 473 774 410 774 410 734 473 734 474 734 410 734 474 734 412 734 412 734 474 734 411 734 411 734 474 734 475 734 411 775 475 775 413 775 413 734 475 734 414 734 414 734 475 734 451 734 414 734 451 734 415 734 415 734 451 734 416 734 337 776 480 776 338 776 480 777 337 777 336 777 338 778 480 778 417 778 339 779 477 779 340 779 335 780 480 780 336 780 477 781 420 781 333 781 477 782 260 782 340 782 260 783 477 783 332 783 417 784 339 784 338 784 420 785 334 785 333 785 477 786 333 786 257 786 477 787 257 787 332 787 477 788 339 788 417 788 335 789 334 789 480 789 480 790 334 790 420 790 457 791 456 791 420 791 480 792 448 792 449 792 480 793 449 793 483 793 449 794 450 794 418 794 449 795 418 795 483 795 450 796 481 796 418 796 424 797 419 797 450 797 450 798 419 798 481 798 484 799 419 799 425 799 425 800 419 800 424 800 417 801 482 801 426 801 426 802 482 802 425 802 425 803 482 803 484 803 460 804 477 804 461 804 461 805 477 805 417 805 460 806 476 806 477 806 459 807 478 807 460 807 460 808 478 808 476 808 459 809 479 809 478 809 423 810 479 810 459 810 458 811 423 811 459 811 458 812 422 812 423 812 457 813 422 813 458 813 457 814 420 814 421 814 457 815 421 815 422 815 417 816 426 816 427 816 417 817 427 817 461 817 461 818 427 818 428 818 461 819 428 819 462 819 462 820 428 820 429 820 462 821 429 821 463 821 463 822 429 822 430 822 463 823 430 823 464 823 464 824 430 824 431 824 464 825 431 825 465 825 465 826 431 826 432 826 465 827 432 827 466 827 466 828 432 828 433 828 466 829 433 829 467 829 467 830 433 830 434 830 467 831 434 831 435 831 467 832 435 832 468 832 468 833 435 833 436 833 468 834 436 834 469 834 469 835 436 835 470 835 470 836 436 836 437 836 470 837 437 837 471 837 471 838 437 838 438 838 471 839 438 839 472 839 472 840 438 840 439 840 472 841 439 841 440 841 472 842 440 842 473 842 473 843 440 843 441 843 473 844 441 844 474 844 474 845 441 845 475 845 475 846 441 846 442 846 475 847 442 847 451 847 451 848 442 848 443 848 451 849 443 849 452 849 452 850 443 850 444 850 452 851 444 851 453 851 453 852 444 852 445 852 453 853 445 853 454 853 454 854 445 854 446 854 454 855 446 855 455 855 455 856 446 856 447 856 455 857 447 857 456 857 456 858 447 858 448 858 456 859 448 859 480 859 456 860 480 860 420 860</p>
78
+ </polylist>
79
+ </mesh>
80
+ </geometry>
81
+ </library_geometries>
82
+ <library_controllers/>
83
+ <library_visual_scenes>
84
+ <visual_scene id="Scene" name="Scene">
85
+ <node id="eSeries_UR5e_058" name="eSeries_UR5e_058" type="NODE">
86
+ <matrix sid="transform">-9.99987e-4 0 -3.25837e-10 0 -3.25837e-10 4.37108e-11 9.99987e-4 0 0 9.99987e-4 -4.37108e-11 0 0 0 0 1</matrix>
87
+ <instance_geometry url="#eSeries_UR5e_058-mesh" name="eSeries_UR5e_058">
88
+ <bind_material>
89
+ <technique_common>
90
+ <instance_material symbol="LinkGrey-material" target="#LinkGrey-material"/>
91
+ </technique_common>
92
+ </bind_material>
93
+ </instance_geometry>
94
+ </node>
95
+ </visual_scene>
96
+ </library_visual_scenes>
97
+ <scene>
98
+ <instance_visual_scene url="#Scene"/>
99
+ </scene>
100
+ </COLLADA>