diff --git a/.github/templates/docker_context/docker_context.sh b/.github/templates/docker_context/docker_context.sh index 30fcd576..8c8b77e8 100755 --- a/.github/templates/docker_context/docker_context.sh +++ b/.github/templates/docker_context/docker_context.sh @@ -21,17 +21,17 @@ fi # Loop through each module while read -r module; do + module_out=$(basename "$(echo "$module" | sed -n 's/modules\/docker-compose\.\(.*\)\.yaml/\1/p')") - # Retrieve docker compose service names - services=$(docker compose -f "$module" --profile deploy --profile develop config --services) - module_out=$(basename $(echo "$module" | sed -n 's/modules\/docker-compose\.\(.*\)\.yaml/\1/p')) - - # Skip simulation module + # Skip Isaac Sim modules (need GPU/NGC/X11; no multi-stage CI Dockerfile) # TODO: Add custom handling for embedded testing - if [[ 'simulation' = $module_out || 'embedded' = $module_out ]]; then + if [[ 'simulation' = $module_out || 'simulation_il' = $module_out || 'embedded' = $module_out ]]; then continue fi + # Retrieve docker compose service names + services=$(docker compose -f "$module" --profile deploy --profile develop config --services) + # Only work with modules that are modified if [[ $MODIFIED_MODULES != *$module_out* && $TEST_ALL = "false" ]]; then continue diff --git a/.github/workflows/build_and_unitest.yml b/.github/workflows/build_and_unitest.yml index b79ae42a..e920a7da 100644 --- a/.github/workflows/build_and_unitest.yml +++ b/.github/workflows/build_and_unitest.yml @@ -30,6 +30,7 @@ jobs: - name: Setup Watod Environment run: | + MONO_DIR="$GITHUB_WORKSPACE" MODULES_DIR="$GITHUB_WORKSPACE/modules" . ./watod_scripts/watod-setup-docker-env.sh shell: bash diff --git a/.github/workflows/build_base_images.yml b/.github/workflows/build_base_images.yml index 0c32cb39..b791cd30 100644 --- a/.github/workflows/build_base_images.yml +++ b/.github/workflows/build_base_images.yml @@ -18,6 +18,7 @@ jobs: - name: Setup Watod Environment run: | + MONO_DIR="$GITHUB_WORKSPACE" MODULES_DIR="$GITHUB_WORKSPACE/modules" . ./watod_scripts/watod-setup-docker-env.sh shell: bash diff --git a/assets/lerobot/README.md b/assets/lerobot/README.md index c77189e4..a73f8d70 100644 --- a/assets/lerobot/README.md +++ b/assets/lerobot/README.md @@ -30,4 +30,9 @@ git add assets/lerobot/ Source: [isaac-sim/Sim-to-Real-SO-101-Workshop](https://github.com/isaac-sim/Sim-to-Real-SO-101-Workshop) (Apache-2.0). -Used by `autonomy/simulation/Teleop/so101-leader teleoperation/`. +Used by: +- `simulation_il` watod Docker — [`docker/simulation/isaac_il/QUICKSTART.md`](../../docker/simulation/isaac_il/QUICKSTART.md) +- `autonomy/simulation/so101_vial_task/` +- `autonomy/simulation/Teleop/so101-leader teleoperation/` + +Run `./assets/lerobot/sync_so101_vial_assets.sh --full` before first sim IL eval if you see `[WARNING] No textures found`. diff --git a/assets/lerobot/so101/so101_arm_camera.usd b/assets/lerobot/so101/so101_arm_camera.usd new file mode 100644 index 00000000..53e9f5b1 Binary files /dev/null and b/assets/lerobot/so101/so101_arm_camera.usd differ diff --git a/assets/lerobot/so101_vial_task/hdri/abandoned_garage_1k.exr b/assets/lerobot/so101_vial_task/hdri/abandoned_garage_1k.exr new file mode 100644 index 00000000..5b358e40 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/abandoned_garage_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/afrikaans_church_interior_1k.exr b/assets/lerobot/so101_vial_task/hdri/afrikaans_church_interior_1k.exr new file mode 100644 index 00000000..867252d5 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/afrikaans_church_interior_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/blaubeuren_church_square_1k.exr b/assets/lerobot/so101_vial_task/hdri/blaubeuren_church_square_1k.exr new file mode 100644 index 00000000..f3493adc Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/blaubeuren_church_square_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/blaubeuren_night_1k.exr b/assets/lerobot/so101_vial_task/hdri/blaubeuren_night_1k.exr new file mode 100644 index 00000000..03f3ede7 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/blaubeuren_night_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/blue_photo_studio_1k.exr b/assets/lerobot/so101_vial_task/hdri/blue_photo_studio_1k.exr new file mode 100644 index 00000000..3edf2fdc Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/blue_photo_studio_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/boma_1k.exr b/assets/lerobot/so101_vial_task/hdri/boma_1k.exr new file mode 100644 index 00000000..106f11f7 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/boma_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/brown_photostudio_01_1k.exr b/assets/lerobot/so101_vial_task/hdri/brown_photostudio_01_1k.exr new file mode 100644 index 00000000..e8430dc0 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/brown_photostudio_01_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/burnt_warehouse_1k.exr b/assets/lerobot/so101_vial_task/hdri/burnt_warehouse_1k.exr new file mode 100644 index 00000000..9356c99d Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/burnt_warehouse_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/climbing_gym_1k.exr b/assets/lerobot/so101_vial_task/hdri/climbing_gym_1k.exr new file mode 100644 index 00000000..2b629d97 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/climbing_gym_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/creepy_bathroom_1k.exr b/assets/lerobot/so101_vial_task/hdri/creepy_bathroom_1k.exr new file mode 100644 index 00000000..4ff93c11 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/creepy_bathroom_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/fireplace_1k.exr b/assets/lerobot/so101_vial_task/hdri/fireplace_1k.exr new file mode 100644 index 00000000..1ff0d06b Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/fireplace_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/hospital_room_2_1k.exr b/assets/lerobot/so101_vial_task/hdri/hospital_room_2_1k.exr new file mode 100644 index 00000000..6a733824 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/hospital_room_2_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/metro_noord_1k.exr b/assets/lerobot/so101_vial_task/hdri/metro_noord_1k.exr new file mode 100644 index 00000000..511939ad Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/metro_noord_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/monkstown_castle_1k.exr b/assets/lerobot/so101_vial_task/hdri/monkstown_castle_1k.exr new file mode 100644 index 00000000..067ec0ba Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/monkstown_castle_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/moon_lab_1k.exr b/assets/lerobot/so101_vial_task/hdri/moon_lab_1k.exr new file mode 100644 index 00000000..fe3942d7 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/moon_lab_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/moonlit_golf_1k.exr b/assets/lerobot/so101_vial_task/hdri/moonlit_golf_1k.exr new file mode 100644 index 00000000..bfa99426 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/moonlit_golf_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/outdoor_chapel_1k.exr b/assets/lerobot/so101_vial_task/hdri/outdoor_chapel_1k.exr new file mode 100644 index 00000000..4ee892f3 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/outdoor_chapel_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/poly_haven_studio_1k.exr b/assets/lerobot/so101_vial_task/hdri/poly_haven_studio_1k.exr new file mode 100644 index 00000000..eb2fad3a Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/poly_haven_studio_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/rogland_moonlit_night_1k.exr b/assets/lerobot/so101_vial_task/hdri/rogland_moonlit_night_1k.exr new file mode 100644 index 00000000..05ec0297 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/rogland_moonlit_night_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/satara_night_1k.exr b/assets/lerobot/so101_vial_task/hdri/satara_night_1k.exr new file mode 100644 index 00000000..cc94c041 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/satara_night_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/studio_small_03_1k.exr b/assets/lerobot/so101_vial_task/hdri/studio_small_03_1k.exr new file mode 100644 index 00000000..f09d8e07 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/studio_small_03_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/studio_small_09_1k.exr b/assets/lerobot/so101_vial_task/hdri/studio_small_09_1k.exr new file mode 100644 index 00000000..77eee540 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/studio_small_09_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/university_workshop_1k.exr b/assets/lerobot/so101_vial_task/hdri/university_workshop_1k.exr new file mode 100644 index 00000000..f104a0a3 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/university_workshop_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/winter_evening_1k.exr b/assets/lerobot/so101_vial_task/hdri/winter_evening_1k.exr new file mode 100644 index 00000000..18993e71 Binary files /dev/null and b/assets/lerobot/so101_vial_task/hdri/winter_evening_1k.exr differ diff --git a/assets/lerobot/so101_vial_task/hdri/yaw_mapping.yaml b/assets/lerobot/so101_vial_task/hdri/yaw_mapping.yaml new file mode 100644 index 00000000..68da03d0 --- /dev/null +++ b/assets/lerobot/so101_vial_task/hdri/yaw_mapping.yaml @@ -0,0 +1,22 @@ +abandoned_garage_1k.exr: null +afrikaans_church_interior_1k.exr: [110, -40] +blaubeuren_church_square_1k.exr: null +blaubeuren_night_1k.exr: null +blue_photo_studio_1k.exr: null +boma_1k.exr: [110, -40] +brown_photostudio_01_1k.exr: [120, -40] +burnt_warehouse_1k.exr: [120, -50] +fireplace_1k.exr: [0, -170] +hospital_room_2_1k.exr: null +metro_noord_1k.exr: null +monkstown_castle_1k.exr: null +moon_lab_1k.exr: [120, -30] +moonlit_golf_1k.exr: [90, -60] +outdoor_chapel_1k.exr: [120, -50] +poly_haven_studio_1k.exr: null +rogland_moonlit_night_1k.exr: [120, -50] +satara_night_1k.exr: [100, -45] +studio_small_03_1k.exr: [350, 160] +studio_small_09_1k.exr: [120, -30] +university_workshop_1k.exr: [120, -30] +winter_evening_1k.exr: [60, -60] \ No newline at end of file diff --git a/assets/lerobot/so101_vial_task/usd/tray.usda b/assets/lerobot/so101_vial_task/usd/tray.usda new file mode 100644 index 00000000..8c834a75 --- /dev/null +++ b/assets/lerobot/so101_vial_task/usd/tray.usda @@ -0,0 +1,174 @@ +#usda 1.0 +( + customLayerData = { + dictionary cameraSettings = { + dictionary Front = { + double3 position = (5, 0, 0) + double radius = 5 + } + dictionary Perspective = { + double3 position = (-0.0976328420089609, -0.268040941470834, 0.2706694762111128) + double3 target = (0.1822166766990666, 0.09134510854635852, 0.013320144525722055) + } + dictionary Right = { + double3 position = (0, -5, 0) + double radius = 5 + } + dictionary Top = { + double3 position = (0, 0, 5) + double radius = 5 + } + string boundCamera = "/OmniverseKit_Persp" + } + string creator = "omni.kit.converter.hoops_core 509.1.0 hoops_cad_converter 9.2.0+v9-2-0.2340.42272a51.gl" + dictionary omni_layer = { + string authoring_layer = "./tray.usda" + } + dictionary renderSettings = { + } + } + defaultPrim = "tray" + endTimeCode = 0 + metersPerUnit = 1 + startTimeCode = -1 + upAxis = "Z" +) + +def Xform "tray" ( + kind = "assembly" +) +{ + def Xform "tray" ( + prepend apiSchemas = ["PhysicsRigidBodyAPI", "PhysxRigidBodyAPI"] + kind = "group" + ) + { + bool physics:kinematicEnabled = 0 + bool physics:rigidBodyEnabled = 1 + matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] + + def Xform "Body1" ( + kind = "component" + ) + { + matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) ) + uniform token[] xformOpOrder = ["xformOp:transform"] + + def Mesh "Mesh" ( + prepend apiSchemas = ["MaterialBindingAPI", "PhysicsCollisionAPI", "PhysxCollisionAPI", "PhysxConvexHullCollisionAPI", "PhysicsMeshCollisionAPI", "PhysxSDFMeshCollisionAPI", "PhysicsMassAPI"] + ) + { + float3[] extent = [(-3.0160063e-33, 0, 0), (0.2, 0.16, 0.03)] + int[] faceVertexCounts = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + int[] faceVertexIndices = [0, 1, 2, 3, 4, 5, 6, 5, 1, 0, 2, 7, 6, 3, 5, 1, 0, 6, 3, 8, 4, 8, 9, 4, 10, 7, 2, 11, 12, 13, 10, 14, 15, 16, 15, 12, 12, 11, 16, 15, 16, 10, 11, 13, 17, 10, 2, 14, 18, 19, 20, 21, 22, 23, 24, 23, 19, 18, 20, 25, 24, 21, 23, 19, 18, 24, 21, 26, 22, 26, 27, 22, 28, 25, 20, 29, 30, 31, 28, 32, 33, 34, 33, 30, 30, 29, 34, 33, 34, 28, 29, 31, 35, 28, 20, 32, 36, 37, 38, 38, 39, 36, 40, 41, 42, 42, 43, 40, 44, 45, 46, 46, 47, 44, 48, 49, 50, 51, 52, 53, 54, 53, 49, 55, 49, 48, 54, 51, 53, 49, 55, 54, 56, 57, 51, 57, 52, 51, 58, 48, 50, 59, 60, 61, 62, 63, 64, 62, 64, 60, 60, 59, 62, 63, 62, 58, 59, 61, 65, 58, 50, 63, 66, 67, 68, 69, 70, 71, 72, 71, 67, 73, 67, 66, 72, 69, 71, 67, 73, 72, 74, 75, 69, 75, 70, 69, 76, 66, 68, 77, 78, 79, 80, 81, 82, 80, 82, 78, 78, 77, 80, 81, 80, 76, 77, 79, 83, 76, 68, 81, 84, 85, 86, 87, 88, 89, 90, 89, 85, 91, 85, 84, 90, 87, 89, 85, 91, 90, 87, 92, 88, 92, 93, 88, 94, 84, 86, 95, 96, 97, 94, 98, 99, 100, 99, 96, 96, 95, 100, 99, 100, 94, 95, 97, 101, 94, 86, 98, 102, 103, 104, 104, 105, 102, 106, 107, 108, 108, 109, 106, 110, 111, 112, 112, 113, 110, 114, 115, 116, 117, 118, 119, 120, 119, 115, 121, 115, 114, 120, 117, 119, 115, 121, 120, 117, 122, 118, 122, 123, 118, 124, 114, 116, 125, 126, 127, 128, 129, 130, 128, 130, 126, 126, 125, 128, 129, 128, 124, 125, 127, 131, 124, 116, 129, 132, 133, 134, 135, 136, 137, 138, 137, 133, 139, 133, 132, 138, 135, 137, 133, 139, 138, 135, 140, 136, 140, 141, 136, 142, 132, 134, 143, 144, 145, 146, 147, 148, 146, 148, 144, 144, 143, 146, 147, 146, 142, 143, 145, 149, 142, 134, 147, 150, 151, 152, 152, 153, 150, 154, 155, 156, 157, 158, 159, 160, 159, 155, 161, 155, 154, 160, 157, 159, 155, 161, 160, 157, 162, 158, 162, 163, 158, 164, 154, 156, 165, 166, 167, 164, 168, 169, 170, 169, 166, 166, 165, 170, 169, 170, 164, 165, 167, 171, 164, 156, 168, 172, 173, 174, 174, 175, 172, 176, 177, 178, 179, 180, 181, 182, 181, 177, 176, 178, 183, 182, 179, 181, 177, 176, 182, 179, 184, 180, 184, 185, 180, 186, 183, 178, 187, 188, 189, 186, 190, 191, 192, 191, 188, 188, 187, 192, 191, 192, 186, 187, 189, 193, 186, 178, 190, 194, 195, 196, 197, 196, 195, 196, 198, 199, 196, 199, 194, 200, 198, 196, 196, 201, 202, 196, 197, 203, 196, 203, 204, 196, 204, 201, 202, 205, 196, 196, 206, 207, 208, 209, 206, 207, 206, 209, 210, 208, 206, 200, 196, 207, 206, 211, 210, 206, 212, 213, 206, 213, 214, 206, 214, 211, 215, 212, 206, 216, 205, 217, 216, 218, 219, 216, 219, 220, 218, 216, 217, 221, 216, 222, 220, 222, 216, 216, 221, 223, 216, 223, 224, 224, 225, 216, 216, 196, 205, 226, 227, 228, 226, 229, 230, 226, 230, 215, 229, 226, 228, 231, 216, 225, 226, 232, 233, 231, 232, 226, 227, 226, 233, 231, 226, 216, 206, 226, 215, 234, 235, 236, 236, 237, 234, 236, 235, 238, 239, 236, 240, 241, 240, 236, 241, 236, 242, 236, 238, 242, 243, 237, 244, 245, 246, 247, 245, 248, 246, 247, 249, 245, 250, 251, 245, 252, 245, 253, 245, 252, 250, 251, 248, 245, 245, 249, 243, 237, 236, 254, 254, 255, 256, 256, 257, 254, 254, 257, 258, 259, 260, 254, 244, 254, 261, 254, 260, 261, 258, 259, 254, 243, 249, 237, 262, 263, 264, 265, 264, 263, 262, 264, 266, 267, 264, 268, 264, 269, 266, 264, 267, 269, 268, 264, 243, 245, 243, 264, 237, 254, 244, 270, 271, 272, 273, 274, 275, 276, 275, 271, 270, 272, 277, 276, 273, 275, 271, 270, 276, 273, 278, 274, 278, 279, 274, 280, 277, 272, 281, 282, 283, 280, 284, 285, 286, 285, 282, 282, 281, 286, 285, 286, 280, 281, 283, 287, 280, 272, 284, 288, 289, 290, 291, 290, 289, 290, 292, 293, 290, 293, 288, 294, 292, 290, 290, 295, 296, 290, 291, 297, 290, 297, 298, 290, 298, 295, 296, 299, 290, 290, 300, 301, 302, 303, 300, 301, 300, 303, 304, 302, 300, 294, 290, 301, 300, 305, 304, 300, 306, 307, 300, 307, 308, 300, 308, 305, 309, 306, 300, 310, 299, 311, 310, 312, 313, 310, 313, 314, 312, 310, 311, 315, 310, 316, 314, 316, 310, 310, 315, 317, 310, 317, 318, 318, 319, 310, 310, 290, 299, 320, 321, 322, 320, 323, 324, 320, 324, 309, 323, 320, 322, 325, 310, 319, 320, 326, 327, 325, 326, 320, 321, 320, 327, 325, 320, 310, 300, 320, 309, 328, 329, 330, 331, 332, 333, 334, 333, 329, 335, 329, 328, 334, 331, 333, 329, 335, 334, 336, 337, 331, 337, 332, 331, 338, 328, 330, 339, 340, 341, 338, 342, 343, 344, 343, 340, 340, 339, 344, 343, 344, 338, 339, 341, 345, 338, 330, 342, 346, 347, 348, 349, 350, 351, 352, 351, 347, 353, 347, 346, 352, 349, 351, 347, 353, 352, 354, 355, 349, 355, 350, 349, 356, 346, 348, 357, 358, 359, 356, 360, 361, 362, 361, 358, 358, 357, 362, 361, 362, 356, 357, 359, 363, 356, 348, 360, 364, 365, 366, 366, 367, 364, 368, 369, 370, 370, 371, 368, 372, 373, 374, 375, 376, 377, 373, 375, 378, 379, 372, 374, 375, 377, 378, 378, 374, 373, 376, 380, 377, 376, 381, 380, 372, 379, 382, 383, 384, 385, 386, 387, 382, 384, 386, 388, 388, 389, 384, 382, 388, 386, 385, 384, 389, 387, 372, 382, 390, 391, 392, 391, 390, 393, 394, 395, 390, 392, 394, 390, 390, 395, 396, 397, 398, 390, 399, 393, 390, 400, 399, 390, 398, 400, 390, 390, 401, 397, 396, 402, 403, 403, 404, 405, 404, 403, 402, 403, 405, 406, 396, 403, 390, 406, 407, 403, 408, 409, 403, 410, 408, 403, 407, 410, 403, 403, 409, 411, 412, 413, 401, 414, 415, 401, 416, 414, 401, 412, 401, 415, 417, 401, 418, 401, 417, 416, 419, 418, 401, 420, 419, 401, 401, 411, 420, 413, 397, 401, 421, 422, 411, 423, 424, 411, 425, 423, 411, 421, 411, 424, 426, 427, 411, 428, 429, 411, 411, 429, 426, 428, 411, 422, 427, 420, 411, 425, 411, 409, 430, 431, 432, 432, 433, 430, 434, 431, 430, 435, 430, 436, 430, 435, 437, 438, 430, 437, 438, 434, 430, 439, 433, 440, 441, 442, 443, 442, 444, 443, 443, 445, 441, 443, 446, 447, 448, 443, 449, 447, 449, 443, 443, 444, 446, 440, 445, 443, 450, 430, 433, 451, 452, 450, 450, 453, 451, 454, 453, 450, 450, 455, 456, 457, 450, 439, 457, 455, 450, 450, 456, 454, 433, 445, 440, 458, 459, 460, 459, 458, 461, 462, 458, 460, 463, 458, 464, 462, 465, 458, 465, 464, 458, 440, 458, 463, 458, 440, 443, 439, 450, 433, 466, 467, 468, 469, 470, 471, 467, 469, 472, 473, 466, 468, 469, 471, 472, 472, 468, 467, 470, 474, 471, 470, 475, 474, 466, 473, 476, 477, 478, 479, 480, 481, 476, 478, 480, 482, 482, 479, 478, 476, 482, 480, 483, 477, 479, 481, 466, 476, 484, 485, 486, 485, 484, 487, 488, 489, 484, 486, 488, 484, 484, 489, 490, 491, 492, 484, 493, 487, 484, 494, 493, 484, 492, 494, 484, 484, 495, 491, 490, 496, 497, 497, 498, 499, 498, 497, 496, 497, 499, 500, 490, 497, 484, 500, 501, 497, 502, 503, 497, 504, 502, 497, 501, 504, 497, 497, 503, 505, 506, 507, 495, 508, 509, 495, 510, 508, 495, 506, 495, 509, 511, 495, 512, 495, 511, 510, 513, 512, 495, 514, 513, 495, 495, 505, 514, 507, 491, 495, 515, 516, 505, 517, 518, 505, 519, 517, 505, 515, 505, 518, 520, 521, 505, 522, 523, 505, 505, 523, 520, 522, 505, 516, 521, 514, 505, 519, 505, 503, 524, 525, 526, 527, 528, 529, 525, 527, 530, 526, 525, 531, 527, 529, 530, 530, 531, 525, 529, 532, 533, 529, 528, 532, 524, 526, 534, 535, 536, 537, 538, 539, 534, 536, 538, 540, 540, 537, 536, 534, 540, 538, 541, 535, 537, 539, 524, 534, 542, 543, 544, 545, 546, 547, 543, 545, 548, 544, 543, 549, 545, 547, 548, 548, 549, 543, 547, 550, 551, 547, 546, 550, 542, 544, 552, 553, 554, 555, 556, 557, 552, 554, 556, 558, 558, 555, 554, 552, 558, 556, 559, 553, 555, 557, 542, 552, 560, 561, 562, 562, 563, 560, 564, 565, 566, 566, 567, 564, 568, 569, 570, 569, 571, 570, 571, 569, 572, 568, 570, 573, 574, 575, 576, 576, 577, 574, 573, 576, 575, 575, 568, 573, 574, 577, 578, 579, 580, 581, 582, 583, 581, 582, 584, 585, 579, 581, 583, 572, 586, 571, 586, 572, 587, 588, 586, 587, 588, 587, 580, 580, 579, 588, 589, 590, 591, 578, 591, 590, 590, 574, 578, 589, 591, 592, 593, 594, 595, 593, 596, 597, 596, 593, 595, 595, 594, 592, 594, 589, 592, 598, 599, 597, 600, 601, 602, 598, 600, 599, 599, 600, 602, 603, 604, 605, 603, 602, 601, 604, 606, 607, 604, 603, 601, 598, 597, 596, 585, 583, 582, 585, 584, 608, 585, 608, 609, 609, 608, 610, 609, 610, 611, 612, 613, 614, 615, 613, 611, 614, 613, 615, 610, 615, 611, 612, 616, 617, 616, 612, 614, 616, 618, 617, 617, 618, 619, 620, 619, 621, 620, 622, 623, 622, 620, 621, 623, 622, 624, 619, 618, 621, 625, 626, 627, 628, 629, 630, 626, 629, 628, 607, 605, 604, 607, 606, 631, 625, 631, 606, 625, 627, 631, 626, 628, 627, 629, 632, 630, 633, 634, 624, 624, 635, 633, 634, 623, 624, 633, 635, 636, 637, 632, 638, 632, 637, 630, 639, 637, 638, 639, 636, 635, 639, 638, 636] + rel material:binding = ( + bindMaterialAs = "weakerThanDescendants" + ) + uniform token orientation = "rightHanded" + uniform token physics:approximation = "sdf" + bool physics:collisionEnabled = 1 + uniform int physxSDFMeshCollision:sdfResolution = 50 + point3f[] points = [(0.196, 0.04833322, 0.021736022), (0.2, 0.04833322, 0.021736022), (0.2, 0.047196697, 0.0208033), (0.196, 0.051036824, 0.02285589), (0.2, 0.051036824, 0.02285589), (0.2, 0.049629875, 0.022429096), (0.196, 0.049629875, 0.022429096), (0.196, 0.047196697, 0.0208033), (0.196, 0.0525, 0.023), (0.2, 0.0525, 0.023), (0.196, 0.046263978, 0.019666776), (0.196, 0.04514411, 0.016963176), (0.2, 0.04514411, 0.016963176), (0.2, 0.045, 0.0155), (0.2, 0.046263978, 0.019666776), (0.2, 0.045570903, 0.018370125), (0.196, 0.045570903, 0.018370125), (0.196, 0.045, 0.0155), (9.3089074e-35, 0.04833322, 0.021736022), (0.004, 0.04833322, 0.021736022), (0.004, 0.047196697, 0.0208033), (3.2688535e-35, 0.051036824, 0.02285589), (0.004, 0.051036824, 0.02285589), (0.004, 0.049629875, 0.022429096), (6.412087e-35, 0.049629875, 0.022429096), (0, 0.047196697, 0.0208033), (0, 0.0525, 0.023), (0.004, 0.0525, 0.023), (1.3931764e-34, 0.046263978, 0.019666776), (1.6433637e-34, 0.04514411, 0.016963176), (0.004, 0.04514411, 0.016963176), (0.004, 0.045, 0.0155), (0.004, 0.046263978, 0.019666776), (0.004, 0.045570903, 0.018370125), (1.5480147e-34, 0.045570903, 0.018370125), (0, 0.045, 0.0155), (0.196, 0.1075, 0.023), (0.2, 0.1075, 0.023), (0.2, 0.0525, 0.023), (0.196, 0.0525, 0.023), (0, 0.1075, 0.023), (0.004, 0.1075, 0.023), (0.004, 0.0525, 0.023), (0, 0.0525, 0.023), (0.196, 0.045, 0.0155), (0.2, 0.045, 0.0155), (0.2, 0.045, 0.0145), (0.196, 0.045, 0.0145), (0.196, 0.112803295, 0.0208033), (0.2, 0.113736026, 0.019666776), (0.2, 0.112803295, 0.0208033), (0.196, 0.114855886, 0.016963176), (0.2, 0.114855886, 0.016963176), (0.2, 0.1144291, 0.018370125), (0.196, 0.1144291, 0.018370125), (0.196, 0.113736026, 0.019666776), (0.196, 0.115, 0.0155), (0.2, 0.115, 0.0155), (0.196, 0.111666776, 0.021736022), (0.196, 0.108963184, 0.02285589), (0.2, 0.108963184, 0.02285589), (0.2, 0.1075, 0.023), (0.196, 0.11037012, 0.022429096), (0.2, 0.111666776, 0.021736022), (0.2, 0.11037012, 0.022429096), (0.196, 0.1075, 0.023), (0, 0.112803295, 0.0208033), (0.004, 0.113736026, 0.019666776), (0.004, 0.112803295, 0.0208033), (-1.6433637e-34, 0.114855886, 0.016963176), (0.004, 0.114855886, 0.016963176), (0.004, 0.1144291, 0.018370125), (-1.5480147e-34, 0.1144291, 0.018370125), (-1.3931764e-34, 0.113736026, 0.019666776), (0, 0.115, 0.0155), (0.004, 0.115, 0.0155), (-9.3089074e-35, 0.111666776, 0.021736022), (-3.2688535e-35, 0.108963184, 0.02285589), (0.004, 0.108963184, 0.02285589), (0.004, 0.1075, 0.023), (-6.412087e-35, 0.11037012, 0.022429096), (0.004, 0.111666776, 0.021736022), (0.004, 0.11037012, 0.022429096), (0, 0.1075, 0.023), (0.196, 0.047196697, 0.0091967), (0.2, 0.046263978, 0.010333223), (0.2, 0.047196697, 0.0091967), (0.196, 0.04514411, 0.013036822), (0.2, 0.04514411, 0.013036822), (0.2, 0.045570903, 0.011629874), (0.196, 0.045570903, 0.011629874), (0.196, 0.046263978, 0.010333223), (0.196, 0.045, 0.0145), (0.2, 0.045, 0.0145), (0.196, 0.04833322, 0.008263978), (0.196, 0.051036824, 0.0071441103), (0.2, 0.051036824, 0.0071441103), (0.2, 0.0525, 0.007), (0.2, 0.04833322, 0.008263978), (0.2, 0.049629875, 0.0075709033), (0.196, 0.049629875, 0.0075709033), (0.196, 0.0525, 0.007), (0.196, 0.115, 0.0145), (0.2, 0.115, 0.0145), (0.2, 0.115, 0.0155), (0.196, 0.115, 0.0155), (0, 0.115, 0.0145), (0.004, 0.115, 0.0145), (0.004, 0.115, 0.0155), (0, 0.115, 0.0155), (0.196, 0.0525, 0.007), (0.2, 0.0525, 0.007), (0.2, 0.1075, 0.007), (0.196, 0.1075, 0.007), (0.196, 0.112803295, 0.0091967), (0.2, 0.111666776, 0.008263978), (0.2, 0.112803295, 0.0091967), (0.196, 0.108963184, 0.0071441103), (0.2, 0.108963184, 0.0071441103), (0.2, 0.11037012, 0.0075709033), (0.196, 0.11037012, 0.0075709033), (0.196, 0.111666776, 0.008263978), (0.196, 0.1075, 0.007), (0.2, 0.1075, 0.007), (0.196, 0.113736026, 0.010333223), (0.196, 0.114855886, 0.013036822), (0.2, 0.114855886, 0.013036822), (0.2, 0.115, 0.0145), (0.196, 0.1144291, 0.011629874), (0.2, 0.113736026, 0.010333223), (0.2, 0.1144291, 0.011629874), (0.196, 0.115, 0.0145), (0, 0.112803295, 0.0091967), (0.004, 0.111666776, 0.008263978), (0.004, 0.112803295, 0.0091967), (-3.2688535e-35, 0.108963184, 0.0071441103), (0.004, 0.108963184, 0.0071441103), (0.004, 0.11037012, 0.0075709033), (-6.412087e-35, 0.11037012, 0.0075709033), (-9.3089074e-35, 0.111666776, 0.008263978), (0, 0.1075, 0.007), (0.004, 0.1075, 0.007), (-1.3931764e-34, 0.113736026, 0.010333223), (-1.6433637e-34, 0.114855886, 0.013036822), (0.004, 0.114855886, 0.013036822), (0.004, 0.115, 0.0145), (-1.5480147e-34, 0.1144291, 0.011629874), (0.004, 0.113736026, 0.010333223), (0.004, 0.1144291, 0.011629874), (0, 0.115, 0.0145), (0, 0.045, 0.0155), (0.004, 0.045, 0.0155), (0.004, 0.045, 0.0145), (0, 0.045, 0.0145), (0, 0.047196697, 0.0091967), (0.004, 0.046263978, 0.010333223), (0.004, 0.047196697, 0.0091967), (1.6433637e-34, 0.04514411, 0.013036822), (0.004, 0.04514411, 0.013036822), (0.004, 0.045570903, 0.011629874), (1.5480147e-34, 0.045570903, 0.011629874), (1.3931764e-34, 0.046263978, 0.010333223), (0, 0.045, 0.0145), (0.004, 0.045, 0.0145), (9.3089074e-35, 0.04833322, 0.008263978), (3.2688535e-35, 0.051036824, 0.0071441103), (0.004, 0.051036824, 0.0071441103), (0.004, 0.0525, 0.007), (0.004, 0.04833322, 0.008263978), (0.004, 0.049629875, 0.0075709033), (6.412087e-35, 0.049629875, 0.0075709033), (0, 0.0525, 0.007), (0, 0.0525, 0.007), (0.004, 0.0525, 0.007), (0.004, 0.1075, 0.007), (0, 0.1075, 0.007), (0.007539138, 0.14666697, 0.03), (0.007539138, 0.14666697, 0.004), (0.010150758, 0.14984924, 0.004), (0.004403509, 0.13909689, 0.03), (0.004403509, 0.13909689, 0.004), (0.0055985297, 0.14303635, 0.004), (0.0055985297, 0.14303635, 0.03), (0.010150758, 0.14984924, 0.03), (0.004, 0.135, 0.03), (0.004, 0.135, 0.004), (0.013333025, 0.15246086, 0.03), (0.020903103, 0.1555965, 0.03), (0.020903103, 0.1555965, 0.004), (0.025, 0.156, 0.004), (0.013333025, 0.15246086, 0.004), (0.016963648, 0.15440148, 0.004), (0.016963648, 0.15440148, 0.03), (0.025, 0.156, 0.03), (0.004, 0.1144291, 0.011629874), (0.004, 0.113736026, 0.010333223), (0.004, 0.135, 0.004), (0.004, 0.112803295, 0.0091967), (0.004, 0.115, 0.0145), (0.004, 0.114855886, 0.013036822), (0.004, 0.115, 0.0155), (0.004, 0.108963184, 0.0071441103), (0.004, 0.1075, 0.007), (0.004, 0.111666776, 0.008263978), (0.004, 0.11037012, 0.0075709033), (0.004, 0.0525, 0.007), (0.004, 0.135, 0.03), (0.004, 0.114855886, 0.016963176), (0.004, 0.113736026, 0.019666776), (0.004, 0.1144291, 0.018370125), (0.004, 0.112803295, 0.0208033), (0.004, 0.111666776, 0.021736022), (0.004, 0.1075, 0.023), (0.004, 0.108963184, 0.02285589), (0.004, 0.11037012, 0.022429096), (0.004, 0.0525, 0.023), (0.004, 0.025, 0.004), (0.004, 0.051036824, 0.0071441103), (0.004, 0.049629875, 0.0075709033), (0.004, 0.04833322, 0.008263978), (0.004, 0.047196697, 0.0091967), (0.004, 0.045570903, 0.011629874), (0.004, 0.046263978, 0.010333223), (0.004, 0.04514411, 0.013036822), (0.004, 0.045, 0.0145), (0.004, 0.045, 0.0155), (0.004, 0.025, 0.03), (0.004, 0.047196697, 0.0208033), (0.004, 0.04833322, 0.021736022), (0.004, 0.049629875, 0.022429096), (0.004, 0.051036824, 0.02285589), (0.004, 0.04514411, 0.016963176), (0.004, 0.045570903, 0.018370125), (0.004, 0.046263978, 0.019666776), (0.004403509, 0.020903103, 0.004), (0.0055985297, 0.016963648, 0.004), (0.025, 0.004, 0.004), (0.004, 0.025, 0.004), (0.007539138, 0.013333025, 0.004), (0.020903103, 0.004403509, 0.004), (0.016963648, 0.0055985297, 0.004), (0.013333025, 0.007539138, 0.004), (0.010150758, 0.010150758, 0.004), (0.196, 0.135, 0.004), (0.196, 0.025, 0.004), (0.025, 0.156, 0.004), (0.0055985297, 0.14303635, 0.004), (0.004403509, 0.13909689, 0.004), (0.007539138, 0.14666697, 0.004), (0.004, 0.135, 0.004), (0.013333025, 0.15246086, 0.004), (0.010150758, 0.14984924, 0.004), (0.016963648, 0.15440148, 0.004), (0.020903103, 0.1555965, 0.004), (0.175, 0.004, 0.004), (0.17909689, 0.004403509, 0.004), (0.18303634, 0.0055985297, 0.004), (0.18666698, 0.007539138, 0.004), (0.18984924, 0.010150758, 0.004), (0.19246086, 0.013333025, 0.004), (0.19440147, 0.016963648, 0.004), (0.1955965, 0.020903103, 0.004), (0.18666698, 0.15246086, 0.004), (0.18303634, 0.15440148, 0.004), (0.175, 0.156, 0.004), (0.17909689, 0.1555965, 0.004), (0.18984924, 0.14984924, 0.004), (0.19440147, 0.14303635, 0.004), (0.1955965, 0.13909689, 0.004), (0.19246086, 0.14666697, 0.004), (0.18666698, 0.15246086, 0.03), (0.18666698, 0.15246086, 0.004), (0.18984924, 0.14984924, 0.004), (0.17909689, 0.1555965, 0.03), (0.17909689, 0.1555965, 0.004), (0.18303634, 0.15440148, 0.004), (0.18303634, 0.15440148, 0.03), (0.18984924, 0.14984924, 0.03), (0.175, 0.156, 0.03), (0.175, 0.156, 0.004), (0.19246086, 0.14666697, 0.03), (0.1955965, 0.13909689, 0.03), (0.1955965, 0.13909689, 0.004), (0.196, 0.135, 0.004), (0.19246086, 0.14666697, 0.004), (0.19440147, 0.14303635, 0.004), (0.19440147, 0.14303635, 0.03), (0.196, 0.135, 0.03), (0.196, 0.045570903, 0.011629874), (0.196, 0.046263978, 0.010333223), (0.196, 0.025, 0.004), (0.196, 0.047196697, 0.0091967), (0.196, 0.045, 0.0145), (0.196, 0.04514411, 0.013036822), (0.196, 0.045, 0.0155), (0.196, 0.051036824, 0.0071441103), (0.196, 0.0525, 0.007), (0.196, 0.04833322, 0.008263978), (0.196, 0.049629875, 0.0075709033), (0.196, 0.1075, 0.007), (0.196, 0.025, 0.03), (0.196, 0.04514411, 0.016963176), (0.196, 0.046263978, 0.019666776), (0.196, 0.045570903, 0.018370125), (0.196, 0.047196697, 0.0208033), (0.196, 0.04833322, 0.021736022), (0.196, 0.0525, 0.023), (0.196, 0.051036824, 0.02285589), (0.196, 0.049629875, 0.022429096), (0.196, 0.1075, 0.023), (0.196, 0.135, 0.004), (0.196, 0.108963184, 0.0071441103), (0.196, 0.11037012, 0.0075709033), (0.196, 0.111666776, 0.008263978), (0.196, 0.112803295, 0.0091967), (0.196, 0.1144291, 0.011629874), (0.196, 0.113736026, 0.010333223), (0.196, 0.114855886, 0.013036822), (0.196, 0.115, 0.0145), (0.196, 0.115, 0.0155), (0.196, 0.135, 0.03), (0.196, 0.112803295, 0.0208033), (0.196, 0.111666776, 0.021736022), (0.196, 0.11037012, 0.022429096), (0.196, 0.108963184, 0.02285589), (0.196, 0.114855886, 0.016963176), (0.196, 0.1144291, 0.018370125), (0.196, 0.113736026, 0.019666776), (0.18984924, 0.010150758, 0.03), (0.19246086, 0.013333025, 0.004), (0.18984924, 0.010150758, 0.004), (0.1955965, 0.020903103, 0.03), (0.1955965, 0.020903103, 0.004), (0.19440147, 0.016963648, 0.004), (0.19440147, 0.016963648, 0.03), (0.19246086, 0.013333025, 0.03), (0.196, 0.025, 0.03), (0.196, 0.025, 0.004), (0.18666698, 0.007539138, 0.03), (0.17909689, 0.004403509, 0.03), (0.17909689, 0.004403509, 0.004), (0.175, 0.004, 0.004), (0.18666698, 0.007539138, 0.004), (0.18303634, 0.0055985297, 0.004), (0.18303634, 0.0055985297, 0.03), (0.175, 0.004, 0.03), (0.010150758, 0.010150758, 0.03), (0.013333025, 0.007539138, 0.004), (0.010150758, 0.010150758, 0.004), (0.020903103, 0.004403509, 0.03), (0.020903103, 0.004403509, 0.004), (0.016963648, 0.0055985297, 0.004), (0.016963648, 0.0055985297, 0.03), (0.013333025, 0.007539138, 0.03), (0.025, 0.004, 0.03), (0.025, 0.004, 0.004), (0.007539138, 0.013333025, 0.03), (0.004403509, 0.020903103, 0.03), (0.004403509, 0.020903103, 0.004), (0.004, 0.025, 0.004), (0.007539138, 0.013333025, 0.004), (0.0055985297, 0.016963648, 0.004), (0.0055985297, 0.016963648, 0.03), (0.004, 0.025, 0.03), (0.025, 0.156, 0.03), (0.025, 0.156, 0.004), (0.175, 0.156, 0.004), (0.175, 0.156, 0.03), (0.175, 0.004, 0.03), (0.175, 0.004, 0.004), (0.025, 0.004, 0.004), (0.025, 0.004, 0.03), (0.0073223305, 0.15267767, 0), (0.0042132596, 0.14888926, 0), (0.0042132596, 0.14888926, 0.03), (0.0019030117, 0.14456709, 0), (0.00048036798, 0.13987726, 0), (0.00048036798, 0.13987726, 0.03), (0.0019030117, 0.14456709, 0.03), (0.0073223305, 0.15267767, 0.03), (-3.0160063e-33, 0.135, 0.03), (-3.0160063e-33, 0.135, 0), (0.011110744, 0.15578674, 0.03), (0.025, 0.16, 0), (0.020122742, 0.15951964, 0), (0.025, 0.16, 0.03), (0.015432914, 0.15809698, 0), (0.011110744, 0.15578674, 0), (0.015432914, 0.15809698, 0.03), (0.020122742, 0.15951964, 0.03), (-3.0160063e-33, 0.135, 0), (-1.3931764e-34, 0.113736026, 0.010333223), (-1.5480147e-34, 0.1144291, 0.011629874), (0, 0.112803295, 0.0091967), (-1.6433637e-34, 0.114855886, 0.013036822), (0, 0.115, 0.0145), (0, 0.115, 0.0155), (0, 0.1075, 0.007), (-3.2688535e-35, 0.108963184, 0.0071441103), (-9.3089074e-35, 0.111666776, 0.008263978), (-6.412087e-35, 0.11037012, 0.0075709033), (-5.585197e-34, 0.025, 0), (-1.6433637e-34, 0.114855886, 0.016963176), (-3.0160063e-33, 0.135, 0.03), (-1.5480147e-34, 0.1144291, 0.018370125), (-1.3931764e-34, 0.113736026, 0.019666776), (0, 0.112803295, 0.0208033), (-9.3089074e-35, 0.111666776, 0.021736022), (-3.2688535e-35, 0.108963184, 0.02285589), (0, 0.1075, 0.023), (-6.412087e-35, 0.11037012, 0.022429096), (-5.585197e-34, 0.025, 0.03), (3.2688535e-35, 0.051036824, 0.0071441103), (0, 0.0525, 0.007), (9.3089074e-35, 0.04833322, 0.008263978), (6.412087e-35, 0.049629875, 0.0075709033), (0, 0.047196697, 0.0091967), (1.3931764e-34, 0.046263978, 0.010333223), (1.5480147e-34, 0.045570903, 0.011629874), (1.6433637e-34, 0.04514411, 0.013036822), (0, 0.045, 0.0145), (9.3089074e-35, 0.04833322, 0.021736022), (0, 0.047196697, 0.0208033), (3.2688535e-35, 0.051036824, 0.02285589), (6.412087e-35, 0.049629875, 0.022429096), (0, 0.0525, 0.023), (1.6433637e-34, 0.04514411, 0.016963176), (0, 0.045, 0.0155), (1.3931764e-34, 0.046263978, 0.019666776), (1.5480147e-34, 0.045570903, 0.018370125), (0.025, 0, 0), (0.0019030117, 0.015432914, 0), (0.00048036798, 0.020122742, 0), (-5.585197e-34, 0.025, 0), (0.0042132596, 0.011110744, 0), (0.015432914, 0.0019030117, 0), (0.020122742, 0.00048036798, 0), (0.011110744, 0.0042132596, 0), (0.0073223305, 0.0073223305, 0), (0.2, 0.025, 0), (0.2, 0.135, 0), (0.00048036798, 0.13987726, 0), (0.0019030117, 0.14456709, 0), (0.025, 0.16, 0), (0.0042132596, 0.14888926, 0), (-3.0160063e-33, 0.135, 0), (0.0073223305, 0.15267767, 0), (0.011110744, 0.15578674, 0), (0.020122742, 0.15951964, 0), (0.015432914, 0.15809698, 0), (0.175, 0, 0), (0.1845671, 0.0019030117, 0), (0.17987725, 0.00048036798, 0), (0.18888925, 0.0042132596, 0), (0.19267768, 0.0073223305, 0), (0.19809699, 0.015432914, 0), (0.19578674, 0.011110744, 0), (0.19951963, 0.020122742, 0), (0.175, 0.16, 0), (0.1845671, 0.15809698, 0), (0.18888925, 0.15578674, 0), (0.17987725, 0.15951964, 0), (0.19267768, 0.15267767, 0), (0.19951963, 0.13987726, 0), (0.19809699, 0.14456709, 0), (0.19578674, 0.14888926, 0), (0.19267768, 0.15267767, 0), (0.18888925, 0.15578674, 0), (0.18888925, 0.15578674, 0.03), (0.1845671, 0.15809698, 0), (0.17987725, 0.15951964, 0), (0.17987725, 0.15951964, 0.03), (0.1845671, 0.15809698, 0.03), (0.19267768, 0.15267767, 0.03), (0.175, 0.16, 0.03), (0.175, 0.16, 0), (0.19578674, 0.14888926, 0.03), (0.2, 0.135, 0), (0.19951963, 0.13987726, 0), (0.19951963, 0.13987726, 0.03), (0.19809699, 0.14456709, 0), (0.19578674, 0.14888926, 0), (0.19809699, 0.14456709, 0.03), (0.2, 0.135, 0.03), (0.2, 0.025, 0), (0.2, 0.046263978, 0.010333223), (0.2, 0.045570903, 0.011629874), (0.2, 0.047196697, 0.0091967), (0.2, 0.04514411, 0.013036822), (0.2, 0.045, 0.0145), (0.2, 0.045, 0.0155), (0.2, 0.0525, 0.007), (0.2, 0.051036824, 0.0071441103), (0.2, 0.04833322, 0.008263978), (0.2, 0.049629875, 0.0075709033), (0.2, 0.135, 0), (0.2, 0.04514411, 0.016963176), (0.2, 0.025, 0.03), (0.2, 0.045570903, 0.018370125), (0.2, 0.046263978, 0.019666776), (0.2, 0.047196697, 0.0208033), (0.2, 0.04833322, 0.021736022), (0.2, 0.051036824, 0.02285589), (0.2, 0.0525, 0.023), (0.2, 0.049629875, 0.022429096), (0.2, 0.135, 0.03), (0.2, 0.108963184, 0.0071441103), (0.2, 0.1075, 0.007), (0.2, 0.111666776, 0.008263978), (0.2, 0.11037012, 0.0075709033), (0.2, 0.112803295, 0.0091967), (0.2, 0.113736026, 0.010333223), (0.2, 0.1144291, 0.011629874), (0.2, 0.114855886, 0.013036822), (0.2, 0.115, 0.0145), (0.2, 0.111666776, 0.021736022), (0.2, 0.112803295, 0.0208033), (0.2, 0.108963184, 0.02285589), (0.2, 0.11037012, 0.022429096), (0.2, 0.1075, 0.023), (0.2, 0.114855886, 0.016963176), (0.2, 0.115, 0.0155), (0.2, 0.113736026, 0.019666776), (0.2, 0.1144291, 0.018370125), (0.19267768, 0.0073223305, 0), (0.19578674, 0.011110744, 0), (0.19267768, 0.0073223305, 0.03), (0.19809699, 0.015432914, 0), (0.19951963, 0.020122742, 0), (0.19951963, 0.020122742, 0.03), (0.19809699, 0.015432914, 0.03), (0.19578674, 0.011110744, 0.03), (0.2, 0.025, 0), (0.2, 0.025, 0.03), (0.18888925, 0.0042132596, 0.03), (0.175, 0, 0), (0.17987725, 0.00048036798, 0), (0.17987725, 0.00048036798, 0.03), (0.1845671, 0.0019030117, 0), (0.18888925, 0.0042132596, 0), (0.1845671, 0.0019030117, 0.03), (0.175, 0, 0.03), (0.0073223305, 0.0073223305, 0), (0.011110744, 0.0042132596, 0), (0.0073223305, 0.0073223305, 0.03), (0.015432914, 0.0019030117, 0), (0.020122742, 0.00048036798, 0), (0.020122742, 0.00048036798, 0.03), (0.015432914, 0.0019030117, 0.03), (0.011110744, 0.0042132596, 0.03), (0.025, 0, 0), (0.025, 0, 0.03), (0.0042132596, 0.011110744, 0.03), (-5.585197e-34, 0.025, 0), (0.00048036798, 0.020122742, 0), (0.00048036798, 0.020122742, 0.03), (0.0019030117, 0.015432914, 0), (0.0042132596, 0.011110744, 0), (0.0019030117, 0.015432914, 0.03), (-5.585197e-34, 0.025, 0.03), (0.175, 0.16, 0), (0.025, 0.16, 0), (0.025, 0.16, 0.03), (0.175, 0.16, 0.03), (0.025, 0, 0), (0.175, 0, 0), (0.175, 0, 0.03), (0.025, 0, 0.03), (0.0019030117, 0.015432914, 0.03), (0.0042132596, 0.011110744, 0.03), (0.007539138, 0.013333025, 0.03), (0.010150758, 0.010150758, 0.03), (0.0073223305, 0.0073223305, 0.03), (0.0055985297, 0.016963648, 0.03), (-5.585197e-34, 0.025, 0.03), (0.00048036798, 0.020122742, 0.03), (0.004403509, 0.020903103, 0.03), (0.004, 0.025, 0.03), (0.004, 0.135, 0.03), (0.020903103, 0.004403509, 0.03), (0.015432914, 0.0019030117, 0.03), (0.020122742, 0.00048036798, 0.03), (0.025, 0, 0.03), (0.025, 0.004, 0.03), (0.175, 0, 0.03), (0.175, 0.004, 0.03), (0.013333025, 0.007539138, 0.03), (0.011110744, 0.0042132596, 0.03), (0.016963648, 0.0055985297, 0.03), (0.00048036798, 0.13987726, 0.03), (-3.0160063e-33, 0.135, 0.03), (0.004403509, 0.13909689, 0.03), (0.0055985297, 0.14303635, 0.03), (0.0042132596, 0.14888926, 0.03), (0.0019030117, 0.14456709, 0.03), (0.007539138, 0.14666697, 0.03), (0.010150758, 0.14984924, 0.03), (0.0073223305, 0.15267767, 0.03), (0.013333025, 0.15246086, 0.03), (0.011110744, 0.15578674, 0.03), (0.016963648, 0.15440148, 0.03), (0.020903103, 0.1555965, 0.03), (0.015432914, 0.15809698, 0.03), (0.020122742, 0.15951964, 0.03), (0.025, 0.156, 0.03), (0.025, 0.16, 0.03), (0.175, 0.156, 0.03), (0.175, 0.16, 0.03), (0.17987725, 0.00048036798, 0.03), (0.17909689, 0.004403509, 0.03), (0.1845671, 0.0019030117, 0.03), (0.18303634, 0.0055985297, 0.03), (0.18984924, 0.010150758, 0.03), (0.18666698, 0.007539138, 0.03), (0.19267768, 0.0073223305, 0.03), (0.18888925, 0.0042132596, 0.03), (0.19578674, 0.011110744, 0.03), (0.19246086, 0.013333025, 0.03), (0.19809699, 0.015432914, 0.03), (0.19440147, 0.016963648, 0.03), (0.1955965, 0.020903103, 0.03), (0.19951963, 0.020122742, 0.03), (0.2, 0.025, 0.03), (0.196, 0.025, 0.03), (0.2, 0.135, 0.03), (0.17909689, 0.1555965, 0.03), (0.18303634, 0.15440148, 0.03), (0.1845671, 0.15809698, 0.03), (0.18888925, 0.15578674, 0.03), (0.18666698, 0.15246086, 0.03), (0.19267768, 0.15267767, 0.03), (0.17987725, 0.15951964, 0.03), (0.18984924, 0.14984924, 0.03), (0.1955965, 0.13909689, 0.03), (0.196, 0.135, 0.03), (0.19951963, 0.13987726, 0.03), (0.19440147, 0.14303635, 0.03), (0.19578674, 0.14888926, 0.03), (0.19246086, 0.14666697, 0.03), (0.19809699, 0.14456709, 0.03)] + normal3f[] primvars:normals = [(-0, 0.55557024, -0.8314696), (-0, 0.70710677, -0.70710677), (-0, 0.19509032, -0.98078525), (-0, 0.38268343, -0.9238795), (-0, 1.110223e-16, -1), (-0, 0.8314696, -0.55557024), (-0, 0.98078525, -0.19509032), (-0, 1, 2.220446e-16), (-0, 0.9238795, -0.38268343), (-0, -0, -1), (-0, 1, -0), (-0, -0.70710677, -0.70710677), (-0, -0.8314696, -0.55557024), (-0, -0.98078525, -0.19509032), (-0, -0.9238795, -0.38268343), (-0, -1, 2.220446e-16), (-0, -0.55557024, -0.8314696), (-0, -0.19509032, -0.98078525), (-0, 2.220446e-16, -1), (-0, -0.38268343, -0.9238795), (-0, 0.70710677, 0.70710677), (-0, 0.8314696, 0.55557024), (-0, 0.98078525, 0.19509032), (-0, 0.9238795, 0.38268343), (-0, 1, -2.220446e-16), (0, 0.55557024, 0.8314696), (0, 0.19509032, 0.98078525), (0, -2.220446e-16, 1), (0, 0.38268343, 0.9238795), (-0, -1, -0), (-0, -0, 1), (-0, -0.70710677, 0.70710677), (-0, -0.55557024, 0.8314696), (-0, -0.19509032, 0.98078525), (-0, -0.38268343, 0.9238795), (-0, -1.110223e-16, 1), (-0, -0.8314696, 0.55557024), (-0, -0.98078525, 0.19509032), (-0, -1, -1.1657342e-15), (-0, -0.9238795, 0.38268343), (0.8314696, -0.55557024, -0), (0.70710677, -0.70710677, -0), (0.98078525, -0.19509032, -0), (0.9238795, -0.38268343, -0), (1, -1.110223e-16, -0), (0.55557024, -0.8314696, -0), (0.19509032, -0.98078525, -0), (-2.220446e-16, -1, -0), (0.38268343, -0.9238795, -0), (1, 2.2340787e-32, -0), (-0.55557024, -0.8314696, -0), (-0.70710677, -0.70710677, -0), (-0.19509032, -0.98078525, -0), (-0.38268343, -0.9238795, -0), (-1.110223e-16, -1, -0), (-0.8314696, -0.55557024, -0), (-0.98078525, -0.19509032, -0), (-1, 2.220446e-16, -0), (-0.9238795, -0.38268343, -0), (-1, -0, -0), (-0.70710677, 0.70710677, -0), (-0.8314696, 0.55557024, -0), (-0.98078525, 0.19509032, -0), (-0.9238795, 0.38268343, -0), (-1, 1.110223e-16, -0), (-0.55557024, 0.8314696, -0), (-0.19509032, 0.98078525, -0), (2.220446e-16, 1, -0), (-0.38268343, 0.9238795, -0), (0.70710677, 0.70710677, -0), (0.55557024, 0.8314696, -0), (0.19509032, 0.98078525, -0), (0.38268343, 0.9238795, -0), (1.110223e-16, 1, -0), (0.8314696, 0.55557024, -0), (0.98078525, 0.19509032, -0), (1, -2.220446e-16, -0), (0.9238795, 0.38268343, -0), (-1, -1.110223e-16, 0), (1.1657342e-15, 1, 0), (-1, -2.2340787e-32, 0), (-1.110223e-16, 1, 0), (1, -1.1657342e-15, 0), (1, 0, 0), (1, 1.110223e-16, 0), (-1.1657342e-15, -1, 0), (1.110223e-16, -1, 0), (-1, 1.1657342e-15, 0)] ( + interpolation = "vertex" + ) + int[] primvars:normals:indices = [0, 0, 1, 2, 2, 3, 3, 1, 4, 4, 5, 6, 6, 7, 5, 8, 8, 7, 0, 0, 1, 2, 2, 3, 3, 1, 4, 4, 5, 6, 6, 7, 5, 8, 8, 7, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 12, 11, 13, 13, 14, 14, 12, 15, 15, 16, 17, 17, 18, 19, 16, 19, 18, 11, 12, 11, 13, 13, 14, 14, 12, 15, 15, 16, 17, 17, 18, 19, 16, 19, 18, 20, 21, 20, 22, 22, 23, 23, 21, 24, 24, 25, 26, 26, 27, 25, 28, 28, 27, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 31, 32, 31, 33, 33, 34, 34, 32, 35, 35, 36, 37, 37, 38, 39, 36, 39, 38, 31, 32, 31, 33, 33, 34, 34, 32, 35, 35, 36, 37, 37, 38, 39, 36, 39, 38, 10, 10, 10, 10, 20, 21, 20, 22, 22, 23, 23, 21, 24, 24, 25, 26, 26, 27, 25, 28, 28, 27, 30, 30, 30, 30, 40, 40, 41, 42, 42, 43, 43, 41, 44, 44, 45, 46, 46, 47, 45, 48, 48, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 50, 50, 51, 52, 52, 53, 53, 51, 54, 54, 55, 56, 56, 57, 55, 58, 58, 57, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 61, 60, 62, 62, 63, 63, 61, 64, 64, 65, 66, 66, 67, 65, 68, 68, 67, 69, 70, 69, 71, 71, 72, 72, 70, 73, 73, 74, 75, 75, 76, 74, 77, 77, 76, 29, 29, 29, 29, 10, 10, 10, 10, 60, 61, 61, 63, 62, 62, 63, 60, 78, 78, 65, 79, 66, 79, 68, 65, 68, 66, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 69, 70, 70, 72, 71, 71, 72, 69, 81, 81, 74, 82, 75, 75, 77, 74, 77, 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 41, 40, 41, 43, 42, 42, 43, 40, 84, 84, 45, 85, 46, 46, 48, 45, 48, 85, 51, 50, 51, 53, 52, 52, 53, 50, 86, 86, 55, 87, 56, 56, 58, 55, 58, 87, 10, 10, 10, 10, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30] + texCoord2f[] primvars:st = [(-0.19600001, 0.048333224), (-0.2, 0.048333224), (-0.2, 0.020803303), (-0.2, 0.0471967), (-0.19600001, 0.051036827), (-0.2, 0.051036827), (-0.2, 0.04962988), (-0.19600001, 0.04962988), (-0.19600001, 0.020803303), (-0.19600001, 0.0471967), (-0.19600001, 0.052500002), (-0.2, 0.052500002), (-0.19600001, 0.019666778), (-0.19600001, 0.016963178), (-0.2, 0.016963178), (-0.2, 0.015500001), (-0.2, 0.019666778), (-0.2, 0.018370125), (-0.19600001, 0.018370125), (-0.19600001, 0.015500001), (-9.308908e-35, 0.048333224), (-0.004, 0.048333224), (-0.004, 0.020803303), (-0.004, 0.0471967), (-3.2688538e-35, 0.051036827), (-0.004, 0.051036827), (-0.004, 0.04962988), (-6.4120875e-35, 0.04962988), (-0, 0.020803303), (-0, 0.0471967), (-0, 0.052500002), (-0.004, 0.052500002), (-1.3931765e-34, 0.019666778), (-1.6433637e-34, 0.016963178), (-0.004, 0.016963178), (-0.004, 0.015500001), (-0.004, 0.019666778), (-0.004, 0.018370125), (-1.5480148e-34, 0.018370125), (-0, 0.015500001), (-0.19600001, 0.1075), (-0.2, 0.1075), (-0.2, 0.052500002), (-0.19600001, 0.052500002), (-0, 0.1075), (-0.004, 0.1075), (-0.004, 0.052500002), (-0, 0.052500002), (-0.19600001, 0.015500001), (-0.2, 0.015500001), (-0.2, 0.0145000005), (-0.19600001, 0.0145000005), (-0.19600001, 0.1128033), (0.19600001, 0.020803303), (0.2, 0.019666778), (-0.2, 0.1128033), (0.2, 0.020803303), (0.19600001, 0.016963178), (0.2, 0.016963178), (0.2, 0.018370125), (0.19600001, 0.018370125), (0.19600001, 0.019666778), (0.19600001, 0.015500001), (0.2, 0.015500001), (-0.19600001, 0.11166678), (-0.19600001, 0.108963184), (-0.2, 0.108963184), (-0.2, 0.1075), (-0.19600001, 0.11037013), (-0.2, 0.11166678), (-0.2, 0.11037013), (-0.19600001, 0.1075), (0, 0.020803303), (-0, 0.1128033), (0.004, 0.019666778), (-0.004, 0.1128033), (0.004, 0.020803303), (-1.6433637e-34, 0.016963178), (0.004, 0.016963178), (0.004, 0.018370125), (-1.5480148e-34, 0.018370125), (-1.3931765e-34, 0.019666778), (0, 0.015500001), (0.004, 0.015500001), (9.308908e-35, 0.11166678), (3.2688538e-35, 0.108963184), (-0.004, 0.108963184), (-0.004, 0.1075), (6.4120875e-35, 0.11037013), (-0.004, 0.11166678), (-0.004, 0.11037013), (-0, 0.1075), (-0.19600001, 0.0091967), (0.19600001, 0.0471967), (-0.2, 0.010333224), (-0.2, 0.0091967), (0.2, 0.0471967), (-0.19600001, 0.013036823), (-0.2, 0.013036823), (-0.2, 0.011629875), (-0.19600001, 0.011629875), (-0.19600001, 0.010333224), (-0.19600001, 0.0145000005), (-0.2, 0.0145000005), (0.19600001, 0.048333224), (0.19600001, 0.051036827), (0.2, 0.051036827), (0.2, 0.052500002), (0.2, 0.048333224), (0.2, 0.04962988), (0.19600001, 0.04962988), (0.19600001, 0.052500002), (0.19600001, 0.0145000005), (0.2, 0.0145000005), (0.2, 0.015500001), (0.19600001, 0.015500001), (0, 0.0145000005), (0.004, 0.0145000005), (0.004, 0.015500001), (0, 0.015500001), (0.19600001, 0.052500002), (0.2, 0.052500002), (0.2, 0.1075), (0.19600001, 0.1075), (0.19600001, 0.0091967), (0.19600001, 0.1128033), (0.2, 0.11166678), (0.2, 0.0091967), (0.2, 0.1128033), (0.19600001, 0.108963184), (0.2, 0.108963184), (0.2, 0.11037013), (0.19600001, 0.11037013), (0.19600001, 0.11166678), (0.19600001, 0.1075), (0.2, 0.1075), (0.19600001, 0.010333224), (0.19600001, 0.013036823), (0.2, 0.013036823), (0.2, 0.0145000005), (0.19600001, 0.011629875), (0.2, 0.010333224), (0.2, 0.011629875), (0.19600001, 0.0145000005), (0, 0.0091967), (0, 0.1128033), (0.004, 0.11166678), (0.004, 0.0091967), (0.004, 0.1128033), (-3.2688538e-35, 0.108963184), (0.004, 0.108963184), (0.004, 0.11037013), (-6.4120875e-35, 0.11037013), (-9.308908e-35, 0.11166678), (0, 0.1075), (0.004, 0.1075), (-1.3931765e-34, 0.010333224), (-1.6433637e-34, 0.013036823), (0.004, 0.013036823), (0.004, 0.0145000005), (-1.5480148e-34, 0.011629875), (0.004, 0.010333224), (0.004, 0.011629875), (0, 0.0145000005), (-0, 0.015500001), (-0.004, 0.015500001), (-0.004, 0.0145000005), (-0, 0.0145000005), (-0, 0.0091967), (0, 0.0471967), (-0.004, 0.010333224), (-0.004, 0.0091967), (0.004, 0.0471967), (-1.6433637e-34, 0.013036823), (-0.004, 0.013036823), (-0.004, 0.011629875), (-1.5480148e-34, 0.011629875), (-1.3931765e-34, 0.010333224), (-0, 0.0145000005), (-0.004, 0.0145000005), (9.308908e-35, 0.048333224), (3.2688538e-35, 0.051036827), (0.004, 0.051036827), (0.004, 0.052500002), (0.004, 0.048333224), (0.004, 0.04962988), (6.4120875e-35, 0.04962988), (0, 0.052500002), (0, 0.052500002), (0.004, 0.052500002), (0.004, 0.1075), (0, 0.1075), (-0.030000001, 0.14666699), (-0.004, 0.14666699), (-0.004, 0.14984925), (0.010150759, 0.004), (-0.030000001, 0.1390969), (-0.004, 0.1390969), (-0.004, 0.14303635), (-0.030000001, 0.14303635), (-0.030000001, 0.14984925), (0.010150759, 0.030000001), (-0.030000001, 0.135), (-0.004, 0.135), (0.013333025, 0.030000001), (0.020903103, 0.030000001), (0.020903103, 0.004), (0.025, 0.004), (0.013333025, 0.004), (0.01696365, 0.004), (0.01696365, 0.030000001), (0.025, 0.030000001), (-0.011629875, 0.11442911), (-0.010333224, 0.113736026), (-0.004, 0.135), (-0.0091967, 0.1128033), (-0.0145000005, 0.115), (-0.013036823, 0.11485589), (-0.015500001, 0.115), (-0.0071441107, 0.108963184), (-0.007, 0.1075), (-0.008263978, 0.11166678), (-0.0075709037, 0.11037013), (-0.007, 0.052500002), (-0.030000001, 0.135), (-0.016963178, 0.11485589), (-0.019666778, 0.113736026), (-0.018370125, 0.11442911), (-0.020803303, 0.1128033), (-0.021736024, 0.11166678), (-0.023000002, 0.1075), (-0.02285589, 0.108963184), (-0.022429097, 0.11037013), (-0.023000002, 0.052500002), (-0.004, 0.025), (-0.0071441107, 0.051036827), (-0.0075709037, 0.04962988), (-0.008263978, 0.048333224), (-0.0091967, 0.0471967), (-0.011629875, 0.045570906), (-0.010333224, 0.046263978), (-0.013036823, 0.045144115), (-0.0145000005, 0.045), (-0.015500001, 0.045), (-0.030000001, 0.025), (-0.020803303, 0.0471967), (-0.021736024, 0.048333224), (-0.022429097, 0.04962988), (-0.02285589, 0.051036827), (-0.016963178, 0.045144115), (-0.018370125, 0.045570906), (-0.019666778, 0.046263978), (0.004403509, 0.020903103), (0.00559853, 0.01696365), (0.025, 0.004), (0.004, 0.025), (0.0075391387, 0.013333025), (0.020903103, 0.004403509), (0.01696365, 0.00559853), (0.013333025, 0.0075391387), (0.010150759, 0.010150759), (0.19600001, 0.135), (0.19600001, 0.025), (0.025, 0.156), (0.00559853, 0.14303635), (0.004403509, 0.1390969), (0.0075391387, 0.14666699), (0.004, 0.135), (0.013333025, 0.15246087), (0.010150759, 0.14984925), (0.01696365, 0.15440148), (0.020903103, 0.15559651), (0.17500001, 0.004), (0.1790969, 0.004403509), (0.18303636, 0.00559853), (0.18666698, 0.0075391387), (0.18984926, 0.010150759), (0.19246086, 0.013333025), (0.19440149, 0.01696365), (0.1955965, 0.020903103), (0.18666698, 0.15246087), (0.18303636, 0.15440148), (0.17500001, 0.156), (0.1790969, 0.15559651), (0.18984926, 0.14984925), (0.19440149, 0.14303635), (0.1955965, 0.1390969), (0.19246086, 0.14666699), (0.18666698, 0.030000001), (0.18666698, 0.004), (0.004, 0.14984925), (0.18984926, 0.004), (0.1790969, 0.030000001), (0.1790969, 0.004), (0.18303636, 0.004), (0.18303636, 0.030000001), (0.030000001, 0.14984925), (0.18984926, 0.030000001), (0.17500001, 0.030000001), (0.17500001, 0.004), (0.030000001, 0.14666699), (0.030000001, 0.1390969), (0.004, 0.1390969), (0.004, 0.135), (0.004, 0.14666699), (0.004, 0.14303635), (0.030000001, 0.14303635), (0.030000001, 0.135), (0.011629875, 0.045570906), (0.010333224, 0.046263978), (0.004, 0.025), (0.0091967, 0.0471967), (0.0145000005, 0.045), (0.013036823, 0.045144115), (0.015500001, 0.045), (0.0071441107, 0.051036827), (0.007, 0.052500002), (0.008263978, 0.048333224), (0.0075709037, 0.04962988), (0.007, 0.1075), (0.030000001, 0.025), (0.016963178, 0.045144115), (0.019666778, 0.046263978), (0.018370125, 0.045570906), (0.020803303, 0.0471967), (0.021736024, 0.048333224), (0.023000002, 0.052500002), (0.02285589, 0.051036827), (0.022429097, 0.04962988), (0.023000002, 0.1075), (0.004, 0.135), (0.0071441107, 0.108963184), (0.0075709037, 0.11037013), (0.008263978, 0.11166678), (0.0091967, 0.1128033), (0.011629875, 0.11442911), (0.010333224, 0.113736026), (0.013036823, 0.11485589), (0.0145000005, 0.115), (0.015500001, 0.115), (0.030000001, 0.135), (0.020803303, 0.1128033), (0.021736024, 0.11166678), (0.022429097, 0.11037013), (0.02285589, 0.108963184), (0.016963178, 0.11485589), (0.018370125, 0.11442911), (0.019666778, 0.113736026), (-0.18984926, 0.030000001), (0.030000001, 0.010150759), (0.004, 0.013333025), (-0.18984926, 0.004), (0.004, 0.010150759), (0.030000001, 0.020903103), (0.004, 0.020903103), (0.004, 0.01696365), (0.030000001, 0.01696365), (0.030000001, 0.013333025), (0.030000001, 0.025), (0.004, 0.025), (-0.18666698, 0.030000001), (-0.1790969, 0.030000001), (-0.1790969, 0.004), (-0.17500001, 0.004), (-0.18666698, 0.004), (-0.18303636, 0.004), (-0.18303636, 0.030000001), (-0.17500001, 0.030000001), (-0.030000001, 0.010150759), (-0.010150759, 0.030000001), (-0.013333025, 0.004), (-0.010150759, 0.004), (-0.004, 0.010150759), (-0.020903103, 0.030000001), (-0.020903103, 0.004), (-0.01696365, 0.004), (-0.01696365, 0.030000001), (-0.013333025, 0.030000001), (-0.025, 0.030000001), (-0.025, 0.004), (-0.030000001, 0.013333025), (-0.030000001, 0.020903103), (-0.004, 0.020903103), (-0.004, 0.025), (-0.004, 0.013333025), (-0.004, 0.01696365), (-0.030000001, 0.01696365), (-0.030000001, 0.025), (0.025, 0.030000001), (0.025, 0.004), (0.17500001, 0.004), (0.17500001, 0.030000001), (-0.17500001, 0.030000001), (-0.17500001, 0.004), (-0.025, 0.004), (-0.025, 0.030000001), (-0.007322331, 0), (0, 0.15267769), (0, 0.14888926), (0.030000001, 0.14888926), (0, 0.1445671), (0, 0.13987726), (0.030000001, 0.13987726), (0.030000001, 0.1445671), (-0.007322331, 0.030000001), (0.030000001, 0.15267769), (0.030000001, 0.135), (0, 0.135), (-0.011110745, 0.030000001), (-0.025, 0), (-0.020122742, 0), (-0.025, 0.030000001), (-0.015432915, 0), (-0.011110745, 0), (-0.015432915, 0.030000001), (-0.020122742, 0.030000001), (0, 0.135), (0.010333224, 0.113736026), (0.011629875, 0.11442911), (0.0091967, 0.1128033), (0.013036823, 0.11485589), (0.0145000005, 0.115), (0.015500001, 0.115), (0.007, 0.1075), (0.0071441107, 0.108963184), (0.008263978, 0.11166678), (0.0075709037, 0.11037013), (0, 0.025), (0.016963178, 0.11485589), (0.030000001, 0.135), (0.018370125, 0.11442911), (0.019666778, 0.113736026), (0.020803303, 0.1128033), (0.021736024, 0.11166678), (0.02285589, 0.108963184), (0.023000002, 0.1075), (0.022429097, 0.11037013), (0.030000001, 0.025), (0.0071441107, 0.051036827), (0.007, 0.052500002), (0.008263978, 0.048333224), (0.0075709037, 0.04962988), (0.0091967, 0.0471967), (0.010333224, 0.046263978), (0.011629875, 0.045570906), (0.013036823, 0.045144115), (0.0145000005, 0.045), (0.021736024, 0.048333224), (0.020803303, 0.0471967), (0.02285589, 0.051036827), (0.022429097, 0.04962988), (0.023000002, 0.052500002), (0.016963178, 0.045144115), (0.015500001, 0.045), (0.019666778, 0.046263978), (0.018370125, 0.045570906), (-0.025, 0), (-0.0019030118, 0.015432915), (-0.000480368, 0.020122742), (5.585197e-34, 0.025), (-0.00421326, 0.011110745), (-0.015432915, 0.0019030118), (-0.020122742, 0.000480368), (-0.011110745, 0.00421326), (-0.007322331, 0.007322331), (-0.2, 0.025), (-0.2, 0.135), (-0.000480368, 0.13987726), (-0.0019030118, 0.1445671), (-0.025, 0.16000001), (-0.00421326, 0.14888926), (3.0160064e-33, 0.135), (-0.007322331, 0.15267769), (-0.011110745, 0.15578675), (-0.020122742, 0.15951964), (-0.015432915, 0.158097), (-0.17500001, 0), (-0.18456711, 0.0019030118), (-0.17987727, 0.000480368), (-0.18888927, 0.00421326), (-0.19267768, 0.007322331), (-0.19809699, 0.015432915), (-0.19578676, 0.011110745), (-0.19951965, 0.020122742), (-0.17500001, 0.16000001), (-0.18456711, 0.158097), (-0.18888927, 0.15578675), (-0.17987727, 0.15951964), (-0.19267768, 0.15267769), (-0.19951965, 0.13987726), (-0.19809699, 0.1445671), (-0.19578676, 0.14888926), (-0.19267768, 0), (-0, 0.15267769), (-0.18888927, 0), (-0.18888927, 0.030000001), (-0.18456711, 0), (-0.17987727, 0), (-0.17987727, 0.030000001), (-0.18456711, 0.030000001), (-0.19267768, 0.030000001), (-0.030000001, 0.15267769), (-0.17500001, 0.030000001), (-0.17500001, 0), (-0.030000001, 0.14888926), (-0, 0.135), (-0, 0.13987726), (-0.030000001, 0.13987726), (-0, 0.1445671), (-0, 0.14888926), (-0.030000001, 0.1445671), (-0.030000001, 0.135), (-0, 0.025), (-0.010333224, 0.046263978), (-0.011629875, 0.045570906), (-0.0091967, 0.0471967), (-0.013036823, 0.045144115), (-0.0145000005, 0.045), (-0.015500001, 0.045), (-0.007, 0.052500002), (-0.0071441107, 0.051036827), (-0.008263978, 0.048333224), (-0.0075709037, 0.04962988), (-0, 0.135), (-0.016963178, 0.045144115), (-0.030000001, 0.025), (-0.018370125, 0.045570906), (-0.019666778, 0.046263978), (-0.020803303, 0.0471967), (-0.021736024, 0.048333224), (-0.02285589, 0.051036827), (-0.023000002, 0.052500002), (-0.022429097, 0.04962988), (-0.030000001, 0.135), (-0.0071441107, 0.108963184), (-0.007, 0.1075), (-0.008263978, 0.11166678), (-0.0075709037, 0.11037013), (-0.0091967, 0.1128033), (-0.010333224, 0.113736026), (-0.011629875, 0.11442911), (-0.013036823, 0.11485589), (-0.0145000005, 0.115), (-0.021736024, 0.11166678), (-0.020803303, 0.1128033), (-0.02285589, 0.108963184), (-0.022429097, 0.11037013), (-0.023000002, 0.1075), (-0.016963178, 0.11485589), (-0.015500001, 0.115), (-0.019666778, 0.113736026), (-0.018370125, 0.11442911), (-0, 0.007322331), (0.19267768, 0), (-0, 0.011110745), (-0.030000001, 0.007322331), (0.19267768, 0.030000001), (-0, 0.015432915), (-0, 0.020122742), (-0.030000001, 0.020122742), (-0.030000001, 0.015432915), (-0.030000001, 0.011110745), (-0, 0.025), (-0.030000001, 0.025), (0.18888927, 0.030000001), (0.17500001, 0), (0.17987727, 0), (0.17987727, 0.030000001), (0.18456711, 0), (0.18888927, 0), (0.18456711, 0.030000001), (0.17500001, 0.030000001), (0, 0.007322331), (0.007322331, 0), (0.011110745, 0), (0.007322331, 0.030000001), (0.030000001, 0.007322331), (0.015432915, 0), (0.020122742, 0), (0.020122742, 0.030000001), (0.015432915, 0.030000001), (0.011110745, 0.030000001), (0.025, 0), (0.025, 0.030000001), (0.030000001, 0.011110745), (0, 0.025), (0, 0.020122742), (0.030000001, 0.020122742), (0, 0.015432915), (0, 0.011110745), (0.030000001, 0.015432915), (0.030000001, 0.025), (-0.17500001, 0), (-0.025, 0), (-0.025, 0.030000001), (-0.17500001, 0.030000001), (0.025, 0), (0.17500001, 0), (0.17500001, 0.030000001), (0.025, 0.030000001), (0.0019030118, 0.015432915), (0.00421326, 0.011110745), (0.0075391387, 0.013333025), (0.010150759, 0.010150759), (0.007322331, 0.007322331), (0.00559853, 0.01696365), (-5.585197e-34, 0.025), (0.000480368, 0.020122742), (0.004403509, 0.020903103), (0.004, 0.025), (0.004, 0.135), (0.020903103, 0.004403509), (0.015432915, 0.0019030118), (0.020122742, 0.000480368), (0.025, 0), (0.025, 0.004), (0.17500001, 0), (0.17500001, 0.004), (0.013333025, 0.0075391387), (0.011110745, 0.00421326), (0.01696365, 0.00559853), (0.000480368, 0.13987726), (-3.0160064e-33, 0.135), (0.004403509, 0.1390969), (0.00559853, 0.14303635), (0.00421326, 0.14888926), (0.0019030118, 0.1445671), (0.0075391387, 0.14666699), (0.010150759, 0.14984925), (0.007322331, 0.15267769), (0.013333025, 0.15246087), (0.011110745, 0.15578675), (0.01696365, 0.15440148), (0.020903103, 0.15559651), (0.015432915, 0.158097), (0.020122742, 0.15951964), (0.025, 0.156), (0.025, 0.16000001), (0.17500001, 0.156), (0.17500001, 0.16000001), (0.17987727, 0.000480368), (0.1790969, 0.004403509), (0.18456711, 0.0019030118), (0.18303636, 0.00559853), (0.18984926, 0.010150759), (0.18666698, 0.0075391387), (0.19267768, 0.007322331), (0.18888927, 0.00421326), (0.19578676, 0.011110745), (0.19246086, 0.013333025), (0.19809699, 0.015432915), (0.19440149, 0.01696365), (0.1955965, 0.020903103), (0.19951965, 0.020122742), (0.2, 0.025), (0.19600001, 0.025), (0.2, 0.135), (0.1790969, 0.15559651), (0.18303636, 0.15440148), (0.18456711, 0.158097), (0.18888927, 0.15578675), (0.18666698, 0.15246087), (0.19267768, 0.15267769), (0.17987727, 0.15951964), (0.18984926, 0.14984925), (0.1955965, 0.1390969), (0.19600001, 0.135), (0.19951965, 0.13987726), (0.19440149, 0.14303635), (0.19578676, 0.14888926), (0.19246086, 0.14666699), (0.19809699, 0.1445671)] ( + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [0, 1, 3, 4, 5, 6, 7, 6, 1, 0, 3, 9, 7, 4, 6, 1, 0, 7, 4, 10, 5, 10, 11, 5, 12, 8, 2, 13, 14, 15, 12, 16, 17, 18, 17, 14, 14, 13, 18, 17, 18, 12, 13, 15, 19, 12, 2, 16, 20, 21, 23, 24, 25, 26, 27, 26, 21, 20, 23, 29, 27, 24, 26, 21, 20, 27, 24, 30, 25, 30, 31, 25, 32, 28, 22, 33, 34, 35, 32, 36, 37, 38, 37, 34, 34, 33, 38, 37, 38, 32, 33, 35, 39, 32, 22, 36, 40, 41, 42, 42, 43, 40, 44, 45, 46, 46, 47, 44, 48, 49, 50, 50, 51, 48, 53, 54, 56, 57, 58, 59, 60, 59, 54, 61, 54, 53, 60, 57, 59, 54, 61, 60, 62, 63, 57, 63, 58, 57, 64, 52, 55, 65, 66, 67, 68, 69, 70, 68, 70, 66, 66, 65, 68, 69, 68, 64, 65, 67, 71, 64, 55, 69, 72, 74, 76, 77, 78, 79, 80, 79, 74, 81, 74, 72, 80, 77, 79, 74, 81, 80, 82, 83, 77, 83, 78, 77, 84, 73, 75, 85, 86, 87, 88, 89, 90, 88, 90, 86, 86, 85, 88, 89, 88, 84, 85, 87, 91, 84, 75, 89, 92, 94, 95, 97, 98, 99, 100, 99, 94, 101, 94, 92, 100, 97, 99, 94, 101, 100, 97, 102, 98, 102, 103, 98, 104, 93, 96, 105, 106, 107, 104, 108, 109, 110, 109, 106, 106, 105, 110, 109, 110, 104, 105, 107, 111, 104, 96, 108, 112, 113, 114, 114, 115, 112, 116, 117, 118, 118, 119, 116, 120, 121, 122, 122, 123, 120, 125, 126, 128, 129, 130, 131, 132, 131, 126, 133, 126, 125, 132, 129, 131, 126, 133, 132, 129, 134, 130, 134, 135, 130, 136, 124, 127, 137, 138, 139, 140, 141, 142, 140, 142, 138, 138, 137, 140, 141, 140, 136, 137, 139, 143, 136, 127, 141, 145, 146, 148, 149, 150, 151, 152, 151, 146, 153, 146, 145, 152, 149, 151, 146, 153, 152, 149, 154, 150, 154, 155, 150, 156, 144, 147, 157, 158, 159, 160, 161, 162, 160, 162, 158, 158, 157, 160, 161, 160, 156, 157, 159, 163, 156, 147, 161, 164, 165, 166, 166, 167, 164, 168, 170, 171, 173, 174, 175, 176, 175, 170, 177, 170, 168, 176, 173, 175, 170, 177, 176, 173, 178, 174, 178, 179, 174, 180, 169, 172, 181, 182, 183, 180, 184, 185, 186, 185, 182, 182, 181, 186, 185, 186, 180, 181, 183, 187, 180, 172, 184, 188, 189, 190, 190, 191, 188, 192, 193, 194, 196, 197, 198, 199, 198, 193, 192, 194, 200, 199, 196, 198, 193, 192, 199, 196, 202, 197, 202, 203, 197, 204, 201, 195, 205, 206, 207, 204, 208, 209, 210, 209, 206, 206, 205, 210, 209, 210, 204, 205, 207, 211, 204, 195, 208, 212, 213, 214, 215, 214, 213, 214, 216, 217, 214, 217, 212, 218, 216, 214, 214, 219, 220, 214, 215, 221, 214, 221, 222, 214, 222, 219, 220, 223, 214, 214, 224, 225, 226, 227, 224, 225, 224, 227, 228, 226, 224, 218, 214, 225, 224, 229, 228, 224, 230, 231, 224, 231, 232, 224, 232, 229, 233, 230, 224, 234, 223, 235, 234, 236, 237, 234, 237, 238, 236, 234, 235, 239, 234, 240, 238, 240, 234, 234, 239, 241, 234, 241, 242, 242, 243, 234, 234, 214, 223, 244, 245, 246, 244, 247, 248, 244, 248, 233, 247, 244, 246, 249, 234, 243, 244, 250, 251, 249, 250, 244, 245, 244, 251, 249, 244, 234, 224, 244, 233, 252, 253, 254, 254, 255, 252, 254, 253, 256, 257, 254, 258, 259, 258, 254, 259, 254, 260, 254, 256, 260, 261, 255, 262, 263, 264, 265, 263, 266, 264, 265, 267, 263, 268, 269, 263, 270, 263, 271, 263, 270, 268, 269, 266, 263, 263, 267, 261, 255, 254, 272, 272, 273, 274, 274, 275, 272, 272, 275, 276, 277, 278, 272, 262, 272, 279, 272, 278, 279, 276, 277, 272, 261, 267, 255, 280, 281, 282, 283, 282, 281, 280, 282, 284, 285, 282, 286, 282, 287, 284, 282, 285, 287, 286, 282, 261, 263, 261, 282, 255, 272, 262, 288, 289, 291, 292, 293, 294, 295, 294, 289, 288, 291, 297, 295, 292, 294, 289, 288, 295, 292, 298, 293, 298, 299, 293, 300, 296, 290, 301, 302, 303, 300, 304, 305, 306, 305, 302, 302, 301, 306, 305, 306, 300, 301, 303, 307, 300, 290, 304, 308, 309, 310, 311, 310, 309, 310, 312, 313, 310, 313, 308, 314, 312, 310, 310, 315, 316, 310, 311, 317, 310, 317, 318, 310, 318, 315, 316, 319, 310, 310, 320, 321, 322, 323, 320, 321, 320, 323, 324, 322, 320, 314, 310, 321, 320, 325, 324, 320, 326, 327, 320, 327, 328, 320, 328, 325, 329, 326, 320, 330, 319, 331, 330, 332, 333, 330, 333, 334, 332, 330, 331, 335, 330, 336, 334, 336, 330, 330, 335, 337, 330, 337, 338, 338, 339, 330, 330, 310, 319, 340, 341, 342, 340, 343, 344, 340, 344, 329, 343, 340, 342, 345, 330, 339, 340, 346, 347, 345, 346, 340, 341, 340, 347, 345, 340, 330, 320, 340, 329, 349, 350, 352, 353, 354, 355, 356, 355, 350, 357, 350, 349, 356, 353, 355, 350, 357, 356, 358, 359, 353, 359, 354, 353, 360, 348, 351, 361, 362, 363, 360, 364, 365, 366, 365, 362, 362, 361, 366, 365, 366, 360, 361, 363, 367, 360, 351, 364, 369, 370, 371, 373, 374, 375, 376, 375, 370, 377, 370, 369, 376, 373, 375, 370, 377, 376, 378, 379, 373, 379, 374, 373, 380, 368, 372, 381, 382, 383, 380, 384, 385, 386, 385, 382, 382, 381, 386, 385, 386, 380, 381, 383, 387, 380, 372, 384, 388, 389, 390, 390, 391, 388, 392, 393, 394, 394, 395, 392, 397, 398, 399, 400, 401, 402, 398, 400, 403, 405, 397, 399, 400, 402, 403, 403, 399, 398, 401, 406, 402, 401, 407, 406, 396, 404, 408, 409, 410, 411, 412, 413, 408, 410, 412, 414, 414, 415, 410, 408, 414, 412, 411, 410, 415, 413, 396, 408, 416, 417, 418, 417, 416, 419, 420, 421, 416, 418, 420, 416, 416, 421, 422, 423, 424, 416, 425, 419, 416, 426, 425, 416, 424, 426, 416, 416, 427, 423, 422, 428, 429, 429, 430, 431, 430, 429, 428, 429, 431, 432, 422, 429, 416, 432, 433, 429, 434, 435, 429, 436, 434, 429, 433, 436, 429, 429, 435, 437, 438, 439, 427, 440, 441, 427, 442, 440, 427, 438, 427, 441, 443, 427, 444, 427, 443, 442, 445, 444, 427, 446, 445, 427, 427, 437, 446, 439, 423, 427, 447, 448, 437, 449, 450, 437, 451, 449, 437, 447, 437, 450, 452, 453, 437, 454, 455, 437, 437, 455, 452, 454, 437, 448, 453, 446, 437, 451, 437, 435, 456, 457, 458, 458, 459, 456, 460, 457, 456, 461, 456, 462, 456, 461, 463, 464, 456, 463, 464, 460, 456, 465, 459, 466, 467, 468, 469, 468, 470, 469, 469, 471, 467, 469, 472, 473, 474, 469, 475, 473, 475, 469, 469, 470, 472, 466, 471, 469, 476, 456, 459, 477, 478, 476, 476, 479, 477, 480, 479, 476, 476, 481, 482, 483, 476, 465, 483, 481, 476, 476, 482, 480, 459, 471, 466, 484, 485, 486, 485, 484, 487, 488, 484, 486, 489, 484, 490, 488, 491, 484, 491, 490, 484, 466, 484, 489, 484, 466, 469, 465, 476, 459, 492, 494, 495, 496, 497, 498, 494, 496, 499, 500, 492, 495, 496, 498, 499, 499, 495, 494, 497, 502, 498, 497, 503, 502, 493, 501, 504, 505, 506, 507, 508, 509, 504, 506, 508, 510, 510, 507, 506, 504, 510, 508, 511, 505, 507, 509, 493, 504, 512, 513, 514, 513, 512, 515, 516, 517, 512, 514, 516, 512, 512, 517, 518, 519, 520, 512, 521, 515, 512, 522, 521, 512, 520, 522, 512, 512, 523, 519, 518, 524, 525, 525, 526, 527, 526, 525, 524, 525, 527, 528, 518, 525, 512, 528, 529, 525, 530, 531, 525, 532, 530, 525, 529, 532, 525, 525, 531, 533, 534, 535, 523, 536, 537, 523, 538, 536, 523, 534, 523, 537, 539, 523, 540, 523, 539, 538, 541, 540, 523, 542, 541, 523, 523, 533, 542, 535, 519, 523, 543, 544, 533, 545, 546, 533, 547, 545, 533, 543, 533, 546, 548, 549, 533, 550, 551, 533, 533, 551, 548, 550, 533, 544, 549, 542, 533, 547, 533, 531, 552, 554, 555, 557, 558, 559, 554, 557, 560, 555, 554, 561, 557, 559, 560, 560, 561, 554, 559, 562, 563, 559, 558, 562, 553, 556, 564, 565, 566, 567, 568, 569, 564, 566, 568, 570, 570, 567, 566, 564, 570, 568, 571, 565, 567, 569, 553, 564, 573, 574, 575, 577, 578, 579, 574, 577, 580, 575, 574, 581, 577, 579, 580, 580, 581, 574, 579, 582, 583, 579, 578, 582, 572, 576, 584, 585, 586, 587, 588, 589, 584, 586, 588, 590, 590, 587, 586, 584, 590, 588, 591, 585, 587, 589, 572, 584, 592, 593, 594, 594, 595, 592, 596, 597, 598, 598, 599, 596, 600, 601, 602, 601, 603, 602, 603, 601, 604, 600, 602, 605, 606, 607, 608, 608, 609, 606, 605, 608, 607, 607, 600, 605, 606, 609, 610, 611, 612, 613, 614, 615, 613, 614, 616, 617, 611, 613, 615, 604, 618, 603, 618, 604, 619, 620, 618, 619, 620, 619, 612, 612, 611, 620, 621, 622, 623, 610, 623, 622, 622, 606, 610, 621, 623, 624, 625, 626, 627, 625, 628, 629, 628, 625, 627, 627, 626, 624, 626, 621, 624, 630, 631, 629, 632, 633, 634, 630, 632, 631, 631, 632, 634, 635, 636, 637, 635, 634, 633, 636, 638, 639, 636, 635, 633, 630, 629, 628, 617, 615, 614, 617, 616, 640, 617, 640, 641, 641, 640, 642, 641, 642, 643, 644, 645, 646, 647, 645, 643, 646, 645, 647, 642, 647, 643, 644, 648, 649, 648, 644, 646, 648, 650, 649, 649, 650, 651, 652, 651, 653, 652, 654, 655, 654, 652, 653, 655, 654, 656, 651, 650, 653, 657, 658, 659, 660, 661, 662, 658, 661, 660, 639, 637, 636, 639, 638, 663, 657, 663, 638, 657, 659, 663, 658, 660, 659, 661, 664, 662, 665, 666, 656, 656, 667, 665, 666, 655, 656, 665, 667, 668, 669, 664, 670, 664, 669, 662, 671, 669, 670, 671, 668, 667, 671, 670, 668] + uniform token subdivisionScheme = "none" + } + } + } + + def Scope "Looks" + { + def Material "OmniPBR" + { + token outputs:mdl:displacement.connect = + token outputs:mdl:surface.connect = + token outputs:mdl:volume.connect = + + def Shader "Shader" + { + uniform token info:implementationSource = "sourceAsset" + uniform asset info:mdl:sourceAsset = @OmniPBR.mdl@ + uniform token info:mdl:sourceAsset:subIdentifier = "OmniPBR" + float inputs:albedo_add = 0 + color3f inputs:diffuse_color_constant = (0.03931828, 0.13806282, 0.2850575) + float inputs:reflection_roughness_constant = 0.39999998 + token outputs:out ( + renderType = "material" + ) + } + } + } +} + +def "Render" ( + hide_in_stage_window = true + no_delete = true +) +{ + def "OmniverseKit" + { + def "HydraTextures" ( + hide_in_stage_window = true + no_delete = true + ) + { + def RenderProduct "omni_kit_widget_viewport_ViewportTexture_0" ( + prepend apiSchemas = ["OmniRtxSettingsCommonAdvancedAPI_1", "OmniRtxSettingsRtAdvancedAPI_1", "OmniRtxSettingsPtAdvancedAPI_1", "OmniRtxPostColorGradingAPI_1", "OmniRtxPostChromaticAberrationAPI_1", "OmniRtxPostBloomPhysicalAPI_1", "OmniRtxPostMatteObjectAPI_1", "OmniRtxPostCompositingAPI_1", "OmniRtxPostDofAPI_1", "OmniRtxPostMotionBlurAPI_1", "OmniRtxPostTvNoiseAPI_1", "OmniRtxPostTonemapIrayReinhardAPI_1", "OmniRtxPostDebugSettingsAPI_1", "OmniRtxDebugSettingsAPI_1"] + hide_in_stage_window = true + no_delete = true + ) + { + rel camera = + token omni:rtx:background:source:texture:textureMode = "repeatMirrored" + token omni:rtx:background:source:type = "domeLight" + bool omni:rtx:dlss:frameGeneration = 0 + bool omni:rtx:material:db:nonVisualMaterialCSV:enabled = 0 + string omni:rtx:material:db:rtSensorNameToIdMap = "DefaultMaterial:0;AsphaltStandardMaterial:1;AsphaltWeatheredMaterial:2;VegetationGrassMaterial:3;WaterStandardMaterial:4;GlassStandardMaterial:5;FiberGlassMaterial:6;MetalAlloyMaterial:7;MetalAluminumMaterial:8;MetalAluminumOxidizedMaterial:9;PlasticStandardMaterial:10;RetroMarkingsMaterial:11;RetroSignMaterial:12;RubberStandardMaterial:13;SoilClayMaterial:14;ConcreteRoughMaterial:15;ConcreteSmoothMaterial:16;OakTreeBarkMaterial:17;FabricStandardMaterial:18;PlexiGlassStandardMaterial:19;MetalSilverMaterial:20" + bool omni:rtx:material:db:syncLoads = 1 + token omni:rtx:post:dlss:execMode = "performance" + bool omni:rtx:post:registeredCompositing:invertColorCorrection = 1 + bool omni:rtx:post:registeredCompositing:invertToneMap = 1 + bool omni:rtx:pt:lightcache:cached:dontResolveConflicts = 1 + int omni:rtx:pt:maxSamplesPerLaunch = 2073600 + int omni:rtx:pt:mgpu:maxPixelsPerRegionExponent = 12 + int omni:rtx:realtime:mgpu:tileCount = 2 + color3f omni:rtx:rt:ambientLight:color = (0.1, 0.1, 0.1) + bool omni:rtx:rt:demoire = 0 + bool omni:rtx:rt:lightcache:spatialCache:dontResolveConflicts = 1 + bool omni:rtx:scene:hydra:materialSyncLoads = 1 + bool omni:rtx:scene:hydra:mdlMaterialWarmup = 1 + uint omni:rtx:viewTile:limit = 4294967295 + rel orderedVars = + custom bool overrideClipRange = 0 + uniform int2 resolution = (1145, 852) + } + } + } + + def RenderSettings "OmniverseGlobalRenderSettings" ( + prepend apiSchemas = ["OmniRtxSettingsGlobalRtAdvancedAPI_1", "OmniRtxSettingsGlobalPtAdvancedAPI_1"] + no_delete = true + ) + { + rel products = + } + + def "Vars" + { + def RenderVar "LdrColor" ( + hide_in_stage_window = true + no_delete = true + ) + { + uniform string sourceName = "LdrColor" + } + } +} + diff --git a/assets/lerobot/sync_so101_vial_assets.sh b/assets/lerobot/sync_so101_vial_assets.sh index c20bcc32..28e904aa 100755 --- a/assets/lerobot/sync_so101_vial_assets.sh +++ b/assets/lerobot/sync_so101_vial_assets.sh @@ -15,7 +15,7 @@ set -euo pipefail REPO="isaac-sim/Sim-to-Real-SO-101-Workshop" BRANCH="main" USD_BASE="https://media.githubusercontent.com/media/${REPO}/${BRANCH}/source/sim_to_real_so101/assets/usd" -HDRI_BASE="https://media.githubusercontent.com/media/${REPO}/${BRANCH}/source/sim_to_real_so101/assets/hdri" +HDRI_BASE="https://github.com/${REPO}/raw/${BRANCH}/source/sim_to_real_so101/assets/hdri" ROOT="$(cd "$(dirname "$0")" && pwd)" DEST="${ROOT}/so101_vial_task/usd" TEX_DEST="${DEST}/tex" diff --git a/autonomy/il/README.md b/autonomy/il/README.md index fdf86f63..cde5ffd8 100644 --- a/autonomy/il/README.md +++ b/autonomy/il/README.md @@ -140,7 +140,11 @@ PYTHONPATH=$(pwd) /home/hy/IsaacLab/isaaclab.sh -p so101_leader_teleop.py --reco Output: `datasets/record_so101_sim_vision/001/`. -## Train (LeRobot, external) +## Train (LeRobot) + +**SO101 vial sim IL (recommended):** inside `simulation_il` Docker — [`docker/simulation/isaac_il/QUICKSTART.md`](../../docker/simulation/isaac_il/QUICKSTART.md) (`il-train`, `--policy.push_to_hub=false`, `--steps=...`). + +**Generic / host** (outside Isaac docker): ```bash lerobot-train \ diff --git a/autonomy/simulation/Teleop/so101-leader teleoperation/README.md b/autonomy/simulation/Teleop/so101-leader teleoperation/README.md index 41420622..0cd97e1d 100644 --- a/autonomy/simulation/Teleop/so101-leader teleoperation/README.md +++ b/autonomy/simulation/Teleop/so101-leader teleoperation/README.md @@ -91,7 +91,9 @@ Optional HDRI sky randomization: copy workshop `assets/hdri/` to `assets/lerobot For workshop-parity **Gym envs**, automatic success detection, policy eval, and depth/seg MP4 sidecars, use: -`autonomy/simulation/so101_vial_task/` — see its README (`lerobot_agent.py`, `lerobot_eval.py`). +**[`docker/simulation/isaac_il/QUICKSTART.md`](../../../../docker/simulation/isaac_il/QUICKSTART.md)** — watod `simulation_il` Docker (recommended). + +Task reference: `autonomy/simulation/so101_vial_task/README.md` (`lerobot_agent.py`, `lerobot_eval.py`). The InteractiveScene teleop above stays the lightweight RGB collection path via `humanoid_il`. diff --git a/autonomy/simulation/so101_vial_task/README.md b/autonomy/simulation/so101_vial_task/README.md index ccca0d33..817527d9 100644 --- a/autonomy/simulation/so101_vial_task/README.md +++ b/autonomy/simulation/so101_vial_task/README.md @@ -2,16 +2,22 @@ Workshop-parity stack for the SO101 **vial → rack** task: registered Gym envs, success detection, policy eval, and rich LeRobot recording with depth/segmentation MP4 export. -Assets live under `assets/lerobot/` (sync with `./assets/lerobot/sync_so101_vial_assets.sh --full`). +## Run this (recommended) -## Install +Use the **`simulation_il`** watod Docker image (Isaac Lab 2.3.2 + LeRobot). Do **not** use host `env_isaaclab` for IL — wrong Python/stack version. + +| Doc | Contents | +|-----|----------| +| **[`docker/simulation/isaac_il/QUICKSTART.md`](../../../docker/simulation/isaac_il/QUICKSTART.md)** | Exact copy-paste: build, train ACT, eval | +| **[`docker/simulation/isaac_il/README.md`](../../../docker/simulation/isaac_il/README.md)** | Full setup, troubleshooting, workflows | ```bash -cd autonomy/simulation/so101_vial_task -pip install -e . +# host +ACTIVE_MODULES="simulation_il" # in watod-config.local.sh +./watod up -d && ./watod -t simulation_il_dev ``` -Requires Isaac Lab, LeRobot, and synced USD/HDRI assets. +Assets: `./assets/lerobot/sync_so101_vial_assets.sh --full` (see [`assets/lerobot/README.md`](../../../assets/lerobot/README.md)). ## Registered Gym tasks @@ -24,52 +30,62 @@ Requires Isaac Lab, LeRobot, and synced USD/HDRI assets. Observation groups: `policy` (joints), `visual` (RGB/depth/seg), `subtask` (grasp/placed flags). Success uses gripper contact sensor + rack slot geometry (`humanoid_so101_vial_task/mdp/terms.py`). -## 1. Leader teleop + rich recording (Gym) +Cameras: `ego` (gripper), `external_D455` (lightbox) — matches [CursedRock17/so101_teleop_vials_sim_and_real](https://huggingface.co/datasets/CursedRock17/so101_teleop_vials_sim_and_real). -Physical SO101 Leader drives sim; **S** start/stop, **R** reset world, **C** cancel episode while recording. +## 1. Train ACT (inside `simulation_il` container) ```bash -cd autonomy/simulation/so101_vial_task -PYTHONPATH=$(pwd) /home/hy/IsaacLab/isaaclab.sh -p scripts/lerobot_agent.py \ - --task Lerobot-So101-Teleop-Vials-To-Rack-DR \ - --port /dev/ttyACM0 \ - --repo_id humanoid/so101_vial_dr \ - --repo_root ../../datasets/record_so101_gym/001 \ - --task_name "vial to rack" \ - --save_mp4 --depth --instance_id_seg +il-train \ + --dataset.repo_id=CursedRock17/so101_teleop_vials_sim_and_real \ + --policy.type=act \ + --policy.push_to_hub=false \ + --output_dir=/workspace/humanoid/outputs/train/so101_hf_act \ + --policy.device=cuda \ + --steps=10000 \ + --batch_size=8 \ + --save_freq=5000 \ + --job_name=so101_hf_smoke ``` -Optional MP4 sidecars: `--save_mp4`, `--depth`, `--instance_id_seg` (via `LeRobotRecorder`). - -## 2. Policy eval in sim +See [QUICKSTART.md](../../../docker/simulation/isaac_il/QUICKSTART.md) for full train/eval commands and pitfalls. -Local LeRobot checkpoint (ACT, etc.): +## 2. Policy eval in sim (inside container) ```bash -PYTHONPATH=$(pwd) /home/hy/IsaacLab/isaaclab.sh -p scripts/lerobot_eval.py \ +cd /workspace/humanoid/autonomy/simulation/so101_vial_task + +PYTHONPATH=$(pwd) $ISAACLAB/isaaclab.sh -p scripts/lerobot_eval.py \ --task Lerobot-So101-Teleop-Vials-To-Rack-DR-Eval \ --policy_type lerobot \ - --policy_path outputs/train/so101_act_v1/checkpoints/last/pretrained_model \ - --num_episodes 10 \ - --rename_map '{"ego":"observation.images.ego","external_D455":"observation.images.external_D455"}' + --policy_path /workspace/humanoid/outputs/train/so101_hf_act/checkpoints/last/pretrained_model \ + --num_episodes 5 ``` -Remote GR00T server: +- **Local ACT:** omit `--rename_map` (sim cameras already `ego` / `external_D455`). +- **GR00T:** `--policy_type groot` and `--rename_map '{"external_D455": "front", "ego": "wrist"}'`. + +Reports success rate when `success` termination fires (vial placed in rack slot). + +## 3. Leader teleop + rich recording (needs USB leader) + +Physical SO101 Leader drives sim; **S** start/stop, **R** reset world, **C** cancel episode while recording. ```bash -PYTHONPATH=$(pwd) /home/hy/IsaacLab/isaaclab.sh -p scripts/lerobot_eval.py \ - --policy_type groot --policy_host localhost --policy_port 5555 +cd $TASK_ROOT +PYTHONPATH=$(pwd) $ISAACLAB/isaaclab.sh -p scripts/lerobot_agent.py \ + --task Lerobot-So101-Teleop-Vials-To-Rack-DR \ + --port /dev/ttyACM0 \ + --repo_root /workspace/humanoid/datasets/record_so101_gym/001 \ + --save_mp4 --depth --instance_id_seg ``` -Reports success rate when `success` termination fires (vial placed in rack slot). - -## 3. Lightweight teleop (InteractiveScene) +## 4. Lightweight teleop (InteractiveScene) -For keyboard/leader collection without Gym, use the existing path: +RGB-only path without Gym: `autonomy/simulation/Teleop/so101-leader teleoperation/` + `autonomy/il/` (`--record --cameras --domain_rand`). -That path is RGB-only in LeRobot; use **this** package for depth/seg MP4 sidecars and automatic success scoring. +Use **this** package for depth/seg MP4 sidecars and automatic success scoring. ## Layout @@ -84,3 +100,14 @@ so101_vial_task/ ├── lerobot_agent.py # teleop + rich record └── lerobot_eval.py # policy rollout + success rate ``` + +## Host install (legacy — not for IL docker workflow) + +Only if developing outside Docker on a matching Isaac Lab 2.3.2 + Python 3.11 stack: + +```bash +cd autonomy/simulation/so101_vial_task +pip install -e . +``` + +Requires Isaac Lab, LeRobot, and synced USD/HDRI assets. diff --git a/docker/simulation/isaac_il/QUICKSTART.md b/docker/simulation/isaac_il/QUICKSTART.md new file mode 100644 index 00000000..577bf5bb --- /dev/null +++ b/docker/simulation/isaac_il/QUICKSTART.md @@ -0,0 +1,192 @@ +# SO101 sim IL — copy-paste commands + +Exact workflow used for **HF dataset → ACT train → sim eval** (no physical arm). +Stack: Isaac Lab 2.3.2 / Sim 5.1 / LeRobot 0.4.3 / ACT / watod `simulation_il`. + +Full reference: [README.md](README.md). Task/env details: [`autonomy/simulation/so101_vial_task/README.md`](../../../autonomy/simulation/so101_vial_task/README.md). + +--- + +## 0. One-time (host) + +```bash +cd ~/Desktop/humanoid + +xhost +local:docker +./assets/lerobot/sync_so101_vial_assets.sh --full +mkdir -p ~/docker/isaac-sim/{cache/kit,cache/ov,cache/pip,cache/glcache,cache/computecache,logs,data} +``` + +Create `watod-config.local.sh` (git-ignored): + +```bash +cat > watod-config.local.sh <<'EOF' +ACTIVE_MODULES="simulation_il" +MODE_OF_OPERATION="develop" +EOF +``` + +--- + +## 1. Build image (first time ~12 min; rebuild ~5–15 min) + +```bash +cd ~/Desktop/humanoid +./watod build simulation_il_dev +``` + +If `import torch` fails inside container (packaging error), rebuild clean: + +```bash +./watod build --no-cache simulation_il_dev +``` + +--- + +## 2. Start container (host) + +```bash +./watod up -d +./watod -t simulation_il_dev +``` + +--- + +## 3. Sanity check (inside container) + +```bash +$PYTHON -c "import torch; print(torch.__version__)" # expect 2.7.0+cu128 +$PYTHON -c "import lerobot; print('ok')" +``` + +Container aliases (from `.bashrc`): `$ISAACLAB`, `$TASK_ROOT`, `il-train`, `il-eval`, `il-record`. + +--- + +## 4. Train ACT on public HF dataset (inside container) + +Dataset: [CursedRock17/so101_teleop_vials_sim_and_real](https://huggingface.co/datasets/CursedRock17/so101_teleop_vials_sim_and_real) — **140 demos**, 26,516 frames. + +**Smoke test** (10k steps ≈ 3 epochs over 140 demos, ~1–2 h): + +```bash +mkdir -p /workspace/humanoid/outputs/train/so101_hf_act + +il-train \ + --dataset.repo_id=CursedRock17/so101_teleop_vials_sim_and_real \ + --policy.type=act \ + --policy.push_to_hub=false \ + --output_dir=/workspace/humanoid/outputs/train/so101_hf_act \ + --policy.device=cuda \ + --steps=10000 \ + --batch_size=8 \ + --save_freq=5000 \ + --job_name=so101_hf_smoke +``` + +**Longer run** (better policy): + +```bash +il-train \ + --dataset.repo_id=CursedRock17/so101_teleop_vials_sim_and_real \ + --policy.type=act \ + --policy.push_to_hub=false \ + --output_dir=/workspace/humanoid/outputs/train/so101_hf_act_50k \ + --policy.device=cuda \ + --steps=50000 \ + --batch_size=8 \ + --save_freq=10000 \ + --job_name=so101_hf_50k +``` + +Checkpoint path when done: + +``` +/workspace/humanoid/outputs/train/so101_hf_act/checkpoints/last/pretrained_model +``` + +Same path on host: `~/Desktop/humanoid/outputs/train/so101_hf_act/...` + +### Train pitfalls (learned the hard way) + +| Wrong | Right | +|-------|-------| +| `lerobot-train` (bare CLI) | `il-train` or `$PYTHON -m lerobot.scripts.lerobot_train` | +| `-m lerobot.scripts.train` | `-m lerobot.scripts.lerobot_train` | +| `--training.num_epochs=10` | `--steps=10000` | +| omit `--policy.push_to_hub=false` | always set `false` for local-only training | +| `pip install humanoid-il[sim]` in image | breaks Isaac torch — Dockerfile uses `--no-deps` only | + +--- + +## 5. Eval ACT in sim (inside container) + +**Must** run from `$TASK_ROOT`. **Do not** pass `--rename_map` for local ACT (cameras already `ego` / `external_D455`). + +```bash +cd /workspace/humanoid/autonomy/simulation/so101_vial_task + +PYTHONPATH=$(pwd) $ISAACLAB/isaaclab.sh -p scripts/lerobot_eval.py \ + --task Lerobot-So101-Teleop-Vials-To-Rack-DR-Eval \ + --policy_type lerobot \ + --policy_path /workspace/humanoid/outputs/train/so101_hf_act/checkpoints/last/pretrained_model \ + --num_episodes 5 +``` + +- Isaac GUI opens (X11 to host display). +- **R** = manual reset world. +- Prints success rate when episodes finish. +- 10k-step smoke policy can still succeed sometimes (e.g. 33–50% in early tests). + +### Eval pitfalls + +| Wrong | Right | +|-------|-------| +| Run from `/workspace/humanoid` | `cd $TASK_ROOT` first | +| `--rename_map '{"ego":"observation.images.ego",...}'` | omit for ACT — causes `KeyError: 'ego'` | +| Ctrl+C when frozen after crash | `./watod down` from host | + +`[WARNING] No textures found` — run asset sync on host, then re-eval. + +--- + +## 6. Stop (host) + +```bash +exit # leave container shell +cd ~/Desktop/humanoid +./watod down +``` + +If Isaac hung and Ctrl+C fails: + +```bash +./watod down +# or: docker kill $(docker ps -q --filter name=simulation_il) +./watod up -d +``` + +--- + +## 7. Optional — record your own demos (needs USB leader) + +```bash +cd $TASK_ROOT +mkdir -p /workspace/humanoid/datasets/record_so101_gym/001 + +PYTHONPATH=$(pwd) $ISAACLAB/isaaclab.sh -p scripts/lerobot_agent.py \ + --task Lerobot-So101-Teleop-Vials-To-Rack-DR \ + --port /dev/ttyACM0 \ + --repo_root /workspace/humanoid/datasets/record_so101_gym/001 \ + --save_mp4 --depth --instance_id_seg +``` + +--- + +## What stays on host (not docker) + +| Workload | Where | +|----------|-------| +| HumanoidRL / in-hand RL | host `env_isaaclab` + `/home/hy/IsaacLab` | +| SO101 IL train + sim eval | `simulation_il` docker | +| Quest / Wato teleop | `simulation` docker (Sim 4.5) | diff --git a/docker/simulation/isaac_il/README.md b/docker/simulation/isaac_il/README.md new file mode 100644 index 00000000..a9aaee4a --- /dev/null +++ b/docker/simulation/isaac_il/README.md @@ -0,0 +1,172 @@ +# SO101 sim IL (watod `simulation_il`) + +Workshop-parity Docker stack for SO101 **imitation learning** in sim: teleop, record, ACT/GR00T eval. + +**Quick copy-paste commands:** [QUICKSTART.md](QUICKSTART.md) + +| Component | Version | +|-----------|---------| +| Isaac Sim | 5.1 (via `nvcr.io/nvidia/isaac-lab:2.3.2`) | +| Isaac Lab | 2.3.2 | +| Python | 3.11 | +| PyTorch | 2.7.0 | +| LeRobot | 0.4.3 @ `e670ac5daf9b76` | + +Based on [NVIDIA SO-101 workshop](https://github.com/isaac-sim/Sim-to-Real-SO-101-Workshop) `teleop-docker` LeRobot install pattern (`--no-deps` + pip constraints). + +## vs other environments + +| Environment | Use | +|-------------|-----| +| **`simulation_il`** (this) | SO101 IL: HF train, sim eval, leader record | +| **`simulation`** | Humanoid_Wato / quest teleop (Sim 4.5) | +| **Host `env_isaaclab`** | HumanoidRL / in-hand — do not mix LeRobot pip installs here | + +## Files + +| Path | Role | +|------|------| +| `docker/simulation/isaac_il/isaac_il.Dockerfile` | Image build | +| `modules/docker-compose.simulation_il.yaml` | watod compose service | +| `autonomy/simulation/so101_vial_task/` | Gym envs + `lerobot_agent.py` / `lerobot_eval.py` | +| `assets/lerobot/` | Workshop USD/HDRI assets | + +## One-time host setup + +```bash +cd ~/Desktop/humanoid + +xhost +local:docker +./assets/lerobot/sync_so101_vial_assets.sh --full +mkdir -p ~/docker/isaac-sim/{cache/kit,cache/ov,cache/pip,cache/glcache,cache/computecache,logs,data} +``` + +`watod-config.local.sh` (create in repo root, do not commit): + +```bash +ACTIVE_MODULES="simulation_il" +MODE_OF_OPERATION="develop" +``` + +GUI uses **X11 to host display** (same as [workshop `teleop-docker`](https://github.com/isaac-sim/Sim-to-Real-SO-101-Workshop)). Not WebRTC. + +## Build and launch + +```bash +./watod build simulation_il_dev # first time: large NGC pull +./watod up -d +./watod -t simulation_il_dev # bash inside container +``` + +Rebuild after Dockerfile changes or broken torch: + +```bash +./watod build --no-cache simulation_il_dev +./watod down && ./watod up -d +``` + +## Inside container — environment + +Set automatically in `.bashrc`: + +```bash +export ISAACLAB=/workspace/isaaclab +export HUMANOID_ROOT=/workspace/humanoid +export TASK_ROOT=/workspace/humanoid/autonomy/simulation/so101_vial_task +export PYTHON=/workspace/isaaclab/_isaac_sim/python.sh +``` + +Aliases: `il-train`, `il-record`, `il-eval`. + +Sanity: + +```bash +$PYTHON -c "import torch; print(torch.__version__)" +$PYTHON -c "import lerobot; print('ok')" +``` + +## Workflows + +### A. Lazy IL — HF dataset → ACT train → sim eval (no arm) + +See [QUICKSTART.md](QUICKSTART.md) §4–5. + +1. `il-train` with `--policy.type=act`, `--policy.push_to_hub=false`, `--steps=N` +2. `cd $TASK_ROOT` then `lerobot_eval.py` with `--policy_type lerobot` +3. **No `--rename_map`** for local ACT + +### B. Record demos (USB leader) + +```bash +cd $TASK_ROOT +PYTHONPATH=$(pwd) $ISAACLAB/isaaclab.sh -p scripts/lerobot_agent.py \ + --task Lerobot-So101-Teleop-Vials-To-Rack-DR \ + --port /dev/ttyACM0 \ + --repo_root /workspace/humanoid/datasets/record_so101_gym/001 \ + --save_mp4 --depth --instance_id_seg +``` + +Keys: **S** start/stop episode, **R** reset, **C** cancel while recording. + +### C. GR00T eval (remote server) + +```bash +cd $TASK_ROOT +PYTHONPATH=$(pwd) $ISAACLAB/isaaclab.sh -p scripts/lerobot_eval.py \ + --task Lerobot-So101-Teleop-Vials-To-Rack-DR-Eval \ + --policy_type groot \ + --policy_host localhost \ + --policy_port 5555 \ + --rename_map '{"external_D455": "front", "ego": "wrist"}' +``` + +`--rename_map` is for GR00T / mismatched camera names, not local ACT. + +## Training notes (LeRobot 0.4.3) + +| Topic | Detail | +|-------|--------| +| Entry point | `il-train` → `$PYTHON -m lerobot.scripts.lerobot_train` | +| Not | bare `lerobot-train`, not `lerobot.scripts.train` | +| Duration flag | `--steps` (default 100k), not `--training.num_epochs` | +| Hub upload | `--policy.push_to_hub=false` for local checkpoints | +| Dataset example | `CursedRock17/so101_teleop_vials_sim_and_real` — 140 episodes | +| 10k steps | ~3 epochs over 140 demos (smoke test) | +| 50k–100k steps | more typical for usable ACT | + +## Eval notes + +| Topic | Detail | +|-------|--------| +| Working directory | must be `$TASK_ROOT` | +| ACT checkpoint | `--policy_type lerobot --policy_path .../pretrained_model` | +| `rename_map` | omit for ACT on matching `ego` / `external_D455` cameras | +| Success | printed at end; env terminates on rack placement | +| Hang on exit | `./watod down` from host — Ctrl+C often fails after Isaac crash | + +## Stop + +```bash +exit +./watod down +``` + +## Troubleshooting + +| Symptom | Fix | +|---------|-----| +| `No module named torch` / packaging error | rebuild image `--no-cache` (see Dockerfile humanoid-il fix) | +| `KeyError: 'ego'` on eval | remove `--rename_map` | +| `can't open file .../scripts/lerobot_eval.py` | `cd $TASK_ROOT` | +| `policy.repo_id missing` on train | add `--policy.push_to_hub=false` | +| `No textures found` | `./assets/lerobot/sync_so101_vial_assets.sh --full` on host | +| Isaac frozen | `./watod down` from host | + +## Upgrade image + +```bash +./watod build --no-cache simulation_il_dev +./watod down && ./watod up -d +``` + +Repo code is bind-mounted at `/workspace/humanoid` — Python edits on host apply without rebuild. diff --git a/docker/simulation/isaac_il/entrypoint.sh b/docker/simulation/isaac_il/entrypoint.sh new file mode 100644 index 00000000..6deeebb0 --- /dev/null +++ b/docker/simulation/isaac_il/entrypoint.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -e +exec "$@" diff --git a/docker/simulation/isaac_il/isaac_il.Dockerfile b/docker/simulation/isaac_il/isaac_il.Dockerfile new file mode 100644 index 00000000..fb58ccaf --- /dev/null +++ b/docker/simulation/isaac_il/isaac_il.Dockerfile @@ -0,0 +1,83 @@ +# SO101 sim IL: NVIDIA workshop stack (Isaac Lab 2.3.2 / Sim 5.1 / Python 3.11 / torch 2.7). +# Launch via watod: ACTIVE_MODULES="simulation_il" ./watod up -d && ./watod -t simulation_il_dev +FROM nvcr.io/nvidia/isaac-lab:2.3.2 + +ENV PYTHON=/workspace/isaaclab/_isaac_sim/python.sh +ENV PATH="/workspace/isaaclab/_isaac_sim/kit/python/bin:$PATH" +ENV ISAACLAB_PATH=/workspace/isaaclab +ENV HUMANOID_ROOT=/workspace/humanoid + +# ── LeRobot (workshop coexist pattern: no-deps + constraints) ───────────────── +WORKDIR /workspace +RUN git clone https://github.com/huggingface/lerobot.git && \ + cd lerobot && git checkout e670ac5daf9b76 + +RUN $PYTHON -m pip install --no-deps -e /workspace/lerobot + +RUN printf '%s\n' \ + "packaging==23.0" \ + "numpy==1.26.0" \ + "lxml==4.9.4" \ + "torch==2.7.0" \ + "torchvision==0.22.0" \ + "imageio==2.37.0" \ + > /tmp/constraints.txt + +RUN $PYTHON -m pip install -c /tmp/constraints.txt \ + "datasets>=4.0.0,<4.2.0" \ + "diffusers>=0.27.2,<0.36.0" \ + "huggingface-hub[hf-transfer,cli]>=0.34.2,<0.36.0" \ + "accelerate>=1.10.0,<2.0.0" \ + "cmake>=3.29.0.1,<4.2.0" \ + "av>=15.0.0,<16.0.0" \ + "jsonlines>=4.0.0,<5.0.0" \ + "pynput>=1.7.7,<1.9.0" \ + "pyserial>=3.5,<4.0" \ + "wandb>=0.20.0,<0.22.0" \ + "torchcodec>=0.2.1,<0.6.0" \ + "draccus==0.10.0" \ + "deepdiff>=7.0.1,<9.0.0" \ + "feetech-servo-sdk>=1.0.0,<2.0.0" + +RUN curl --proto "=https" --tlsv1.2 -sSf -L -o /tmp/ffmpeg.tar.xz \ + https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n7.1-latest-linux64-lgpl-shared-7.1.tar.xz && \ + tar -xf /tmp/ffmpeg.tar.xz -C /usr/local --strip-components=1 && \ + ldconfig && \ + rm /tmp/ffmpeg.tar.xz + +RUN apt-get update && apt-get install -y --no-install-recommends \ + libx11-6 libxcursor1 libxrandr2 libxi6 libxinerama1 \ + libxkbcommon0 libxkbcommon-x11-0 \ + && rm -rf /var/lib/apt/lists/* + +RUN $PYTHON -m pip install --no-deps "rerun-sdk>=0.24.0,<0.27.0" && \ + $PYTHON -m pip install pyzmq && \ + $PYTHON -m pip install --upgrade pip + +# ── Humanoid IL packages (editable; repo bind-mounted at runtime) ───────────── +COPY autonomy/il ${HUMANOID_ROOT}/autonomy/il +COPY autonomy/simulation/so101_vial_task ${HUMANOID_ROOT}/autonomy/simulation/so101_vial_task + +# Humanoid packages: --no-deps only (never [sim]/[lerobot] extras — they pull torch/lerobot with deps). +RUN $PYTHON -m pip install --no-deps -e "${HUMANOID_ROOT}/autonomy/il" && \ + $PYTHON -m pip install -c /tmp/constraints.txt psutil && \ + $PYTHON -m pip install --no-deps -e "${HUMANOID_ROOT}/autonomy/simulation/so101_vial_task" + +RUN mkdir -p /tmp/pycache && chmod 1777 /tmp/pycache +ENV PYTHONPYCACHEPREFIX=/tmp/pycache + +COPY docker/simulation/isaac_il/entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +RUN cat >> /root/.bashrc <<'EOF' +export ISAACLAB=/workspace/isaaclab +export HUMANOID_ROOT=/workspace/humanoid +export TASK_ROOT=/workspace/humanoid/autonomy/simulation/so101_vial_task +alias il-train='$PYTHON -m lerobot.scripts.lerobot_train' +alias il-record='cd $TASK_ROOT && PYTHONPATH=$(pwd) $ISAACLAB/isaaclab.sh -p scripts/lerobot_agent.py' +alias il-eval='cd $TASK_ROOT && PYTHONPATH=$(pwd) $ISAACLAB/isaaclab.sh -p scripts/lerobot_eval.py' +EOF + +WORKDIR ${HUMANOID_ROOT} +ENTRYPOINT ["/entrypoint.sh"] +CMD ["bash"] diff --git a/modules/docker-compose.simulation_il.yaml b/modules/docker-compose.simulation_il.yaml new file mode 100644 index 00000000..343ab7ec --- /dev/null +++ b/modules/docker-compose.simulation_il.yaml @@ -0,0 +1,64 @@ +version: "3.8" + +x-simulation_il_volumes: &simulation_il_volumes + - /tmp/.X11-unix:/tmp/.X11-unix:rw + - ${XAUTHORITY:-${HOME}/.Xauthority}:/root/.Xauthority:rw + - ${MONO_DIR}:/workspace/humanoid:rw + - /dev:/dev + - /run/udev:/run/udev:ro + - ${HF_HOME:-${HOME}/.cache/huggingface}:/root/.cache/huggingface:rw + - ${ISAAC_SIM_CACHE_DIR}/cache/kit:/isaac-sim/kit/cache:rw + - ${ISAAC_SIM_CACHE_DIR}/cache/ov:/root/.cache/ov:rw + - ${ISAAC_SIM_CACHE_DIR}/cache/pip:/root/.cache/pip:rw + - ${ISAAC_SIM_CACHE_DIR}/cache/glcache:/root/.cache/nvidia/GLCache:rw + - ${ISAAC_SIM_CACHE_DIR}/cache/computecache:/root/.nv/ComputeCache:rw + - ${ISAAC_SIM_CACHE_DIR}/logs:/root/.nvidia-omniverse/logs:rw + - ${ISAAC_SIM_CACHE_DIR}/data:/root/.local/share/ov/data:rw + +x-simulation_il_env: &simulation_il_env + - ACCEPT_EULA=Y + - PRIVACY_CONSENT=Y + - NVIDIA_VISIBLE_DEVICES=all + - NVIDIA_DRIVER_CAPABILITIES=all + - DISPLAY=${DISPLAY} + - QT_X11_NO_MITSHM=1 + - TELEOP_PORT=${TELEOP_PORT:-/dev/ttyACM0} + - TELEOP_ID=${TELEOP_ID:-leader_arm_1} + +services: + simulation_il: + build: &simulation_il_build + context: .. + dockerfile: docker/simulation/isaac_il/isaac_il.Dockerfile + cache_from: + - "${SIMULATION_IL_IMAGE:?}:${TAG}" + - "${SIMULATION_IL_IMAGE:?}:main" + image: "${SIMULATION_IL_IMAGE:?}:${TAG}" + privileged: true + gpus: all + environment: *simulation_il_env + profiles: [deploy] + deploy: + resources: + reservations: + devices: + - driver: nvidia + capabilities: [gpu] + volumes: *simulation_il_volumes + network_mode: host + stdin_open: true + tty: true + command: sleep infinity + + simulation_il_dev: + build: *simulation_il_build + image: "${SIMULATION_IL_IMAGE:?}:dev_${TAG}" + privileged: true + gpus: all + environment: *simulation_il_env + profiles: [develop] + volumes: *simulation_il_volumes + network_mode: host + stdin_open: true + tty: true + command: sleep infinity diff --git a/watod-config.sh b/watod-config.sh index 70bd2659..dfeeae29 100755 --- a/watod-config.sh +++ b/watod-config.sh @@ -13,7 +13,8 @@ ## - infrastructure : starts visualization tools ## - interfacing : starts interfacing nodes ## - perception : starts perception nodes -## - simulation : starts simulation +## - simulation : starts simulation (Humanoid_Wato / quest, Sim 4.5) +## - simulation_il : starts SO101 sim IL (workshop stack, Lab 2.3.2) — see docker/simulation/isaac_il/QUICKSTART.md ## - behaviour : starts behaviour nodes ## - samples : starts sample ROS2 pubsub nodes ## - teleop : starts teleop nodes diff --git a/watod_scripts/watod-setup-docker-env.sh b/watod_scripts/watod-setup-docker-env.sh index 44d3a9dd..b46883fb 100755 --- a/watod_scripts/watod-setup-docker-env.sh +++ b/watod_scripts/watod-setup-docker-env.sh @@ -34,7 +34,8 @@ TAG=${TAG/\//-} ## - interfacing : starts interfacing nodes ## - perception : starts perception nodes ## - controller : starts controller nodes -## - simulation : starts simulation +## - simulation : starts simulation (Humanoid_Wato / quest, Sim 4.5) +## - simulation_il : starts SO101 sim IL (workshop stack, Lab 2.3.2) — see docker/simulation/isaac_il/QUICKSTART.md ## - behaviour : starts behaviour nodes ## - samples : starts sample ROS2 pubsub nodes ACTIVE_MODULES=${ACTIVE_MODULES:-""} @@ -64,6 +65,10 @@ PERCEPTION_IMAGE=${PERCEPTION_IMAGE:-"$REGISTRY_URL/perception/perception_module SIMULATION_IMAGE=${SIMULATION_IMAGE:-"$REGISTRY_URL/simulation/isaac_sim"} +SIMULATION_IL_IMAGE=${SIMULATION_IL_IMAGE:-"$REGISTRY_URL/simulation/isaac_il"} + +ISAAC_SIM_CACHE_DIR=${ISAAC_SIM_CACHE_DIR:-"$HOME/docker/isaac-sim"} + BEHAVIOUR_OCTO_IMAGE=${BEHAVIOUR_OCTO_IMAGE:-"$REGISTRY_URL/behaviour/octomap_server"} INTERFACING_IMAGE=${INTERFACING_IMAGE:-"$REGISTRY_URL/interfacing"} @@ -77,6 +82,9 @@ FOXGLOVE_BRIDGE_PORT=${FOXGLOVE_BRIDGE_PORT:-$((BASE_PORT++))} ## -------------------- Environment Variables ------------------------- +# Repo root (watod sets this; CI only passes MODULES_DIR) +MONO_DIR=${MONO_DIR:-$(cd "$(dirname "${MODULES_DIR:?MODULES_DIR must be set}")" && pwd)} + # General echo "$MODULES_DIR" echo "# Auto-generated by ${BASH_SOURCE[0]}. Edit at own risk." > "$MODULES_DIR/.env" @@ -108,5 +116,9 @@ echo "BEHAVIOUR_VOXEL_IMAGE=$BEHAVIOUR_VOXEL_IMAGE" >> "$MODULES_DIR/.env" echo "BEHAVIOUR_JOINT_COMMAND_IMAGE=$BEHAVIOUR_JOINT_COMMAND_IMAGE" >> "$MODULES_DIR/.env" echo "PERCEPTION_IMAGE=$PERCEPTION_IMAGE" >> "$MODULES_DIR/.env" echo "SIMULATION_IMAGE=$SIMULATION_IMAGE" >> "$MODULES_DIR/.env" +echo "SIMULATION_IL_IMAGE=$SIMULATION_IL_IMAGE" >> "$MODULES_DIR/.env" +echo "ISAAC_SIM_CACHE_DIR=$ISAAC_SIM_CACHE_DIR" >> "$MODULES_DIR/.env" +echo "HF_HOME=${HF_HOME:-$HOME/.cache/huggingface}" >> "$MODULES_DIR/.env" +echo "XAUTHORITY=${XAUTHORITY:-$HOME/.Xauthority}" >> "$MODULES_DIR/.env" echo "BEHAVIOUR_OCTO_IMAGE=$BEHAVIOUR_OCTO_IMAGE" >> "$MODULES_DIR/.env" echo "TELEOP_IMAGE=$TELEOP_IMAGE" >> "$MODULES_DIR/.env" \ No newline at end of file