diff --git a/.github/actions/install_isaac_deps/action.yml b/.github/actions/install_isaac_deps/action.yml new file mode 100644 index 0000000000..754fa9368a --- /dev/null +++ b/.github/actions/install_isaac_deps/action.yml @@ -0,0 +1,45 @@ +name: Hello World 1 +runs: + using: composite + steps: + - name: Print Hello World + run: echo "Hello World" + shell: bash + - name: Setup miniconda + uses: conda-incubator/setup-miniconda@v3.0.1 + with: + miniconda-version: "latest" + python-version: "3.10" + - name: Install conda and isaac lab + run: |- + echo "Install conda and dependencies" + conda create -n env_isaaclab python=3.10 + conda init + source ~/.bashrc + conda activate env_isaaclab + pip install torch==2.5.1 --index-url https://download.pytorch.org/whl/cu118 + pip install isaacsim[all,extscache]==4.5.0 --extra-index-url https://pypi.nvidia.com + git clone https://github.com/isaac-sim/IsaacLab.git + sudo apt install cmake build-essential + echo "ISAAC SIM PATH" + ls /home/runner/work/habitat-lab/habitat-lab/IsaacLab/source + cp -f /home/runner/work/habitat-lab/habitat-lab/habitat-lab/isaaclab_modified.sh /home/runner/work/habitat-lab/habitat-lab/IsaacLab/isaaclab.sh + chmod +x ./IsaacLab/isaaclab.sh + yes | ./IsaacLab/isaaclab.sh --install + python -c "from omni.isaac.lab.app import AppLauncher; print('Libraries imported successfully')" + shell: bash +# git clone https://github.com/isaac-sim/IsaacLab.git + # sudo apt install cmake build-essential + # chmod +x ./IsaacLab/isaaclab_modified.sh + # cp ./habitat-lab/isaaclab_modified.sh ./IsaacLab/ + # cp $GITHUB_WORKSPACE/.github/actions/install_isaac_deps/isaaclab_modified.sh ./IsaacLab/ + # mkdir /home/runner/miniconda3/envs/env_isaaclab/lib/python3.10/site-packages/isaacsim/.vscode/ + # echo "{}" > /home/runner/miniconda3/envs/env_isaaclab/lib/python3.10/site-packages/isaacsim/.vscode/settings.json + + # yes | python -c "import isaacsim; print(isaacsim.__file__)" + # yes | ./IsaacLab/isaaclab.sh --install + # ignore-errors: true + # - name: Import Issac Sim + # run: | + # python -c "from omni.isaac.lab.app import AppLauncher; print('Libraries imported successfully')" + # shell: bash \ No newline at end of file diff --git a/.github/workflows/debug_isaac.yml b/.github/workflows/debug_isaac.yml new file mode 100644 index 0000000000..8d4d61e59f --- /dev/null +++ b/.github/workflows/debug_isaac.yml @@ -0,0 +1,19 @@ +name: Hello World Workflow +on: + pull_request: {} + push: + branches: + - main + tags: [ "v*" ] + +jobs: + hello-world: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.1.1 + with: + path: "./habitat-lab" + - name: Run Hello World Action + uses: "./habitat-lab/.github/actions/install_isaac_deps" + + diff --git a/.github/workflows/deploy_pypi.yml b/.github/workflows/deploy_pypi.txt similarity index 100% rename from .github/workflows/deploy_pypi.yml rename to .github/workflows/deploy_pypi.txt diff --git a/.github/workflows/install_and_test.yml b/.github/workflows/install_and_test.txt similarity index 100% rename from .github/workflows/install_and_test.yml rename to .github/workflows/install_and_test.txt diff --git a/.gitignore b/.gitignore index 0c52dc37c4..8fcbb09d15 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,7 @@ data # Autogenerated navmesh files *.navmesh + +# urdf conversion artifact +test/data/usd_conversion_data/.asset_hash +test/data/usd_conversion_data/config.yaml diff --git a/habitat-lab/habitat/isaac_sim/asset_conversion/scene_instance_json_to_usd.py b/habitat-lab/habitat/isaac_sim/asset_conversion/scene_instance_json_to_usd.py new file mode 100644 index 0000000000..27581b4293 --- /dev/null +++ b/habitat-lab/habitat/isaac_sim/asset_conversion/scene_instance_json_to_usd.py @@ -0,0 +1,610 @@ +"""This module converts a scene instance json to a usda file. +""" + +import argparse +import asyncio +import json +import os +import re +from typing import Any, Dict, List, Optional, Tuple, Union + + +def sanitize_usd_name(name: str) -> Optional[str]: + """Sanitizes a string for use as a USD node name. + + :param name: The input string to sanitize. + + :return: The sanitized string, suitable for use as a USD node name. + """ + + if len(name) == 0: + print("Input string for USD node is empty") + return None + + # Replace spaces, hyphens, colons, and other special characters with underscores + sanitized_name = re.sub(r"[^\w]", "_", name) + + # Remove consecutive underscores + sanitized_name = re.sub(r"_+", "_", sanitized_name) + + # Ensure the name doesn't start with a number + if sanitized_name[0].isdigit(): + sanitized_name = "_" + sanitized_name + + return sanitized_name + + +def object_usd_info( + obj_instance_json: Dict[str, Union[List[float], str]], + object_counts: Dict[str, int], +) -> Tuple[str, str, Dict[str, int], str]: + """From the values defined in the object json from the scence instance, generate various + strings and object counts. + + :param obj_instance_json: This is object level information from the scence_instance json file, Dictionary object + :param object counts: This dictionary contains information about multiples uses of the same mesh + + :return: object_config_filename is the name of the object config file. + out_usd_path is the filepath where the converted object is located. object_counts might be updated if there exists another + instance of the same mesh. unique_object_name is the unique name of a mesh. + """ + object_config_filename = ( + f"{obj_instance_json['template_name']}.object_config.json" + ) + # TODO: maybe don't prepend OBJECT_. Just use sanitize_usd_name. + # NOTE: You cannot start the unique object name with number in teh Xform class environment + base_object_name = "OBJECT_" + object_config_filename.removesuffix( + ".object_config.json" + ) + base_object_name = sanitize_usd_name(base_object_name) + + if base_object_name in object_counts: + object_counts[base_object_name] += 1 + unique_object_name = ( + f"{base_object_name}_dup{object_counts[base_object_name]}" + ) + else: + unique_object_name = base_object_name + object_counts[base_object_name] = 1 + + out_usd_path = f"./data/usd/objects/{base_object_name}.usda" + + return ( + object_config_filename, + out_usd_path, + object_counts, + unique_object_name, + ) + + +def convert_object_to_usd( + objects_folder: str, + object_config_filename: str, + out_usd_path: str, + project_root_folder: str, +) -> None: + """This converts an object mesh to a usda file. + + :param objects_folder : Parent folder that contains all the object meshes. + :param object_config_filename: String name of the config file associated with an object. + :param out_usd_path: Filepath where object usd will be located after conversion + :project_root_folder: Path of habitat-lab repo + """ + object_config_filepath = find_file(objects_folder, object_config_filename) + assert object_config_filepath + + object_config_json_data = None + with open(object_config_filepath, "r") as file: + object_config_json_data = json.load(file) + + # By convention, we fall back to render_asset if collision_asset is not set. See Habitat-sim Simulator::getJoinedMesh. + collision_asset_filename = ( + object_config_json_data["collision_asset"] + if "collision_asset" in object_config_json_data + else object_config_json_data["render_asset"] + ) + collision_asset_filepath = find_file( + objects_folder, collision_asset_filename + ) + + print(f"Converting {collision_asset_filepath}...") + + if not os.path.exists(out_usd_path): + convert_mesh_to_usd( + collision_asset_filepath, out_usd_path, load_materials=False + ) + + render_asset_filepath_from_urdf = object_config_json_data["render_asset"] + object_config_dir, _ = os.path.split(object_config_filepath) + render_asset_filepath_for_usd = os.path.relpath( + os.path.abspath( + os.path.join(object_config_dir, render_asset_filepath_from_urdf) + ), + start=project_root_folder, + ) + render_asset_scale = object_config_json_data.get("scale", (1.0, 1.0, 1.0)) + + add_habitat_visual_to_usd_root( + out_usd_path, render_asset_filepath_for_usd, render_asset_scale + ) + + print(f"Wrote {out_usd_path}") + + +def find_file(folder: str, filename: str) -> str: + """Given a root folder, return the string of the absolute path of file contained within the root folder + + :param folder: Root folder to search in + :param filename: Name of file to be searched for. + + :return: Absoluate path string of filename if it is found, None if none found. + """ + result = None + for root, _, files in os.walk(folder): + if filename in files: + assert not result + result = os.path.join(root, filename) + return os.path.abspath(result) + + +def find_scene_instance_json_files(scene_directory: str) -> List[str]: + """ + Find all files in the given folder and its subfolders whose names end with 'scene_instance.json'. + + :param folder_path: The path to the folder to search. + + :return: A list of paths to the matching files. + """ + matching_files = [] + for root, _, files in os.walk(scene_directory): + for file in files: + if file.endswith("scene_instance.json"): + matching_files.append(os.path.join(root, file)) + return matching_files + + +def make_scene_instance_usd_path( + scene_filepath: str, scene_usd_directory: str +) -> str: + """ + Form the scene instance usda filepath from scence instance json filepath'. + + :param scene_filepath: scene instance json filepath + :param scene_usd_directory: desired scene instance usd output directory + + :return: desired scene instance usd output filepath + """ + + filename_with_extension = os.path.basename(scene_filepath) + filename_without_extension = os.path.splitext(filename_with_extension)[0] + usda_filename = f"{filename_without_extension}.usda" + + # Create the new directory if it doesn't exist + if not os.path.exists(scene_usd_directory): + os.makedirs(scene_usd_directory) + + usda_filepath = os.path.join(scene_usd_directory, usda_filename) + + return usda_filepath + + +def convert_mesh_to_usd( + in_file: str, out_file: str, load_materials: bool = True +) -> None: + """Convert mesh to usd + + :param in_file: string filepath of input mesh + :param out_file: string of output usda file + :param load_materials: load material properties of mesh. + + """ + asyncio.run( + async_convert_mesh_to_usd( + in_file=in_file, out_file=out_file, load_materials=load_materials + ) + ) + + from pxr import Usd + + stage = Usd.Stage.Open(out_file) + + convert_meshes_to_static_colliders(stage, "/World") + + stage.GetRootLayer().Export(out_file) + + +async def async_convert_mesh_to_usd( + in_file: str, out_file: str, load_materials: bool = True +) -> bool: + """ported from IsaacLab mesh_converter.py _convert_mesh_to_usd + + :param in_file: Input mesh filepath + :param out_file: Output usda filepath + + :return: True if conversion to usd sucessful. False otherwise. + """ + + from omni.isaac.core.utils.extensions import enable_extension + + enable_extension("omni.kit.asset_converter") + + import omni.kit.asset_converter + import omni.usd + + # Create converter context + converter_context = omni.kit.asset_converter.AssetConverterContext() + # Set up converter settings + # Don't import/export materials + converter_context.ignore_materials = not load_materials + converter_context.ignore_animations = True + converter_context.ignore_camera = True + converter_context.ignore_light = True + # Merge all meshes into one + converter_context.merge_all_meshes = False + # Sets world units to meters, this will also scale asset if it's centimeters model. + # This does not work right now :(, so we need to scale the mesh manually + converter_context.use_meter_as_world_unit = True + converter_context.baking_scales = True + # Uses double precision for all transform ops. + converter_context.use_double_precision_to_usd_transform_op = True + + # Create converter task + instance = omni.kit.asset_converter.get_instance() + task = instance.create_converter_task( + in_file, out_file, None, converter_context + ) + # Start conversion task and wait for it to finish + success = await task.wait_until_finished() + if not success: + raise RuntimeError( + f"Failed to convert {in_file} to USD. Error: {task.get_error_message()}" + ) + return success + + +def convert_meshes_to_static_colliders( + stage: "Usd.stage", root_path: str # type: ignore[name-defined] # noqa: F821 +) -> None: + """ + Iterates over all meshes in the USD subtree under `root_path` and adds convex hull collision shapes. + + :param stage: The USD stage. + :param root_path: The root path of the subtree to process. + """ + from pxr import PhysxSchema, Usd, UsdGeom, UsdPhysics + + # Get the root prim + root_prim = stage.GetPrimAtPath(root_path) + if not root_prim.IsValid(): + raise ValueError( + f"The specified root path '{root_path}' is not valid." + ) + + # Iterate over all child prims in the subtree + for prim in Usd.PrimRange(root_prim): + # Check if the prim is a mesh + if prim.IsA(UsdGeom.Mesh): + # print(f"Processing mesh: {prim.GetPath()}") + + # Check if MeshCollisionAPI is already applied + UsdPhysics.CollisionAPI.Apply(prim) + collision_api = UsdPhysics.MeshCollisionAPI.Apply(prim) + collision_api.GetApproximationAttr().Set( + "convexHull" + ) # "convexDecomposition") + + physicsAPI = UsdPhysics.RigidBodyAPI.Apply(prim) + PhysxSchema.PhysxRigidBodyAPI.Apply(prim) + physicsAPI.CreateRigidBodyEnabledAttr(True) + physicsAPI.CreateKinematicEnabledAttr(True) + + # set purpose to "guide" so that this mesh doesn't render in Isaac? + if True: + mesh_geom = UsdGeom.Imageable(prim) + mesh_geom.CreatePurposeAttr(UsdGeom.Tokens.guide) + + +def add_habitat_visual_to_usd_root( + usd_filepath: str, + render_asset_filepath: str, + render_asset_scale: List[float], +) -> None: + """ + This function adds habitat visual information into a usda file. + + :param usd_filepath: Filepath to scene instance json file + :param render_asset_filepath: Filepath that contains render asset information + :param render_asset_scale: An array that defines scale on the xyz axis + """ + from pxr import Gf, Sdf, Usd + + # Open the USD file + stage = Usd.Stage.Open(usd_filepath) + if not stage: + raise ValueError(f"Could not open USD file: {usd_filepath}") + + default_prim = stage.GetDefaultPrim() + + # Add habitatVisual:assetPath + asset_path_attr = default_prim.CreateAttribute( + "habitatVisual:assetPath", Sdf.ValueTypeNames.String + ) + asset_path_attr.Set(render_asset_filepath) + + # Add habitatVisual:assetScale + asset_scale_attr = default_prim.CreateAttribute( + "habitatVisual:assetScale", Sdf.ValueTypeNames.Float3 + ) + asset_scale_attr.Set(Gf.Vec3f(*render_asset_scale)) + + # Save the updated USD file + stage.GetRootLayer().Save() + print( + f"Added habitat visual metadata to RigidBody prim in: {usd_filepath}" + ) + + +def add_xform_scale(object_xform: "UsdGeom.Xform") -> None: # type: ignore[name-defined] # noqa: F821 + """Add object scale value into xform class for scene instance json. + + :param object_xform: The Xform class containing scene object information. + """ + from pxr import Gf + + # Ensure scale op exists, default value + scale = [ + 1.0, + 1.0, + 1.0, + ] # obj_instance_json.get("non_uniform_scale", [1.0, 1.0, 1.0]) + + scale_op = next( + ( + op + for op in object_xform.GetOrderedXformOps() + if op.GetName() == "xformOp:scale" + ), + None, + ) + if scale_op is None: + scale_op = object_xform.AddScaleOp() + scale_op.Set(Gf.Vec3f(*scale)) + + +def add_xform_rotation( + obj_instance_json: Dict[str, Any], object_xform: "UsdGeom.Xform" # type: ignore[name-defined] # noqa: F821 +) -> None: + """Add object rotation value into xform class for scene instance json. + + :param obj_instance_json: Object information from scence instance json + :object_xform: The Xform class that contains object information for usd file. + """ + from pxr import Gf, UsdGeom + + # Ensure rotation op exists + # rotation = habitat_to_usd_rotation([0.0, 0.0, 0.0, 1.0]) + # rotation = [1.0, 0.0, 0.0, 0.0] + # 90 degrees about x in wxyz format + # rotation = [0.7071068,0.7071067,0.0,0.0] + rotation = habitat_to_usd_rotation( + obj_instance_json.get("rotation", [1.0, 0.0, 0.0, 0.0]) + ) + orient_op = next( + ( + op + for op in object_xform.GetOrderedXformOps() + if op.GetName() == "xformOp:orient" + ), + None, + ) + if orient_op is None: + orient_op = object_xform.AddOrientOp( + precision=UsdGeom.XformOp.PrecisionDouble + ) + orient_op.Set(Gf.Quatd(*rotation)) + + +def habitat_to_usd_rotation(rotation: List[float]) -> List[float]: + """ + Convert a quaternion rotation from Habitat to USD coordinate system. + + :param rotation: Quaternion in Habitat coordinates [w, x, y, z] (wxyz). + + :return: Quaternion in USD coordinates [w, x, y, z] (wxyz). + """ + HALF_SQRT2 = 0.70710678 # √0.5 + + # Combined inverse quaternion transform: (inverse of q_trans) + # q_x90_inv = [√0.5, √0.5, 0, 0] (wxyz format) + # q_y180_inv = [0, 0, -1, 0] (wxyz format) + # q_y90_inv = [HALF_SQRT2, 0.0, HALF_SQRT2, 0.0] + # q_z90_inv = [HALF_SQRT2, 0.0, 0.0, HALF_SQRT2] + # q_z180_inv = [0.0, 0.0, 0.0, 1.0] + + q_x90_inv = [HALF_SQRT2, HALF_SQRT2, 0.0, 0.0] + q_y180_inv = [0.0, 0.0, -1.0, 0.0] + + # Multiply q_y180_inv * q_x90_inv to get the combined quaternion + def quat_multiply(q1, q2): + w1, x1, y1, z1 = q1 + w2, x2, y2, z2 = q2 + w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2 + x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2 + y = w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2 + z = w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2 + return [w, x, y, z] + + q_trans_inv = quat_multiply(q_x90_inv, q_y180_inv) + + # Multiply q_trans_inv with the input rotation quaternion + w, x, y, z = rotation + rotation_usd = quat_multiply(q_trans_inv, [w, x, y, z]) + + return rotation_usd + + +def add_xform_translation( + obj_instance_json: Dict[str, Any], object_xform: "UsdGeom.Xform" # type: ignore[name-defined] # noqa: F821 +) -> None: + """Add object translation value into xform class for scene instance json. + + :param obj_instance_json: Object information from scence instance json + :object_xform: The Xform class that contains object information for usd file. + """ + from pxr import Gf + + # Ensure translation op exists + position = habitat_to_usd_position( + obj_instance_json.get("translation", [0.0, 0.0, 0.0]) + ) + translate_op = next( + ( + op + for op in object_xform.GetOrderedXformOps() + if op.GetName() == "xformOp:translate" + ), + None, + ) + if translate_op is None: + translate_op = object_xform.AddTranslateOp() + translate_op.Set(Gf.Vec3f(*position)) + + +def habitat_to_usd_position(position: List[float]) -> List[float]: + """ + Convert a position from Habitat (Y-up) to USD (Z-up) coordinate system. Habitat (-x, z, y) -> Isaac (x, y, z) + + :param position: Habitat coordinates + :return: Isaac coordinates + """ + x, y, z = position + return [-x, z, y] + + +def convert_hab_scene( + scene_filepath: str, + project_root_folder: str, + scene_usd_filepath: str, + objects_folder: str = "", +) -> None: + """ + This function converts scene_instance.json file types to .usda. + + :param scene_filepath: Filepath of the scene_instance,json + :param project_root_folder: Directory path of habitat-lab + :param objects_folder: Directory path that contains scence instance objects. + :param scene_usd_filepath: Filepath location of scene instance usda file after conversion. + """ + from pxr import Usd, UsdGeom + + with open(scene_filepath, "r") as file: + scene_json_data = json.load(file) + + # Form Xform stage object for output .usda file. + print(scene_usd_filepath) + stage = Usd.Stage.CreateNew(scene_usd_filepath) + xform_prim = UsdGeom.Xform.Define(stage, "/Scene") + stage.SetDefaultPrim(xform_prim.GetPrim()) + + # Get scene folder and objects folder. In the case of HSSD, the scene folder + # contains the scene_instance.json files, and the object folder is the same hierarchy. + # Adjust paths as needed. + scenes_folder = os.path.dirname(scene_filepath) + if not objects_folder: + objects_folder = scenes_folder + "/../objects" + + try: + assert os.path.exists(objects_folder) + except AssertionError: + raise FileNotFoundError( + f"Object glb folder {objects_folder} does not exist" + ) + + # A scene may have multiple instances of the same object mesh. Xform usda needs + # to have one unique name per mesh. + object_counts: Dict[str, int] = {} + + try: + assert "object_instances" in scene_json_data + except AssertionError: + print(f"'object_instances' key not found in {scene_filepath} ") + return + + for obj_instance_json in scene_json_data["object_instances"]: + # TODO: assert collision_asset_size is (1,1,1) or not present + # TODO: check is_collidable + # TODO: how to handle scale + + object_config_filename = ( + f"{obj_instance_json['template_name']}.object_config.json" + ) + # TODO: maybe don't prepend OBJECT_. Just use sanitize_usd_name. + # NOTE: You cannot start the unique object name with number in teh Xform class environment + base_object_name = "OBJECT_" + object_config_filename.removesuffix( + ".object_config.json" + ) + base_object_name = sanitize_usd_name(base_object_name) + + ( + object_config_filename, + out_usd_path, + object_counts, + unique_object_name, + ) = object_usd_info(obj_instance_json, object_counts) + + convert_object_to_usd( + objects_folder, + object_config_filename, + out_usd_path, + project_root_folder, + ) + + relative_usd_path = out_usd_path.removeprefix("./data/usd/") + + # Form Scene Node + object_xform = UsdGeom.Xform.Define( + stage, f"/Scene/{unique_object_name}" + ) + + object_xform.GetPrim().GetReferences().AddReference(relative_usd_path) + + # Operation are performed in the order listed, change as desired + # Current order is scale at global origin, local rotation at global origin, then translate from global origin + add_xform_scale(object_xform) + add_xform_rotation(obj_instance_json, object_xform) + add_xform_translation(obj_instance_json, object_xform) + + # NOTE: Let's not change the xform order. I don't know what's going on with Xform order. + # object_xform.SetXformOpOrder(xform_op_order) + + stage.GetRootLayer().Save() + print(f"wrote scene {scene_usd_filepath}") + + +if __name__ == "__main__": + # Launch Issac Lab Applauncher + from omni.isaac.lab.app import AppLauncher + + app_launcher = AppLauncher(headless=True) + simulation_app = app_launcher.app + + # Build parser + parser = argparse.ArgumentParser( + description="Convert scene instance json to usd." + ) + + # Parser for convert_hab_scene + parser.add_argument("scene_filepath") + parser.add_argument("project_root_folder") + parser.add_argument("scene_usd_filepath") + parser.add_argument("--objects_folder") + parser.set_defaults(func=convert_hab_scene) + + args = parser.parse_args() + + convert_hab_scene( + args.scene_filepath, + args.project_root_folder, + args.scene_usd_filepath, + args.objects_folder, + ) diff --git a/habitat-lab/habitat/isaac_sim/asset_conversion/urdf_to_usd.py b/habitat-lab/habitat/isaac_sim/asset_conversion/urdf_to_usd.py new file mode 100644 index 0000000000..5968cb1da5 --- /dev/null +++ b/habitat-lab/habitat/isaac_sim/asset_conversion/urdf_to_usd.py @@ -0,0 +1,238 @@ +"""This module converts urdf files into usda files.""" + +import argparse +import os + +from lxml import etree as ET # Using lxml for better XML handling + + +def clean_urdf(input_file: str, output_file: str, remove_visual=False) -> None: + """ + Cleans a URDF file: + 1. Optionally removes elements. + 2. Fixes invalid use of '.' in and names while preserving references. + + :param input_file: Path to the input URDF file. + :param output_file: Path to the output cleaned URDF file. + :param remove_visual: If True, removes all elements. + """ + tree = ET.parse(input_file) + root = tree.getroot() + + name_map = {} # Maps old names to new names for links and joints + + # Helper function to sanitize names + def sanitize_name(name): + if "." in name: + new_name = name.replace(".", "_") + name_map[name] = new_name + return new_name + return name + + # Update and names + for element in root.xpath("//*[@name]"): + original_name = element.get("name") + sanitized_name = sanitize_name(original_name) + element.set("name", sanitized_name) + + # Update references to and + for parent in root.xpath("//parent[@link]"): + original_link = parent.get("link") + parent.set("link", name_map.get(original_link, original_link)) + + for child in root.xpath("//child[@link]"): + original_link = child.get("link") + child.set("link", name_map.get(original_link, original_link)) + + # Optionally remove elements + if remove_visual: + for visual in root.xpath("//visual"): + visual_parent = visual.getparent() + visual_parent.remove(visual) + + # Write the cleaned URDF to the output file + with open(output_file, "wb") as f: + f.write( + ET.tostring( + root, pretty_print=True, xml_declaration=True, encoding="UTF-8" + ) + ) + print(f"Cleaned URDF written to: {output_file}") + + +def convert_urdf(urdf_filepath: str, out_usd_filepath: str) -> None: + """Convert urdf file to usda file + + :param urdf_filepath: The filepath of urdf file + :param out_usd_filepath: The desired output path of usda file + """ + + from omni.isaac.lab.sim.converters import UrdfConverter, UrdfConverterCfg + + out_dir, out_filename = os.path.split(out_usd_filepath) + + # Define the configuration for the URDF conversion + config = UrdfConverterCfg( + asset_path=urdf_filepath, # Path to the input URDF file + usd_dir=out_dir, # Directory to save the converted USD file + usd_file_name=out_filename, # Name of the output USD file + force_usd_conversion=True, # Force conversion even if USD already exists + make_instanceable=False, # Make the USD asset instanceable + link_density=1000.0, # Default density for links + import_inertia_tensor=True, # Import inertia tensor from URDF + convex_decompose_mesh=False, # Decompose convex meshes + fix_base=False, # Fix the base link + merge_fixed_joints=False, # Merge links connected by fixed joints + self_collision=False, # Enable self-collision + default_drive_type="position", # Default drive type for joints + override_joint_dynamics=False, # Override joint dynamics + ) + + # Create the UrdfConverter with the specified configuration + converter = UrdfConverter(config) + + # Get the path to the generated USD file + usd_path = converter.usd_path + print(f"USD file generated at: {usd_path}") + + +def add_habitat_visual_metadata_for_articulation( + usd_filepath: str, + reference_urdf_filepath: str, + out_usd_filepath: str, + project_root_folder: str, +) -> None: + """Add habitat visual metadata into usda file. + + :param usd_filepath: Usd fileapath to add visual metadata + :param reference_urdf_filepath: Filepath of reference urdf + :param out_usd_filepath: Desired output usd path + :param project_root_folder: Directory path of habitat-lab + """ + from pxr import Gf, Sdf, Usd + + # Parse the URDF file + urdf_tree = ET.parse(reference_urdf_filepath) + urdf_root = urdf_tree.getroot() + + # Get the robot name from the URDF + robot_name = urdf_root.get("name") + + # Extract visual metadata from the URDF + visual_metadata = {} + urdf_dir = os.path.dirname(os.path.abspath(reference_urdf_filepath)) + # usd_dir = os.path.dirname(os.path.abspath(usd_filepath)) # NOTE: Not used in this function + for link in urdf_root.findall("link"): + link_name = link.get("name") + visual = link.find("visual") + if visual is not None: + geometry = visual.find("geometry") + if geometry is not None: + mesh = geometry.find("mesh") + if mesh is not None: + filename = mesh.get("filename") + asset_path = os.path.relpath( + os.path.abspath(os.path.join(urdf_dir, filename)), + start=project_root_folder, + ) + scale = (1.0, 1.0, 1.0) # Default scale + + # Check for scale in the element + scale_element = mesh.find("scale") + if scale_element is not None: + scale = tuple( + map(float, scale_element.text.split()) + ) # type: ignore # noqa: ALL + + # Replace periods with underscores for USD-safe names + # todo: use a standard get_sanitized_usd_name function here + safe_link_name = link_name.replace(".", "_") + visual_metadata[safe_link_name] = { + "assetPath": asset_path, + "assetScale": scale, + } + + # Open the USD file + stage = Usd.Stage.Open(usd_filepath) + if not stage: + raise ValueError(f"Could not open USD file: {usd_filepath}") + + # Add the habitatVisual metadata to each relevant prim + for link_name, metadata in visual_metadata.items(): + prim_path = f"/{robot_name}/{link_name}" + prim = stage.GetPrimAtPath(prim_path) + if prim: + # Add assetPath + asset_path_attr = prim.CreateAttribute( + "habitatVisual:assetPath", Sdf.ValueTypeNames.String + ) + asset_path_attr.Set(metadata["assetPath"]) + + # Add assetScale + asset_scale_attr = prim.CreateAttribute( + "habitatVisual:assetScale", Sdf.ValueTypeNames.Float3 + ) + asset_scale_attr.Set(Gf.Vec3f(*metadata["assetScale"])) + else: + print(f"Warning: Prim not found for link: {link_name}") + + # Save the updated USD to the output file + stage.GetRootLayer().Export(out_usd_filepath) + print(f"Updated USD file written to: {out_usd_filepath}") + + +def convert_urdf_to_usd( + input_urdf_file: str, + output_usda_file: str, + project_root_folder: str, + remove_visual: bool = False, +) -> None: + """This function cleans the format of a urdf file, converts the urdf file to usda, and then + adds habitat visual metadata in that order. + + :param input_urdf_file: Filepath of raw urdf file + :param output_usda_file: Filepath of desired output filepath + :param project_root_folder: Repository root directory + :param remove_visual: If True, removes all elements + """ + + filename, file_extension = os.path.splitext(input_urdf_file) + clean_urdf_temp = f"{filename}_TEMP{file_extension}" + clean_urdf(input_urdf_file, clean_urdf_temp, remove_visual) + + convert_urdf(clean_urdf_temp, output_usda_file) + + if os.path.exists(clean_urdf_temp): + os.remove(clean_urdf_temp) + + add_habitat_visual_metadata_for_articulation( + output_usda_file, + input_urdf_file, + output_usda_file, + project_root_folder, + ) + + +if __name__ == "__main__": + # Launch Issac Lab Applauncher + from omni.isaac.lab.app import AppLauncher + + app_launcher = AppLauncher(headless=True) + simulation_app = app_launcher.app + + # Build parser and subparser + parser = argparse.ArgumentParser(description="Convert urdf file to usd.") + + parser.add_argument("input_urdf_file") + parser.add_argument("output_usda_file") + parser.add_argument("project_root_folder") + parser.add_argument("--remove_visual") + + args = parser.parse_args() + + convert_urdf_to_usd( + args.input_urdf_file, + args.output_usda_file, + args.project_root_folder, + args.remove_visual, + ) diff --git a/habitat-lab/requirements.txt b/habitat-lab/requirements.txt index f73e3471d7..217e37e2c6 100644 --- a/habitat-lab/requirements.txt +++ b/habitat-lab/requirements.txt @@ -14,3 +14,4 @@ imageio>=2.2.0 imageio-ffmpeg>=0.2.0 scipy>=1.10.1 tqdm>=4.0.0 +lxml==5.3.0 diff --git a/isaaclab_modified.sh b/isaaclab_modified.sh new file mode 100644 index 0000000000..0ea7f362f4 --- /dev/null +++ b/isaaclab_modified.sh @@ -0,0 +1,402 @@ +#!/usr/bin/env bash + +# Copyright (c) 2022-2025, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +#== +# Configurations +#== + +# Exits if error occurs +set -e + +# Set tab-spaces +tabs 4 + +# get source directory +export ISAACLAB_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" + +#== +# Helper functions +#== + +# extract isaac sim path +extract_isaacsim_path() { + # Use the sym-link path to Isaac Sim directory + local isaac_path=${ISAACLAB_PATH}/_isaac_sim + # If above path is not available, try to find the path using python + if [ ! -d "${isaac_path}" ]; then + # Use the python executable to get the path + local python_exe=$(extract_python_exe) + # Retrieve the path importing isaac sim and getting the environment path + if [ $(${python_exe} -m pip list | grep -c 'isaacsim-rl') ]; then + local isaac_path=$(${python_exe} -c "import isaacsim; import os; print(os.environ['ISAAC_PATH'])") + fi + fi + # check if there is a path available + if [ ! -d "${isaac_path}" ]; then + # throw an error if no path is found + echo -e "[ERROR] Unable to find the Isaac Sim directory: '${isaac_path}'" >&2 + echo -e "\tThis could be due to the following reasons:" >&2 + echo -e "\t1. Conda environment is not activated." >&2 + echo -e "\t2. Isaac Sim pip package 'isaacsim-rl' is not installed." >&2 + echo -e "\t3. Isaac Sim directory is not available at the default path: ${ISAACLAB_PATH}/_isaac_sim" >&2 + # exit the script + exit 1 + fi + # return the result + echo ${isaac_path} +} + +# extract the python from isaacsim +extract_python_exe() { + # check if using conda + if ! [[ -z "${CONDA_PREFIX}" ]]; then + # use conda python + local python_exe=${CONDA_PREFIX}/bin/python + else + # use kit python + local python_exe=${ISAACLAB_PATH}/_isaac_sim/python.sh + + if [ ! -f "${python_exe}" ]; then + # note: we need to check system python for cases such as docker + # inside docker, if user installed into system python, we need to use that + # otherwise, use the python from the kit + if [ $(python -m pip list | grep -c 'isaacsim-rl') ]; then + local python_exe=$(which python) + fi + fi + fi + # check if there is a python path available + if [ ! -f "${python_exe}" ]; then + echo -e "[ERROR] Unable to find any Python executable at path: '${python_exe}'" >&2 + echo -e "\tThis could be due to the following reasons:" >&2 + echo -e "\t1. Conda environment is not activated." >&2 + echo -e "\t2. Isaac Sim pip package 'isaacsim-rl' is not installed." >&2 + echo -e "\t3. Python executable is not available at the default path: ${ISAACLAB_PATH}/_isaac_sim/python.sh" >&2 + exit 1 + fi + # return the result + echo ${python_exe} +} + +# extract the simulator exe from isaacsim +extract_isaacsim_exe() { + # obtain the isaac sim path + local isaac_path=$(extract_isaacsim_path) + # python executable to use + local isaacsim_exe=${isaac_path}/isaac-sim.sh + # check if there is a python path available + if [ ! -f "${isaacsim_exe}" ]; then + # check for installation using Isaac Sim pip + if [ $(python -m pip list | grep -c 'isaacsim-rl') -gt 0 ]; then + # Isaac Sim - Python packages entry point + local isaacsim_exe="isaacsim omni.isaac.sim" + else + echo "[ERROR] No Isaac Sim executable found at path: ${isaac_path}" >&2 + exit 1 + fi + fi + # return the result + echo ${isaacsim_exe} +} + +# check if input directory is a python extension and install the module +install_isaaclab_extension() { + # retrieve the python executable + python_exe=$(extract_python_exe) + # if the directory contains setup.py then install the python module + if [ -f "$1/setup.py" ]; then + echo -e "\t module: $1" + ${python_exe} -m pip install --editable $1 + fi +} + +# setup anaconda environment for Isaac Lab +setup_conda_env() { + # get environment name from input + local env_name=$1 + # check conda is installed + if ! command -v conda &> /dev/null + then + echo "[ERROR] Conda could not be found. Please install conda and try again." + exit 1 + fi + + # check if the environment exists + if { conda env list | grep -w ${env_name}; } >/dev/null 2>&1; then + echo -e "[INFO] Conda environment named '${env_name}' already exists." + else + echo -e "[INFO] Creating conda environment named '${env_name}'..." + conda create -y --name ${env_name} python=3.10 + fi + + # cache current paths for later + cache_pythonpath=$PYTHONPATH + cache_ld_library_path=$LD_LIBRARY_PATH + # clear any existing files + rm -f ${CONDA_PREFIX}/etc/conda/activate.d/setenv.sh + rm -f ${CONDA_PREFIX}/etc/conda/deactivate.d/unsetenv.sh + # activate the environment + source $(conda info --base)/etc/profile.d/conda.sh + conda activate ${env_name} + # setup directories to load Isaac Sim variables + mkdir -p ${CONDA_PREFIX}/etc/conda/activate.d + mkdir -p ${CONDA_PREFIX}/etc/conda/deactivate.d + + # add variables to environment during activation + printf '%s\n' '#!/usr/bin/env bash' '' \ + '# for Isaac Lab' \ + 'export ISAACLAB_PATH='${ISAACLAB_PATH}'' \ + 'alias isaaclab='${ISAACLAB_PATH}'/isaaclab.sh' \ + '' \ + '# show icon if not runninng headless' \ + 'export RESOURCE_NAME="IsaacSim"' \ + '' > ${CONDA_PREFIX}/etc/conda/activate.d/setenv.sh + + # check if we have _isaac_sim directory -> if so that means binaries were installed. + # we need to setup conda variables to load the binaries + local isaacsim_setup_conda_env_script=${ISAACLAB_PATH}/_isaac_sim/setup_conda_env.sh + + if [ -f "${isaacsim_setup_conda_env_script}" ]; then + # add variables to environment during activation + printf '%s\n' \ + '# for Isaac Sim' \ + 'source '${isaacsim_setup_conda_env_script}'' \ + '' >> ${CONDA_PREFIX}/etc/conda/activate.d/setenv.sh + fi + + # reactivate the environment to load the variables + # needed because deactivate complains about Isaac Lab alias since it otherwise doesn't exist + conda activate ${env_name} + + # remove variables from environment during deactivation + printf '%s\n' '#!/usr/bin/env bash' '' \ + '# for Isaac Lab' \ + 'unalias isaaclab &>/dev/null' \ + 'unset ISAACLAB_PATH' \ + '' \ + '# restore paths' \ + 'export PYTHONPATH='${cache_pythonpath}'' \ + 'export LD_LIBRARY_PATH='${cache_ld_library_path}'' \ + '' \ + '# for Isaac Sim' \ + 'unset RESOURCE_NAME' \ + '' > ${CONDA_PREFIX}/etc/conda/deactivate.d/unsetenv.sh + + # check if we have _isaac_sim directory -> if so that means binaries were installed. + if [ -f "${isaacsim_setup_conda_env_script}" ]; then + # add variables to environment during activation + printf '%s\n' \ + '# for Isaac Sim' \ + 'unset CARB_APP_PATH' \ + 'unset EXP_PATH' \ + 'unset ISAAC_PATH' \ + '' >> ${CONDA_PREFIX}/etc/conda/deactivate.d/unsetenv.sh + fi + + # install some extra dependencies + echo -e "[INFO] Installing extra dependencies (this might take a few minutes)..." + conda install -c conda-forge -y importlib_metadata &> /dev/null + + # deactivate the environment + conda deactivate + # add information to the user about alias + echo -e "[INFO] Added 'isaaclab' alias to conda environment for 'isaaclab.sh' script." + echo -e "[INFO] Created conda environment named '${env_name}'.\n" + echo -e "\t\t1. To activate the environment, run: conda activate ${env_name}" + echo -e "\t\t2. To install Isaac Lab extensions, run: isaaclab -i" + echo -e "\t\t4. To perform formatting, run: isaaclab -f" + echo -e "\t\t5. To deactivate the environment, run: conda deactivate" + echo -e "\n" +} + + +# print the usage description +print_help () { + echo -e "\nusage: $(basename "$0") [-h] [-i] [-f] [-p] [-s] [-t] [-o] [-v] [-d] [-c] -- Utility to manage Isaac Lab." + echo -e "\noptional arguments:" + echo -e "\t-h, --help Display the help content." + echo -e "\t-i, --install [LIB] Install the extensions inside Isaac Lab and learning frameworks as extra dependencies. Default is 'all'." + echo -e "\t-f, --format Run pre-commit to format the code and check lints." + echo -e "\t-p, --python Run the python executable provided by Isaac Sim or virtual environment (if active)." + echo -e "\t-s, --sim Run the simulator executable (isaac-sim.sh) provided by Isaac Sim." + echo -e "\t-t, --test Run all python unittest tests." + echo -e "\t-o, --docker Run the docker container helper script (docker/container.sh)." + echo -e "\t-v, --vscode Generate the VSCode settings file from template." + echo -e "\t-d, --docs Build the documentation from source using sphinx." + echo -e "\t-c, --conda [NAME] Create the conda environment for Isaac Lab. Default name is 'isaaclab'." + echo -e "\n" >&2 +} + + +#== +# Main +#== + +# check argument provided +if [ -z "$*" ]; then + echo "[Error] No arguments provided." >&2; + print_help + exit 1 +fi + +# pass the arguments +while [[ $# -gt 0 ]]; do + # read the key + case "$1" in + -i|--install) + # install the python packages in IsaacLab/source directory + echo "[INFO] Installing extensions inside the Isaac Lab repository..." + echo "${ISAACLAB_PATH}" + python_exe=$(extract_python_exe) + # recursively look into directories and install them + # this does not check dependencies between extensions + export -f extract_python_exe + export -f install_isaaclab_extension + # source directory + find -L "${ISAACLAB_PATH}/source/extensions" -mindepth 1 -maxdepth 1 -type d -exec bash -c 'install_isaaclab_extension "{}"' \; + # install the python packages for supported reinforcement learning frameworks + echo "[INFO] Installing extra requirements such as learning frameworks..." + # check if specified which rl-framework to install + if [ -z "$2" ]; then + echo "[INFO] Installing all rl-frameworks..." + framework_name="all" + elif [ "$2" = "none" ]; then + echo "[INFO] No rl-framework will be installed." + framework_name="none" + shift # past argument + else + echo "[INFO] Installing rl-framework: $2" + framework_name=$2 + shift # past argument + fi + # install the rl-frameworks specified + ${python_exe} -m pip install -e ${ISAACLAB_PATH}/source/extensions/omni.isaac.lab_tasks["${framework_name}"] + + # check if we are inside a docker container or are building a docker image + # in that case don't setup VSCode since it asks for EULA agreement which triggers user interaction + if [ -f /.dockerenv ]; then + echo "[INFO] Running inside a docker container. Skipping VSCode settings setup." + echo "[INFO] To setup VSCode settings, run 'isaaclab -v'." + fi + + # unset local variables + unset extract_python_exe + unset install_isaaclab_extension + shift # past argument + ;; + -c|--conda) + # use default name if not provided + if [ -z "$2" ]; then + echo "[INFO] Using default conda environment name: isaaclab" + conda_env_name="isaaclab" + else + echo "[INFO] Using conda environment name: $2" + conda_env_name=$2 + shift # past argument + fi + # setup the conda environment for Isaac Lab + setup_conda_env ${conda_env_name} + shift # past argument + ;; + -f|--format) + # reset the python path to avoid conflicts with pre-commit + # this is needed because the pre-commit hooks are installed in a separate virtual environment + # and it uses the system python to run the hooks + if [ -n "${CONDA_DEFAULT_ENV}" ]; then + cache_pythonpath=${PYTHONPATH} + export PYTHONPATH="" + fi + # run the formatter over the repository + # check if pre-commit is installed + if ! command -v pre-commit &>/dev/null; then + echo "[INFO] Installing pre-commit..." + pip install pre-commit + fi + # always execute inside the Isaac Lab directory + echo "[INFO] Formatting the repository..." + cd ${ISAACLAB_PATH} + pre-commit run --all-files + cd - > /dev/null + # set the python path back to the original value + if [ -n "${CONDA_DEFAULT_ENV}" ]; then + export PYTHONPATH=${cache_pythonpath} + fi + shift # past argument + # exit neatly + break + ;; + -p|--python) + # run the python provided by isaacsim + python_exe=$(extract_python_exe) + echo "[INFO] Using python from: ${python_exe}" + shift # past argument + ${python_exe} "$@" + # exit neatly + break + ;; + -s|--sim) + # run the simulator exe provided by isaacsim + isaacsim_exe=$(extract_isaacsim_exe) + echo "[INFO] Running isaac-sim from: ${isaacsim_exe}" + shift # past argument + ${isaacsim_exe} --ext-folder ${ISAACLAB_PATH}/source/extensions $@ + # exit neatly + break + ;; + -t|--test) + # run the python provided by isaacsim + python_exe=$(extract_python_exe) + shift # past argument + ${python_exe} ${ISAACLAB_PATH}/tools/run_all_tests.py $@ + # exit neatly + break + ;; + -o|--docker) + # run the docker container helper script + docker_script=${ISAACLAB_PATH}/docker/container.sh + echo "[INFO] Running docker utility script from: ${docker_script}" + shift # past argument + bash ${docker_script} $@ + # exit neatly + break + ;; + -v|--vscode) + # update the vscode settings + shift # past argument + # exit neatly + break + ;; + -d|--docs) + # build the documentation + echo "[INFO] Building documentation..." + # retrieve the python executable + python_exe=$(extract_python_exe) + # install pip packages + cd ${ISAACLAB_PATH}/docs + ${python_exe} -m pip install -r requirements.txt > /dev/null + # build the documentation + ${python_exe} -m sphinx -b html -d _build/doctrees . _build/current + # open the documentation + echo -e "[INFO] To open documentation on default browser, run:" + echo -e "\n\t\txdg-open $(pwd)/_build/current/index.html\n" + # exit neatly + cd - > /dev/null + shift # past argument + # exit neatly + break + ;; + -h|--help) + print_help + exit 1 + ;; + *) # unknown option + echo "[Error] Invalid argument provided: $1" + print_help + exit 1 + ;; + esac +done diff --git a/test/data/usd_conversion_data/EXAMPLE.scene_instance.json b/test/data/usd_conversion_data/EXAMPLE.scene_instance.json new file mode 100644 index 0000000000..6280f0495f --- /dev/null +++ b/test/data/usd_conversion_data/EXAMPLE.scene_instance.json @@ -0,0 +1,7150 @@ + +{ + "_comment": "This document was originally 102343992.scene_instance.json in the hssd repo", + "stage_instance": { + "template_name": "stages/102343992" + }, + "translation_origin": "asset_local", + "object_instances": [ + { + "template_name": "1efdc3d37dfab1eb9f99117bb84c59003d684811", + "translation": [ + 7.869999885559082, + 1.200000514924497, + -9.038998947203183 + ], + "rotation": [ + 0.8660254049292261, + -1.7140893014617373e-08, + 0.4999999980171692, + 2.144662085814174e-08 + ], + "non_uniform_scale": [ + 0.9999999418353455, + 1.000248074501974, + 0.439367260520995 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1efdc3d37dfab1eb9f99117bb84c59003d684811", + "translation": [ + 8.145999908447266, + -4.354715485987981e-07, + 7.305999797224985 + ], + "rotation": [ + -4.371138874050119e-08, + -6.535889244928926e-16, + 0.9999999999999968, + 6.713240204275516e-08 + ], + "non_uniform_scale": [ + 1.6183986663818422, + 1.675353446560673, + 0.8347977596762485 + ], + "motion_type": "STATIC" + }, + { + "template_name": "356ce92bc38493578fdf63b7f3edfaea8001c849", + "translation": [ + 2.1589999198913574, + 4.4175203584018163e-07, + -7.411368881978433 + ], + "rotation": [ + 1.0, + -6.961006137011693e-11, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0177514553070068, + 1.0158729534300552, + 1.0877191915846753 + ], + "motion_type": "STATIC" + }, + { + "template_name": "27dd125228e0872193eb34907b03ef9caf98289f", + "translation": [ + 4.874000072479248, + 0.5699998878836645, + 1.190999947726727 + ], + "rotation": [ + -4.371139052004705e-08, + -5.189451379033344e-16, + 0.9999999999999971, + 6.353505723290555e-08 + ], + "non_uniform_scale": [ + 0.36587145924568315, + 0.6081244816631647, + 0.36587141563041015 + ], + "motion_type": "STATIC" + }, + { + "template_name": "27dd125228e0872193eb34907b03ef9caf98289f", + "translation": [ + 8.262999534606934, + -2.82585631339316e-07, + 4.740999892890443 + ], + "rotation": [ + -4.371138862421552e-08, + -3.531505908618891e-16, + 0.9999999999999972, + 6.110702092622337e-08 + ], + "non_uniform_scale": [ + 0.6402750611305261, + 0.8784020092008034, + 0.6402749848037965 + ], + "motion_type": "STATIC" + }, + { + "template_name": "b4197540cbbe2787185cd37ab9f1524b883cbdbe", + "translation": [ + 10.534000396728516, + 2.419999523435223, + 6.855429861817953 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 6.039234783699483e-08 + ], + "non_uniform_scale": [ + -1.3249999284744263, + 1.6666663090388276, + 1.3249997705221368 + ], + "motion_type": "STATIC" + }, + { + "template_name": "b4197540cbbe2787185cd37ab9f1524b883cbdbe", + "translation": [ + 10.54699993133545, + 2.4199997093081294, + 3.737000148475161 + ], + "rotation": [ + -0.7071067601131207, + -4.32005191647139e-09, + 0.707106802259972, + 4.758087952961973e-08 + ], + "non_uniform_scale": [ + -1.3249997302889984, + 1.6666663090388276, + 1.3249997302889998 + ], + "motion_type": "STATIC" + }, + { + "template_name": "b5cd29d5a8c63e815aa3ce9f8ff2e3539733574e", + "translation": [ + 16.20835304260254, + 1.3199997258192369, + 4.159989664555205 + ], + "rotation": [ + 1.0, + -1.7731669521877803e-09, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.3165112733840942, + 1.2943504697858623, + 0.9182735182912874 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f58947f958c50e143449786ec29f1fdbaf9a7570", + "translation": [ + 13.515999794006348, + 1.1999999631047222, + 0.21900005525350874 + ], + "rotation": [ + -4.3711388260298874e-08, + -4.342335181803143e-16, + 0.9999999999999971, + 6.208817497170097e-08 + ], + "non_uniform_scale": [ + 1.26666653156281, + 0.9999998807907167, + 0.6666666070620283 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f58947f958c50e143449786ec29f1fdbaf9a7570", + "translation": [ + 16.552000045776367, + 1.1999999631047222, + 0.21900005525350874 + ], + "rotation": [ + -4.3711388260298874e-08, + -4.342335181803143e-16, + 0.9999999999999971, + 6.208817497170097e-08 + ], + "non_uniform_scale": [ + 1.26666653156281, + 0.9999998807907167, + 0.6666666070620283 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f58947f958c50e143449786ec29f1fdbaf9a7570", + "translation": [ + 15.035999298095703, + 1.1999999631047222, + 0.21900005525350874 + ], + "rotation": [ + -4.3711388061281694e-08, + -4.3423350631796536e-16, + 0.9999999999999971, + 6.208817497170097e-08 + ], + "non_uniform_scale": [ + 1.299999952316289, + 0.9999998807907167, + 0.6666666070620283 + ], + "motion_type": "STATIC" + }, + { + "template_name": "fcbec27e89a114dc373e08baa90f20bb503ecf3e", + "translation": [ + 10.14900016784668, + 2.5998904354459995, + -2.011701785827128 + ], + "rotation": [ + -3.0908617299409977e-08, + -3.090862186551752e-08, + 0.7071068444928671, + -0.7071067178802208 + ], + "non_uniform_scale": [ + 1.1266900300979659, + 1.0006829499384213, + 1.095290172661516 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1bb66668829970ef66295bb7e8b946b6974b55ca", + "translation": [ + 11.129000663757324, + 0.37000078344345155, + -13.433999192476271 + ], + "rotation": [ + 1.0, + -2.037765549258766e-09, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 0.7500000596046448, + 1.4444442457623075, + 0.9999998807907194 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1bb66668829970ef66295bb7e8b946b6974b55ca", + "translation": [ + 7.199999809265137, + 0.5500003889203064, + -6.874999557435512 + ], + "rotation": [ + 0.9999999999999977, + -6.901709202409711e-08, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.2000000476837158, + 0.48888883127110455, + 3.1666661302248995 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1bb66668829970ef66295bb7e8b946b6974b55ca", + "translation": [ + 7.931000232696533, + 0.5500003770590176, + -6.676000164389574 + ], + "rotation": [ + 0.7071068022599463, + 1.815759681973011e-08, + -0.7071067601131267, + -1.7337679048460566e-07 + ], + "non_uniform_scale": [ + 1.0999998390674688, + 0.4888888312711135, + 3.5333323756854247 + ], + "motion_type": "STATIC" + }, + { + "template_name": "edd29c09710bf64c66065b6d884f573bc48682f5", + "translation": [ + 7.818999767303467, + 0.5000006384254334, + -11.211000698149121 + ], + "rotation": [ + 0.7071068022599744, + -1.0917528389400378e-08, + 0.7071067601131191, + 3.495513783468017e-08 + ], + "non_uniform_scale": [ + 1.2578089679593463, + 1.1132517918048064, + 0.7333331863085534 + ], + "motion_type": "STATIC" + }, + { + "template_name": "66f9623be165c339763d833a7666c34e94744f33", + "translation": [ + 11.569999694824219, + 3.0799993967413855, + 5.760999996602521 + ], + "rotation": [ + 0.9966633374757886, + -1.7949840917330613e-10, + -0.08162225022395736, + -5.1664283568703725e-09 + ], + "non_uniform_scale": [ + -1.433277699129368, + 1.1855860727326704, + 1.3324665456484044 + ], + "motion_type": "STATIC" + }, + { + "template_name": "66f9623be165c339763d833a7666c34e94744f33", + "translation": [ + 12.30199909210205, + 3.0799993944168023, + 5.800000028610214 + ], + "rotation": [ + 0.9999999999999991, + -2.0349744240280907e-10, + 4.371138720143821e-08, + 2.76679154909771e-15 + ], + "non_uniform_scale": [ + -1.4332777261734062, + 1.1855860727326704, + 1.3324665626923318 + ], + "motion_type": "STATIC" + }, + { + "template_name": "53dfe296a16ce12dd5579e0e2b87e3085c7627ac", + "translation": [ + 0.4339999854564667, + 1.1574029485927895e-06, + -19.417998110175176 + ], + "rotation": [ + 0.7071067601131131, + 1.6284009813703456e-08, + 0.7071068022599719, + 1.1379648964873415e-07 + ], + "non_uniform_scale": [ + -1.363636293194515, + 5.999999284744296, + 1.3636362931945594 + ], + "motion_type": "STATIC" + }, + { + "template_name": "53dfe296a16ce12dd5579e0e2b87e3085c7627ac", + "translation": [ + 6.110000133514404, + 1.1574029485927895e-06, + -19.417998110175176 + ], + "rotation": [ + 0.7071067601131131, + 1.6284009813703456e-08, + 0.7071068022599719, + 1.1379648964873415e-07 + ], + "non_uniform_scale": [ + -1.363636293194515, + 5.999999284744296, + 1.3636362931945594 + ], + "motion_type": "STATIC" + }, + { + "template_name": "53dfe296a16ce12dd5579e0e2b87e3085c7627ac", + "translation": [ + 6.7170000076293945, + -6.299615051830187e-07, + 10.56899961417912 + ], + "rotation": [ + 0.7071067601131119, + 1.6583348322472112e-08, + 0.7071068022599721, + 1.1997802865293216e-07 + ], + "non_uniform_scale": [ + -1.363636293194515, + 6.399999332428002, + 1.3636362931945658 + ], + "motion_type": "STATIC" + }, + { + "template_name": "e39154e6536b8ec6aaaf2815172021b5797b30e1", + "translation": [ + -0.6580000519752502, + 2.3121497375876743, + -13.883999812832485 + ], + "rotation": [ + -3.090861810684315e-08, + -3.0908619323927855e-08, + 0.7071068444068277, + -0.7071067179662602 + ], + "non_uniform_scale": [ + 1.0007698535919227, + 0.9999998211860855, + 0.9991808534644964 + ], + "motion_type": "STATIC" + }, + { + "template_name": "e39154e6536b8ec6aaaf2815172021b5797b30e1", + "translation": [ + 7.198999404907227, + 2.3121497375876743, + -13.883999812832485 + ], + "rotation": [ + -3.090861810684315e-08, + -3.0908619323927855e-08, + 0.7071068444068277, + -0.7071067179662602 + ], + "non_uniform_scale": [ + 1.0007698535919227, + 0.9999998211860855, + 0.9991808534644964 + ], + "motion_type": "STATIC" + }, + { + "template_name": "e39154e6536b8ec6aaaf2815172021b5797b30e1", + "translation": [ + 13.133000373840332, + 2.3121497375876743, + -13.883999812832485 + ], + "rotation": [ + -3.090861810684315e-08, + -3.0908619323927855e-08, + 0.7071068444068277, + -0.7071067179662602 + ], + "non_uniform_scale": [ + 1.0007698535919227, + 0.9999998211860855, + 0.9991808534644964 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d6624608fa15c1bfe4e424eba4c5dd455bc84050", + "translation": [ + 7.599935531616211, + 0.5800004293117205, + -8.062654933771167 + ], + "rotation": [ + 0.7071068022599741, + -1.0986404235783726e-09, + 0.707106760113119, + 4.1102647642979485e-08 + ], + "non_uniform_scale": [ + 1.0009889006025254, + 1.053542130763269, + 1.0013384222186554 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c68da241cb165e10f20957aecfe9a23a827001dc", + "translation": [ + 17.10700035095215, + 2.5099998865127553, + -0.7659997775554679 + ], + "rotation": [ + -0.7071067601131209, + -4.422817568138599e-09, + 0.7071068022599718, + 4.7744480500170925e-08 + ], + "non_uniform_scale": [ + -5.0444437834952005, + 1.1249998658895564, + 0.8888887829250832 + ], + "motion_type": "STATIC" + }, + { + "template_name": "ced51760e36e33d31c5a793d326597c322213c53", + "translation": [ + 10.254000663757324, + 0.570000762581838, + -13.483999368309963 + ], + "rotation": [ + 1.0, + -3.6339076646183155e-10, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.2903225421905518, + 1.1111109124289786, + 1.298701131498669 + ], + "motion_type": "STATIC" + }, + { + "template_name": "4c246a64de4bb9fcce09ff4523db1661f42d2d95", + "translation": [ + 13.145999908447266, + 0.5699995669126388, + 6.575999855637537 + ], + "rotation": [ + 0.7071068022599734, + 2.98110633404132e-09, + 0.7071067601131197, + 4.561915904057173e-08 + ], + "non_uniform_scale": [ + 1.1532123593561436, + 0.9890654100101633, + 1.1520356445291249 + ], + "motion_type": "STATIC" + }, + { + "template_name": "4c246a64de4bb9fcce09ff4523db1661f42d2d95", + "translation": [ + 16.586999893188477, + 0.5699999085664729, + 0.8440000251531572 + ], + "rotation": [ + 1.0, + -9.167849995401245e-11, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.153212547302246, + 0.989065410010163, + 1.0697474396529787 + ], + "motion_type": "STATIC" + }, + { + "template_name": "4c246a64de4bb9fcce09ff4523db1661f42d2d95", + "translation": [ + 7.260000228881836, + 0.5699997951984379, + 2.7459999217987026 + ], + "rotation": [ + -4.3711386817851204e-08, + 1.0626668661807595e-16, + 0.9999999999999973, + 5.969632682805839e-08 + ], + "non_uniform_scale": [ + 1.1696869134902999, + 0.989065410010163, + 1.0697474396529827 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 24.808000564575195, + -5.935430635872763e-07, + 9.957999589562405 + ], + "rotation": [ + -0.7071067601131145, + -1.5885134456112617e-08, + 0.7071068022599718, + 1.0666794790754681e-07 + ], + "non_uniform_scale": [ + -2.1938894871539185, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 21.558000564575195, + -1.1717677352862665e-06, + 19.65899922496078 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999956, + 9.399546752452894e-08 + ], + "non_uniform_scale": [ + -2.193889856338501, + 3.5832870503321512, + 0.8822075268975047 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 15.036999702453613, + -1.1717677352862665e-06, + 19.65899922496078 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999956, + 9.399546752452894e-08 + ], + "non_uniform_scale": [ + -2.193889856338501, + 3.5832870503321512, + 0.8822075268975047 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 8.585000038146973, + -1.1717677352862665e-06, + 19.65899922496078 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999956, + 9.399546752452894e-08 + ], + "non_uniform_scale": [ + -2.193889856338501, + 3.5832870503321512, + 0.8822075268975047 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 2.3010001182556152, + -1.1717677352862665e-06, + 19.65899922496078 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999956, + 9.399546752452894e-08 + ], + "non_uniform_scale": [ + -2.193889856338501, + 3.5832870503321512, + 0.8822075268975047 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 24.808000564575195, + -1.8805265256105486e-07, + 3.154999783337118 + ], + "rotation": [ + -0.7071067601131145, + -1.5885134456112617e-08, + 0.7071068022599718, + 1.0666794790754681e-07 + ], + "non_uniform_scale": [ + -2.1938894871539185, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 24.808000564575195, + 2.1696091323519795e-07, + -3.6399998879432616 + ], + "rotation": [ + -0.7071067601131145, + -1.5885134456112617e-08, + 0.7071068022599718, + 1.0666794790754681e-07 + ], + "non_uniform_scale": [ + -2.1938894871539185, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 24.808000564575195, + 6.102323482082284e-07, + -10.237999305844312 + ], + "rotation": [ + -0.7071067601131145, + -1.5885134456112617e-08, + 0.7071068022599718, + 1.0666794790754681e-07 + ], + "non_uniform_scale": [ + -2.1938894871539185, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 24.808000564575195, + 9.71674921856902e-07, + -16.301999074101445 + ], + "rotation": [ + -0.7071067601131145, + -1.5885134456112617e-08, + 0.7071068022599718, + 1.0666794790754681e-07 + ], + "non_uniform_scale": [ + -2.1938894871539185, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 22.158000946044922, + 1.159429530162015e-06, + -19.45199850487711 + ], + "rotation": [ + 0.9999999999999989, + -1.856558281065091e-08, + 4.371138749797679e-08, + 1.7517169937656433e-15 + ], + "non_uniform_scale": [ + -1.8177943229675362, + 3.5832870503321517, + 1.2350905853402039 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 24.808000564575195, + -9.651780601416249e-07, + 16.19299982827897 + ], + "rotation": [ + -0.7071067601131145, + -1.5885134456112617e-08, + 0.7071068022599718, + 1.0666794790754681e-07 + ], + "non_uniform_scale": [ + -2.1938894871539185, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + -3.184000015258789, + -7.083415880515531e-07, + 11.883999116182338 + ], + "rotation": [ + 0.7071067601131145, + 1.5885134456112617e-08, + 0.7071068022599718, + 1.0666794790754681e-07 + ], + "non_uniform_scale": [ + -2.1938894871539185, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + -3.184000015258789, + -9.78052639766247e-07, + 16.408999418675876 + ], + "rotation": [ + 0.7071067601131145, + 1.5885134456112617e-08, + 0.7071068022599718, + 1.0666794790754681e-07 + ], + "non_uniform_scale": [ + -2.1938894871539185, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 0.06599999964237213, + -1.1717677352862665e-06, + 19.65899922496078 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999956, + 9.399546752452894e-08 + ], + "non_uniform_scale": [ + -2.193889856338501, + 3.5832870503321512, + 0.8822075268975047 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + -3.309999942779541, + 9.385943258166662e-07, + -15.74699880200626 + ], + "rotation": [ + 0.7071067601131146, + 1.588513445611262e-08, + 0.7071068022599716, + 1.0666794790754683e-07 + ], + "non_uniform_scale": [ + -0.6895080989892424, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + -3.309999942779541, + 1.0462402997291065e-06, + -17.55299845021966 + ], + "rotation": [ + 0.7071067601131146, + 1.588513445611262e-08, + 0.7071068022599716, + 1.0666794790754683e-07 + ], + "non_uniform_scale": [ + -0.6895080989892424, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + -2.8610000610351562, + 1.1643171546893427e-06, + -19.53399923241136 + ], + "rotation": [ + 0.9999999999999984, + -3.4390819196424676e-08, + 4.371138872332456e-08, + 1.6234266843627799e-15 + ], + "non_uniform_scale": [ + -0.43877795338630843, + 3.5832870503321512, + 0.8822075268975083 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + -3.309999942779541, + 1.1136531838928931e-06, + -18.683998901605605 + ], + "rotation": [ + 0.7071067601131146, + 1.588513445611262e-08, + 0.7071068022599716, + 1.0666794790754683e-07 + ], + "non_uniform_scale": [ + -0.6895080989892424, + 3.5832870503321517, + 0.882207519876533 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 19.18199920654297, + 1.159429530162015e-06, + -19.45199850487711 + ], + "rotation": [ + 0.9999999999999989, + -1.856558281065091e-08, + 4.371138749797679e-08, + 1.7517169937656433e-15 + ], + "non_uniform_scale": [ + -1.8177943229675362, + 3.5832870503321517, + 1.2350905853402039 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20ba326864f55fdc086275e0249c32763a1260e8", + "translation": [ + 16.288999557495117, + 1.0789632369778701e-06, + -18.101998203873677 + ], + "rotation": [ + 0.7071067601131175, + 1.3809818215056635e-08, + 0.7071068022599719, + 8.221236988150038e-08 + ], + "non_uniform_scale": [ + -1.065603431129251, + 3.5832870503321517, + 1.2350905397480567 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d36ceee09705df0153d06a91b00dc59d9fb5d7b5", + "translation": [ + 4.916999816894531, + 5.047321565143648e-07, + -8.467999907255148 + ], + "rotation": [ + 0.9986295348588669, + -1.544498204942833e-10, + -0.05233595425291473, + -3.291483461074672e-09 + ], + "non_uniform_scale": [ + -1.1842504316766782, + 0.9809066676012608, + 1.0890873051498224 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9c4912480452a050bf49648066dec4b073ee71cf", + "translation": [ + 13.32800006866455, + 2.509999949574464, + -1.823999623417862 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 5.960773456539157e-08 + ], + "non_uniform_scale": [ + -0.9400376081466675, + 1.0002871751442868, + 1.0147867185131574 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9c4912480452a050bf49648066dec4b073ee71cf", + "translation": [ + 12.82300090789795, + 2.5099999206662176, + -1.3389997572302832 + ], + "rotation": [ + 0.707106760113121, + -3.0546607826304856e-10, + 0.7071068022599722, + 4.1845750782457686e-08 + ], + "non_uniform_scale": [ + -0.9000358641126237, + 1.0002871751442868, + 1.0147866597898805 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_1", + "translation": [ + 11.702478444456002, + 0.7708642959766735, + -4.165448664817421 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_1", + "translation": [ + 11.854753476765227, + 0.7708642906897842, + -4.450936326495225 + ], + "rotation": [ + 0.9999999992772152, + 2.032370439422264e-06, + 2.8722872460421773e-05, + 2.4828125576240453e-05 + ], + "non_uniform_scale": [ + 0.9049900017005614, + 1.1000110979588114, + 0.9049899472555942 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_1", + "translation": [ + 11.760550674787153, + 0.7708642979991865, + -4.7604768703706775 + ], + "rotation": [ + 0.923877987960785, + -5.376892816721451e-06, + 0.38268716112742307, + -6.391742983766297e-06 + ], + "non_uniform_scale": [ + 0.9049899472984589, + 1.100011098335771, + 0.9049900011995042 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_1", + "translation": [ + 11.475063099342485, + 0.7708643139167912, + -4.912747355637762 + ], + "rotation": [ + 0.7070725673715036, + -9.152057442063448e-06, + 0.7071409932334496, + -8.701766793137615e-06 + ], + "non_uniform_scale": [ + 0.904989947379451, + 1.1000110982777676, + 0.9049900011890144 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_1", + "translation": [ + 11.165524024353838, + 0.7708643290443727, + -4.818548351832818 + ], + "rotation": [ + 0.382673086669235, + -2.0223767979061556e-05, + 0.9238838175263592, + -6.554419248948939e-06 + ], + "non_uniform_scale": [ + 0.9049900015663201, + 1.1000110980755435, + 0.9049899472479481 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_1", + "translation": [ + 11.013256548988867, + 0.7708643345695584, + -4.533066151748306 + ], + "rotation": [ + -1.475812714148927e-05, + -2.7906737475565865e-05, + 0.9999999993759612, + 1.5858418536197947e-05 + ], + "non_uniform_scale": [ + 0.9049900018371576, + 1.1000110976789168, + 0.9049899474592086 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_1", + "translation": [ + 11.107449445841814, + 0.7708643269599306, + -4.223522705975741 + ], + "rotation": [ + -0.38268716112712275, + -6.356577832918443e-06, + 0.92387798796094, + 5.413194755829551e-06 + ], + "non_uniform_scale": [ + 0.9049899472976805, + 1.1000110983364113, + 0.9049900011995043 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_1", + "translation": [ + 11.392936689029776, + 0.7708643110762579, + -4.071252591107879 + ], + "rotation": [ + 0.7071409932328311, + 8.683171865211803e-06, + -0.707072567371956, + -9.182500409793314e-06 + ], + "non_uniform_scale": [ + 0.9049899473785762, + 1.1000110982786062, + 0.9049900011888699 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_10", + "translation": [ + 11.761180080060736, + 0.7708643590082881, + -4.221934413832555 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_10", + "translation": [ + 11.704065464029531, + 0.7708643669363687, + -4.819179795265939 + ], + "rotation": [ + 0.923879468870373, + 1.815087699564889e-08, + 0.38268358600781, + -1.7582635507793935e-08 + ], + "non_uniform_scale": [ + 0.9049899472491386, + 1.1000110983835258, + 0.9049900011907794 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_10", + "translation": [ + 11.1068198885943, + 0.7708643970544895, + -4.762065102916263 + ], + "rotation": [ + 0.3826834753916517, + 2.0787744913877348e-08, + 0.9238795146890999, + -1.4537352627232667e-09 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_10", + "translation": [ + 11.163934666433047, + 0.7708643891264011, + -4.164819790318104 + ], + "rotation": [ + -0.38268358600781, + 1.7582635512838472e-08, + 0.923879468870373, + 1.8150877005161864e-08 + ], + "non_uniform_scale": [ + 0.9049899472491386, + 1.1000110983835258, + 0.9049900011907794 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_10", + "translation": [ + 11.474386206298322, + 0.7708643724253861, + -4.069683673657861 + ], + "rotation": [ + 0.7071070048458659, + -9.298195620076728e-09, + -0.7071065575271581, + -1.5220474278087195e-08 + ], + "non_uniform_scale": [ + 0.904989947249195, + 1.1000110983835256, + 0.9049900011907228 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_10", + "translation": [ + 11.856316216665864, + 0.770864356734669, + -4.532385866945424 + ], + "rotation": [ + 0.9999999999999497, + 8.326351669412136e-09, + 3.163020912614164e-07, + -2.1475983465982998e-08 + ], + "non_uniform_scale": [ + 0.9049900011907228, + 1.1000110983835256, + 0.904989947249195 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_10", + "translation": [ + 11.393613543931474, + 0.7708643836374057, + -4.9143162349453045 + ], + "rotation": [ + 0.7071060603301788, + 1.5220489043981084e-08, + 0.7071075020421811, + -9.298184911256879e-09 + ], + "non_uniform_scale": [ + 0.904989947249271, + 1.1000110983835256, + 0.9049900011906469 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_10", + "translation": [ + 11.011683867310575, + 0.7708643993281035, + -4.451613765124766 + ], + "rotation": [ + -3.163020912614164e-07, + 2.1475983467225575e-08, + 0.9999999999999497, + 8.326351676459154e-09 + ], + "non_uniform_scale": [ + 0.9049900011907228, + 1.1000110983835256, + 0.904989947249195 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_26", + "translation": [ + 11.431307315840534, + 0.7712021024117494, + -3.8898983273612933 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_26", + "translation": [ + 11.857909293044719, + 0.7712020820343101, + -4.064408674056539 + ], + "rotation": [ + 0.9999999999999428, + -1.3250749896893047e-09, + 3.368881286370236e-07, + -2.9444879353735978e-08 + ], + "non_uniform_scale": [ + 0.9049900011907211, + 1.100011098383525, + 0.9049899472491979 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_26", + "translation": [ + 12.036101642681922, + 0.771202076413342, + -4.489307054566199 + ], + "rotation": [ + 0.9238796516646284, + 4.486715200413767e-08, + 0.382683144703347, + -6.99985333120712e-09 + ], + "non_uniform_scale": [ + 0.9049899472491892, + 1.1000110983835258, + 0.9049900011907285 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_26", + "translation": [ + 11.86159122203096, + 0.7712020889649353, + -4.9159089780708705 + ], + "rotation": [ + 0.7071067285188761, + 1.274690688609694e-08, + 0.7071068338542149, + -8.571956373181825e-09 + ], + "non_uniform_scale": [ + 0.9049899472491691, + 1.1000110983835256, + 0.9049900011907488 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_26", + "translation": [ + 11.43669226315512, + 0.7712021122573159, + -5.094101734955731 + ], + "rotation": [ + 0.38268247958611645, + -3.6742822480227233e-09, + 0.9238799271646838, + 1.414139634188489e-08 + ], + "non_uniform_scale": [ + 0.9049900011908733, + 1.100011098383526, + 0.9049899472490446 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_26", + "translation": [ + 11.010090628790488, + 0.7712021326224994, + -4.9195907958197145 + ], + "rotation": [ + -3.3688812814631206e-07, + 1.7322754709665733e-08, + 0.999999999999943, + 1.3356482377323904e-08 + ], + "non_uniform_scale": [ + 0.9049900011907204, + 1.1000110983835258, + 0.9049899472491971 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_26", + "translation": [ + 10.83189852682163, + 0.7712021381844085, + -4.494692568377998 + ], + "rotation": [ + -0.3826833893385265, + 1.7582638814454313e-08, + 0.9238795503334714, + 1.8150871910029137e-08 + ], + "non_uniform_scale": [ + 0.9049899472491613, + 1.1000110983835256, + 0.9049900011907566 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_26", + "translation": [ + 11.006408928549078, + 0.7712021256804454, + -4.0680905871544475 + ], + "rotation": [ + 0.7071069485316094, + -1.1388947130615955e-08, + -0.7071066138414456, + -2.2341504707801218e-08 + ], + "non_uniform_scale": [ + 0.9049899472491862, + 1.1000110983835254, + 0.9049900011907314 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_18", + "translation": [ + 11.431610574474663, + 0.7762363734075753, + -3.889927290408935 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_18", + "translation": [ + 11.858040228523063, + 0.7762363530246957, + -4.064580500366617 + ], + "rotation": [ + 0.9999999999960542, + -6.807744930077943e-07, + 2.715889752218249e-06, + 2.2850040586162484e-07 + ], + "non_uniform_scale": [ + 0.9049900011905072, + 1.1000110983831453, + 0.9049899472498739 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_18", + "translation": [ + 12.036072686807593, + 0.7762363474639709, + -4.489610309233443 + ], + "rotation": [ + 0.9238791842617899, + -2.953907735591151e-07, + 0.38268427311248643, + 2.243812920311381e-07 + ], + "non_uniform_scale": [ + 0.9049899472490662, + 1.1000110983834246, + 0.904990001190975 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_18", + "translation": [ + 11.861419385541366, + 0.7762363599828226, + -4.916039909224392 + ], + "rotation": [ + 0.7071068283662852, + -2.476043813750278e-07, + 0.7071067340067604, + 6.494472525075056e-08 + ], + "non_uniform_scale": [ + 0.9049899472491639, + 1.1000110983834777, + 0.9049900011908127 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_18", + "translation": [ + 11.436389017246157, + 0.7762363832479239, + -5.094072783417984 + ], + "rotation": [ + 0.3826825642933671, + -4.899924800711571e-08, + 0.9238798920778588, + 2.3366238762032375e-07 + ], + "non_uniform_scale": [ + 0.9049900011908631, + 1.1000110983834952, + 0.9049899472490924 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_18", + "translation": [ + 11.006580764215453, + 0.7762363966726454, + -4.067959656099127 + ], + "rotation": [ + -0.7071067294043609, + 1.1165369379735453e-07, + 0.7071068329686256, + 3.6869110659082437e-07 + ], + "non_uniform_scale": [ + 0.9049899472491585, + 1.1000110983834352, + 0.9049900011908698 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_18", + "translation": [ + 10.831927477267454, + 0.7762364091915105, + -4.494389322568893 + ], + "rotation": [ + -0.3826843004364376, + 9.880569238251738e-08, + 0.9238791729438446, + 2.495652889436086e-07 + ], + "non_uniform_scale": [ + 0.9049899472490552, + 1.1000110983834848, + 0.9049900011909124 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_18", + "translation": [ + 11.009959698942739, + 0.7762364036308113, + -4.919418959340262 + ], + "rotation": [ + 6.32653071003679e-08, + -1.262701593274212e-07, + 0.9999999999999452, + 2.9970494982092614e-07 + ], + "non_uniform_scale": [ + 0.9049900011907765, + 1.1000110983834657, + 0.9049899472492142 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_34", + "translation": [ + 11.27465975253298, + 0.7752163389062542, + -3.8854978621959706 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_34", + "translation": [ + 11.75113246290555, + 0.7752161365339878, + -3.949528555370161 + ], + "rotation": [ + 0.999999999967891, + 5.793837273520698e-06, + -1.397837039975872e-06, + 5.356813939142367e-06 + ], + "non_uniform_scale": [ + 0.9049900012147832, + 1.1000110983411404, + 0.9049899472766539 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_34", + "translation": [ + 12.040502117802452, + 0.775216303417816, + -4.3326594996675345 + ], + "rotation": [ + 0.9238795503334714, + 1.8150871906556897e-08, + 0.3826833893385266, + -1.758263881773125e-08 + ], + "non_uniform_scale": [ + 0.9049899472491612, + 1.1000110983835256, + 0.9049900011907563 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_34", + "translation": [ + 11.976471244585262, + 0.7752160431042756, + -4.809132042881481 + ], + "rotation": [ + 0.707112466403413, + 1.192030313018789e-05, + 0.7071010958199155, + 2.2501849375982818e-06 + ], + "non_uniform_scale": [ + 0.9049899473064712, + 1.100011098286793, + 0.904990001251024 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_34", + "translation": [ + 11.59333996872842, + 0.775215832702855, + -5.098501979345274 + ], + "rotation": [ + 0.3827007013672913, + 1.9681320736592328e-05, + 0.9238723789988807, + -1.0420041472603206e-05 + ], + "non_uniform_scale": [ + 0.9049900013872837, + 1.100011098046109, + 0.9049899474627613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_34", + "translation": [ + 11.116867496950537, + 0.7752160890284706, + -5.03447089051413 + ], + "rotation": [ + 8.040161788889199e-06, + 8.404946922496568e-06, + 0.9999999998969128, + -8.419445777852477e-06 + ], + "non_uniform_scale": [ + 0.9049900012504014, + 1.1000110982863005, + 0.9049899473076934 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_34", + "translation": [ + 10.827498086315796, + 0.7752158779157706, + -4.651340057872433 + ], + "rotation": [ + -0.3826835149451281, + 7.751139703948726e-06, + 0.9238794980515573, + -2.0227808347391873e-05 + ], + "non_uniform_scale": [ + 0.9049899474025855, + 1.1000110980634694, + 0.9049900014263603 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_34", + "translation": [ + 10.891528805843192, + 0.7752162179578502, + -4.174867438555047 + ], + "rotation": [ + -0.7071051613428223, + -3.307737007797535e-07, + 0.7071084009973613, + -6.417694088814286e-06 + ], + "non_uniform_scale": [ + 0.9049899472579308, + 1.1000110983561004, + 0.9049900012153229 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_42", + "translation": [ + 11.113417364240295, + 0.771426616501775, + -3.9622098249511217 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_42", + "translation": [ + 11.576404457932883, + 0.7714265921669134, + -3.8886183541452475 + ], + "rotation": [ + 0.9999999999997451, + 8.32632529038973e-09, + -7.136765122020258e-07, + -2.147598777981226e-08 + ], + "non_uniform_scale": [ + 0.9049900011908342, + 1.1000110983835256, + 0.9049899472490842 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_42", + "translation": [ + 11.963790050278563, + 0.7714265746899565, + -4.171417092653669 + ], + "rotation": [ + 0.9238793892872237, + 1.8150881974373677e-08, + 0.38268377813838145, + -1.7582632281362026e-08 + ], + "non_uniform_scale": [ + 0.9049899472491162, + 1.1000110983835256, + 0.9049900011908022 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_42", + "translation": [ + 12.037381550431153, + 0.7714265747975937, + -4.634404206565183 + ], + "rotation": [ + 0.7071072858318688, + 2.6926374336933552e-08, + 0.7071062765408656, + -9.298219739667012e-09 + ], + "non_uniform_scale": [ + 0.9049899472490842, + 1.1000110983835256, + 0.9049900011908342 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_42", + "translation": [ + 11.75458278628006, + 0.771426592529667, + -5.021789740231103 + ], + "rotation": [ + 0.3826830865917441, + 2.0787748191722132e-08, + 0.92387967573522, + -1.453725410212011e-09 + ], + "non_uniform_scale": [ + 0.9049900011908022, + 1.1000110983835256, + 0.9049899472491162 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_42", + "translation": [ + 11.291595091952983, + 0.7714266168645629, + -5.095381620821316 + ], + "rotation": [ + 1.1361120954842148e-07, + 2.14759852669421e-08, + 0.9999999999999933, + 8.32634066085505e-09 + ], + "non_uniform_scale": [ + 0.9049900011907692, + 1.1000110983835256, + 0.9049899472491487 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_42", + "translation": [ + 10.904209900238184, + 0.7714266343414946, + -4.812582329604897 + ], + "rotation": [ + -0.38268377813838145, + 1.7582632281362026e-08, + 0.9238793892872237, + 1.8150881974373677e-08 + ], + "non_uniform_scale": [ + 0.9049899472491162, + 1.1000110983835256, + 0.9049900011908022 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_42", + "translation": [ + 10.830618648369633, + 0.7714266342338465, + -4.349595425342048 + ], + "rotation": [ + -0.7071067008512857, + 9.29820358208214e-09, + 0.7071068615217996, + 2.6926386940780883e-08 + ], + "non_uniform_scale": [ + 0.9049899472491487, + 1.1000110983835256, + 0.9049900011907692 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_50", + "translation": [ + 10.824202223659048, + 0.7713087470263508, + -4.316120570301113 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_50", + "translation": [ + 11.126500955894555, + 0.7713087413427577, + -3.9357696709000733 + ], + "rotation": [ + 0.9999999999939716, + 2.2343687746161218e-06, + -2.558200843853536e-06, + 7.211602158963421e-07 + ], + "non_uniform_scale": [ + 0.9049900011914653, + 1.1000110983798435, + 0.9049899472529285 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_50", + "translation": [ + 11.609879325020914, + 0.771308703142439, + -3.882202014007376 + ], + "rotation": [ + 0.9238795503334714, + 1.8150871911492184e-08, + 0.3826833893385266, + -1.758263883341876e-08 + ], + "non_uniform_scale": [ + 0.9049899472491613, + 1.1000110983835258, + 0.9049900011907566 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_50", + "translation": [ + 11.990230228393253, + 0.7713087016943774, + -4.184500666310619 + ], + "rotation": [ + 0.707108378507588, + 2.8205551073020698e-06, + 0.7071051838558502, + -7.734497939011417e-07 + ], + "non_uniform_scale": [ + 0.904989947249583, + 1.1000110983779374, + 0.9049900011971282 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_50", + "translation": [ + 12.04379791502851, + 0.7713086671243379, + -4.667879070385595 + ], + "rotation": [ + 0.3826844376022832, + 1.6370074386740928e-06, + 0.9238791161261092, + 6.195900492450604e-07 + ], + "non_uniform_scale": [ + 0.9049900011931158, + 1.1000110983814908, + 0.9049899472492764 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_50", + "translation": [ + 11.741499205498354, + 0.771308721670729, + -5.048229922324512 + ], + "rotation": [ + 2.258956701623811e-06, + 9.376979327163137e-07, + 0.999999999993407, + -2.683970587568833e-06 + ], + "non_uniform_scale": [ + 0.904990001191732, + 1.1000110983778835, + 0.9049899472550448 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_50", + "translation": [ + 11.258120204097878, + 0.771308748440899, + -5.10179785602007 + ], + "rotation": [ + -0.38267795591565723, + 6.36402075840012e-07, + 0.923881800900688, + -4.506738695059129e-06 + ], + "non_uniform_scale": [ + 0.904989947253144, + 1.1000110983692561, + 0.904990001204118 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_50", + "translation": [ + 10.877769751490705, + 0.7713087770909602, + -4.799498775113114 + ], + "rotation": [ + -0.7071047919077845, + -1.6462619568552825e-06, + 0.7071087704514885, + -2.98711839951368e-06 + ], + "non_uniform_scale": [ + 0.9049899472489501, + 1.1000110983758105, + 0.904990001200346 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_59", + "translation": [ + 11.434000034038105, + 0.013387418180340895, + -4.491999759567284 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_60", + "translation": [ + 10.401605570593336, + -1.1014858049364956e-06, + -4.491999891600983 + ], + "rotation": [ + 0.9238795146890999, + -1.4537352627232667e-09, + -0.3826834753916517, + -2.0787744913877348e-08 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_60", + "translation": [ + 10.696284595656877, + -1.1104033873736742e-06, + -5.229714763858242 + ], + "rotation": [ + -0.7071066721350625, + 9.29820467558605e-09, + 0.7071068902380152, + 2.692638608778515e-08 + ], + "non_uniform_scale": [ + 0.9049899472491443, + 1.1000110983835256, + 0.9049900011907737 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_60", + "translation": [ + 11.433999264764136, + -1.1457279487206004e-06, + -5.524394914482984 + ], + "rotation": [ + -0.382683049774526, + 1.7582644522266653e-08, + 0.923879690985394, + 1.8150863118141675e-08 + ], + "non_uniform_scale": [ + 0.9049899472492011, + 1.1000110983835256, + 0.904990001190717 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_60", + "translation": [ + 12.171715233936014, + -1.185988673577692e-06, + -5.22971491498278 + ], + "rotation": [ + 4.141130055128866e-07, + 2.1475986525343137e-08, + 0.999999999999914, + 8.326332963605413e-09 + ], + "non_uniform_scale": [ + 0.9049900011908015, + 1.1000110983835256, + 0.9049899472491164 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_60", + "translation": [ + 12.46639445992414, + -1.2072635076245089e-06, + -4.491999759833362 + ], + "rotation": [ + 0.3826834753916517, + 2.0787744913877348e-08, + 0.9238795146890999, + -1.4537352627232667e-09 + ], + "non_uniform_scale": [ + 0.9049900011907566, + 1.1000110983835256, + 0.9049899472491613 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_60", + "translation": [ + 12.171715230609319, + -1.1983459165940828e-06, + -3.7542846642536003 + ], + "rotation": [ + 0.7071070740086013, + 2.6926380629003405e-08, + 0.707106488364372, + -9.298211673508416e-09 + ], + "non_uniform_scale": [ + 0.9049899472491164, + 1.1000110983835256, + 0.9049900011908015 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_60", + "translation": [ + 11.433999985361657, + -1.1630213178716694e-06, + -3.45960545212282 + ], + "rotation": [ + 0.9238798316373986, + 1.8150854327332565e-08, + 0.38268271020997446, + -1.7582650228991278e-08 + ], + "non_uniform_scale": [ + 0.9049899472492406, + 1.1000110983835256, + 0.9049900011906772 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a7ec91a375ee6c5a6fd9e94a9c4a5507dab76762_part_60", + "translation": [ + 10.696284886405323, + -1.1227606441775043e-06, + -3.7542846656989664 + ], + "rotation": [ + 0.9999999999999879, + 8.32633962060789e-09, + -1.5422261691250746e-07, + -2.1475985437009254e-08 + ], + "non_uniform_scale": [ + 0.9049900011907737, + 1.1000110983835256, + 0.9049899472491443 + ], + "motion_type": "STATIC" + }, + { + "template_name": "ccc3a05acbdd0ca79a82f36a71cd775f2781eb62", + "translation": [ + 14.756999969482422, + 2.499999949872496, + -1.658999791204927 + ], + "rotation": [ + 0.9999999999999991, + -7.32115207083523e-10, + 4.3711388120698884e-08, + 2.3468841552436926e-15 + ], + "non_uniform_scale": [ + -1.8460664749145579, + 1.0801547670179799, + 0.8658007543324506 + ], + "motion_type": "STATIC" + }, + { + "template_name": "ccc3a05acbdd0ca79a82f36a71cd775f2781eb62", + "translation": [ + 11.378000259399414, + 3.0799996412992527, + 1.6580000771284062 + ], + "rotation": [ + 0.7071067601131203, + 9.167294415366704e-09, + 0.7071068022599715, + 5.8372634808432794e-08 + ], + "non_uniform_scale": [ + -3.550127533070592, + 1.3408817838571216, + 0.757575645591283 + ], + "motion_type": "STATIC" + }, + { + "template_name": "ccc3a05acbdd0ca79a82f36a71cd775f2781eb62", + "translation": [ + 11.378000259399414, + 3.0799994989633603, + 4.045999946236606 + ], + "rotation": [ + 0.7071067601131203, + 9.167294415366704e-09, + 0.7071068022599715, + 5.8372634808432794e-08 + ], + "non_uniform_scale": [ + -3.550127533070592, + 1.3408817838571216, + 0.757575645591283 + ], + "motion_type": "STATIC" + }, + { + "template_name": "ccc3a05acbdd0ca79a82f36a71cd775f2781eb62", + "translation": [ + 14.756999969482422, + 2.499999840915203, + 0.1690001387000084 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 6.033676353518795e-08 + ], + "non_uniform_scale": [ + -1.8460664749145508, + 1.0801547670179799, + 0.8658007543324472 + ], + "motion_type": "STATIC" + }, + { + "template_name": "ccc3a05acbdd0ca79a82f36a71cd775f2781eb62", + "translation": [ + 11.897000312805176, + 3.0799997857809096, + -0.7659997435808243 + ], + "rotation": [ + 0.9999999999999991, + -4.219519223754996e-12, + 4.37113894942862e-08, + 2.627508510416066e-15 + ], + "non_uniform_scale": [ + -2.1016757488250812, + 1.3408817838571234, + 1.3636362119154632 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3b558ce715c88cca63b307f8e0e9b665ca57ef43", + "translation": [ + 16.156999588012695, + 2.5099999396800996, + -1.657999743938447 + ], + "rotation": [ + 0.9999999999999991, + -8.349485449035737e-15, + 4.3711388417101666e-08, + 2.6063774341393603e-15 + ], + "non_uniform_scale": [ + -1.1902306079864549, + 0.9998998642087074, + 1.0006486176671212 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3b558ce715c88cca63b307f8e0e9b665ca57ef43", + "translation": [ + 16.156999588012695, + 2.509999830842019, + 0.16800013732910113 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 5.960465667758986e-08 + ], + "non_uniform_scale": [ + 1.1902306079864502, + 0.9998998642087074, + 1.0006486176671174 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f7109eaad4235fd4db456ca184f9f458a3611421", + "translation": [ + -2.928999900817871, + 6.189346208884672e-07, + -10.383999205589305 + ], + "rotation": [ + 0.7071068022599735, + -3.929735814455638e-09, + 0.7071067601131199, + 3.8834748668842635e-08 + ], + "non_uniform_scale": [ + 0.8766232802496385, + 1.0007926224717274, + 0.8434984777272662 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20efcf0a59e674a60cb79c379bee312cc6575d21", + "translation": [ + 14.5389986038208, + 0.5700006722212088, + -11.967999664664244 + ], + "rotation": [ + -4.3711386868732936e-08, + 2.6408520435206174e-16, + 0.9999999999999972, + 6.01138071766943e-08 + ], + "non_uniform_scale": [ + 1.001557946205143, + 0.8367421225616734, + 1.006367444233003 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20efcf0a59e674a60cb79c379bee312cc6575d21", + "translation": [ + -3.001000165939331, + 0.5700002312660324, + -4.569999865293493 + ], + "rotation": [ + 0.7071068022599735, + 3.5519682210484275e-09, + 0.7071067601131193, + 4.6418877109822465e-08 + ], + "non_uniform_scale": [ + 1.0015577672983547, + 0.8367421225616732, + 1.0063673850078942 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20efcf0a59e674a60cb79c379bee312cc6575d21", + "translation": [ + 15.67699909210205, + -4.239082329604571e-07, + 7.111999564647675 + ], + "rotation": [ + 1.0, + -5.09158848589935e-10, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0015579462051392, + 0.8367421225616734, + 1.006367444232999 + ], + "motion_type": "STATIC" + }, + { + "template_name": "20efcf0a59e674a60cb79c379bee312cc6575d21", + "translation": [ + 8.536999702453613, + 0.5699999729990965, + -0.23699995535612128 + ], + "rotation": [ + 0.42512684387075755, + -2.568430636680354e-09, + 0.9051337838245161, + 5.330635321647955e-08 + ], + "non_uniform_scale": [ + 1.0015578808067522, + 0.8367421225616732, + 1.0063674632959905 + ], + "motion_type": "STATIC" + }, + { + "template_name": "03c328fccef4975310314838e42b6dff06709b06", + "translation": [ + 16.386999130249023, + 0.5699997123479754, + 4.135999943852415 + ], + "rotation": [ + 0.9999999999999991, + -1.2563792875110788e-09, + 4.371138866502507e-08, + 2.2780901410595403e-15 + ], + "non_uniform_scale": [ + -0.9729729890823401, + 1.3355702953850765, + 0.9999998807907228 + ], + "motion_type": "STATIC" + }, + { + "template_name": "03c328fccef4975310314838e42b6dff06709b06", + "translation": [ + 9.211000442504883, + 0.5699999282956121, + 0.5130000148415554 + ], + "rotation": [ + 0.9999999999999991, + -1.2563792875110788e-09, + 4.371138781302674e-08, + 2.2780900902764787e-15 + ], + "non_uniform_scale": [ + -0.8648648858070406, + 1.3355702953850765, + 0.9999998807907228 + ], + "motion_type": "STATIC" + }, + { + "template_name": "03c328fccef4975310314838e42b6dff06709b06", + "translation": [ + 14.625, + 0.5699997757077249, + 3.0729998050332092 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 6.08610276156155e-08 + ], + "non_uniform_scale": [ + -0.8648648858070374, + 1.3355702953850765, + 0.999999880790719 + ], + "motion_type": "STATIC" + }, + { + "template_name": "31609de54bc7b3cceb58cff41b88b69d7f7db9ec", + "translation": [ + 9.288999557495117, + 1.470000640451886, + -11.73499886959793 + ], + "rotation": [ + 1.0, + -1.0706779713342195e-09, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0, + 0.9999998807907168, + 0.7654769104150596 + ], + "motion_type": "STATIC" + }, + { + "template_name": "31609de54bc7b3cceb58cff41b88b69d7f7db9ec", + "translation": [ + 8.689000129699707, + 1.470000640451886, + -11.73499886959793 + ], + "rotation": [ + 1.0, + -1.0706779713342195e-09, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0, + 0.9999998807907168, + 0.7654769104150596 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2dbcfd4e031f9c39eb2690a15ee989b12ee4ea36", + "translation": [ + 4.251999855041504, + 0.5699998481869706, + 1.856999916613102 + ], + "rotation": [ + -0.6691305764609728, + 1.782193730010128e-15, + 0.7431448523975689, + 4.4294885755564176e-08 + ], + "non_uniform_scale": [ + 0.9999999701611482, + 0.9999998807907177, + 0.9999999688586417 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2dbcfd4e031f9c39eb2690a15ee989b12ee4ea36", + "translation": [ + 4.196000099182129, + 0.5699999238848683, + 0.587000011384486 + ], + "rotation": [ + 0.760405971145649, + 3.7658489730156914e-16, + -0.649448041837098, + -3.871012258200061e-08 + ], + "non_uniform_scale": [ + 0.9999999064888001, + 0.9999998807907176, + 0.9999999035715409 + ], + "motion_type": "STATIC" + }, + { + "template_name": "7105e78f9396def9255f6144ed2208657fba53ee", + "translation": [ + 19.099000930786133, + 0.5599990779342896, + 14.94969472946551 + ], + "rotation": [ + 0.7071068022599722, + 5.527454951668573e-09, + -0.7071067601131206, + -4.96396224913139e-08 + ], + "non_uniform_scale": [ + 0.7013714491503567, + 0.7377048447483922, + 0.9999998807907168 + ], + "motion_type": "STATIC" + }, + { + "template_name": "7105e78f9396def9255f6144ed2208657fba53ee", + "translation": [ + 5.354000091552734, + 0.5599990925012115, + 14.7053023490129 + ], + "rotation": [ + 0.7071068022599722, + 5.527454951668573e-09, + 0.7071067601131206, + 4.96396224913139e-08 + ], + "non_uniform_scale": [ + 0.7013714491503567, + 0.7377048447483922, + 0.9999998807907168 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d54c345c38c55edfc062126cb032b8a4c9d55d83", + "translation": [ + 22.52483367919922, + 0.5799989124035356, + 17.386839818546722 + ], + "rotation": [ + -0.38268345183214886, + -2.9487397020808905e-13, + 0.923879524447765, + 5.506763590564559e-08 + ], + "non_uniform_scale": [ + 1.0001769276950299, + 1.00007963179592, + 1.000053714999508 + ], + "motion_type": "STATIC" + }, + { + "template_name": "796933d96e20ed5dac6491d424084900fd72d301", + "translation": [ + 16.976591110229492, + 9.561133396118748e-08, + -1.604091906303644 + ], + "rotation": [ + 1.0, + -8.193568471325638e-10, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0862900018692017, + 1.0722346219736707, + 0.8485618414209026 + ], + "motion_type": "STATIC" + }, + { + "template_name": "76e9175f4567ec5f57925c1300e3f1d99db65430", + "translation": [ + 11.925689697265625, + 3.5499998170834814, + -1.281169722606542 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 5.960496220263546e-08 + ], + "non_uniform_scale": [ + -1.1341910362243652, + 0.995420873710998, + 0.9999998807907176 + ], + "motion_type": "STATIC" + }, + { + "template_name": "6f8a01edea21152ccfbfa112893148df4c3a29bc", + "translation": [ + -2.508004903793335, + 7.293820658560435e-07, + -12.236999736011 + ], + "rotation": [ + 0.7071068022599734, + -4.646447672895939e-12, + 0.7071067601131198, + 4.214220434328061e-08 + ], + "non_uniform_scale": [ + 0.9999999403953588, + 1.000170826891555, + 0.9999503493338615 + ], + "motion_type": "STATIC" + }, + { + "template_name": "12e352286e7867ced3d610cf5af9183dcb4ea6c9", + "translation": [ + 14.420000076293945, + 3.0000000236630484, + -3.3969996930956796 + ], + "rotation": [ + -4.371138759698701e-08, + 1.3092108339300705e-18, + 0.9999999999999973, + 5.960466335989035e-08 + ], + "non_uniform_scale": [ + 1.000704765319828, + 0.9997000694632376, + 1.000704646026531 + ], + "motion_type": "STATIC" + }, + { + "template_name": "12e352286e7867ced3d610cf5af9183dcb4ea6c9", + "translation": [ + 14.79800033569336, + 3.0000001363754336, + -5.287999612808221 + ], + "rotation": [ + -4.371138759698701e-08, + 1.3092108339300705e-18, + 0.9999999999999973, + 5.960466335989035e-08 + ], + "non_uniform_scale": [ + 1.000704765319828, + 0.9997000694632376, + 1.000704646026531 + ], + "motion_type": "STATIC" + }, + { + "template_name": "12e352286e7867ced3d610cf5af9183dcb4ea6c9", + "translation": [ + 16.01300048828125, + 3.0000001363754336, + -5.287999612808221 + ], + "rotation": [ + -4.371138759698701e-08, + 1.3092108339300705e-18, + 0.9999999999999973, + 5.960466335989035e-08 + ], + "non_uniform_scale": [ + 1.000704765319828, + 0.9997000694632376, + 1.000704646026531 + ], + "motion_type": "STATIC" + }, + { + "template_name": "451250ecf29343c92f5f707565ebfd8315c1b15c_part_1", + "translation": [ + 12.579891214429908, + 0.5722742644367411, + 10.503823439659739 + ], + "rotation": [ + 0.9999999999999991, + -3.483213148630508e-15, + 4.3711387773713e-08, + 2.606031880437006e-15 + ], + "non_uniform_scale": [ + -1.0000000000000038, + 0.9995763302354348, + 1.000059723846942 + ], + "motion_type": "STATIC" + }, + { + "template_name": "451250ecf29343c92f5f707565ebfd8315c1b15c_part_1", + "translation": [ + 14.254162957831642, + 0.5722744133855201, + 10.503822886724935 + ], + "rotation": [ + -4.371138777383445e-08, + 2.094987578439889e-13, + 0.9999999999997348, + 7.270507278398932e-07 + ], + "non_uniform_scale": [ + -1.000000000000004, + 0.9995763302354359, + 1.000059723846941 + ], + "motion_type": "STATIC" + }, + { + "template_name": "451250ecf29343c92f5f707565ebfd8315c1b15c_part_1", + "translation": [ + 13.852772232215223, + 0.5722742100774231, + 11.073144866301302 + ], + "rotation": [ + 0.7071067502779281, + 1.018430727510517e-11, + 0.7071068120951655, + -1.0189234173273885e-11 + ], + "non_uniform_scale": [ + -1.000059723846942, + 0.9995763302354348, + 1.0000000000000038 + ], + "motion_type": "STATIC" + }, + { + "template_name": "451250ecf29343c92f5f707565ebfd8315c1b15c_part_1", + "translation": [ + 12.96446626267893, + 0.5722741737712265, + 11.073145078077932 + ], + "rotation": [ + 0.7071067502779281, + 1.018430727510517e-11, + 0.7071068120951655, + -1.0189234173273885e-11 + ], + "non_uniform_scale": [ + -1.000059723846942, + 0.9995763302354348, + 1.0000000000000038 + ], + "motion_type": "STATIC" + }, + { + "template_name": "451250ecf29343c92f5f707565ebfd8315c1b15c_part_1", + "translation": [ + 12.972975555292853, + 0.5722742493257856, + 9.926871349362916 + ], + "rotation": [ + 0.7071067876051779, + -1.0189235231786495e-11, + -0.7071067747679174, + -1.018430762795679e-11 + ], + "non_uniform_scale": [ + -1.0000597238469415, + 0.9995763302354348, + 1.0000000000000033 + ], + "motion_type": "STATIC" + }, + { + "template_name": "451250ecf29343c92f5f707565ebfd8315c1b15c_part_1", + "translation": [ + 13.85277235829043, + 0.5722742270998842, + 9.92687125754658 + ], + "rotation": [ + 0.7071068120951657, + -1.0189234173273885e-11, + -0.7071067502779281, + -1.018430727510517e-11 + ], + "non_uniform_scale": [ + -1.000059723846942, + 0.9995763302354348, + 1.0000000000000038 + ], + "motion_type": "STATIC" + }, + { + "template_name": "451250ecf29343c92f5f707565ebfd8315c1b15c_part_7", + "translation": [ + 13.408976644278875, + 0.5699993328720255, + 10.502564435830996 + ], + "rotation": [ + 0.9999999999999991, + -3.483213148630508e-15, + 4.3711387773713e-08, + 2.606031880437006e-15 + ], + "non_uniform_scale": [ + -1.0000000000000038, + 0.9995763302354348, + 1.000059723846942 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d9820cf28b3281876e3af6a16aa5df12a33729f4", + "translation": [ + 1.815000057220459, + 0.5999991083144991, + 14.759999384880054 + ], + "rotation": [ + 0.38268345167438256, + -1.4057107152289738e-10, + 0.923879524513114, + 5.501170773832621e-08 + ], + "non_uniform_scale": [ + 1.008699947440594, + 0.9956026082512537, + 1.0078738934541318 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d9820cf28b3281876e3af6a16aa5df12a33729f4", + "translation": [ + -0.3019999861717224, + 0.5999991005658885, + 14.889999491572361 + ], + "rotation": [ + 0.38268345167438256, + -1.4057107152289738e-10, + 0.923879524513114, + 5.501170773832621e-08 + ], + "non_uniform_scale": [ + 1.008699947440594, + 0.9956026082512537, + 1.0078738934541318 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d9820cf28b3281876e3af6a16aa5df12a33729f4", + "translation": [ + -0.21299999952316284, + 0.5999989800452781, + 16.911999683856926 + ], + "rotation": [ + 0.38268345167438256, + -1.4057107152289738e-10, + 0.923879524513114, + 5.501170773832621e-08 + ], + "non_uniform_scale": [ + 1.008699947440594, + 0.9956026082512537, + 1.0078738934541318 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d9820cf28b3281876e3af6a16aa5df12a33729f4", + "translation": [ + 1.8270000219345093, + 0.5999989862441666, + 16.80799959850308 + ], + "rotation": [ + 0.38268345167438256, + -1.4057107152289738e-10, + 0.923879524513114, + 5.501170773832621e-08 + ], + "non_uniform_scale": [ + 1.008699947440594, + 0.9956026082512537, + 1.0078738934541318 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a0aee66ebcbeac2e2937109356c7463b1252b668", + "translation": [ + 15.957871437072754, + 1.0135326533600164e-07, + -1.7004255234941468 + ], + "rotation": [ + -4.37113889991056e-08, + -9.105366857996671e-17, + 0.9999999999999973, + 5.968291834365758e-08 + ], + "non_uniform_scale": [ + -1.0246509313583414, + 1.0416665027539054, + 0.9688580073287449 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a0aee66ebcbeac2e2937109356c7463b1252b668", + "translation": [ + 14.570127487182617, + 1.0135326533600164e-07, + -1.7004255234941468 + ], + "rotation": [ + -4.37113889991056e-08, + -9.105366857996671e-17, + 0.9999999999999973, + 5.968291834365758e-08 + ], + "non_uniform_scale": [ + 1.0246509313583414, + 1.0416665027539054, + 0.9688580073287449 + ], + "motion_type": "STATIC" + }, + { + "template_name": "703dc02d39bf4be233dd614b8bad4cd8363d667c", + "translation": [ + 4.526519775390625, + 6.821176725679834e-07, + -11.44403484797266 + ], + "rotation": [ + 1.0, + -5.299370446080666e-11, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 0.9055612683296204, + 0.8836184282757664, + 0.937907762776873 + ], + "motion_type": "STATIC" + }, + { + "template_name": "fcc046afe57d8d3616e206364b7b7f20d04d9fdb", + "translation": [ + -1.722000002861023, + 3.3688544931465003e-07, + -5.651999613523486 + ], + "rotation": [ + -4.3711389802723484e-08, + -2.6054006739209904e-16, + 0.9999999999999972, + 6.034970633228556e-08 + ], + "non_uniform_scale": [ + 1.4181817770004328, + 0.9999998807907169, + 0.7999999165535056 + ], + "motion_type": "STATIC" + }, + { + "template_name": "fcc046afe57d8d3616e206364b7b7f20d04d9fdb", + "translation": [ + -2.882999897003174, + 3.917217270554829e-07, + -6.571999634981154 + ], + "rotation": [ + 0.7071068022599738, + -5.268355969656142e-09, + -0.7071067601131195, + -3.793216479027109e-08 + ], + "non_uniform_scale": [ + 1.199999856948861, + 0.9999998807907169, + 0.7999999046325748 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1cf45047e33c08336b6cb6c49aee3fed0ba016ee", + "translation": [ + 13.635000228881836, + 0.570000763177898, + -13.493999596595739 + ], + "rotation": [ + 0.9999999999999991, + -9.08802960324839e-15, + 4.371138865552183e-08, + 2.6064196941595767e-15 + ], + "non_uniform_scale": [ + -1.0002266168594398, + 1.000050902360563, + 1.0008321999511447 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1cf45047e33c08336b6cb6c49aee3fed0ba016ee", + "translation": [ + 9.668999671936035, + 0.570000057995319, + -1.6629998545050633 + ], + "rotation": [ + 0.9999999999999991, + -6.274675220588287e-10, + 4.371138853340992e-08, + 2.3641067392507074e-15 + ], + "non_uniform_scale": [ + -1.0002266168594398, + 1.021502492248707, + 0.8322928151735269 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1cf45047e33c08336b6cb6c49aee3fed0ba016ee", + "translation": [ + 16.687000274658203, + -4.21881679812941e-07, + 7.077999646782871 + ], + "rotation": [ + 0.9999999999999991, + -9.08802960324839e-15, + 4.371138878938393e-08, + 2.60641970213838e-15 + ], + "non_uniform_scale": [ + -0.6800408363342312, + 1.000050902360563, + 1.0008321999511447 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_1", + "translation": [ + 4.828944868625985, + 0.00040117086445077833, + -4.440140046482127 + ], + "rotation": [ + 0.7071068022599731, + 3.823680344569059e-09, + 0.7071067601131198, + 4.681811011554933e-08 + ], + "non_uniform_scale": [ + 1.0706215458737882, + 0.9999625086828994, + 1.2216201292502795 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_2", + "translation": [ + 5.49406618247036, + 4.32165546988627e-07, + -5.4261447124213005 + ], + "rotation": [ + 0.7071068022599731, + 3.823680344569059e-09, + 0.7071067601131198, + 4.681811011554933e-08 + ], + "non_uniform_scale": [ + 1.0706215458737882, + 0.9999625086828994, + 1.2216201292502795 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_2", + "translation": [ + 5.494066126423959, + 3.7323918310735796e-07, + -4.437524729656262 + ], + "rotation": [ + 0.7071075174479966, + 7.158286082314168e-08, + 0.7071060449243197, + 1.089387582492376e-07 + ], + "non_uniform_scale": [ + 1.0706215458744364, + 0.9999625086829023, + 1.2216201292497098 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_2", + "translation": [ + 4.830029476047385, + 4.1283941703544074e-07, + -5.645456536486939 + ], + "rotation": [ + 1.0168351481201027e-06, + 6.247902171045813e-08, + 0.9999999999994806, + 3.2001500736102194e-08 + ], + "non_uniform_scale": [ + 1.221620129249735, + 0.9999625086829023, + 1.0706215458744073 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_2", + "translation": [ + 4.163943870298448, + 3.6726465322285385e-07, + -5.426065935702703 + ], + "rotation": [ + -0.707106044924199, + -4.304972275401492e-08, + 0.7071075174481279, + -2.8677893147556325e-10 + ], + "non_uniform_scale": [ + 1.0706215458744381, + 0.9999625086828994, + 1.2216201292497098 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_2", + "translation": [ + 4.16394390239522, + 3.08343643446705e-07, + -4.437535411255726 + ], + "rotation": [ + -0.707106044924199, + -4.304972275401492e-08, + 0.7071075174481279, + -2.8677893147556325e-10 + ], + "non_uniform_scale": [ + 1.0706215458744381, + 0.9999625086828994, + 1.2216201292497098 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_2", + "translation": [ + 4.16394397136581, + 2.4971502674456795e-07, + -3.4539103723598608 + ], + "rotation": [ + -0.7071067601131197, + -4.681811011335162e-08, + 0.7071068022599731, + 3.82368034719568e-09 + ], + "non_uniform_scale": [ + 1.0706215458737882, + 0.9999625086828992, + 1.2216201292502795 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_2", + "translation": [ + 4.829321169507966, + 2.689840035729091e-07, + -3.2325430030079607 + ], + "rotation": [ + 0.9999999999994751, + 2.760319989597334e-08, + -1.0168351527116027e-06, + 1.2328227592674054e-07 + ], + "non_uniform_scale": [ + 1.2216201292497262, + 0.9999625086829129, + 1.0706215458744073 + ], + "motion_type": "STATIC" + }, + { + "template_name": "30b848e2c7c60159f1861f3ca38a48a26a3887d6_part_2", + "translation": [ + 5.494066065082194, + 3.1460308084231807e-07, + -3.4537739682133815 + ], + "rotation": [ + 0.7071075174481274, + 7.934205959074605e-09, + 0.7071060449241992, + 5.058648171282569e-08 + ], + "non_uniform_scale": [ + 1.0706215458744381, + 0.9999625086828995, + 1.2216201292497098 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2a800c4dae039c07505cf8474d8c999172e4ef42", + "translation": [ + 10.932999610900879, + 1.7350006341933764, + -12.134998448491139 + ], + "rotation": [ + -3.0908618249605766e-08, + -3.090862055974815e-08, + 0.70710684442965, + -0.7071067179434379 + ], + "non_uniform_scale": [ + 0.4665049314498919, + 0.9898538601572663, + 0.9448387092544138 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2a800c4dae039c07505cf8474d8c999172e4ef42", + "translation": [ + 10.782999992370605, + 1.9700005667804845, + -10.998997868955215 + ], + "rotation": [ + 0.4999999840840887, + 0.49999994807448306, + 0.5000000760555635, + -0.4999999917858561 + ], + "non_uniform_scale": [ + 0.7277476353795812, + 0.9898538595525213, + 0.8192242599458347 + ], + "motion_type": "STATIC" + }, + { + "template_name": "03f10b35c7310988c0002289934c4b78f80950bd", + "translation": [ + -1.156999945640564, + 0.5799996100664053, + 5.681999856114377 + ], + "rotation": [ + 0.7071068022599734, + 4.271561527877543e-12, + 0.7071067601131198, + 4.215112219476717e-08 + ], + "non_uniform_scale": [ + 0.9999998807907176, + 0.9998781681205955, + 1.0000808834981392 + ], + "motion_type": "STATIC" + }, + { + "template_name": "033ec086c23a6d39fb37df87e6748c413bf80e29", + "translation": [ + 14.7347412109375, + 0.5600004773139879, + -8.527999336242683 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 5.960464848397727e-08 + ], + "non_uniform_scale": [ + -1.1250618696212769, + 0.9999998807907176, + 1.0001021623489592 + ], + "motion_type": "STATIC" + }, + { + "template_name": "033ec086c23a6d39fb37df87e6748c413bf80e29", + "translation": [ + 9.9975004196167, + 2.419999615151397, + 5.31668788810444 + ], + "rotation": [ + -0.7071067601131206, + 2.1541670459116564e-12, + 0.7071068022599726, + 4.214469833237925e-08 + ], + "non_uniform_scale": [ + -1.1250616833530853, + 0.9999998807907176, + 1.0001021027504144 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1e6795498f065062e0eb70d318cd34337dbcd952", + "translation": [ + -1.187999963760376, + 1.805000786721692, + -13.88399888938666 + ], + "rotation": [ + -6.181723206172603e-08, + -6.181724229704324e-08, + 0.7071068026649842, + -0.7071067597081047 + ], + "non_uniform_scale": [ + -1.2500001192093086, + 0.9999998211860979, + 1.2162159423570629 + ], + "motion_type": "STATIC" + }, + { + "template_name": "10f82d87bf341e228ce8dee47a5c39a438eb9cda", + "translation": [ + 0.7950000166893005, + 0.6199991036375465, + 14.498465664478154 + ], + "rotation": [ + -4.3711387559778877e-08, + -3.669579837259098e-16, + 0.9999999999999972, + 6.125073158730243e-08 + ], + "non_uniform_scale": [ + 1.0000000000000038, + 1.4117645726484456, + 1.01408433746286 + ], + "motion_type": "STATIC" + }, + { + "template_name": "10f82d87bf341e228ce8dee47a5c39a438eb9cda", + "translation": [ + 0.7509999871253967, + 0.6199989546260483, + 16.998463608118023 + ], + "rotation": [ + -4.3711387559778877e-08, + -3.669579837259098e-16, + 0.9999999999999972, + 6.125073158730243e-08 + ], + "non_uniform_scale": [ + 1.0000000000000038, + 1.4117645726484456, + 1.01408433746286 + ], + "motion_type": "STATIC" + }, + { + "template_name": "10f82d87bf341e228ce8dee47a5c39a438eb9cda", + "translation": [ + 2.112534999847412, + 0.6199990262389221, + 15.79699902671576 + ], + "rotation": [ + 0.7071068022599742, + -8.264091673098037e-09, + 0.7071067601131193, + 3.6210671763512994e-08 + ], + "non_uniform_scale": [ + 0.9999998807907176, + 1.4117645726484458, + 1.0140842786977142 + ], + "motion_type": "STATIC" + }, + { + "template_name": "10f82d87bf341e228ce8dee47a5c39a438eb9cda", + "translation": [ + -0.49446478486061096, + 0.6199990200996623, + 15.899998707771324 + ], + "rotation": [ + 0.7071068022599742, + -8.264091673098037e-09, + 0.7071067601131193, + 3.6210671763512994e-08 + ], + "non_uniform_scale": [ + 0.9999998807907176, + 1.4117645726484458, + 1.0140842786977142 + ], + "motion_type": "STATIC" + }, + { + "template_name": "11e7bc2e7f42f1a3b27baac7055c917d1753fddd", + "translation": [ + 11.431849479675293, + 3.0699997530072736, + -0.04614942946138689 + ], + "rotation": [ + 0.7071067601131217, + 2.1270462512360247e-11, + 0.7071068022599715, + 4.216814423139495e-08 + ], + "non_uniform_scale": [ + -0.9998772740437225, + 1.0003492831767389, + 0.9993395805752527 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3648d1dda109a672e34c7981552b8cc7c5dc0473", + "translation": [ + -1.5399999618530273, + 2.712011450967111e-07, + -4.549999919533718 + ], + "rotation": [ + 0.707106802259973, + 1.2604136075230883e-09, + 0.7071067601131199, + 4.3487445242401444e-08 + ], + "non_uniform_scale": [ + 0.7777148021629571, + 1.2908777843859365, + 1.3729975597263835 + ], + "motion_type": "STATIC" + }, + { + "template_name": "427e1e9e12064e671a7cf92d612b0fb7e12d4c95", + "translation": [ + 16.767000198364258, + 0.590000613093661, + -11.31600404345961 + ], + "rotation": [ + 0.7071068022599739, + 1.4389368592442751e-10, + 0.7071067601131191, + 4.2291732752456034e-08 + ], + "non_uniform_scale": [ + 1.0008584856475302, + 0.9948163634757492, + 1.0016558765378072 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_1", + "translation": [ + 16.928940917287438, + 1.323030891774385, + 3.416469478007013 + ], + "rotation": [ + -4.3711388312202836e-08, + 2.5141967120509746e-18, + 0.9999999999999973, + 5.960470371890293e-08 + ], + "non_uniform_scale": [ + 1.0000000000000038, + 1.0001914500961888, + 1.0021216866824967 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_2", + "translation": [ + 16.594810435405154, + 1.2870561163491976, + 3.197041034907537 + ], + "rotation": [ + -4.3711388312202836e-08, + 2.5141967120509746e-18, + 0.9999999999999973, + 5.960470371890293e-08 + ], + "non_uniform_scale": [ + 1.0000000000000038, + 1.0001914500961888, + 1.0021216866824967 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_3", + "translation": [ + 16.57497159738607, + 0.5699872343480091, + 2.8704258249345354 + ], + "rotation": [ + -4.3711388312202836e-08, + 2.5141967120509746e-18, + 0.9999999999999973, + 5.960470371890293e-08 + ], + "non_uniform_scale": [ + 1.0000000000000038, + 1.0001914500961888, + 1.0021216866824967 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_4", + "translation": [ + 16.5750007860718, + 0.5699226040471358, + 3.4402603331316355 + ], + "rotation": [ + -4.3711388312202836e-08, + 2.5141967120509746e-18, + 0.9999999999999973, + 5.960470371890293e-08 + ], + "non_uniform_scale": [ + 1.0000000000000038, + 1.0001914500961888, + 1.0021216866824967 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_1", + "translation": [ + 14.831545667186779, + 1.3230306844694204, + 6.894469437828273 + ], + "rotation": [ + -4.371138928592694e-08, + 2.51413867356822e-18, + 0.9999999999999973, + 5.960470371890293e-08 + ], + "non_uniform_scale": [ + 0.8999999761581455, + 1.0001914500961888, + 1.0021216866824967 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_2", + "translation": [ + 14.530828239540709, + 1.2870559090442333, + 6.6750409918077365 + ], + "rotation": [ + -4.371138928592694e-08, + 2.51413867356822e-18, + 0.9999999999999973, + 5.960470371890293e-08 + ], + "non_uniform_scale": [ + 0.8999999761581455, + 1.0001914500961888, + 1.0021216866824967 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_3", + "translation": [ + 14.512973282941166, + 0.5699870270430448, + 6.348425781661299 + ], + "rotation": [ + -4.371138928592694e-08, + 2.51413867356822e-18, + 0.9999999999999973, + 5.960470371890293e-08 + ], + "non_uniform_scale": [ + 0.8999999761581455, + 1.0001914500961888, + 1.0021216866824967 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_4", + "translation": [ + 14.512999557739283, + 0.5699223967421715, + 6.918260289858654 + ], + "rotation": [ + -4.371138928592694e-08, + 2.51413867356822e-18, + 0.9999999999999973, + 5.960470371890293e-08 + ], + "non_uniform_scale": [ + 0.8999999761581455, + 1.0001914500961888, + 1.0021216866824967 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_1", + "translation": [ + 6.9000600536246655, + 1.32303108471099, + 0.17953056937477133 + ], + "rotation": [ + 1.0, + -5.539079856638885e-14, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0, + 1.0001914500961888, + 1.002121686682493 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_2", + "translation": [ + 7.2341905163239035, + 1.287056283127891, + 0.3989590373963292 + ], + "rotation": [ + 1.0, + -5.539079856638885e-14, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0, + 1.0001914500961888, + 1.002121686682493 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_3", + "translation": [ + 7.254029325789381, + 0.5699873621911382, + 0.7255741636224147 + ], + "rotation": [ + 1.0, + -5.539079856638885e-14, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0, + 1.0001914500961888, + 1.002121686682493 + ], + "motion_type": "STATIC" + }, + { + "template_name": "8597e0af462124aef9ec06dde13f45bb2b223a74_part_4", + "translation": [ + 7.254000186920166, + 0.5699227998198357, + 0.15573965541506685 + ], + "rotation": [ + 1.0, + -5.539079856638885e-14, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0, + 1.0001914500961888, + 1.002121686682493 + ], + "motion_type": "STATIC" + }, + { + "template_name": "ee51901dcbac477d664dde61d6986af177006f3b", + "translation": [ + -0.39399996399879456, + 7.870197578085936e-07, + -13.203999686002703 + ], + "rotation": [ + 0.9999999821803407, + -1.1201597032808159e-16, + 0.0001887837871516332, + 1.1251903661487752e-11 + ], + "non_uniform_scale": [ + -0.9997421023576565, + 0.9998928308614623, + 0.9998061773784832 + ], + "motion_type": "STATIC" + }, + { + "template_name": "eab1a7b6a78e81693dae1ca4e1e993f081e0be20", + "translation": [ + 9.645000457763672, + 0.5700004577040936, + -8.368999902069543 + ], + "rotation": [ + -0.004363360274291032, + 4.105888707975182e-11, + 0.999990480498246, + 6.073298106820156e-08 + ], + "non_uniform_scale": [ + 1.640312188674795, + 1.2450866407052636, + 1.6382159758503871 + ], + "motion_type": "STATIC" + }, + { + "template_name": "78e8c0bb62e3ef33af7e1635ca30986837e5ecea", + "translation": [ + 6.800000190734863, + -4.26232787731351e-07, + 7.150999119818238 + ], + "rotation": [ + 0.7071068022599748, + -1.6460699091219368e-08, + -0.7071067601131186, + -3.29050379005251e-08 + ], + "non_uniform_scale": [ + 1.0661888679153402, + 1.7124753341108017, + 0.9614642881474361 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a1d60b70b67539c00303512208bf4f65d92bfb31", + "translation": [ + 9.946996688842773, + 0.5700004752874115, + -8.663999007105854 + ], + "rotation": [ + 0.7071068022599738, + -4.857621098558752e-09, + -0.7071067601131196, + -3.819919885333098e-08 + ], + "non_uniform_scale": [ + -0.7057328399579025, + 0.8016513226447852, + 0.6514792650056329 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3250fed9cd01e87e35addd30f213df8fae6ae89f", + "translation": [ + 16.05500030517578, + 0.5700006136297979, + -10.984998967945597 + ], + "rotation": [ + 0.7071068022599738, + -4.614634198038408e-09, + -0.7071067601131196, + -3.8361193920826994e-08 + ], + "non_uniform_scale": [ + 0.7142447999569893, + 0.8359312014661723, + 0.6857634970090695 + ], + "motion_type": "STATIC" + }, + { + "template_name": "556e2dce2ddc10b3941a4c5b3adfbd7364a425a1", + "translation": [ + 3.265000104904175, + 7.538199611190066e-07, + -12.646999558985215 + ], + "rotation": [ + -4.3711388380251286e-08, + -1.117070275563263e-16, + 0.9999999999999973, + 5.97244955336787e-08 + ], + "non_uniform_scale": [ + 1.0778160095214886, + 1.0831349989014785, + 0.9902557146244361 + ], + "motion_type": "STATIC" + }, + { + "template_name": "41059c4d9ae2380bf7304880f2ba5f3327bb0a47", + "translation": [ + 13.897000312805176, + 0.5700006644725981, + -11.837999557971937 + ], + "rotation": [ + 1.0, + -6.513534079138449e-09, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.3448275327682495, + 1.9148933988936503, + 0.9999998807907223 + ], + "motion_type": "STATIC" + }, + { + "template_name": "41059c4d9ae2380bf7304880f2ba5f3327bb0a47", + "translation": [ + 7.929999828338623, + 0.570000000953673, + -0.7059998943805716 + ], + "rotation": [ + 0.7071068022599747, + -1.9279941528352162e-08, + -0.7071067601131186, + -3.207843559766338e-08 + ], + "non_uniform_scale": [ + 1.3448273334010046, + 1.9148933988936503, + 0.9999998807907223 + ], + "motion_type": "STATIC" + }, + { + "template_name": "e4ee71b667832a51e6cfd3834fdaac3870b9fda8", + "translation": [ + 10.80199909210205, + -0.15000025486947344, + 4.325999946832644 + ], + "rotation": [ + -0.70608062485552, + -3.890274899354423e-09, + 0.7081314505115814, + 4.6969268771301936e-08 + ], + "non_uniform_scale": [ + -1.6412214141125148, + 1.2268041101927531, + 0.9999999143510684 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9f931fb564b83de5f6a263778970136f1695f43e", + "translation": [ + 13.119999885559082, + 0.5800008032917923, + -14.336999004065998 + ], + "rotation": [ + 0.7071068022599728, + -1.491977843805778e-10, + 0.7071067601131205, + 4.199870085361683e-08 + ], + "non_uniform_scale": [ + 0.9905515914826637, + 0.9999998807907176, + 0.9929697517770677 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9f931fb564b83de5f6a263778970136f1695f43e", + "translation": [ + 10.675999641418457, + 0.580000803112906, + -14.333997791171154 + ], + "rotation": [ + 0.7071068022599728, + -1.491977843805778e-10, + 0.7071067601131205, + 4.199870085361683e-08 + ], + "non_uniform_scale": [ + 0.9905515914826637, + 0.9999998807907176, + 0.9929697517770677 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9f931fb564b83de5f6a263778970136f1695f43e", + "translation": [ + 3.609999895095825, + 1.335144048653092e-07, + -2.2399998760223383 + ], + "rotation": [ + 0.7071068022599728, + -1.491977843805778e-10, + 0.7071067601131205, + 4.199870085361683e-08 + ], + "non_uniform_scale": [ + 0.9905515914826637, + 0.9999998807907176, + 0.9929697517770677 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9f931fb564b83de5f6a263778970136f1695f43e", + "translation": [ + 6.019000053405762, + 1.3279914412578364e-07, + -2.227999792814259 + ], + "rotation": [ + 0.7071068022599728, + -1.491977843805778e-10, + 0.7071067601131205, + 4.199870085361683e-08 + ], + "non_uniform_scale": [ + 0.9905515914826637, + 0.9999998807907176, + 0.9929697517770677 + ], + "motion_type": "STATIC" + }, + { + "template_name": "df864a06ed866275336fb19a83e536ddac44cf9a", + "translation": [ + 9.111968040466309, + 2.250005469133427, + -10.006837114283869 + ], + "rotation": [ + -3.090861719739956e-08, + -3.090862020571329e-08, + 0.7071068444138319, + -0.7071067179592564 + ], + "non_uniform_scale": [ + 1.6418600082397523, + 1.0103923069963077, + 1.0367920354852578 + ], + "motion_type": "STATIC" + }, + { + "template_name": "5406441590ae50f71a4d5a65d7a427761713e647", + "translation": [ + -0.15400004386901855, + 6.18696219589765e-07, + -10.379999495744698 + ], + "rotation": [ + -4.371138844828575e-08, + 4.228207038671373e-17, + 0.9999999999999973, + 5.961985271845465e-08 + ], + "non_uniform_scale": [ + 1.2765958309173633, + 1.1648934883006148, + 1.2027026173230824 + ], + "motion_type": "STATIC" + }, + { + "template_name": "bc535374502a6afca25a3046379343f1f06e2da4", + "translation": [ + 2.7360000610351562, + -0.29000030672551524, + 5.575999863982188 + ], + "rotation": [ + -4.371138844904854e-08, + -2.478055056490772e-16, + 0.9999999999999972, + 6.027051676786147e-08 + ], + "non_uniform_scale": [ + 0.8207485675811799, + 1.0135506375371572, + 0.8207484697403329 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c86e7f32a692444a8ff2a19e3cd29ce6ecc9c444", + "translation": [ + 14.987000465393066, + 0.5599999186992619, + 0.8440000245571113 + ], + "rotation": [ + -0.7071067601131205, + -5.965959217979038e-09, + 0.707106802259972, + 5.0468776740137795e-08 + ], + "non_uniform_scale": [ + -0.6842104384773708, + 1.731601389455616, + 1.2413790678155998 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c86e7f32a692444a8ff2a19e3cd29ce6ecc9c444", + "translation": [ + 8.869999885559082, + 0.559999805331227, + 2.7459999212026567 + ], + "rotation": [ + 0.7071067601131205, + 5.965959217979038e-09, + 0.707106802259972, + 5.0468776740137795e-08 + ], + "non_uniform_scale": [ + -0.6842104384773708, + 1.731601389455616, + 1.2413790678155998 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c86e7f32a692444a8ff2a19e3cd29ce6ecc9c444", + "translation": [ + 13.145999908447266, + 0.5599996724128822, + 4.975999568939219 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999981, + 6.127056726078974e-08 + ], + "non_uniform_scale": [ + -0.7368420958518982, + 1.731601389455616, + 1.2413791130329168 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c95829d613a9a780c467c06f0402984dbbc8db06", + "translation": [ + 11.003000259399414, + 0.42000065654514707, + -11.654999013245122 + ], + "rotation": [ + 0.7071068022599744, + -1.5718963852593217e-08, + 0.7071067601131192, + 3.314356343926334e-08 + ], + "non_uniform_scale": [ + 0.9999998807907176, + 1.4494380415155719, + 0.8301886421329622 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c95829d613a9a780c467c06f0402984dbbc8db06", + "translation": [ + 11.003000259399414, + 0.42000057792671974, + -10.336000755071558 + ], + "rotation": [ + 0.7071068022599744, + -1.5718963852593217e-08, + 0.7071067601131192, + 3.314356343926334e-08 + ], + "non_uniform_scale": [ + 0.9999998807907176, + 1.4494380415155719, + 0.8301886421329622 + ], + "motion_type": "STATIC" + }, + { + "template_name": "0677bfbb64af1d34d83b878761110ce57285b9cf", + "translation": [ + 6.38700008392334, + 2.419999712407588, + 3.6849998673796733 + ], + "rotation": [ + -0.7071067601131212, + 2.1245257696515625e-09, + 0.707106802259972, + 4.021689596738763e-08 + ], + "non_uniform_scale": [ + -0.94545442191038, + 0.9090908278118516, + 1.0007411837136035 + ], + "motion_type": "STATIC" + }, + { + "template_name": "0677bfbb64af1d34d83b878761110ce57285b9cf", + "translation": [ + 6.38700008392334, + 2.419999654352665, + 4.658999786436567 + ], + "rotation": [ + -0.7071067601131212, + 2.1245257696515625e-09, + 0.707106802259972, + 4.021689596738763e-08 + ], + "non_uniform_scale": [ + -0.94545442191038, + 0.9090908278118516, + 1.0007411837136035 + ], + "motion_type": "STATIC" + }, + { + "template_name": "0677bfbb64af1d34d83b878761110ce57285b9cf", + "translation": [ + 6.38700008392334, + 2.4199995923638653, + 5.698999209463636 + ], + "rotation": [ + -0.7071067601131212, + 2.1245257696515625e-09, + 0.707106802259972, + 4.021689596738763e-08 + ], + "non_uniform_scale": [ + -0.94545442191038, + 0.9090908278118516, + 1.0007411837136035 + ], + "motion_type": "STATIC" + }, + { + "template_name": "0159bbff524170a2ace52cd61a00a573da95fd38", + "translation": [ + 0.7689999938011169, + 0.6199990254640326, + 15.80999951422212 + ], + "rotation": [ + -4.3711388509781874e-08, + 5.12797875705216e-16, + 0.9999999999999972, + 6.126145451360568e-08 + ], + "non_uniform_scale": [ + 1.4515078067779597, + 1.0924483427466878, + 1.522481856050264 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f9b8d96daa969944c9cb86404e0092dd7cbec4c8", + "translation": [ + 13.911999702453613, + -0.3000000011324877, + 0.11899997776746662 + ], + "rotation": [ + -4.371138884281485e-08, + -2.0354688983740284e-16, + 0.9999999999999973, + 6.003581645502657e-08 + ], + "non_uniform_scale": [ + 1.4375000000000056, + 1.48148137551767, + 1.2499998509884025 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f9b8d96daa969944c9cb86404e0092dd7cbec4c8", + "translation": [ + 16.16200065612793, + -0.3000000011324877, + 0.11899997776746662 + ], + "rotation": [ + -4.3711389066587624e-08, + -2.0354690317530052e-16, + 0.9999999999999973, + 6.003581645502657e-08 + ], + "non_uniform_scale": [ + 1.4312499761581474, + 1.48148137551767, + 1.2499998509884025 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2793206b3b9810b154dd8c127d57770c45cab701", + "translation": [ + 6.671999931335449, + 2.0635127384593943e-07, + -3.4619996868372027 + ], + "rotation": [ + 0.3007058176914836, + -5.213836351363144e-12, + 0.9537169450138197, + 5.68443242796424e-08 + ], + "non_uniform_scale": [ + 1.000576681597341, + 0.9999998807907177, + 1.00058161151883 + ], + "motion_type": "STATIC" + }, + { + "template_name": "267e675cf67aa4eae206fd36826e1919cbaf4441", + "translation": [ + 17.28700065612793, + 2.1000000908970833, + -5.224999468028557 + ], + "rotation": [ + 0.500000021975544, + 0.5000000477505296, + -0.4999999782641681, + 0.49999995200975283 + ], + "non_uniform_scale": [ + -0.2916666095455548, + 0.9990632534585557, + 1.134072287789304 + ], + "motion_type": "STATIC" + }, + { + "template_name": "267e675cf67aa4eae206fd36826e1919cbaf4441", + "translation": [ + 17.28700065612793, + 2.099999957323078, + -2.983999664545067 + ], + "rotation": [ + 0.5000000219755447, + 0.5000000477505274, + -0.49999997826416875, + 0.4999999520097535 + ], + "non_uniform_scale": [ + -0.8124998323619539, + 0.9990632534585557, + 1.134072287789304 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17596487ad7861c4dc70a8934235bdbb06e871c1", + "translation": [ + 10.675999641418457, + 0.5900007929206019, + -14.332999293625345 + ], + "rotation": [ + 0.7071068022599739, + 5.9168158158247214e-12, + -0.7071067601131191, + -4.215276824487608e-08 + ], + "non_uniform_scale": [ + 1.000941932145242, + 1.0006608962224774, + 1.000941932145242 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17596487ad7861c4dc70a8934235bdbb06e871c1", + "translation": [ + 13.120999336242676, + 0.5900007936954346, + -14.345998827457446 + ], + "rotation": [ + 0.7071068022599739, + 5.9168158158247214e-12, + 0.7071067601131191, + 4.215276824487608e-08 + ], + "non_uniform_scale": [ + 1.000941932145242, + 1.0006608962224774, + 1.000941932145242 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17596487ad7861c4dc70a8934235bdbb06e871c1", + "translation": [ + 6.002000331878662, + 1.375675253711961e-07, + -2.3079999501705117 + ], + "rotation": [ + 0.7071068022599739, + 5.9168158158247214e-12, + -0.7071067601131191, + -4.215276824487608e-08 + ], + "non_uniform_scale": [ + 1.000941932145242, + 1.0006608962224774, + 1.000941932145242 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17596487ad7861c4dc70a8934235bdbb06e871c1", + "translation": [ + 3.627000093460083, + 1.3828277189986693e-07, + -2.319999794960026 + ], + "rotation": [ + 0.7071068022599739, + 5.9168158158247214e-12, + -0.7071067601131191, + -4.215276824487608e-08 + ], + "non_uniform_scale": [ + 1.000941932145242, + 1.0006608962224774, + 1.000941932145242 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17596487ad7861c4dc70a8934235bdbb06e871c1", + "translation": [ + 16.815000534057617, + 0.5900006921292054, + -12.642000363349847 + ], + "rotation": [ + -4.3711386811978394e-08, + 3.660967953736205e-19, + 0.9999999999999973, + 5.960464950362972e-08 + ], + "non_uniform_scale": [ + 1.0009421110153236, + 1.0006608962224774, + 1.0009419916937328 + ], + "motion_type": "STATIC" + }, + { + "template_name": "6a7f42be0fe9ad75f553aff035ef99a88b2f5b4f", + "translation": [ + 7.885000228881836, + -4.739165433420567e-07, + 7.9509997397065035 + ], + "rotation": [ + 0.7071068022599736, + -1.5373542398247557e-09, + 0.7071067601131197, + 4.071402338832161e-08 + ], + "non_uniform_scale": [ + 1.0823787997735261, + 0.8518126187547836, + 0.793896091348166 + ], + "motion_type": "STATIC" + }, + { + "template_name": "62a74828d10b53f8d47e0b260cd8911ab42df32f", + "translation": [ + 15.104000091552734, + 3.878474217344774e-07, + -6.506999581635 + ], + "rotation": [ + 1.0, + -4.3842788188597305e-09, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 0.6496686935424805, + 1.0258070199719558, + 0.6001919984588603 + ], + "motion_type": "STATIC" + }, + { + "template_name": "5f35fba809dd9b4c06e20515b4ebb56afb66d461", + "translation": [ + -3.23799991607666, + 0.9600003151297791, + -6.606999899923782 + ], + "rotation": [ + 0.7071068022599699, + 1.1707456628727665e-08, + 0.7071067601131212, + 6.848863051805174e-08 + ], + "non_uniform_scale": [ + 0.9999998807907176, + 0.44444439477391307, + 0.9999998807907161 + ], + "motion_type": "STATIC" + }, + { + "template_name": "5f35fba809dd9b4c06e20515b4ebb56afb66d461", + "translation": [ + -1.7139999866485596, + 0.9600002355575761, + -5.271999941349012 + ], + "rotation": [ + -4.3711388362105696e-08, + 1.6283764302499893e-15, + 0.9999999999999967, + 6.995267735127647e-08 + ], + "non_uniform_scale": [ + 1.2222222089767503, + 0.44444439477391307, + 0.99999988079072 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3e5f2e2107948399a61f5ffbb800c794ed5bbcdc", + "translation": [ + 10.982998847961426, + 0.5600006236433295, + -10.98299815994508 + ], + "rotation": [ + 0.7071068022599742, + -9.765733433096774e-09, + 0.7071067601131192, + 3.5473598391244923e-08 + ], + "non_uniform_scale": [ + 0.5468065412755881, + 1.3123358115749477, + 0.8967627944491646 + ], + "motion_type": "STATIC" + }, + { + "template_name": "4500ce3490c69e1e0961c6eae02458cc90b24e06", + "translation": [ + 11.432001113891602, + 0.8000002320408832, + -4.492999715030191 + ], + "rotation": [ + 0.9999619230721946, + -7.507273354293884e-10, + -0.008726534578998621, + -4.679672761224088e-10 + ], + "non_uniform_scale": [ + 0.5652173919719967, + 0.7297296846235118, + 0.5833332774858798 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d07b8ac145fb657379b11d2ed85d52fcd7294dfb", + "translation": [ + 16.003999710083008, + 3.878474217344774e-07, + -6.506999581635 + ], + "rotation": [ + 0.7071068022599732, + 2.6568663892085023e-09, + -0.7071067601131199, + -4.518700945073332e-08 + ], + "non_uniform_scale": [ + 1.3312031429288897, + 0.952941065676079, + 1.0904172008980986 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d07b8ac145fb657379b11d2ed85d52fcd7294dfb", + "translation": [ + 15.354000091552734, + 4.20629987729626e-07, + -7.056999739587297 + ], + "rotation": [ + 1.0, + -2.238630751760491e-10, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.4976037740707397, + 0.9647057694547388, + 1.0904172551134437 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d07b8ac145fb657379b11d2ed85d52fcd7294dfb", + "translation": [ + 15.354000091552734, + 3.5506482731761935e-07, + -5.956998946845573 + ], + "rotation": [ + -4.37113876096441e-08, + 1.6975609362162002e-16, + 0.9999999999999973, + 5.982851140328042e-08 + ], + "non_uniform_scale": [ + 1.4976037740707455, + 0.9647057694547387, + 1.0904172551134481 + ], + "motion_type": "STATIC" + }, + { + "template_name": "7f99b0422e4d6967cb20ea2b6ab3441d7c1ee774", + "translation": [ + 16.981000900268555, + 1.9400000272989288, + -1.4379998816251671 + ], + "rotation": [ + 1.0, + -2.18600972470527e-09, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.9815059900283813, + 1.1668610373901025, + 1.707497870028259 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9d8cc5b25b4442b998ed2f009d5e3171d99a2d5b", + "translation": [ + 12.968999862670898, + 0.4000004906654109, + -8.531999055624032 + ], + "rotation": [ + 0.707106802259976, + -3.392260483739725e-08, + 0.7071067601131169, + 2.9148357425296188e-08 + ], + "non_uniform_scale": [ + 1.9196428108428234, + 1.6776857760326986, + 0.6428570364202901 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9d8cc5b25b4442b998ed2f009d5e3171d99a2d5b", + "translation": [ + 8.814000129699707, + 1.3700006237626141, + -11.754999332129948 + ], + "rotation": [ + 1.0, + -1.3716883025508824e-11, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.4107142686843872, + 0.8099172341922184, + 0.7857141750199531 + ], + "motion_type": "STATIC" + }, + { + "template_name": "70edacf930043886edc239c55156daa0a782abb1", + "translation": [ + 16.29400062561035, + 0.5900008686184712, + -15.602998722016832 + ], + "rotation": [ + 0.7071068022599746, + -1.4091561776770385e-08, + -0.7071067601131188, + -3.3702157954075254e-08 + ], + "non_uniform_scale": [ + 1.2422358249285326, + 2.6664885680092865, + 1.5979544163969557 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2a9cb0b671a281159864a83d00e0a89439b15ef6", + "translation": [ + 16.23699951171875, + 0.5699995900988988, + 6.186998986184637 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 5.972345390818775e-08 + ], + "non_uniform_scale": [ + -1.1897746324539185, + 1.0002255439489365, + 1.093613136576032 + ], + "motion_type": "STATIC" + }, + { + "template_name": "09b1df19e95ab47e50c8aac06137ef2f51144d34", + "translation": [ + 6.348832607269287, + 2.2494929454695693, + 0.7138877830270189 + ], + "rotation": [ + -0.5000000151160372, + -0.4999999916288683, + 0.5000000453376072, + -0.4999999479174822 + ], + "non_uniform_scale": [ + 1.4038182852376508, + 0.9986209870206735, + 1.267127124413587 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f99cafe4766e6f0c9fe7f6aecb219f4591308db3", + "translation": [ + 16.59600067138672, + 2.569999616682523, + 2.7410001652836655 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999981, + 6.141439128984918e-08 + ], + "non_uniform_scale": [ + -1.2054831981658936, + 0.7553944879299972, + 1.0684846557993022 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f99cafe4766e6f0c9fe7f6aecb219f4591308db3", + "translation": [ + 7.255000114440918, + 2.5699997290968923, + 0.855000121295447 + ], + "rotation": [ + 0.9999999999999991, + -1.8097429617448039e-09, + 4.371138922645397e-08, + 3.145335627768405e-15 + ], + "non_uniform_scale": [ + -1.2313150167465257, + 0.7553944879299972, + 1.0684846557993062 + ], + "motion_type": "STATIC" + }, + { + "template_name": "f99cafe4766e6f0c9fe7f6aecb219f4591308db3", + "translation": [ + 16.41200065612793, + 2.5699994825720722, + 4.991000031173215 + ], + "rotation": [ + 0.9999999999999991, + -1.8097429617448039e-09, + 4.371139008489256e-08, + 3.1453356789353347e-15 + ], + "non_uniform_scale": [ + -1.5068540573120175, + 0.7553944879299972, + 1.0684846557993062 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9decf8fa3f788bd605928cc91128d11eabd5674d", + "translation": [ + -2.703000068664551, + 0.5800008528232716, + -15.167999282598483 + ], + "rotation": [ + 0.7071067601131217, + 9.250763745956468e-12, + 0.7071068022599715, + 4.215610710497304e-08 + ], + "non_uniform_scale": [ + -0.9994287491185219, + 1.000159621219673, + 0.9997205734419481 + ], + "motion_type": "STATIC" + }, + { + "template_name": "797dfff15715fcc568ce2e6d73c12f829c3637db", + "translation": [ + 9.430000305175781, + 0.5699999609589581, + -0.03499996408820194 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999982, + 6.055903231315167e-08 + ], + "non_uniform_scale": [ + -1.25, + 1.1727236303420439, + 1.509433924027202 + ], + "motion_type": "STATIC" + }, + { + "template_name": "e701f9f4b4cced9ece89e1a9be7ff16b3e8ebdc0", + "translation": [ + 13.32699966430664, + 2.4999999213218658, + -1.179999728202823 + ], + "rotation": [ + 1.0, + -1.2047618599979516e-12, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0001754760742188, + 1.009065388552493, + 1.0000329017599867 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17b9d6c36508399b034d5e0acb0ce5ee81502a0c", + "translation": [ + 22.558998107910156, + 0.5900008493681632, + -15.280032165644581 + ], + "rotation": [ + 0.7071068022598382, + 1.9802126317405266e-08, + -0.707106760113159, + -3.703981884109231e-07 + ], + "non_uniform_scale": [ + 0.6721655921837335, + 0.059847385007483433, + 0.9920634036026339 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17b9d6c36508399b034d5e0acb0ce5ee81502a0c", + "translation": [ + 20.50896644592285, + 0.5900009685755201, + -17.279999621510466 + ], + "rotation": [ + 0.9999999999999762, + -2.1810652247043368e-07, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 0.6721656918525696, + 0.059847385007483433, + 0.9920634040756848 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17b9d6c36508399b034d5e0acb0ce5ee81502a0c", + "translation": [ + 23.784021377563477, + 0.5900007301568841, + -13.279998906254786 + ], + "rotation": [ + -4.3711387143365e-08, + 2.0291592730076396e-14, + 0.9999999999999605, + 2.7771117079853287e-07 + ], + "non_uniform_scale": [ + 0.3983204066753403, + 0.059847385007483433, + 0.9920634040756886 + ], + "motion_type": "STATIC" + }, + { + "template_name": "17b9d6c36508399b034d5e0acb0ce5ee81502a0c", + "translation": [ + 18.509000778198242, + 0.5900010415922559, + -18.505017096101152 + ], + "rotation": [ + 0.707106802259838, + 1.980212631740527e-08, + -0.7071067601131591, + -3.7039818841092313e-07 + ], + "non_uniform_scale": [ + 0.3983203531312732, + 0.059847385007483433, + 0.9920634036026339 + ], + "motion_type": "STATIC" + }, + { + "template_name": "347414deea3205ff5e0c36c1acad28944fb5f1b2", + "translation": [ + 13.140000343322754, + 4.0572882653577835e-07, + -6.806999754488459 + ], + "rotation": [ + 0.7071068022599735, + -3.6029146971326526e-09, + 0.70710676011312, + 3.906998517430552e-08 + ], + "non_uniform_scale": [ + 0.8318081598396206, + 0.9751902252208844, + 0.8328057627197651 + ], + "motion_type": "STATIC" + }, + { + "template_name": "347414deea3205ff5e0c36c1acad28944fb5f1b2", + "translation": [ + 14.531999588012695, + 2.0730495009502192e-07, + -3.4779997183084532 + ], + "rotation": [ + -4.3711388685884384e-08, + -7.895336797462333e-17, + 0.9999999999999973, + 5.966291586545403e-08 + ], + "non_uniform_scale": [ + 1.0397603511810343, + 0.9751902252208846, + 0.9160863261119903 + ], + "motion_type": "STATIC" + }, + { + "template_name": "514731fa03071a52318224f7be986fd25864a47f", + "translation": [ + 15.596122741699219, + 2.235031644204355e-07, + -3.7497606426619967 + ], + "rotation": [ + 1.0, + -5.941751345845265e-11, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.0558738708496094, + 0.9705334936936434, + 0.9111524330195802 + ], + "motion_type": "STATIC" + }, + { + "template_name": "5cd043b511e3f7031892d1fa56fe309d2896128a", + "translation": [ + 1.8513699769973755, + 6.675238068964973e-07, + -11.199190425921017 + ], + "rotation": [ + 1.0, + -2.1050361410400615e-10, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 0.9277470707893372, + 0.7879805817627161, + 0.8873675003805689 + ], + "motion_type": "STATIC" + }, + { + "template_name": "21ce95549835e79027456765d8c06858051dea4b", + "translation": [ + 10.876999855041504, + 3.4799998643398276, + -0.883999743223189 + ], + "rotation": [ + -0.7071067601131217, + -1.872401883263631e-11, + 0.7071068022599715, + 4.2165592948167765e-08 + ], + "non_uniform_scale": [ + -0.999493837386737, + 0.9994109869705383, + 0.9985229969905021 + ], + "motion_type": "STATIC" + }, + { + "template_name": "21ce95549835e79027456765d8c06858051dea4b", + "translation": [ + 10.217000007629395, + 3.4800006209611922, + -13.577999051928515 + ], + "rotation": [ + 0.9999999999999991, + -1.1774270038070779e-14, + 4.3711388762372743e-08, + 2.6042444879867827e-15 + ], + "non_uniform_scale": [ + -0.9994939565658608, + 0.9994109869705383, + 0.998522997078535 + ], + "motion_type": "STATIC" + }, + { + "template_name": "0391f7b149076276d028060971ae3d197619f196", + "translation": [ + -1.9020497798919678, + 7.29119676634582e-07, + -12.232597575628859 + ], + "rotation": [ + -4.371138915856696e-08, + 1.0529384849693142e-18, + 0.9999999999999973, + 5.960465805158961e-08 + ], + "non_uniform_scale": [ + 1.0002490282058754, + 0.9997772574690202, + 1.0005851983326404 + ], + "motion_type": "STATIC" + }, + { + "template_name": "a70fb3e4fb65cac24249dd2ef1f3db031e81d7b8", + "translation": [ + 15.694000244140625, + 0.57000061517952, + -11.010998989284058 + ], + "rotation": [ + 0.7071068022599734, + -5.892226094271134e-12, + -0.7071067601131198, + -4.2140959187555564e-08 + ], + "non_uniform_scale": [ + 0.9999533891705639, + 1.0007086991418888, + 1.0004289746028796 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d3b1439bf4a338a6df4e4421c2186835667fac5d", + "translation": [ + 10.800999641418457, + 0.570000057995319, + -1.6629998545050633 + ], + "rotation": [ + 0.9999999999999991, + -2.142750020282937e-10, + 4.3711389082356155e-08, + 2.771262948321607e-15 + ], + "non_uniform_scale": [ + -1.2500000000000049, + 1.1764704970752522, + 1.3262596933532078 + ], + "motion_type": "STATIC" + }, + { + "template_name": "ab3ddbf2938d1217677ce647de4f58c906d4993e", + "translation": [ + 7.216000556945801, + 6.487965720225475e-07, + -10.884999580085264 + ], + "rotation": [ + 0.7132504533280045, + 7.836118123213514e-12, + -0.7009092600525365, + -4.178542714649887e-08 + ], + "non_uniform_scale": [ + 0.9999999556032696, + 1.0000473260823028, + 1.0004292339628957 + ], + "motion_type": "STATIC" + }, + { + "template_name": "09843c7d1af4d42f2c34c69e80992049361770dd", + "translation": [ + 13.123833656311035, + 0.9000003363712281, + -6.943372258938986 + ], + "rotation": [ + 0.241921908920184, + -3.123361738573381e-10, + 0.970295722954817, + 5.778388532340394e-08 + ], + "non_uniform_scale": [ + 1.4234342278758092, + 1.388888670338541, + 1.4490564181535726 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 11.90044116973877, + 9.66663620260988e-08, + -1.621792338979695 + ], + "rotation": [ + -4.371138734830304e-08, + -1.3470696808800304e-16, + 0.9999999999999973, + 5.978235984341905e-08 + ], + "non_uniform_scale": [ + 1.6816401481628482, + 0.8207159256081609, + 0.7358489947499023 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 8.855546951293945, + 7.557904382338165e-07, + -12.68005867719296 + ], + "rotation": [ + 0.7071068022599731, + 1.0546157693260478e-09, + -0.7071067601131199, + -4.325702408038572e-08 + ], + "non_uniform_scale": [ + 1.266989036381898, + 0.8065656654160366, + 0.8490565509166388 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 11.926468849182129, + 4.6028279143683903e-07, + -7.722263352736007 + ], + "rotation": [ + 1.0, + -6.580700078630081e-11, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.6586040258407593, + 0.8065656654160362, + 0.7547169620136016 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 6.359774112701416, + 8.519534162587661e-07, + -14.293405634557814 + ], + "rotation": [ + 0.7071068022599726, + 2.3662673281185494e-09, + -0.7071067601131205, + -4.481242632061792e-08 + ], + "non_uniform_scale": [ + 0.9214465664955039, + 0.8207159256081615, + 0.9245282456559984 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 0.17522643506526947, + 8.523817882633011e-07, + -14.30059252377788 + ], + "rotation": [ + 0.7071068022599726, + 2.3662673281185494e-09, + 0.7071067601131205, + 4.481242632061792e-08 + ], + "non_uniform_scale": [ + 0.9214465664955039, + 0.8207159256081615, + 0.9245282456559984 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 4.800082206726074, + 8.903022319373122e-08, + -1.4936791960192153 + ], + "rotation": [ + -4.3711388944966015e-08, + -7.480975634790689e-17, + 0.9999999999999973, + 5.965678384104319e-08 + ], + "non_uniform_scale": [ + 1.7737848758697576, + 0.820715925608161, + 0.7735848696726693 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 9.631773948669434, + 4.2216711904075055e-07, + -7.082788522077266 + ], + "rotation": [ + 0.9025852840509386, + -4.66303981213632e-10, + 0.4305110974349973, + 2.4835693572918682e-08 + ], + "non_uniform_scale": [ + 1.4397603668309014, + 0.8065656654160362, + 0.7547170027658792 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 0.6448010802268982, + 3.2058244414656656e-07, + -5.378480590672439 + ], + "rotation": [ + -4.371138924038789e-08, + 3.001023083301297e-17, + 0.9999999999999973, + 5.961237820131345e-08 + ], + "non_uniform_scale": [ + 1.5894955396652282, + 0.8207159256081612, + 0.8396225762817145 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 13.044679641723633, + 2.509999843079837, + -0.03731637166044033 + ], + "rotation": [ + 0.7071067601131215, + 1.2101788454927035e-09, + 0.7071068022599718, + 4.3430761843268495e-08 + ], + "non_uniform_scale": [ + -0.9444827470491679, + 0.820715925608161, + 0.7735848561772792 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 11.90038013458252, + -5.277415198179369e-07, + 8.854032942412289 + ], + "rotation": [ + -0.00035770335372132514, + -1.3563362250919983e-12, + 0.9999999360241515, + 5.988102731569709e-08 + ], + "non_uniform_scale": [ + -1.6355679644381282, + 0.778265085427149, + 0.6792452667799709 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2fa75eaccb316cfe425443170a4c592ce744150d", + "translation": [ + 11.881185531616211, + -3.4598753018144635e-07, + 5.804707181173114 + ], + "rotation": [ + 1.0, + -7.60228851151593e-11, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.842893362045288, + 0.820715925608161, + 0.764150886040815 + ], + "motion_type": "STATIC" + }, + { + "template_name": "2e67550ebfbba75f09dc42129dbfee02648e56df", + "translation": [ + 17.28700065612793, + 2.1401881142146664, + -4.4129997162110755 + ], + "rotation": [ + -0.5000000237311454, + -0.4999999920247838, + 0.5000000359306701, + -0.49999994831339606 + ], + "non_uniform_scale": [ + -0.9999998807907162, + 0.9999998211860766, + 0.9399476122918543 + ], + "motion_type": "STATIC" + }, + { + "template_name": "57346c22693590f256c92ff2ebf04605458a0352", + "translation": [ + 9.097999572753906, + -0.19999918764829072, + -13.47899930006265 + ], + "rotation": [ + 0.7071068022599741, + -1.0077241600345789e-08, + -0.7071067601131195, + -3.532959595955107e-08 + ], + "non_uniform_scale": [ + 0.9999998807907176, + 2.020201680636189, + 1.3666663547357139 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1e5f2201cc9bb1d55871aac979996d1280fc71ac_part_1", + "translation": [ + 7.427777872739753, + 2.418911765669222, + 4.776094705672002 + ], + "rotation": [ + -0.7071067601131215, + -1.4525313236658348e-09, + 0.7071068022599717, + 4.370691415642701e-08 + ], + "non_uniform_scale": [ + -0.849104771071388, + 1.0001920461425653, + 0.9312516491859171 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1e5f2201cc9bb1d55871aac979996d1280fc71ac_part_1", + "translation": [ + 7.387742120632802, + 2.418911716171891, + 5.6495216024143255 + ], + "rotation": [ + -0.21688291802479928, + 2.333482794050729e-08, + 0.976197623367854, + 3.633164595946901e-08 + ], + "non_uniform_scale": [ + -0.9171196362569748, + 1.0001920461425653, + 0.8643495352920362 + ], + "motion_type": "STATIC" + }, + { + "template_name": "1e5f2201cc9bb1d55871aac979996d1280fc71ac_part_3", + "translation": [ + 6.938754096398369, + 2.4199996393885597, + 5.219640749194676 + ], + "rotation": [ + -0.7071067601131215, + -1.4525313236658348e-09, + 0.7071068022599717, + 4.370691415642701e-08 + ], + "non_uniform_scale": [ + -0.849104771071388, + 1.0001920461425653, + 0.9312516491859171 + ], + "motion_type": "STATIC" + }, + { + "template_name": "075c48b41236ddbb5f8167b363feddfb7ed9c137", + "translation": [ + 11.439000129699707, + 3.000000089108937, + -4.494999438822276 + ], + "rotation": [ + 0.7071068022599728, + 2.9864669555118016e-09, + -0.7071067601131201, + -4.5626433917983825e-08 + ], + "non_uniform_scale": [ + 1.3979308964055244, + 1.1998200178360838, + 1.3979308964055235 + ], + "motion_type": "STATIC" + }, + { + "template_name": "075c48b41236ddbb5f8167b363feddfb7ed9c137", + "translation": [ + 14.86400032043457, + 3.0000002090334874, + -6.506999402821066 + ], + "rotation": [ + 0.7071068022599722, + 6.0009611137849784e-09, + -0.7071067601131202, + -5.053703865226953e-08 + ], + "non_uniform_scale": [ + 1.3979308964055244, + 0.9998499155223417, + 1.397930896405523 + ], + "motion_type": "STATIC" + }, + { + "template_name": "b403849fe16897c7d53d2578edaa859c46164e71", + "translation": [ + 7.736245155334473, + 0.850000126587453, + -2.57378486253112 + ], + "rotation": [ + 0.0, + 0.0, + 0.9999999999999981, + 6.154464838218381e-08 + ], + "non_uniform_scale": [ + 1.3103102445602417, + 1.0005149840694632, + 1.4324780187036854 + ], + "motion_type": "STATIC" + }, + { + "template_name": "6d081c66892c3b79c5915d8bf3600ee7e3cd1690", + "translation": [ + 15.516880989074707, + 2.5699994873404677, + 4.910999635398397 + ], + "rotation": [ + -0.7071067601131288, + 1.0880131768101156e-07, + 0.7071068022599568, + 2.4492799552193813e-08 + ], + "non_uniform_scale": [ + -1.0104164474954338, + 0.6490383566572622, + 3.9999995231628636 + ], + "motion_type": "STATIC" + }, + { + "template_name": "6d081c66892c3b79c5915d8bf3600ee7e3cd1690", + "translation": [ + 14.496999740600586, + 2.5699994307089042, + 5.861119550995838 + ], + "rotation": [ + 0.999999999999997, + -6.445084647079756e-08, + 4.3711387918544466e-08, + 9.331199471756669e-15 + ], + "non_uniform_scale": [ + -1.0520833730697672, + 0.6490383566572622, + 3.9999995231628787 + ], + "motion_type": "STATIC" + }, + { + "template_name": "6d081c66892c3b79c5915d8bf3600ee7e3cd1690", + "translation": [ + 7.990119934082031, + 2.5699996995329926, + 1.3510000240206708 + ], + "rotation": [ + 0.7071067601131298, + -1.169823969385415e-07, + 0.7071068022599546, + 2.429017112349275e-08 + ], + "non_uniform_scale": [ + -1.1145831874261387, + 0.6105768548755038, + 3.9999995231628636 + ], + "motion_type": "STATIC" + }, + { + "template_name": "6d081c66892c3b79c5915d8bf3600ee7e3cd1690", + "translation": [ + 15.867119789123535, + 2.569999647796152, + 2.219000122010698 + ], + "rotation": [ + 0.7071067601131296, + -1.1698239693854148e-07, + 0.7071068022599546, + 2.4290171123492748e-08 + ], + "non_uniform_scale": [ + -1.1041664419074988, + 0.6105768548755038, + 3.9999995231628636 + ], + "motion_type": "STATIC" + }, + { + "template_name": "71f80baa4252fccaf2b5033c41cfe914df11b42c", + "translation": [ + 0.7639999985694885, + 0.5899989985227414, + 15.771999407887439 + ], + "rotation": [ + 0.7071068022599735, + -4.619294648294243e-09, + 0.7071067601131199, + 3.8358058060099764e-08 + ], + "non_uniform_scale": [ + 1.640419743036047, + 1.999999761581434, + 1.6404197430360485 + ], + "motion_type": "STATIC" + }, + { + "template_name": "0b7c3e44a3d3cc591a423333383ebe9ab4d949ca", + "translation": [ + 15.489823341369629, + 2.09782991384688, + -11.69369901469176 + ], + "rotation": [ + -3.090861893686571e-08, + -3.090862030960523e-08, + 0.7071068444735308, + -0.7071067178995571 + ], + "non_uniform_scale": [ + 1.1776250600814864, + 1.0001972913506856, + 0.9237162561754828 + ], + "motion_type": "STATIC" + }, + { + "template_name": "0b7c3e44a3d3cc591a423333383ebe9ab4d949ca", + "translation": [ + -2.173823356628418, + 2.247286489904752, + -5.102299729014248 + ], + "rotation": [ + 0.7071068024776093, + 0.7071067598954799, + 6.181724074719728e-08, + -6.181723692142081e-08 + ], + "non_uniform_scale": [ + 1.1776250600815, + 1.000197291350698, + 1.1546451861089178 + ], + "motion_type": "STATIC" + }, + { + "template_name": "0b7c3e44a3d3cc591a423333383ebe9ab4d949ca", + "translation": [ + 7.001823902130127, + 2.2472862057932392, + -0.33569979173026887 + ], + "rotation": [ + -3.090861853130173e-08, + -3.090862030300787e-08, + 0.7071068446244597, + -0.7071067177486282 + ], + "non_uniform_scale": [ + 1.1776250600814864, + 1.0001972913506867, + 1.154645186108918 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c2a02097a8366892be928f0485471d898002276b", + "translation": [ + 7.814000129699707, + 0.570000614225858, + -10.994999196231372 + ], + "rotation": [ + 0.7071068022599742, + -8.965977752433197e-09, + -0.7071067601131192, + -3.5856982205173875e-08 + ], + "non_uniform_scale": [ + 1.0934391562080885, + 1.1516313372097713, + 0.8078994269430994 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c2a02097a8366892be928f0485471d898002276b", + "translation": [ + 9.713000297546387, + 0.570000568687913, + -10.230999302804474 + ], + "rotation": [ + -4.371138876683376e-08, + -3.888220926044861e-16, + 0.9999999999999972, + 6.149694415971299e-08 + ], + "non_uniform_scale": [ + 1.0161254405975382, + 1.1516313372097713, + 0.8078994383931818 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c2a02097a8366892be928f0485471d898002276b", + "translation": [ + 8.501999855041504, + 0.570000568687913, + -10.230999302804474 + ], + "rotation": [ + -4.371138876683376e-08, + -3.888220926044861e-16, + 0.9999999999999972, + 6.149694415971299e-08 + ], + "non_uniform_scale": [ + 1.0161254405975382, + 1.1516313372097713, + 0.8078994383931818 + ], + "motion_type": "STATIC" + }, + { + "template_name": "c2a02097a8366892be928f0485471d898002276b", + "translation": [ + 8.58899974822998, + 0.5700006598234317, + -11.759999493956553 + ], + "rotation": [ + 1.0, + -1.8922958316086715e-09, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 1.1044842004776, + 1.1516313372097713, + 0.8078994383931787 + ], + "motion_type": "STATIC" + }, + { + "template_name": "d7fd25440d82e45d3d994cc560206a1f96c2af99", + "translation": [ + 6.390000343322754, + 2.7601617929859685, + -9.35603355668809 + ], + "rotation": [ + 0.502176902154723, + 0.5021769384338254, + -0.4978135785606315, + 0.4978135418489271 + ], + "non_uniform_scale": [ + -0.73461887645367, + 0.9980038741067937, + 0.8067687980212179 + ], + "motion_type": "STATIC" + }, + { + "template_name": "605f233dd70c9a66d02914f1420d964642bdba81_part_1", + "translation": [ + 8.365001496201609, + 0.5800074586130093, + 9.75499926294911 + ], + "rotation": [ + 0.7071068022599735, + 2.8044306008190012e-09, + -0.7071067601131197, + -4.538178220933255e-08 + ], + "non_uniform_scale": [ + -1.02213364707627, + 1.0036201472735164, + 1.1576835419128209 + ], + "motion_type": "STATIC" + }, + { + "template_name": "605f233dd70c9a66d02914f1420d964642bdba81_part_2", + "translation": [ + 8.535555555877224, + 0.5799992979532927, + 10.605868591543462 + ], + "rotation": [ + 0.7071068022599735, + 2.8044306008190012e-09, + -0.7071067601131197, + -4.538178220933255e-08 + ], + "non_uniform_scale": [ + -1.02213364707627, + 1.0036201472735164, + 1.1576835419128209 + ], + "motion_type": "STATIC" + }, + { + "template_name": "605f233dd70c9a66d02914f1420d964642bdba81_part_2", + "translation": [ + 7.776065349825426, + 0.5799993371981774, + 10.605868636812609 + ], + "rotation": [ + 0.7071068022599735, + 2.804437860572373e-09, + -0.7071067601131197, + -4.5381772549650984e-08 + ], + "non_uniform_scale": [ + -1.0221336470762703, + 1.0036201472735164, + 1.1576835419128209 + ], + "motion_type": "STATIC" + }, + { + "template_name": "605f233dd70c9a66d02914f1420d964642bdba81_part_4", + "translation": [ + 8.075765229978499, + 0.579999313643736, + 10.059233524020307 + ], + "rotation": [ + 0.7071068022599735, + 2.8044306008190012e-09, + -0.7071067601131197, + -4.538178220933255e-08 + ], + "non_uniform_scale": [ + -1.02213364707627, + 1.0036201472735164, + 1.1576835419128209 + ], + "motion_type": "STATIC" + }, + { + "template_name": "bd82b03e76b8fbba79e0fad0d7850c738badce77", + "translation": [ + 8.51845645904541, + -2.2173028924044047e-07, + 3.7200167345990565 + ], + "rotation": [ + 1.0, + -2.608236006055866e-10, + 0.0, + 0.0 + ], + "non_uniform_scale": [ + 0.9818451404571533, + 1.1108901368510475, + 0.9733192356444252 + ], + "motion_type": "STATIC" + }, + { + "template_name": "76eb8317661751dd4897b39db29df5db517e2d5c", + "translation": [ + 9.439000129699707, + 1.4340876930418744e-07, + -2.405999755501753 + ], + "rotation": [ + 0.250379957078192, + 4.428709120950701e-10, + 0.9681476525269889, + 5.787827212700988e-08 + ], + "non_uniform_scale": [ + 1.4579495589103635, + 1.4950714713249726, + 1.4063375558373736 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9c61e7e98634fda17cd2276857cea3c03ad1024d", + "translation": [ + 7.529996871948242, + 5.428792064776644e-07, + -9.108001166105169 + ], + "rotation": [ + -0.4999999515758448, + -3.986783072779621e-09, + 0.8660254317421341, + 5.5602483879196915e-08 + ], + "non_uniform_scale": [ + 1.7789596952916866, + 1.0017938611753072, + 0.7337654009259619 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9c61e7e98634fda17cd2276857cea3c03ad1024d", + "translation": [ + -3.0779950618743896, + 5.151033519723569e-07, + -8.641999683260906 + ], + "rotation": [ + 0.7071068022599737, + 9.202390240259266e-12, + 0.7071067601131195, + 4.215605617803323e-08 + ], + "non_uniform_scale": [ + 1.4044415113662772, + 0.999929904946093, + 1.0003667473574431 + ], + "motion_type": "STATIC" + }, + { + "template_name": "9c61e7e98634fda17cd2276857cea3c03ad1024d", + "translation": [ + 6.860000133514404, + 4.873876378042041e-07, + -8.17700718778326 + ], + "rotation": [ + -4.371138905341697e-08, + 6.056296093072111e-16, + 0.9999999999999972, + 6.180319512923066e-08 + ], + "non_uniform_scale": [ + 0.5992285013198875, + 1.0017938611753103, + 1.467530671652469 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3753-0", + "translation": [ + -0.7329999804496765, + 2.0499996679425294, + 2.7209999161362646 + ], + "rotation": [ + 0.9999999999999973, + 5.960464832810436e-08, + 4.371138781308187e-08, + -1.5529406128515055e-22 + ], + "non_uniform_scale": [ + -1.0000000000000038, + 0.9999998807907176, + 0.9999998807907214 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3753-0", + "translation": [ + -1.566999912261963, + 2.0499996679425294, + 2.7209999161362646 + ], + "rotation": [ + 0.9999999999999973, + 5.960464832810436e-08, + 4.371138781308187e-08, + -1.5529406128515055e-22 + ], + "non_uniform_scale": [ + -1.0000000000000038, + 0.9999998807907176, + 0.9999998807907214 + ], + "motion_type": "STATIC" + }, + { + "template_name": "204-0", + "translation": [ + -0.03999999910593033, + 1.6899998363852404, + 2.0150000855326624 + ], + "rotation": [ + 0.7071068331685849, + 4.214685412141269e-08, + -0.7071067292045052, + 1.9184883258843258e-22 + ], + "non_uniform_scale": [ + -0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "220-0", + "translation": [ + 10.256999969482422, + 2.3500005876421994, + -13.808999052107339 + ], + "rotation": [ + 0.9999999999999973, + 5.960464832810436e-08, + 4.371138781308187e-08, + -1.5529406128515055e-22 + ], + "non_uniform_scale": [ + -1.0000000000000038, + 0.9999998807907176, + 0.9999998807907214 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3753-1", + "translation": [ + 9.378999710083008, + 2.350000567793842, + -13.475998888850228 + ], + "rotation": [ + 0.7071068331685849, + 4.214685412141269e-08, + -0.7071067292045052, + 1.9184883258843258e-22 + ], + "non_uniform_scale": [ + -0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "220-1", + "translation": [ + 7.51800537109375, + 2.3550007730126623, + -11.00399986749882 + ], + "rotation": [ + -0.7067736049221722, + -4.212699398440791e-08, + 0.7074398005380496, + 1.813681673092133e-15 + ], + "non_uniform_scale": [ + -0.9999999669795063, + 0.9999998807907176, + 0.9999999669793737 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-0", + "translation": [ + 16.328327178955078, + 1.9750004038214897, + -8.349999766051745 + ], + "rotation": [ + -0.7069867676891199, + -4.213969887442351e-08, + 0.7072267743181733, + 1.213091217354803e-15 + ], + "non_uniform_scale": [ + -0.9999999383939026, + 0.9999998807907176, + 0.9999999383938822 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-1", + "translation": [ + 16.328800201416016, + 1.5850005243420355, + -9.741998951017877 + ], + "rotation": [ + -0.7069867676891199, + -4.213969887442351e-08, + 0.7072267743181733, + 1.213091217354803e-15 + ], + "non_uniform_scale": [ + -0.9999999383939026, + 0.9999998807907176, + 0.9999999383938822 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-2", + "translation": [ + 16.895999908447266, + 1.6500003178119655, + -7.3819994311332735 + ], + "rotation": [ + -8.742277562616284e-08, + -5.210803853528463e-15, + 0.9999999999999962, + 0.0 + ], + "non_uniform_scale": [ + -1.0000000000000153, + 0.9999998807907176, + 0.9999998807907329 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-3", + "translation": [ + 6.476584434509277, + 1.7500002964139014, + -6.722999544560906 + ], + "rotation": [ + 0.7076258917877594, + 4.217779104867594e-08, + -0.7065872892088964, + 1.3775372481349825e-15 + ], + "non_uniform_scale": [ + -0.9999999462072235, + 0.9999998807907176, + 0.9999999462068601 + ], + "motion_type": "STATIC" + }, + { + "template_name": "204-0", + "translation": [ + 0.5219993591308594, + 1.1200004027221766, + -7.796556418147269 + ], + "rotation": [ + -0.00045713583049037185, + -2.724741966756852e-11, + 0.9999998955134108, + -8.419611865664666e-22 + ], + "non_uniform_scale": [ + 0.9999999411091041, + 0.9999998807907176, + 0.9999998218998966 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-4", + "translation": [ + 2.1480002403259277, + 1.85000037837289, + -7.798043152806535 + ], + "rotation": [ + -0.00045713583049037185, + -2.724741966756852e-11, + 0.9999998955134108, + -8.419611865664666e-22 + ], + "non_uniform_scale": [ + -0.9999999411091041, + 0.9999998807907176, + 0.9999998218998966 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-4", + "translation": [ + 3.7090003490448, + 1.8500003784579562, + -7.799470326335971 + ], + "rotation": [ + -0.00045713583049037185, + -2.724741966756852e-11, + 0.9999998955134108, + -8.419611865664666e-22 + ], + "non_uniform_scale": [ + -0.9999999411091041, + 0.9999998807907176, + 0.9999998218998966 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3753-2", + "translation": [ + 5.2769999504089355, + 1.8500003785434203, + -7.800904175585224 + ], + "rotation": [ + -0.00045713583049037185, + -2.724741966756852e-11, + 0.9999998955134108, + -8.419611865664666e-22 + ], + "non_uniform_scale": [ + -0.9999999411091041, + 0.9999998807907176, + 0.9999998218998966 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-5", + "translation": [ + 13.324000358581543, + 2.2299991819858462, + 11.813999558448785 + ], + "rotation": [ + -8.742277562616284e-08, + -5.210803853528463e-15, + 0.9999999999999962, + 0.0 + ], + "non_uniform_scale": [ + -1.0000000000000153, + 0.9999998807907176, + 0.9999998807907329 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-6", + "translation": [ + 7.690000057220459, + 1.7500002389550104, + -5.758999376952659 + ], + "rotation": [ + 0.9999999999999973, + 5.960464832810436e-08, + 4.371138781308187e-08, + -1.5529406128515055e-22 + ], + "non_uniform_scale": [ + -1.0000000000000038, + 0.9999998807907176, + 0.9999998807907214 + ], + "motion_type": "STATIC" + }, + { + "template_name": "208-0", + "translation": [ + 8.98849868774414, + 1.4200001382529663, + -4.459499485522521 + ], + "rotation": [ + 0.7072431243300731, + 1.5662403450714644e-15, + 0.706970411748494, + 4.213872433761785e-08 + ], + "non_uniform_scale": [ + 0.9999999551628747, + 0.9999998807907176, + 0.999999955162851 + ], + "motion_type": "STATIC" + }, + { + "template_name": "219-0", + "translation": [ + 8.98849868774414, + 3.49000006729365, + -4.458999636828892 + ], + "rotation": [ + 0.7072431243300731, + 1.5662403450714644e-15, + 0.706970411748494, + 4.213872433761785e-08 + ], + "non_uniform_scale": [ + 0.9999999551628747, + 0.9999998807907176, + 0.999999955162851 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-7", + "translation": [ + 8.060999870300293, + 3.744999345600604, + 5.314000036180005 + ], + "rotation": [ + 0.7071067292045052, + -1.9184883258843258e-22, + 0.7071068331685849, + 4.214685412141269e-08 + ], + "non_uniform_scale": [ + 0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "220-2", + "translation": [ + 11.914999961853027, + 2.7699998849034344, + -1.1589998049139965 + ], + "rotation": [ + 0.9999999999999897, + 5.96046483281039e-08, + 1.31134154557458e-07, + -4.658822785187639e-22 + ], + "non_uniform_scale": [ + -1.0000000000000344, + 0.9999998807907176, + 0.999999880790752 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3753-0", + "translation": [ + 16.327205657958984, + 2.35000056070092, + -13.356999414741978 + ], + "rotation": [ + 0.707268131816717, + 4.2156466075961994e-08, + -0.7069453937303002, + 2.1945047949004075e-15 + ], + "non_uniform_scale": [ + -0.9999999849505995, + 0.9999998807907176, + 0.9999999849505702 + ], + "motion_type": "STATIC" + }, + { + "template_name": "204-1", + "translation": [ + 12.100000381469727, + 1.6850006654262586, + -13.808999091744425 + ], + "rotation": [ + -4.371138781308187e-08, + 1.5529406128515055e-22, + 0.9999999999999973, + 5.960464832810436e-08 + ], + "non_uniform_scale": [ + -1.0000000000000038, + 0.9999998807907176, + 0.9999998807907214 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-8", + "translation": [ + 11.47599983215332, + 1.6850006654262586, + -13.808999091744425 + ], + "rotation": [ + -4.371138781308187e-08, + 1.5529406128515055e-22, + 0.9999999999999973, + 5.960464832810436e-08 + ], + "non_uniform_scale": [ + -1.0000000000000038, + 0.9999998807907176, + 0.9999998807907214 + ], + "motion_type": "STATIC" + }, + { + "template_name": "219-1", + "translation": [ + 17.36199951171875, + 1.6500002693533773, + -6.568999277412907 + ], + "rotation": [ + 0.7071067713513534, + 4.21468504368188e-08, + 0.7071067910217403, + -1.0294328215895812e-22 + ], + "non_uniform_scale": [ + -0.9999998807907162, + 0.9999998807907176, + 0.9999998807907127 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-9", + "translation": [ + 14.662036895751953, + 2.229999209282056, + 11.356045179006713 + ], + "rotation": [ + 0.9428592060469003, + 5.6198791057214735e-08, + 0.3331914128134242, + -1.1302257237912896e-15 + ], + "non_uniform_scale": [ + -0.9999999946114078, + 0.9999998807907176, + 0.9999998982463576 + ], + "motion_type": "STATIC" + }, + { + "template_name": "211-0", + "translation": [ + -0.08099811524152756, + 1.7050000595153136, + -1.9835010952650691 + ], + "rotation": [ + 0.70721773389673, + 4.215346328215326e-08, + -0.7069958110639498, + 1.0376980981285547e-15 + ], + "non_uniform_scale": [ + -0.9999999300404635, + 0.9999998807907176, + 0.999999930040445 + ], + "motion_type": "STATIC" + }, + { + "template_name": "220-3", + "translation": [ + -0.0860026627779007, + 3.499999910473818, + -1.9979995788335856 + ], + "rotation": [ + 0.7069958110639498, + -1.0376980981285547e-15, + 0.70721773389673, + 4.215346328215326e-08 + ], + "non_uniform_scale": [ + 0.9999999300404635, + 0.9999998807907176, + 0.999999930040445 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-4", + "translation": [ + -0.08699999749660492, + 1.8500003010034547, + -6.499999502301215 + ], + "rotation": [ + 0.7071068331685849, + 4.214685412141269e-08, + -0.7071067292045052, + 1.9184883258843258e-22 + ], + "non_uniform_scale": [ + -0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "219-2", + "translation": [ + -3.3320000171661377, + 2.5000002441406366, + -6.5959996523857 + ], + "rotation": [ + 0.7071067713513534, + 4.21468504368188e-08, + 0.7071067910217403, + -1.0294328215895812e-22 + ], + "non_uniform_scale": [ + -0.9999998807907162, + 0.9999998807907176, + 0.9999998807907127 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-10", + "translation": [ + 6.475889682769775, + 1.9249997408389987, + 1.6230001629590873 + ], + "rotation": [ + -0.7068982809008284, + -4.213442458771423e-08, + 0.7073152200111714, + 1.1497141605876796e-15 + ], + "non_uniform_scale": [ + -0.9999999354196714, + 0.9999998807907176, + 0.9999999354196056 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-11", + "translation": [ + 15.2223539352417, + 2.2299993047118107, + 9.75499966591596 + ], + "rotation": [ + 0.7073057383050123, + 4.2158708965937116e-08, + -0.7069077680721861, + 8.252356647404943e-16 + ], + "non_uniform_scale": [ + -0.9999999199617527, + 0.9999998807907176, + 0.9999999199616904 + ], + "motion_type": "STATIC" + }, + { + "template_name": "219-3", + "translation": [ + 17.36199951171875, + 1.5999994560176205, + 7.926509480088363 + ], + "rotation": [ + 0.7071067292045052, + -1.9184883258843258e-22, + 0.7071068331685849, + 4.214685412141269e-08 + ], + "non_uniform_scale": [ + 0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-10", + "translation": [ + 17.36199951171875, + 1.9249997148513813, + 2.059000007271763 + ], + "rotation": [ + 0.7071068331685849, + 4.214685412141269e-08, + -0.7071067292045052, + 1.9184883258843258e-22 + ], + "non_uniform_scale": [ + -0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-12", + "translation": [ + 17.36199951171875, + 1.5999995044690465, + 7.113629489324701 + ], + "rotation": [ + 0.7071067292045052, + -1.9184883258843258e-22, + 0.7071068331685849, + 4.214685412141269e-08 + ], + "non_uniform_scale": [ + 0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-10", + "translation": [ + 17.36199951171875, + 1.9249995344877249, + 5.08499984979629 + ], + "rotation": [ + 0.7071068331685849, + 4.214685412141269e-08, + -0.7071067292045052, + 1.9184883258843258e-22 + ], + "non_uniform_scale": [ + -0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-13", + "translation": [ + 6.474206447601318, + 1.7999996195435557, + 3.7829998741745925 + ], + "rotation": [ + 0.7069946729195756, + 4.214016990830402e-08, + 0.7072188716821267, + 1.058538543096863e-15 + ], + "non_uniform_scale": [ + 0.9999999310558051, + 0.9999998807907176, + 0.9999999310557863 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-13", + "translation": [ + 6.474684238433838, + 1.7999995295405, + 5.293000489890531 + ], + "rotation": [ + 0.7069946729195756, + 4.214016990830402e-08, + 0.7072188716821267, + 1.058538543096863e-15 + ], + "non_uniform_scale": [ + 0.9999999310558051, + 0.9999998807907176, + 0.9999999310557863 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-14", + "translation": [ + 7.322000026702881, + 3.744999287605282, + 6.287000027775747 + ], + "rotation": [ + 0.9999999999999962, + 0.0, + 8.742277562616284e-08, + 5.210803853528463e-15 + ], + "non_uniform_scale": [ + 1.0000000000000153, + 0.9999998807907176, + 0.9999998807907329 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-13", + "translation": [ + 6.474552154541016, + 1.7999994390011267, + 6.811999022245445 + ], + "rotation": [ + 0.7074082888400395, + 1.3838463954859474e-15, + 0.7068051449164794, + 4.212887348442483e-08 + ], + "non_uniform_scale": [ + 0.9999999465501292, + 0.9999998807907176, + 0.9999999465500149 + ], + "motion_type": "STATIC" + }, + { + "template_name": "211-1", + "translation": [ + 11.894500732421875, + 1.8049991354942208, + 11.818999647259695 + ], + "rotation": [ + -8.742277562616284e-08, + -5.210803853528463e-15, + 0.9999999999999962, + 0.0 + ], + "non_uniform_scale": [ + -1.0000000000000153, + 0.9999998807907176, + 0.9999998807907329 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-15", + "translation": [ + 10.627899169921875, + 2.229999208263706, + 11.373130253366782 + ], + "rotation": [ + 0.32082337200785743, + 1.9122564197494052e-08, + 0.9471390415210997, + -3.401583518770755e-16 + ], + "non_uniform_scale": [ + -0.9999999345002891, + 0.9999998807907176, + 0.9999998353655455 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-16", + "translation": [ + 10.036888122558594, + 2.2299993040561787, + 9.765999344825758 + ], + "rotation": [ + 0.7053566703791168, + 4.20425375865695e-08, + 0.7088525710976044, + 1.292705115969557e-15 + ], + "non_uniform_scale": [ + -0.99999994276692, + 0.9999998807907176, + 0.9999999427624325 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-17", + "translation": [ + 6.474000453948975, + 3.949999334037315, + 8.022999520719068 + ], + "rotation": [ + 0.7071067292045052, + -1.9184883258843258e-22, + 0.7071068331685849, + 4.214685412141269e-08 + ], + "non_uniform_scale": [ + 0.9999998807907267, + 0.9999998807907176, + 0.9999998807907231 + ], + "motion_type": "STATIC" + }, + { + "template_name": "3753-3", + "translation": [ + 16.919309616088867, + 1.5999994179010386, + 8.565999569535258 + ], + "rotation": [ + -8.742277562616284e-08, + -5.210803853528463e-15, + 0.9999999999999962, + 0.0 + ], + "non_uniform_scale": [ + -1.0000000000000153, + 0.9999998807907176, + 0.9999998807907329 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-18", + "translation": [ + 13.944000244140625, + 2.229999375581741, + 8.565999607086184 + ], + "rotation": [ + -8.742277562616284e-08, + -5.210803853528463e-15, + 0.9999999999999962, + 0.0 + ], + "non_uniform_scale": [ + -1.0000000000000153, + 0.9999998807907176, + 0.9999998807907329 + ], + "motion_type": "STATIC" + }, + { + "template_name": "218-19", + "translation": [ + 11.890000343322754, + 2.7099993658348467, + 8.569525369434018 + ], + "rotation": [ + 0.9999967930292861, + 5.960445717771863e-08, + 0.0025325740146227302, + -9.968344067635823e-18 + ], + "non_uniform_scale": [ + -1.000000012862703, + 0.9999998807907176, + 0.9999998936548841 + ], + "motion_type": "STATIC" + } + ] +} diff --git a/test/data/usd_conversion_data/EXAMPLE2.scene_instance.json b/test/data/usd_conversion_data/EXAMPLE2.scene_instance.json new file mode 100644 index 0000000000..4c38a265c5 --- /dev/null +++ b/test/data/usd_conversion_data/EXAMPLE2.scene_instance.json @@ -0,0 +1,29 @@ + +{ + "_comment": "This document was originally 102343992.scene_instance.json in the hssd repo", + "stage_instance": { + "template_name": "stages/102343992" + }, + "translation_origin": "asset_local", + "object_instances": [{ + "template_name": "1efdc3d37dfab1eb9f99117bb84c59003d684811", + "translation": [ + 7.869999885559082, + 1.200000514924497, + -9.038998947203183 + ], + "rotation": [ + 0.8660254049292261, + -1.7140893014617373e-08, + 0.4999999980171692, + 2.144662085814174e-08 + ], + "non_uniform_scale": [ + 0.9999999418353455, + 1.000248074501974, + 0.439367260520995 + ], + "motion_type": "STATIC" + }] + +} diff --git a/test/data/usd_conversion_data/hab_spot_arm_EXAMPLE.urdf b/test/data/usd_conversion_data/hab_spot_arm_EXAMPLE.urdf new file mode 100644 index 0000000000..1032d2edf9 --- /dev/null +++ b/test/data/usd_conversion_data/hab_spot_arm_EXAMPLE.urdf @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/data/usd_conversion_data/hab_spot_arm_clean_CORRECT.urdf b/test/data/usd_conversion_data/hab_spot_arm_clean_CORRECT.urdf new file mode 100644 index 0000000000..78fdaa7e21 --- /dev/null +++ b/test/data/usd_conversion_data/hab_spot_arm_clean_CORRECT.urdf @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/data/usd_conversion_data/hab_spot_arm_clean_CORRECT_visual_removed.urdf b/test/data/usd_conversion_data/hab_spot_arm_clean_CORRECT_visual_removed.urdf new file mode 100644 index 0000000000..8c33fe0c53 --- /dev/null +++ b/test/data/usd_conversion_data/hab_spot_arm_clean_CORRECT_visual_removed.urdf @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/data/usd_conversion_data/objects_EXAMPLE2/1efdc3d37dfab1eb9f99117bb84c59003d684811.collider.glb b/test/data/usd_conversion_data/objects_EXAMPLE2/1efdc3d37dfab1eb9f99117bb84c59003d684811.collider.glb new file mode 100644 index 0000000000..352b6aaf89 Binary files /dev/null and b/test/data/usd_conversion_data/objects_EXAMPLE2/1efdc3d37dfab1eb9f99117bb84c59003d684811.collider.glb differ diff --git a/test/data/usd_conversion_data/objects_EXAMPLE2/1efdc3d37dfab1eb9f99117bb84c59003d684811.object_config.json b/test/data/usd_conversion_data/objects_EXAMPLE2/1efdc3d37dfab1eb9f99117bb84c59003d684811.object_config.json new file mode 100644 index 0000000000..93edea30e5 --- /dev/null +++ b/test/data/usd_conversion_data/objects_EXAMPLE2/1efdc3d37dfab1eb9f99117bb84c59003d684811.object_config.json @@ -0,0 +1 @@ +{"render_asset": "1efdc3d37dfab1eb9f99117bb84c59003d684811.glb", "collision_asset": "1efdc3d37dfab1eb9f99117bb84c59003d684811.collider.glb", "up": [0, 1, 0], "front": [0, 0, -1], "semantic_id": 26} diff --git a/test/test_isaac_sim.py b/test/test_isaac_sim.py new file mode 100644 index 0000000000..4117004acb --- /dev/null +++ b/test/test_isaac_sim.py @@ -0,0 +1,331 @@ +import json +import os +import sys +from typing import List + +import pytest +from lxml import etree as ET + +repo_dir = os.path.dirname(os.path.dirname(__file__)) +sys.path.insert(0, repo_dir) +isaacsim_dir = repo_dir + "/habitat-lab/habitat/isaac_sim" +sys.path.insert(0, isaacsim_dir) +sys.path.insert( + 0, repo_dir + "/habitat-lab/habitat/isaac_sim/asset_conversion" +) +scene_instance_conversion_script = ( + isaacsim_dir + "/asset_conversion/scene_instance_json_to_usd.py" +) +urdf_conversion_script = isaacsim_dir + "/asset_conversion//urdf_to_usd.py" + +from scene_instance_json_to_usd import convert_hab_scene +from urdf_to_usd import ( + add_habitat_visual_metadata_for_articulation, + clean_urdf, + convert_urdf, +) + +# Initialize the app here +print("Initializing AppLauncher...") + +from omni.isaac.lab.app import AppLauncher + +app_launcher = AppLauncher(headless=True) +simulation_app = app_launcher.app +from pxr import Usd + + +## Helper functions +def usd_to_habitat_position(position: List[float]) -> List[float]: + """ + Convert a position from USD (Z-up) to Habitat (Y-up) coordinate system. + + Issac (x, y, z) -> Habitat (-x, z, y) + """ + x, y, z = position + return [-x, z, y] + + +def usd_to_habitat_rotation(rotation: List[float]) -> List[float]: + """ + Convert a quaternion rotation from USD to Habitat coordinate system. + + Parameters + ---------- + rotation : list[float] + Quaternion in USD coordinates [w, x, y, z] (wxyz). + + Returns + ------- + list[float] + Quaternion in Habitat coordinates [w, x, y, z] (wxyz). + """ + HALF_SQRT2 = 0.70710678 # √0.5 + + # Combined inverse quaternion transform: (inverse of q_trans) + # q_x90_inv = [√0.5, √0.5, 0, 0] (wxyz format) + # q_y180_inv = [0, 0, -1, 0] (wxyz format) + # q_y90_inv = [HALF_SQRT2, 0.0, HALF_SQRT2, 0.0] + + q_x90_inv = [HALF_SQRT2, HALF_SQRT2, 0.0, 0.0] + # q_z90_inv = [HALF_SQRT2, 0.0, 0.0, HALF_SQRT2] + q_y180_inv = [0.0, 0.0, -1.0, 0.0] + # q_z180_inv = [0.0, 0.0, 0.0, 1.0] + + def quat_multiply(q1, q2): + w1, x1, y1, z1 = q1 + w2, x2, y2, z2 = q2 + w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2 + x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2 + y = w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2 + z = w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2 + return [w, x, y, z] + + def quat_inverse(q): + w, x, y, z = q + norm = w * w + x * x + y * y + z * z + return [w / norm, -x / norm, -y / norm, -z / norm] + + # Calculate the inverse of q_x90_inv and q_y180_inv + q_x90 = quat_inverse(q_x90_inv) + q_y180 = quat_inverse(q_y180_inv) + # Calculate q_trans by multiplying q_y180 and q_x90 + q_trans = quat_multiply(q_y180, q_x90) + # Multiply q_trans with rotation_usd to get the original rotation + w, x, y, z = rotation + rotation_hab = quat_multiply(q_trans, rotation) + + return rotation_hab + + +## scene_instance_json_to_usd.py unit tests + + +def test_wrong_scene_instance_path(): + scene_filepath = "./NONEXISTENT.scene_instance.json" + project_root_folder = repo_dir + scene_usd_filepath = ( + "/home/trandaniel/dev/habitat-lab/data/usd/NONEXISTENT.usda" + ) + with pytest.raises(FileNotFoundError): + convert_hab_scene( + scene_filepath, project_root_folder, scene_usd_filepath + ) + + +def test_example2_scene_instance(): + scene_filepath = ( + repo_dir + + "/test/data/usd_conversion_data/EXAMPLE2.scene_instance.json" + ) + project_root_folder = repo_dir + scene_usd_filepath = ( + repo_dir + "/data/usd/test_example2_scene_instance.usda" + ) + object_folder = ( + repo_dir + "/test/data/usd_conversion_data/objects_EXAMPLE2" + ) + + convert_hab_scene( + scene_filepath, project_root_folder, scene_usd_filepath, object_folder + ) + + # subprocess.run( + # [ + # "python", + # scene_instance_conversion_script, + # scene_filepath, + # project_root_folder, + # scene_usd_filepath, + # "--objects_folder", + # object_folder, + # ] + # ) + + stage = Usd.Stage.Open(scene_usd_filepath) + xform_path = "/Scene/OBJECT_1efdc3d37dfab1eb9f99117bb84c59003d684811" + xform_prim = stage.GetPrimAtPath(xform_path) + + usda_orient_im = list( + xform_prim.GetAttribute("xformOp:orient").Get().imaginary + ) + usda_orient_real = xform_prim.GetAttribute("xformOp:orient").Get().real + # usda_scale = list(xform_prim.GetAttribute("xformOp:scale").Get()) + usda_translate = list(xform_prim.GetAttribute("xformOp:translate").Get()) + + # change usd coords back to habitat coords + + usda_translate_hab_coord = usd_to_habitat_position(usda_translate) + usda_rotation = [usda_orient_real] + usda_orient_im + usda_rotation_hab_coord = usd_to_habitat_rotation(usda_rotation) + + with open(scene_filepath, "r") as file: + scene_instance_json_data = json.load(file) + + scene_instance_translation = scene_instance_json_data["object_instances"][ + 0 + ]["translation"] + scene_instance_rotation = scene_instance_json_data["object_instances"][0][ + "rotation" + ] + # scene_instance_uniform_scale = scene_instance_json_data[ + # "object_instances" + # ][0]["non_uniform_scale"] + + assert usda_translate_hab_coord == pytest.approx( + scene_instance_translation + ) + assert usda_rotation_hab_coord == pytest.approx(scene_instance_rotation) + # TODO: Add Scale to show values are equal, looks like most objects are (1, 1, 1) for the (x, y, z) coordinates in hab space. + # Not sure, but pxr space is has values from 0 to infinity, and 1 is default, but hab space has + # -1 values? Don't know what hab space scaling is. + + assert os.path.exists(scene_usd_filepath) + os.remove(scene_usd_filepath) + + +## urdf_to_usd.py unit tests + + +def test_clean_urdf(): + urdf_dir = repo_dir + "/test/data/usd_conversion_data/" + input_file = urdf_dir + "hab_spot_arm_EXAMPLE.urdf" + output_file = urdf_dir + "hab_spot_arm_clean.urdf" + correct_file = urdf_dir + "hab_spot_arm_clean_CORRECT.urdf" + removed_visual = urdf_dir + "hab_spot_arm_clean_visual_removed.urdf" + removed_visual_CORRECT = ( + urdf_dir + "hab_spot_arm_clean_CORRECT_visual_removed.urdf" + ) + + clean_urdf(input_file, output_file, remove_visual=False) + clean_urdf(input_file, removed_visual, remove_visual=True) + + tree_test = ET.parse(output_file) + root_test = tree_test.getroot() + tree_correct = ET.parse(correct_file) + root_correct = tree_correct.getroot() + + tree_removed_visual = ET.parse(removed_visual) + root_removed_visual = tree_removed_visual.getroot() + tree_removed_visual_CORRECT = ET.parse(removed_visual_CORRECT) + root_removed_visual_CORRECT = tree_removed_visual_CORRECT.getroot() + + # Update and names + for element1, element2 in zip( + root_test.xpath("//*[@name]"), root_correct.xpath("//*[@name]") + ): + assert element1.get("name") == element2.get("name") + + # Update references to + for element1, element2 in zip( + root_test.xpath("//parent[@link]"), + root_correct.xpath("//parent[@link]"), + ): + assert element1.get("link") == element2.get("link") + + # Update references to + for element1, element2 in zip( + root_test.xpath("//child[@link]"), root_correct.xpath("//child[@link]") + ): + assert element1.get("link") == element2.get("link") + + # Optionally remove elements + assert len(root_removed_visual.xpath("//visual")) == 0 + assert len(root_removed_visual_CORRECT.xpath("//visual")) == 0 + + if os.path.exists(output_file): + os.remove(output_file) + + if os.path.exists(removed_visual): + os.remove(removed_visual) + + +def test_convert_urdf(): + urdf_dir = repo_dir + "/test/data/usd_conversion_data/" + clean_urdf_filepath = urdf_dir + "hab_spot_arm_clean_CORRECT.urdf" + output_usd = urdf_dir + "hab_spot_arm_test_convert_urdf.usda" + + convert_urdf(clean_urdf_filepath, output_usd) + + assert os.path.exists(output_usd) + os.remove(output_usd) + + +def test_add_habitat_visual_metadata_for_articulation(): + urdf_dir = repo_dir + "/test/data/usd_conversion_data/" + converted_clean_usda = urdf_dir + "hab_spot_arm_test_converted_urdf.usda" + reference_urdf_filepath = urdf_dir + "hab_spot_arm_EXAMPLE.urdf" + out_usd_filepath = urdf_dir + "hab_spot_arm_with_hab_metadata.usda" + project_root_folder = repo_dir + + add_habitat_visual_metadata_for_articulation( + converted_clean_usda, + reference_urdf_filepath, + out_usd_filepath, + project_root_folder, + ) + + # Parse the URDF file + urdf_tree = ET.parse(reference_urdf_filepath) + urdf_root = urdf_tree.getroot() + + # Get the robot name from the URDF + robot_name = urdf_root.get("name") + + # Build visual metadata dictionary + visual_metadata = {} + urdf_dir = os.path.dirname(os.path.abspath(reference_urdf_filepath)) + + for link in urdf_root.findall("link"): + link_name = link.get("name") + visual = link.find("visual") + if visual is not None: + geometry = visual.find("geometry") + if geometry is not None: + mesh = geometry.find("mesh") + if mesh is not None: + filename = mesh.get("filename") + asset_path = os.path.relpath( + os.path.abspath(os.path.join(urdf_dir, filename)), + start=project_root_folder, + ) + scale = (1.0, 1.0, 1.0) # Default scale + + # Check for scale in the element + scale_element = mesh.find("scale") + if scale_element is not None: + scale = tuple( + map(float, scale_element.text.split()) + ) # type: ignore # noqa: ALL + + # Replace periods with underscores for USD-safe names + # todo: use a standard get_sanitized_usd_name function here + safe_link_name = link_name.replace(".", "_") + visual_metadata[safe_link_name] = { + "assetPath": asset_path, + "assetScale": scale, + } + + # Open the USD file + stage_before_metadata = Usd.Stage.Open(converted_clean_usda) + stage_output_metadata = Usd.Stage.Open(out_usd_filepath) + + # See if habitatVisual data was contained inside usda file + for link_name, metadata in visual_metadata.items(): + prim_path = f"/{robot_name}/{link_name}" + prim = stage_before_metadata.GetPrimAtPath(prim_path) + + prim_output_metadata = stage_output_metadata.GetPrimAtPath(prim_path) + if prim: + assert ( + metadata["assetPath"] + == prim_output_metadata.GetAttribute( + "habitatVisual:assetPath" + ).Get() + ) + assert ( + metadata["assetScale"] + == prim_output_metadata.GetAttribute( + "habitatVisual:assetScale" + ).Get() + )