{
  "assembly_id": "ag_hexacopter_mechanical",
  "body_frame_convention": "origin at the hub centre on the arm-tube axis plane, +Z up, +X out of the rotor-1 bay; fixed by the root instance 'hub_plate_bottom' and its root placement",
  "clearance_requirements": {
    "artifact_path": "design_package/mechanical/clearance_requirements.json",
    "artifact_sha256": "50dab24166ad835401facafb36ea66b1bd00f1f0e5735ad857a95d57a89a76d5",
    "contribution_status": {
      "cable_cover_motion": "open (MECH_SPEC_GAP/pending_upstream_artifact)",
      "deflection": "open (MECH_DYNAMIC_LOAD_GAP/vendor_evidence)",
      "lubrication_seal_needs": "not applicable, with basis",
      "manufacturing_process_capability": "PROVISIONAL_PENDING_FAB_SELECTION for PA12 members (four candidate profiles, largest figure used); open (MECH_SPEC_GAP/process_capability) for CFRP cut parts, whose profiles publish stock tolerances only",
      "safety_service_requirement": "open (MECH_SPEC_GAP/requirement_absent)",
      "thermal_growth": "open (MECH_SPEC_GAP/vendor_evidence)",
      "tolerance_stack_up": "grounded in part; per-pair, from the mate chain"
    },
    "coverage": {
      "pairs_whose_requirement_is_a_lower_bound": 693,
      "pairs_with_a_fully_grounded_requirement": 0,
      "pairs_with_a_requirement": 693,
      "pairs_with_the_process_capability_term_partially_quantified": 144,
      "pairs_with_the_process_capability_term_quantified_provisionally": 0,
      "pairs_without_a_requirement": 0,
      "why_none_is_fully_grounded": "four of the seven SRS L7314 contributions have no grounded value for any pair, and the process-capability term is provisional on a fabricator selection nobody has made. Reporting 651 fully grounded requirements would be the failure this gate exists to catch"
    },
    "no_universal_rule_was_applied": "L7314: there is no universal 5 mm clearance rule. No constant appears in any requirement in this file. Every value is a sum of published vendor tolerances over that pair's own mate chain, so pairs with different chains have different requirements and a pair whose chain has no published tolerance gets 0.0 plus the open terms rather than a default",
    "open_contribution_codes": [
      "MECH_DYNAMIC_LOAD_GAP",
      "MECH_SPEC_GAP"
    ],
    "pair_count": 693,
    "pair_count_by_interface_class": {
      "rotating_blade_to_rotating_blade": 15,
      "rotating_blade_to_static_structure": 678
    },
    "reader_status": "Gate 4 reads this schema since 2026-10-09 (gate4_collision.py _read_clearance_requirements): it re-hashes the artifact against artifact_sha256, grades every blocking pair's measured separation bound against required_clearance_mm, and reports the open L7314 terms as the reason a cleared lower bound is not yet a met requirement. Until then it located the field by key name, had no reader, and counted zero pairs covered",
    "requirement_range_mm": {
      "max": 6.8,
      "min": 0.2
    },
    "requirements_are_lower_bounds": true,
    "schema_id": "anubis.stage2a.clearance_requirements/1",
    "srs_l7314_contributions": [
      "tolerance_stack_up",
      "manufacturing_process_capability",
      "deflection",
      "thermal_growth",
      "cable_cover_motion",
      "lubrication_seal_needs",
      "safety_service_requirement"
    ],
    "srs_ref": "SRS L7314-L7316 (Gate 4 clearance requirement and tolerance model)",
    "version": "1.1.0"
  },
  "design_variable_ids": [
    "class_requirements.thrust_to_weight",
    "class_requirements.propeller_spec",
    "class_requirements.esc_spec",
    "mechanical_requirements.footprint_max_m"
  ],
  "display_name": "Agricultural mapping hexacopter, mechanical assembly",
  "ground_contact": {
    "contact_normal_convention": "+Z is up in the body frame; the contact normal is the outward normal of the ground on the vehicle, i.e. (0, 0, 1) for a horizontal surface",
    "contact_points": [
      {
        "instance_id": "skid_wear_sleeve_1",
        "measurement_method": "BRepExtrema_DistShapeShape from the placed B-Rep to a horizontal reference plane; all extremal solutions retained",
        "normal_xyz": [
          0.0,
          0.0,
          1.0
        ],
        "part_id": "skid_wear_sleeve",
        "point_mm": [
          100.0,
          99.99999999999999,
          -210.99999999999997
        ]
      },
      {
        "instance_id": "skid_wear_sleeve_1",
        "measurement_method": "BRepExtrema_DistShapeShape from the placed B-Rep to a horizontal reference plane; all extremal solutions retained",
        "normal_xyz": [
          0.0,
          0.0,
          1.0
        ],
        "part_id": "skid_wear_sleeve",
        "point_mm": [
          20.0,
          99.99999999999999,
          -210.99999999999997
        ]
      },
      {
        "instance_id": "skid_wear_sleeve_2",
        "measurement_method": "BRepExtrema_DistShapeShape from the placed B-Rep to a horizontal reference plane; all extremal solutions retained",
        "normal_xyz": [
          0.0,
          0.0,
          1.0
        ],
        "part_id": "skid_wear_sleeve",
        "point_mm": [
          -20.0,
          99.99999999999999,
          -210.99999999999997
        ]
      },
      {
        "instance_id": "skid_wear_sleeve_2",
        "measurement_method": "BRepExtrema_DistShapeShape from the placed B-Rep to a horizontal reference plane; all extremal solutions retained",
        "normal_xyz": [
          0.0,
          0.0,
          1.0
        ],
        "part_id": "skid_wear_sleeve",
        "point_mm": [
          -100.0,
          99.99999999999999,
          -210.99999999999997
        ]
      },
      {
        "instance_id": "skid_wear_sleeve_3",
        "measurement_method": "BRepExtrema_DistShapeShape from the placed B-Rep to a horizontal reference plane; all extremal solutions retained",
        "normal_xyz": [
          0.0,
          0.0,
          1.0
        ],
        "part_id": "skid_wear_sleeve",
        "point_mm": [
          99.99999999999994,
          -100.00000000000009,
          -210.99999999999997
        ]
      },
      {
        "instance_id": "skid_wear_sleeve_3",
        "measurement_method": "BRepExtrema_DistShapeShape from the placed B-Rep to a horizontal reference plane; all extremal solutions retained",
        "normal_xyz": [
          0.0,
          0.0,
          1.0
        ],
        "part_id": "skid_wear_sleeve",
        "point_mm": [
          19.999999999999943,
          -100.00000000000009,
          -210.99999999999997
        ]
      },
      {
        "instance_id": "skid_wear_sleeve_4",
        "measurement_method": "BRepExtrema_DistShapeShape from the placed B-Rep to a horizontal reference plane; all extremal solutions retained",
        "normal_xyz": [
          0.0,
          0.0,
          1.0
        ],
        "part_id": "skid_wear_sleeve",
        "point_mm": [
          -20.000000000000057,
          -100.00000000000009,
          -210.99999999999997
        ]
      },
      {
        "instance_id": "skid_wear_sleeve_4",
        "measurement_method": "BRepExtrema_DistShapeShape from the placed B-Rep to a horizontal reference plane; all extremal solutions retained",
        "normal_xyz": [
          0.0,
          0.0,
          1.0
        ],
        "part_id": "skid_wear_sleeve",
        "point_mm": [
          -100.00000000000006,
          -100.00000000000009,
          -210.99999999999997
        ]
      }
    ],
    "evidence_path": "design_package/mechanical/ground_contact.json",
    "evidence_sha256": "c87847a9d1bbfa36b86c8b5036f2d71bf241fdfbc6a6f683b8a100a653879e97",
    "gap_codes": [
      "GROUND_FRICTION_DATA_GAP"
    ],
    "ground_plane_z_mm": -211.0,
    "max_unplaced_com_offset_for_zero_margin_mm": 494.78923621015446,
    "near_contact_instance_ids": [
      "leg_elbow_1",
      "leg_elbow_2",
      "leg_elbow_3",
      "leg_elbow_4",
      "skid_tube_1",
      "skid_tube_2"
    ],
    "placed_mass_kg": 13.38050934171452,
    "signed_margin_over_placed_fraction_mm": 98.62528402094124,
    "support_polygon_xy_mm": [
      [
        -100.00000000000006,
        -100.00000000000009
      ],
      [
        99.99999999999994,
        -100.00000000000009
      ],
      [
        100.0,
        99.99999999999999
      ],
      [
        -100.0,
        99.99999999999999
      ]
    ],
    "unplaced_mass_kg": 3.3310868565375333,
    "vehicle_margin_is_a_bound_because": "the vehicle centre of mass does not exist while any mass has no position, so a single tipping margin would be a number about a different aircraft. The inequality above is what the measured geometry actually supports"
  },
  "instances": [
    {
      "instance_id": "arm_clamp_lower_1",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          0.8660254037844387,
          0.49999999999999994,
          0.0,
          90.93266739736606
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          52.49999999999999
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_clamp_lower_to_hub onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_lower_2",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          6.123233995736766e-17,
          1.0,
          0.0,
          6.429395695523604e-15
        ],
        [
          1.0,
          -6.123233995736766e-17,
          0.0,
          105.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_clamp_lower_to_hub onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_lower_3",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          -0.8660254037844387,
          0.49999999999999994,
          0.0,
          -90.93266739736606
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          52.49999999999999
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_clamp_lower_to_hub onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_lower_4",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          -0.8660254037844386,
          -0.5000000000000001,
          0.0,
          -90.93266739736605
        ],
        [
          -0.5000000000000001,
          0.8660254037844386,
          0.0,
          -52.500000000000014
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_clamp_lower_to_hub onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_lower_5",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          -1.8369701987210297e-16,
          -1.0,
          0.0,
          -1.928818708657081e-14
        ],
        [
          -1.0,
          1.8369701987210297e-16,
          0.0,
          -105.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_clamp_lower_to_hub onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_lower_6",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          0.8660254037844384,
          -0.5000000000000004,
          0.0,
          90.93266739736603
        ],
        [
          -0.5000000000000004,
          -0.8660254037844384,
          0.0,
          -52.50000000000005
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_clamp_lower_to_hub onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_upper_1",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          90.93266739736606
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          52.49999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_clamp_upper_to_lower onto arm_clamp_lower_1, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_upper_2",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          6.123233995736766e-17,
          -1.0,
          0.0,
          6.429395695523604e-15
        ],
        [
          1.0,
          6.123233995736766e-17,
          0.0,
          105.0
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_clamp_upper_to_lower onto arm_clamp_lower_2, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_upper_3",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -90.93266739736606
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          52.49999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_clamp_upper_to_lower onto arm_clamp_lower_3, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_upper_4",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -90.93266739736605
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -52.500000000000014
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_clamp_upper_to_lower onto arm_clamp_lower_4, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_upper_5",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          -1.8369701987210297e-16,
          1.0,
          0.0,
          -1.928818708657081e-14
        ],
        [
          -1.0,
          -1.8369701987210297e-16,
          0.0,
          -105.0
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_clamp_upper_to_lower onto arm_clamp_lower_5, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_clamp_upper_6",
      "link_id": "base_link",
      "part_id": "arm_clamp",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          90.93266739736603
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -52.50000000000005
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_clamp_upper_to_lower onto arm_clamp_lower_6, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_tube_1",
      "link_id": "base_link",
      "part_id": "arm_tube",
      "placement": [
        [
          0.0,
          -0.49999999999999994,
          0.8660254037844387,
          51.96152422706632
        ],
        [
          0.0,
          0.8660254037844387,
          0.49999999999999994,
          29.999999999999996
        ],
        [
          -1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_tube_to_clamp onto arm_clamp_lower_1, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_tube_2",
      "link_id": "base_link",
      "part_id": "arm_tube",
      "placement": [
        [
          0.0,
          -1.0,
          6.123233995736766e-17,
          3.673940397442059e-15
        ],
        [
          0.0,
          6.123233995736766e-17,
          1.0,
          60.0
        ],
        [
          -1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_tube_to_clamp onto arm_clamp_lower_2, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_tube_3",
      "link_id": "base_link",
      "part_id": "arm_tube",
      "placement": [
        [
          0.0,
          -0.49999999999999994,
          -0.8660254037844387,
          -51.96152422706632
        ],
        [
          0.0,
          -0.8660254037844387,
          0.49999999999999994,
          29.999999999999996
        ],
        [
          -1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_tube_to_clamp onto arm_clamp_lower_3, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_tube_4",
      "link_id": "base_link",
      "part_id": "arm_tube",
      "placement": [
        [
          0.0,
          0.5000000000000001,
          -0.8660254037844386,
          -51.961524227066306
        ],
        [
          0.0,
          -0.8660254037844386,
          -0.5000000000000001,
          -30.00000000000001
        ],
        [
          -1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_tube_to_clamp onto arm_clamp_lower_4, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_tube_5",
      "link_id": "base_link",
      "part_id": "arm_tube",
      "placement": [
        [
          0.0,
          1.0,
          -1.8369701987210297e-16,
          -1.1021821192326178e-14
        ],
        [
          0.0,
          -1.8369701987210297e-16,
          -1.0,
          -60.0
        ],
        [
          -1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_tube_to_clamp onto arm_clamp_lower_5, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "arm_tube_6",
      "link_id": "base_link",
      "part_id": "arm_tube",
      "placement": [
        [
          0.0,
          0.5000000000000004,
          0.8660254037844384,
          51.961524227066306
        ],
        [
          0.0,
          0.8660254037844384,
          -0.5000000000000004,
          -30.00000000000003
        ],
        [
          -1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_tube_to_clamp onto arm_clamp_lower_6, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "article_u_oa1",
      "link_id": "base_link",
      "part_id": "article_u_oa1",
      "placement": [
        [
          0.5000000000000001,
          -0.8660254037844386,
          0.0,
          20.0
        ],
        [
          0.8660254037844386,
          0.5000000000000001,
          0.0,
          120.5
        ],
        [
          0.0,
          0.0,
          1.0,
          25.2
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:article_u_oa1_to_hub_plate_top onto hub_plate_top, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "article_u_oa2_u_oa5_1",
      "link_id": "base_link",
      "part_id": "article_u_oa2_u_oa5",
      "placement": [
        [
          0.0,
          1.0,
          0.0,
          118.0
        ],
        [
          -1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:article_u_oa2_u_oa5_1_to_hub_plate_bottom onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "article_u_oa2_u_oa5_2",
      "link_id": "base_link",
      "part_id": "article_u_oa2_u_oa5",
      "placement": [
        [
          0.0,
          -1.0,
          0.0,
          -118.0
        ],
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:article_u_oa2_u_oa5_2_to_hub_plate_bottom onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "article_u_oa2_u_oa5_3",
      "link_id": "base_link",
      "part_id": "article_u_oa2_u_oa5",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -59.0
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          -102.2
        ],
        [
          0.0,
          0.0,
          1.0,
          -22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:article_u_oa2_u_oa5_3_to_hub_plate_bottom onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "article_u_oa2_u_oa5_4",
      "link_id": "base_link",
      "part_id": "article_u_oa2_u_oa5",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          59.0
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -102.2
        ],
        [
          0.0,
          0.0,
          1.0,
          -22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:article_u_oa2_u_oa5_4_to_hub_plate_bottom onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "article_u_pm",
      "link_id": "base_link",
      "part_id": "article_u_pm",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          -40.5
        ],
        [
          0.0,
          1.0,
          0.0,
          106.5
        ],
        [
          0.0,
          0.0,
          1.0,
          25.2
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:article_u_pm_to_hub_plate_top onto hub_plate_top, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "article_u_telem",
      "link_id": "base_link",
      "part_id": "article_u_telem",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          63.0
        ],
        [
          0.0,
          1.0,
          0.0,
          -92.4
        ],
        [
          0.0,
          0.0,
          1.0,
          25.2
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:article_u_telem_to_hub_plate_top onto hub_plate_top, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "battery",
      "link_id": "base_link",
      "part_id": "battery",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          28.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:battery_to_tray onto battery_tray, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "battery_retainer_1",
      "link_id": "base_link",
      "part_id": "battery_retainer",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          126.0
        ],
        [
          0.0,
          1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          28.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:battery_retainer_1_to_tray onto battery_tray, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "battery_retainer_2",
      "link_id": "base_link",
      "part_id": "battery_retainer",
      "placement": [
        [
          -1.0,
          0.0,
          0.0,
          -126.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          28.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:battery_retainer_2_to_tray onto battery_tray, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "battery_tray",
      "link_id": "base_link",
      "part_id": "battery_tray",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          25.2
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:battery_tray_to_hub_top onto hub_plate_top, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_lower_1",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          0.8660254037844387,
          0.49999999999999994,
          0.0,
          424.352447854375
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_boom_lower_to_clamp onto arm_clamp_lower_1, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_lower_2",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          6.123233995736766e-17,
          1.0,
          0.0,
          3.0003846579110155e-14
        ],
        [
          1.0,
          -6.123233995736766e-17,
          0.0,
          490.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_boom_lower_to_clamp onto arm_clamp_lower_2, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_lower_3",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          -0.8660254037844387,
          0.49999999999999994,
          0.0,
          -424.352447854375
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_boom_lower_to_clamp onto arm_clamp_lower_3, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_lower_4",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          -0.8660254037844386,
          -0.5000000000000001,
          0.0,
          -424.35244785437493
        ],
        [
          -0.5000000000000001,
          0.8660254037844386,
          0.0,
          -245.00000000000006
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_boom_lower_to_clamp onto arm_clamp_lower_4, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_lower_5",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          -1.8369701987210297e-16,
          -1.0,
          0.0,
          -9.001153973733046e-14
        ],
        [
          -1.0,
          1.8369701987210297e-16,
          0.0,
          -490.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_boom_lower_to_clamp onto arm_clamp_lower_5, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_lower_6",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          0.8660254037844384,
          -0.5000000000000004,
          0.0,
          424.35244785437476
        ],
        [
          -0.5000000000000004,
          -0.8660254037844384,
          0.0,
          -245.00000000000023
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_boom_lower_to_clamp onto arm_clamp_lower_6, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_upper_1",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          424.352447854375
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_boom_upper_to_lower onto boom_mount_lower_1, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_upper_2",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          6.123233995736766e-17,
          -1.0,
          0.0,
          3.0003846579110155e-14
        ],
        [
          1.0,
          6.123233995736766e-17,
          0.0,
          490.0
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_boom_upper_to_lower onto boom_mount_lower_2, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_upper_3",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -424.352447854375
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_boom_upper_to_lower onto boom_mount_lower_3, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_upper_4",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -424.35244785437493
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -245.00000000000006
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_boom_upper_to_lower onto boom_mount_lower_4, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_upper_5",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          -1.8369701987210297e-16,
          1.0,
          0.0,
          -9.001153973733046e-14
        ],
        [
          -1.0,
          -1.8369701987210297e-16,
          0.0,
          -490.0
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_boom_upper_to_lower onto boom_mount_lower_5, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "boom_mount_upper_6",
      "link_id": "base_link",
      "part_id": "boom_mount",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          424.35244785437476
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -245.00000000000023
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_boom_upper_to_lower onto boom_mount_lower_6, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "camera",
      "link_id": "base_link",
      "part_id": "camera",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -79.6
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:camera_to_subtray onto camera_subtray, depth 7; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "camera_subtray",
      "link_id": "base_link",
      "part_id": "camera_subtray",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -79.6
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:camera_subtray_to_float_bracket_1 onto iso_bracket_float_1, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "dls2",
      "link_id": "base_link",
      "part_id": "dls2",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          -113.0
        ],
        [
          0.0,
          0.0,
          1.0,
          25.2
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:dls2_to_hub_top onto hub_plate_top, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_1",
      "link_id": "base_link",
      "part_id": "esc",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          277.1281292110204
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          159.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          18.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_esc_to_saddle onto esc_saddle_upper_1, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_2",
      "link_id": "base_link",
      "part_id": "esc",
      "placement": [
        [
          6.123233995736766e-17,
          -1.0,
          0.0,
          1.9594348786357652e-14
        ],
        [
          1.0,
          6.123233995736766e-17,
          0.0,
          320.0
        ],
        [
          0.0,
          0.0,
          1.0,
          18.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_esc_to_saddle onto esc_saddle_upper_2, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_3",
      "link_id": "base_link",
      "part_id": "esc",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -277.1281292110204
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          159.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          18.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_esc_to_saddle onto esc_saddle_upper_3, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_4",
      "link_id": "base_link",
      "part_id": "esc",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -277.12812921102034
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -160.00000000000006
        ],
        [
          0.0,
          0.0,
          1.0,
          18.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_esc_to_saddle onto esc_saddle_upper_4, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_5",
      "link_id": "base_link",
      "part_id": "esc",
      "placement": [
        [
          -1.8369701987210297e-16,
          1.0,
          0.0,
          -5.878304635907295e-14
        ],
        [
          -1.0,
          -1.8369701987210297e-16,
          0.0,
          -320.0
        ],
        [
          0.0,
          0.0,
          1.0,
          18.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_esc_to_saddle onto esc_saddle_upper_5, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_6",
      "link_id": "base_link",
      "part_id": "esc",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          277.1281292110203
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -160.00000000000014
        ],
        [
          0.0,
          0.0,
          1.0,
          18.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_esc_to_saddle onto esc_saddle_upper_6, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_lower_1",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          0.8660254037844387,
          0.49999999999999994,
          0.0,
          277.1281292110204
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          159.99999999999997
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_esc_saddle_lower_to_upper onto esc_saddle_upper_1, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_lower_2",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          6.123233995736766e-17,
          1.0,
          0.0,
          1.9594348786357652e-14
        ],
        [
          1.0,
          -6.123233995736766e-17,
          0.0,
          320.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_esc_saddle_lower_to_upper onto esc_saddle_upper_2, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_lower_3",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          -0.8660254037844387,
          0.49999999999999994,
          0.0,
          -277.1281292110204
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          159.99999999999997
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_esc_saddle_lower_to_upper onto esc_saddle_upper_3, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_lower_4",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          -0.8660254037844386,
          -0.5000000000000001,
          0.0,
          -277.12812921102034
        ],
        [
          -0.5000000000000001,
          0.8660254037844386,
          0.0,
          -160.00000000000006
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_esc_saddle_lower_to_upper onto esc_saddle_upper_4, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_lower_5",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          -1.8369701987210297e-16,
          -1.0,
          0.0,
          -5.878304635907295e-14
        ],
        [
          -1.0,
          1.8369701987210297e-16,
          0.0,
          -320.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_esc_saddle_lower_to_upper onto esc_saddle_upper_5, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_lower_6",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          0.8660254037844384,
          -0.5000000000000004,
          0.0,
          277.1281292110203
        ],
        [
          -0.5000000000000004,
          -0.8660254037844384,
          0.0,
          -160.00000000000014
        ],
        [
          0.0,
          0.0,
          -1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_esc_saddle_lower_to_upper onto esc_saddle_upper_6, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_upper_1",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          277.1281292110204
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          159.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_esc_saddle_upper_to_clamp onto arm_clamp_upper_1, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_upper_2",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          6.123233995736766e-17,
          -1.0,
          0.0,
          1.9594348786357652e-14
        ],
        [
          1.0,
          6.123233995736766e-17,
          0.0,
          320.0
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_esc_saddle_upper_to_clamp onto arm_clamp_upper_2, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_upper_3",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -277.1281292110204
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          159.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_esc_saddle_upper_to_clamp onto arm_clamp_upper_3, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_upper_4",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -277.12812921102034
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -160.00000000000006
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_esc_saddle_upper_to_clamp onto arm_clamp_upper_4, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_upper_5",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          -1.8369701987210297e-16,
          1.0,
          0.0,
          -5.878304635907295e-14
        ],
        [
          -1.0,
          -1.8369701987210297e-16,
          0.0,
          -320.0
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_esc_saddle_upper_to_clamp onto arm_clamp_upper_5, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "esc_saddle_upper_6",
      "link_id": "base_link",
      "part_id": "esc_saddle",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          277.1281292110203
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -160.00000000000014
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_esc_saddle_upper_to_clamp onto arm_clamp_upper_6, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "flight_controller",
      "link_id": "base_link",
      "part_id": "flight_controller",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:flight_controller_to_hub_top onto hub_plate_top, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "hub_plate_bottom",
      "link_id": "base_link",
      "part_id": "hub_plate_bottom",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -25.2
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "root datum, depth 0 (the single absolute coordinate in the assembly)"
    },
    {
      "instance_id": "hub_plate_top",
      "link_id": "base_link",
      "part_id": "hub_plate_top",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:hub_plate_top_to_arm_1 onto arm_clamp_upper_1, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_bracket_fixed_1",
      "link_id": "base_link",
      "part_id": "iso_bracket",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          -35.0
        ],
        [
          0.0,
          1.0,
          0.0,
          70.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -30.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_bracket_fixed_1_to_deck onto iso_deck, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_bracket_fixed_2",
      "link_id": "base_link",
      "part_id": "iso_bracket",
      "placement": [
        [
          -1.0,
          0.0,
          0.0,
          -35.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          -70.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -30.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_bracket_fixed_2_to_deck onto iso_deck, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_bracket_fixed_3",
      "link_id": "base_link",
      "part_id": "iso_bracket",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          35.0
        ],
        [
          0.0,
          1.0,
          0.0,
          70.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -30.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_bracket_fixed_3_to_deck onto iso_deck, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_bracket_fixed_4",
      "link_id": "base_link",
      "part_id": "iso_bracket",
      "placement": [
        [
          -1.0,
          0.0,
          0.0,
          35.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          -70.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -30.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_bracket_fixed_4_to_deck onto iso_deck, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_bracket_float_1",
      "link_id": "base_link",
      "part_id": "iso_bracket",
      "placement": [
        [
          -1.0,
          0.0,
          0.0,
          -35.0
        ],
        [
          0.0,
          1.0,
          0.0,
          40.2
        ],
        [
          0.0,
          0.0,
          -1.0,
          -76.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_bracket_float_1_to_isolator_1 onto isolator_1, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_bracket_float_2",
      "link_id": "base_link",
      "part_id": "iso_bracket",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          -35.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          -40.2
        ],
        [
          0.0,
          0.0,
          -1.0,
          -76.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_bracket_float_2_to_subtray onto camera_subtray, depth 7; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_bracket_float_3",
      "link_id": "base_link",
      "part_id": "iso_bracket",
      "placement": [
        [
          -1.0,
          0.0,
          0.0,
          35.0
        ],
        [
          0.0,
          1.0,
          0.0,
          40.2
        ],
        [
          0.0,
          0.0,
          -1.0,
          -76.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_bracket_float_3_to_subtray onto camera_subtray, depth 7; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_bracket_float_4",
      "link_id": "base_link",
      "part_id": "iso_bracket",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          35.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          -40.2
        ],
        [
          0.0,
          0.0,
          -1.0,
          -76.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_bracket_float_4_to_subtray onto camera_subtray, depth 7; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "iso_deck",
      "link_id": "base_link",
      "part_id": "iso_deck",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          0.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -30.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:iso_deck_to_rail_1 onto payload_rail_1, depth 2; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "isolator_1",
      "link_id": "base_link",
      "part_id": "isolator",
      "placement": [
        [
          -1.0,
          0.0,
          0.0,
          -35.0
        ],
        [
          0.0,
          1.0,
          0.0,
          43.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          -53.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:isolator_1_to_fixed_bracket onto iso_bracket_fixed_1, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "isolator_2",
      "link_id": "base_link",
      "part_id": "isolator",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          -35.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          -43.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          -53.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:isolator_2_to_fixed_bracket onto iso_bracket_fixed_2, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "isolator_3",
      "link_id": "base_link",
      "part_id": "isolator",
      "placement": [
        [
          -1.0,
          0.0,
          0.0,
          35.0
        ],
        [
          0.0,
          1.0,
          0.0,
          43.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          -53.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:isolator_3_to_fixed_bracket onto iso_bracket_fixed_3, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "isolator_4",
      "link_id": "base_link",
      "part_id": "isolator",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          35.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          -43.0
        ],
        [
          0.0,
          0.0,
          -1.0,
          -53.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:isolator_4_to_fixed_bracket onto iso_bracket_fixed_4, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_clamp_lower_1",
      "link_id": "base_link",
      "part_id": "leg_clamp_lower",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          173.20508075688775
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          99.99999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          -44.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_1_clamp_lower_to_arm onto arm_clamp_upper_1, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_clamp_lower_2",
      "link_id": "base_link",
      "part_id": "leg_clamp_lower",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -173.20508075688775
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          99.99999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          -44.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_2_clamp_lower_to_arm onto arm_clamp_upper_3, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_clamp_lower_3",
      "link_id": "base_link",
      "part_id": "leg_clamp_lower",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -173.2050807568877
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -100.00000000000003
        ],
        [
          0.0,
          0.0,
          1.0,
          -44.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_3_clamp_lower_to_arm onto arm_clamp_upper_4, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_clamp_lower_4",
      "link_id": "base_link",
      "part_id": "leg_clamp_lower",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          173.2050807568877
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -100.00000000000009
        ],
        [
          0.0,
          0.0,
          1.0,
          -44.8
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_4_clamp_lower_to_arm onto arm_clamp_upper_6, depth 3; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_clamp_upper_1",
      "link_id": "base_link",
      "part_id": "leg_clamp_upper",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          173.20508075688775
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          99.99999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_1_clamp_upper_to_lower onto leg_clamp_lower_1, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_clamp_upper_2",
      "link_id": "base_link",
      "part_id": "leg_clamp_upper",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -173.20508075688775
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          99.99999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_2_clamp_upper_to_lower onto leg_clamp_lower_2, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_clamp_upper_3",
      "link_id": "base_link",
      "part_id": "leg_clamp_upper",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -173.2050807568877
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -100.00000000000003
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_3_clamp_upper_to_lower onto leg_clamp_lower_3, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_clamp_upper_4",
      "link_id": "base_link",
      "part_id": "leg_clamp_upper",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          173.2050807568877
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -100.00000000000009
        ],
        [
          0.0,
          0.0,
          1.0,
          0.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_4_clamp_upper_to_lower onto leg_clamp_lower_4, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_elbow_1",
      "link_id": "base_link",
      "part_id": "leg_elbow",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          173.20508075688775
        ],
        [
          0.0,
          1.0,
          0.0,
          99.99999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          -210.79999999999998
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_1_elbow_to_tube onto leg_tube_1, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_elbow_2",
      "link_id": "base_link",
      "part_id": "leg_elbow",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          -173.20508075688775
        ],
        [
          0.0,
          1.0,
          0.0,
          99.99999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          -210.79999999999998
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_2_elbow_to_tube onto leg_tube_2, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_elbow_3",
      "link_id": "base_link",
      "part_id": "leg_elbow",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          -173.2050807568877
        ],
        [
          0.0,
          1.0,
          0.0,
          -100.00000000000003
        ],
        [
          0.0,
          0.0,
          1.0,
          -210.79999999999998
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_3_elbow_to_tube onto leg_tube_3, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_elbow_4",
      "link_id": "base_link",
      "part_id": "leg_elbow",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          173.2050807568877
        ],
        [
          0.0,
          1.0,
          0.0,
          -100.00000000000009
        ],
        [
          0.0,
          0.0,
          1.0,
          -210.79999999999998
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_4_elbow_to_tube onto leg_tube_4, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_tube_1",
      "link_id": "base_link",
      "part_id": "leg_tube",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          173.20508075688775
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          99.99999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          -172.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_1_tube_to_clamp onto leg_clamp_lower_1, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_tube_2",
      "link_id": "base_link",
      "part_id": "leg_tube",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -173.20508075688775
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          99.99999999999999
        ],
        [
          0.0,
          0.0,
          1.0,
          -172.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_2_tube_to_clamp onto leg_clamp_lower_2, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_tube_3",
      "link_id": "base_link",
      "part_id": "leg_tube",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -173.2050807568877
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -100.00000000000003
        ],
        [
          0.0,
          0.0,
          1.0,
          -172.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_3_tube_to_clamp onto leg_clamp_lower_3, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "leg_tube_4",
      "link_id": "base_link",
      "part_id": "leg_tube",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          173.2050807568877
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -100.00000000000009
        ],
        [
          0.0,
          0.0,
          1.0,
          -172.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:leg_4_tube_to_clamp onto leg_clamp_lower_4, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_1",
      "link_id": "base_link",
      "part_id": "motor",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          424.352447854375
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          33.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_motor_to_plate onto motor_plate_1, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_2",
      "link_id": "base_link",
      "part_id": "motor",
      "placement": [
        [
          6.123233995736766e-17,
          -1.0,
          0.0,
          3.0003846579110155e-14
        ],
        [
          1.0,
          6.123233995736766e-17,
          0.0,
          490.0
        ],
        [
          0.0,
          0.0,
          1.0,
          33.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_motor_to_plate onto motor_plate_2, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_3",
      "link_id": "base_link",
      "part_id": "motor",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -424.352447854375
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          33.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_motor_to_plate onto motor_plate_3, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_4",
      "link_id": "base_link",
      "part_id": "motor",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -424.35244785437493
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -245.00000000000006
        ],
        [
          0.0,
          0.0,
          1.0,
          33.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_motor_to_plate onto motor_plate_4, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_5",
      "link_id": "base_link",
      "part_id": "motor",
      "placement": [
        [
          -1.8369701987210297e-16,
          1.0,
          0.0,
          -9.001153973733046e-14
        ],
        [
          -1.0,
          -1.8369701987210297e-16,
          0.0,
          -490.0
        ],
        [
          0.0,
          0.0,
          1.0,
          33.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_motor_to_plate onto motor_plate_5, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_6",
      "link_id": "base_link",
      "part_id": "motor",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          424.35244785437476
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -245.00000000000023
        ],
        [
          0.0,
          0.0,
          1.0,
          33.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_motor_to_plate onto motor_plate_6, depth 5; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_plate_1",
      "link_id": "base_link",
      "part_id": "motor_plate",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          424.352447854375
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_motor_plate_to_boom onto boom_mount_upper_1, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_plate_2",
      "link_id": "base_link",
      "part_id": "motor_plate",
      "placement": [
        [
          6.123233995736766e-17,
          -1.0,
          0.0,
          3.0003846579110155e-14
        ],
        [
          1.0,
          6.123233995736766e-17,
          0.0,
          490.0
        ],
        [
          0.0,
          0.0,
          1.0,
          22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_motor_plate_to_boom onto boom_mount_upper_2, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_plate_3",
      "link_id": "base_link",
      "part_id": "motor_plate",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -424.352447854375
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_motor_plate_to_boom onto boom_mount_upper_3, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_plate_4",
      "link_id": "base_link",
      "part_id": "motor_plate",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -424.35244785437493
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -245.00000000000006
        ],
        [
          0.0,
          0.0,
          1.0,
          22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_motor_plate_to_boom onto boom_mount_upper_4, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_plate_5",
      "link_id": "base_link",
      "part_id": "motor_plate",
      "placement": [
        [
          -1.8369701987210297e-16,
          1.0,
          0.0,
          -9.001153973733046e-14
        ],
        [
          -1.0,
          -1.8369701987210297e-16,
          0.0,
          -490.0
        ],
        [
          0.0,
          0.0,
          1.0,
          22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_motor_plate_to_boom onto boom_mount_upper_5, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "motor_plate_6",
      "link_id": "base_link",
      "part_id": "motor_plate",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          424.35244785437476
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -245.00000000000023
        ],
        [
          0.0,
          0.0,
          1.0,
          22.4
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_motor_plate_to_boom onto boom_mount_upper_6, depth 4; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "payload_rail_1",
      "link_id": "base_link",
      "part_id": "payload_rail",
      "placement": [
        [
          1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          1.0,
          0.0,
          60.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -28.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:payload_rail_1_to_hub onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "payload_rail_2",
      "link_id": "base_link",
      "part_id": "payload_rail",
      "placement": [
        [
          -1.0,
          0.0,
          0.0,
          0.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          -60.0
        ],
        [
          0.0,
          0.0,
          1.0,
          -28.0
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:payload_rail_2_to_hub onto hub_plate_bottom, depth 1; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "propeller_1",
      "link_id": "rotor_1",
      "part_id": "propeller",
      "placement": [
        [
          0.8660254037844387,
          -0.49999999999999994,
          0.0,
          424.352447854375
        ],
        [
          0.49999999999999994,
          0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          60.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_1_propeller_to_motor onto motor_1, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "propeller_2",
      "link_id": "rotor_2",
      "part_id": "propeller",
      "placement": [
        [
          6.123233995736766e-17,
          -1.0,
          0.0,
          3.0003846579110155e-14
        ],
        [
          1.0,
          6.123233995736766e-17,
          0.0,
          490.0
        ],
        [
          0.0,
          0.0,
          1.0,
          60.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_2_propeller_to_motor onto motor_2, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "propeller_3",
      "link_id": "rotor_3",
      "part_id": "propeller",
      "placement": [
        [
          -0.8660254037844387,
          -0.49999999999999994,
          0.0,
          -424.352447854375
        ],
        [
          0.49999999999999994,
          -0.8660254037844387,
          0.0,
          244.99999999999997
        ],
        [
          0.0,
          0.0,
          1.0,
          60.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_3_propeller_to_motor onto motor_3, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "propeller_4",
      "link_id": "rotor_4",
      "part_id": "propeller",
      "placement": [
        [
          -0.8660254037844386,
          0.5000000000000001,
          0.0,
          -424.35244785437493
        ],
        [
          -0.5000000000000001,
          -0.8660254037844386,
          0.0,
          -245.00000000000006
        ],
        [
          0.0,
          0.0,
          1.0,
          60.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_4_propeller_to_motor onto motor_4, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "propeller_5",
      "link_id": "rotor_5",
      "part_id": "propeller",
      "placement": [
        [
          -1.8369701987210297e-16,
          1.0,
          0.0,
          -9.001153973733046e-14
        ],
        [
          -1.0,
          -1.8369701987210297e-16,
          0.0,
          -490.0
        ],
        [
          0.0,
          0.0,
          1.0,
          60.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_5_propeller_to_motor onto motor_5, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "propeller_6",
      "link_id": "rotor_6",
      "part_id": "propeller",
      "placement": [
        [
          0.8660254037844384,
          0.5000000000000004,
          0.0,
          424.35244785437476
        ],
        [
          -0.5000000000000004,
          0.8660254037844384,
          0.0,
          -245.00000000000023
        ],
        [
          0.0,
          0.0,
          1.0,
          60.599999999999994
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:arm_6_propeller_to_motor onto motor_6, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "skid_tube_1",
      "link_id": "base_link",
      "part_id": "skid_tube",
      "placement": [
        [
          0.0,
          0.0,
          1.0,
          -215.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          99.99999999999999
        ],
        [
          1.0,
          0.0,
          0.0,
          -192.99999999999997
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:skid_1_tube_to_elbow onto leg_elbow_1, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "skid_tube_2",
      "link_id": "base_link",
      "part_id": "skid_tube",
      "placement": [
        [
          0.0,
          0.0,
          1.0,
          -215.00000000000006
        ],
        [
          0.0,
          -1.0,
          0.0,
          -100.00000000000009
        ],
        [
          1.0,
          0.0,
          0.0,
          -192.99999999999997
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:skid_2_tube_to_elbow onto leg_elbow_4, depth 6; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "skid_wear_sleeve_1",
      "link_id": "base_link",
      "part_id": "skid_wear_sleeve",
      "placement": [
        [
          0.0,
          0.0,
          1.0,
          20.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          99.99999999999999
        ],
        [
          1.0,
          0.0,
          0.0,
          -192.99999999999997
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:skid_1_sleeve_1 onto skid_tube_1, depth 7; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "skid_wear_sleeve_2",
      "link_id": "base_link",
      "part_id": "skid_wear_sleeve",
      "placement": [
        [
          0.0,
          0.0,
          1.0,
          -100.0
        ],
        [
          0.0,
          -1.0,
          0.0,
          99.99999999999999
        ],
        [
          1.0,
          0.0,
          0.0,
          -192.99999999999997
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:skid_1_sleeve_2 onto skid_tube_1, depth 7; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "skid_wear_sleeve_3",
      "link_id": "base_link",
      "part_id": "skid_wear_sleeve",
      "placement": [
        [
          0.0,
          0.0,
          1.0,
          19.999999999999943
        ],
        [
          0.0,
          -1.0,
          0.0,
          -100.00000000000009
        ],
        [
          1.0,
          0.0,
          0.0,
          -192.99999999999997
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:skid_2_sleeve_3 onto skid_tube_2, depth 7; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    },
    {
      "instance_id": "skid_wear_sleeve_4",
      "link_id": "base_link",
      "part_id": "skid_wear_sleeve",
      "placement": [
        [
          0.0,
          0.0,
          1.0,
          -100.00000000000006
        ],
        [
          0.0,
          -1.0,
          0.0,
          -100.00000000000009
        ],
        [
          1.0,
          0.0,
          0.0,
          -192.99999999999997
        ],
        [
          0.0,
          0.0,
          0.0,
          1.0
        ]
      ],
      "placement_provenance": "mate @mate:skid_2_sleeve_4 onto skid_tube_2, depth 7; resolved from port geometry by anubis.stage2a.assembly.solver v1.0.0"
    }
  ],
  "ir_path": "/home/ubuntu/.claude/projects/-home-ubuntu-anubis/c1179ced-67e9-4300-b22e-779674797b76/durable/stress_run4/design_slices/w38_hexa_bought_parts/wt/runs/ag_hexacopter/input/frozen_ir.json",
  "ir_sha256": "57c7b14bed120a03d54df506078b8cd26a87b0757c8874b4b0455344085cdede",
  "joints": [
    {
      "axis_xyz": [
        0.0,
        0.0,
        1.0
      ],
      "child_link": "rotor_1",
      "derived_from_mate": "@mate:arm_1_propeller_to_motor",
      "joint_id": "@joint:rotor_1",
      "joint_type": "continuous",
      "limit_effort": 1.1001788955639655,
      "limit_lower": null,
      "limit_provenance": {
        "corroborating_source_file": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/product_page.html",
        "corroborating_source_sha256": "a429456b36fdf1125c93cd076440b6e87ee89597d814e0abade28b9a0a60c701",
        "effort_basis": "max(P_electrical/omega upper bound = 1.1001788955639655 N*m, vendor-reported shaft torque = 0.87 N*m) at the peak-thrust bench row (687.0 W, 5963.0 rev/min). The bound is strict because it credits the machine with no losses; the two readings imply an electromechanical efficiency of 0.7907804844356945",
        "row_digest": "100538d08ec48457154bf47bf40e38613438ef5a09e9a5a0cdbce3c7d504f46b",
        "source_file": "design_package/electrical/datasheet_records/raw/tmotor_mn5008__mn5008-kv170-motor-antigravity-type.html",
        "source_kind": "vendor_bench_measurement",
        "source_locator": "'Test Data' table, 11 rows of the MN5008 KV170 + P18*6.1 CF Polish block, parsed by anubis.stage2b.power.tree.rotor_curve()",
        "source_sha256": "49226f5c36bc3bffb0a6eedb79e5e6b4b69d62adf928b949eddbbb96a64fea6f",
        "velocity_basis": "peak measured 5963.0 rev/min converted to rad/s. This is the fastest row of the bench table, not an extrapolation, and not a KV*voltage calculation"
      },
      "limit_upper": null,
      "limit_velocity": 624.4438997785312,
      "origin_rpy_rad": [
        0.0,
        0.0,
        0.0
      ],
      "origin_xyz_m": [
        0.424352447854375,
        0.24499999999999997,
        0.060599999999999994
      ],
      "parent_link": "base_link",
      "rationale": "Continuous rather than revolute: a propeller has no travel limit, and inventing one would put a false constraint into every downstream dynamics run. Origin is the solved world frame of @port:motor:prop_mount on motor_1, so it moves with the mate. Effort and velocity are the vendor bench maxima for this exact motor/propeller/bus combination, not a travel limit",
      "spin_direction": -1,
      "spin_rationale": "clockwise viewed from +Z: rotor azimuth 30.0 deg from +X; rotors alternate around the ring starting clockwise at the first rotor counter-clockwise from +X (anubis.stage2a.assembly.build.rotor_spin_directions). Requires the CW-handed propeller of the selected pair on this motor"
    },
    {
      "axis_xyz": [
        0.0,
        0.0,
        1.0
      ],
      "child_link": "rotor_2",
      "derived_from_mate": "@mate:arm_2_propeller_to_motor",
      "joint_id": "@joint:rotor_2",
      "joint_type": "continuous",
      "limit_effort": 1.1001788955639655,
      "limit_lower": null,
      "limit_provenance": {
        "corroborating_source_file": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/product_page.html",
        "corroborating_source_sha256": "a429456b36fdf1125c93cd076440b6e87ee89597d814e0abade28b9a0a60c701",
        "effort_basis": "max(P_electrical/omega upper bound = 1.1001788955639655 N*m, vendor-reported shaft torque = 0.87 N*m) at the peak-thrust bench row (687.0 W, 5963.0 rev/min). The bound is strict because it credits the machine with no losses; the two readings imply an electromechanical efficiency of 0.7907804844356945",
        "row_digest": "100538d08ec48457154bf47bf40e38613438ef5a09e9a5a0cdbce3c7d504f46b",
        "source_file": "design_package/electrical/datasheet_records/raw/tmotor_mn5008__mn5008-kv170-motor-antigravity-type.html",
        "source_kind": "vendor_bench_measurement",
        "source_locator": "'Test Data' table, 11 rows of the MN5008 KV170 + P18*6.1 CF Polish block, parsed by anubis.stage2b.power.tree.rotor_curve()",
        "source_sha256": "49226f5c36bc3bffb0a6eedb79e5e6b4b69d62adf928b949eddbbb96a64fea6f",
        "velocity_basis": "peak measured 5963.0 rev/min converted to rad/s. This is the fastest row of the bench table, not an extrapolation, and not a KV*voltage calculation"
      },
      "limit_upper": null,
      "limit_velocity": 624.4438997785312,
      "origin_rpy_rad": [
        0.0,
        0.0,
        0.0
      ],
      "origin_xyz_m": [
        3.0003846579110155e-17,
        0.49,
        0.060599999999999994
      ],
      "parent_link": "base_link",
      "rationale": "Continuous rather than revolute: a propeller has no travel limit, and inventing one would put a false constraint into every downstream dynamics run. Origin is the solved world frame of @port:motor:prop_mount on motor_2, so it moves with the mate. Effort and velocity are the vendor bench maxima for this exact motor/propeller/bus combination, not a travel limit",
      "spin_direction": 1,
      "spin_rationale": "counter-clockwise viewed from +Z: rotor azimuth 90.0 deg from +X; rotors alternate around the ring starting clockwise at the first rotor counter-clockwise from +X (anubis.stage2a.assembly.build.rotor_spin_directions). Requires the CCW-handed propeller of the selected pair on this motor"
    },
    {
      "axis_xyz": [
        0.0,
        0.0,
        1.0
      ],
      "child_link": "rotor_3",
      "derived_from_mate": "@mate:arm_3_propeller_to_motor",
      "joint_id": "@joint:rotor_3",
      "joint_type": "continuous",
      "limit_effort": 1.1001788955639655,
      "limit_lower": null,
      "limit_provenance": {
        "corroborating_source_file": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/product_page.html",
        "corroborating_source_sha256": "a429456b36fdf1125c93cd076440b6e87ee89597d814e0abade28b9a0a60c701",
        "effort_basis": "max(P_electrical/omega upper bound = 1.1001788955639655 N*m, vendor-reported shaft torque = 0.87 N*m) at the peak-thrust bench row (687.0 W, 5963.0 rev/min). The bound is strict because it credits the machine with no losses; the two readings imply an electromechanical efficiency of 0.7907804844356945",
        "row_digest": "100538d08ec48457154bf47bf40e38613438ef5a09e9a5a0cdbce3c7d504f46b",
        "source_file": "design_package/electrical/datasheet_records/raw/tmotor_mn5008__mn5008-kv170-motor-antigravity-type.html",
        "source_kind": "vendor_bench_measurement",
        "source_locator": "'Test Data' table, 11 rows of the MN5008 KV170 + P18*6.1 CF Polish block, parsed by anubis.stage2b.power.tree.rotor_curve()",
        "source_sha256": "49226f5c36bc3bffb0a6eedb79e5e6b4b69d62adf928b949eddbbb96a64fea6f",
        "velocity_basis": "peak measured 5963.0 rev/min converted to rad/s. This is the fastest row of the bench table, not an extrapolation, and not a KV*voltage calculation"
      },
      "limit_upper": null,
      "limit_velocity": 624.4438997785312,
      "origin_rpy_rad": [
        0.0,
        0.0,
        0.0
      ],
      "origin_xyz_m": [
        -0.424352447854375,
        0.24499999999999997,
        0.060599999999999994
      ],
      "parent_link": "base_link",
      "rationale": "Continuous rather than revolute: a propeller has no travel limit, and inventing one would put a false constraint into every downstream dynamics run. Origin is the solved world frame of @port:motor:prop_mount on motor_3, so it moves with the mate. Effort and velocity are the vendor bench maxima for this exact motor/propeller/bus combination, not a travel limit",
      "spin_direction": -1,
      "spin_rationale": "clockwise viewed from +Z: rotor azimuth 150.0 deg from +X; rotors alternate around the ring starting clockwise at the first rotor counter-clockwise from +X (anubis.stage2a.assembly.build.rotor_spin_directions). Requires the CW-handed propeller of the selected pair on this motor"
    },
    {
      "axis_xyz": [
        0.0,
        0.0,
        1.0
      ],
      "child_link": "rotor_4",
      "derived_from_mate": "@mate:arm_4_propeller_to_motor",
      "joint_id": "@joint:rotor_4",
      "joint_type": "continuous",
      "limit_effort": 1.1001788955639655,
      "limit_lower": null,
      "limit_provenance": {
        "corroborating_source_file": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/product_page.html",
        "corroborating_source_sha256": "a429456b36fdf1125c93cd076440b6e87ee89597d814e0abade28b9a0a60c701",
        "effort_basis": "max(P_electrical/omega upper bound = 1.1001788955639655 N*m, vendor-reported shaft torque = 0.87 N*m) at the peak-thrust bench row (687.0 W, 5963.0 rev/min). The bound is strict because it credits the machine with no losses; the two readings imply an electromechanical efficiency of 0.7907804844356945",
        "row_digest": "100538d08ec48457154bf47bf40e38613438ef5a09e9a5a0cdbce3c7d504f46b",
        "source_file": "design_package/electrical/datasheet_records/raw/tmotor_mn5008__mn5008-kv170-motor-antigravity-type.html",
        "source_kind": "vendor_bench_measurement",
        "source_locator": "'Test Data' table, 11 rows of the MN5008 KV170 + P18*6.1 CF Polish block, parsed by anubis.stage2b.power.tree.rotor_curve()",
        "source_sha256": "49226f5c36bc3bffb0a6eedb79e5e6b4b69d62adf928b949eddbbb96a64fea6f",
        "velocity_basis": "peak measured 5963.0 rev/min converted to rad/s. This is the fastest row of the bench table, not an extrapolation, and not a KV*voltage calculation"
      },
      "limit_upper": null,
      "limit_velocity": 624.4438997785312,
      "origin_rpy_rad": [
        0.0,
        0.0,
        0.0
      ],
      "origin_xyz_m": [
        -0.4243524478543749,
        -0.24500000000000005,
        0.060599999999999994
      ],
      "parent_link": "base_link",
      "rationale": "Continuous rather than revolute: a propeller has no travel limit, and inventing one would put a false constraint into every downstream dynamics run. Origin is the solved world frame of @port:motor:prop_mount on motor_4, so it moves with the mate. Effort and velocity are the vendor bench maxima for this exact motor/propeller/bus combination, not a travel limit",
      "spin_direction": 1,
      "spin_rationale": "counter-clockwise viewed from +Z: rotor azimuth 210.0 deg from +X; rotors alternate around the ring starting clockwise at the first rotor counter-clockwise from +X (anubis.stage2a.assembly.build.rotor_spin_directions). Requires the CCW-handed propeller of the selected pair on this motor"
    },
    {
      "axis_xyz": [
        0.0,
        0.0,
        1.0
      ],
      "child_link": "rotor_5",
      "derived_from_mate": "@mate:arm_5_propeller_to_motor",
      "joint_id": "@joint:rotor_5",
      "joint_type": "continuous",
      "limit_effort": 1.1001788955639655,
      "limit_lower": null,
      "limit_provenance": {
        "corroborating_source_file": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/product_page.html",
        "corroborating_source_sha256": "a429456b36fdf1125c93cd076440b6e87ee89597d814e0abade28b9a0a60c701",
        "effort_basis": "max(P_electrical/omega upper bound = 1.1001788955639655 N*m, vendor-reported shaft torque = 0.87 N*m) at the peak-thrust bench row (687.0 W, 5963.0 rev/min). The bound is strict because it credits the machine with no losses; the two readings imply an electromechanical efficiency of 0.7907804844356945",
        "row_digest": "100538d08ec48457154bf47bf40e38613438ef5a09e9a5a0cdbce3c7d504f46b",
        "source_file": "design_package/electrical/datasheet_records/raw/tmotor_mn5008__mn5008-kv170-motor-antigravity-type.html",
        "source_kind": "vendor_bench_measurement",
        "source_locator": "'Test Data' table, 11 rows of the MN5008 KV170 + P18*6.1 CF Polish block, parsed by anubis.stage2b.power.tree.rotor_curve()",
        "source_sha256": "49226f5c36bc3bffb0a6eedb79e5e6b4b69d62adf928b949eddbbb96a64fea6f",
        "velocity_basis": "peak measured 5963.0 rev/min converted to rad/s. This is the fastest row of the bench table, not an extrapolation, and not a KV*voltage calculation"
      },
      "limit_upper": null,
      "limit_velocity": 624.4438997785312,
      "origin_rpy_rad": [
        0.0,
        0.0,
        0.0
      ],
      "origin_xyz_m": [
        -9.001153973733046e-17,
        -0.49,
        0.060599999999999994
      ],
      "parent_link": "base_link",
      "rationale": "Continuous rather than revolute: a propeller has no travel limit, and inventing one would put a false constraint into every downstream dynamics run. Origin is the solved world frame of @port:motor:prop_mount on motor_5, so it moves with the mate. Effort and velocity are the vendor bench maxima for this exact motor/propeller/bus combination, not a travel limit",
      "spin_direction": -1,
      "spin_rationale": "clockwise viewed from +Z: rotor azimuth 270.0 deg from +X; rotors alternate around the ring starting clockwise at the first rotor counter-clockwise from +X (anubis.stage2a.assembly.build.rotor_spin_directions). Requires the CW-handed propeller of the selected pair on this motor"
    },
    {
      "axis_xyz": [
        0.0,
        0.0,
        1.0
      ],
      "child_link": "rotor_6",
      "derived_from_mate": "@mate:arm_6_propeller_to_motor",
      "joint_id": "@joint:rotor_6",
      "joint_type": "continuous",
      "limit_effort": 1.1001788955639655,
      "limit_lower": null,
      "limit_provenance": {
        "corroborating_source_file": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/product_page.html",
        "corroborating_source_sha256": "a429456b36fdf1125c93cd076440b6e87ee89597d814e0abade28b9a0a60c701",
        "effort_basis": "max(P_electrical/omega upper bound = 1.1001788955639655 N*m, vendor-reported shaft torque = 0.87 N*m) at the peak-thrust bench row (687.0 W, 5963.0 rev/min). The bound is strict because it credits the machine with no losses; the two readings imply an electromechanical efficiency of 0.7907804844356945",
        "row_digest": "100538d08ec48457154bf47bf40e38613438ef5a09e9a5a0cdbce3c7d504f46b",
        "source_file": "design_package/electrical/datasheet_records/raw/tmotor_mn5008__mn5008-kv170-motor-antigravity-type.html",
        "source_kind": "vendor_bench_measurement",
        "source_locator": "'Test Data' table, 11 rows of the MN5008 KV170 + P18*6.1 CF Polish block, parsed by anubis.stage2b.power.tree.rotor_curve()",
        "source_sha256": "49226f5c36bc3bffb0a6eedb79e5e6b4b69d62adf928b949eddbbb96a64fea6f",
        "velocity_basis": "peak measured 5963.0 rev/min converted to rad/s. This is the fastest row of the bench table, not an extrapolation, and not a KV*voltage calculation"
      },
      "limit_upper": null,
      "limit_velocity": 624.4438997785312,
      "origin_rpy_rad": [
        0.0,
        0.0,
        0.0
      ],
      "origin_xyz_m": [
        0.42435244785437476,
        -0.24500000000000022,
        0.060599999999999994
      ],
      "parent_link": "base_link",
      "rationale": "Continuous rather than revolute: a propeller has no travel limit, and inventing one would put a false constraint into every downstream dynamics run. Origin is the solved world frame of @port:motor:prop_mount on motor_6, so it moves with the mate. Effort and velocity are the vendor bench maxima for this exact motor/propeller/bus combination, not a travel limit",
      "spin_direction": 1,
      "spin_rationale": "counter-clockwise viewed from +Z: rotor azimuth 330.0 deg from +X; rotors alternate around the ring starting clockwise at the first rotor counter-clockwise from +X (anubis.stage2a.assembly.build.rotor_spin_directions). Requires the CCW-handed propeller of the selected pair on this motor"
    }
  ],
  "links": [
    {
      "display_name": "Airframe, avionics, pack and mission sensors",
      "instance_ids": [
        "arm_clamp_lower_1",
        "arm_clamp_lower_2",
        "arm_clamp_lower_3",
        "arm_clamp_lower_4",
        "arm_clamp_lower_5",
        "arm_clamp_lower_6",
        "arm_clamp_upper_1",
        "arm_clamp_upper_2",
        "arm_clamp_upper_3",
        "arm_clamp_upper_4",
        "arm_clamp_upper_5",
        "arm_clamp_upper_6",
        "arm_tube_1",
        "arm_tube_2",
        "arm_tube_3",
        "arm_tube_4",
        "arm_tube_5",
        "arm_tube_6",
        "article_u_oa1",
        "article_u_oa2_u_oa5_1",
        "article_u_oa2_u_oa5_2",
        "article_u_oa2_u_oa5_3",
        "article_u_oa2_u_oa5_4",
        "article_u_pm",
        "article_u_telem",
        "battery",
        "battery_retainer_1",
        "battery_retainer_2",
        "battery_tray",
        "boom_mount_lower_1",
        "boom_mount_lower_2",
        "boom_mount_lower_3",
        "boom_mount_lower_4",
        "boom_mount_lower_5",
        "boom_mount_lower_6",
        "boom_mount_upper_1",
        "boom_mount_upper_2",
        "boom_mount_upper_3",
        "boom_mount_upper_4",
        "boom_mount_upper_5",
        "boom_mount_upper_6",
        "camera",
        "camera_subtray",
        "dls2",
        "esc_1",
        "esc_2",
        "esc_3",
        "esc_4",
        "esc_5",
        "esc_6",
        "esc_saddle_lower_1",
        "esc_saddle_lower_2",
        "esc_saddle_lower_3",
        "esc_saddle_lower_4",
        "esc_saddle_lower_5",
        "esc_saddle_lower_6",
        "esc_saddle_upper_1",
        "esc_saddle_upper_2",
        "esc_saddle_upper_3",
        "esc_saddle_upper_4",
        "esc_saddle_upper_5",
        "esc_saddle_upper_6",
        "flight_controller",
        "hub_plate_bottom",
        "hub_plate_top",
        "iso_bracket_fixed_1",
        "iso_bracket_fixed_2",
        "iso_bracket_fixed_3",
        "iso_bracket_fixed_4",
        "iso_bracket_float_1",
        "iso_bracket_float_2",
        "iso_bracket_float_3",
        "iso_bracket_float_4",
        "iso_deck",
        "isolator_1",
        "isolator_2",
        "isolator_3",
        "isolator_4",
        "leg_clamp_lower_1",
        "leg_clamp_lower_2",
        "leg_clamp_lower_3",
        "leg_clamp_lower_4",
        "leg_clamp_upper_1",
        "leg_clamp_upper_2",
        "leg_clamp_upper_3",
        "leg_clamp_upper_4",
        "leg_elbow_1",
        "leg_elbow_2",
        "leg_elbow_3",
        "leg_elbow_4",
        "leg_tube_1",
        "leg_tube_2",
        "leg_tube_3",
        "leg_tube_4",
        "motor_1",
        "motor_2",
        "motor_3",
        "motor_4",
        "motor_5",
        "motor_6",
        "motor_plate_1",
        "motor_plate_2",
        "motor_plate_3",
        "motor_plate_4",
        "motor_plate_5",
        "motor_plate_6",
        "payload_rail_1",
        "payload_rail_2",
        "skid_tube_1",
        "skid_tube_2",
        "skid_wear_sleeve_1",
        "skid_wear_sleeve_2",
        "skid_wear_sleeve_3",
        "skid_wear_sleeve_4"
      ],
      "is_root": true,
      "link_id": "base_link",
      "rationale": "Everything bolted or bonded to the hub is one rigid body. The arms are clamped, not hinged; the legs are clamped, not sprung; the payload deck hangs on wire-rope isolators whose compliance is real but is a vibration path rather than a kinematic degree of freedom, and modelling it as a joint would put a stiffness this package has not measured into the kinematics"
    },
    {
      "display_name": "Rotor 1 rotating assembly",
      "instance_ids": [
        "propeller_1"
      ],
      "is_root": false,
      "link_id": "rotor_1",
      "rationale": "The propeller alone. The motor's bell rotates with it, but T-MOTOR's MN5008 STEP models only housing, shaft and shim -- no winding, magnet or lamination core -- so no rotor/stator mass split is recoverable from it and the bell stays in base_link. This link's inertia is a LOWER bound (MECH_CAD_SOURCE_GAP), short by at most 9.892352e-05 kg*m^2; see design_package/mechanical/mn5008_solid_inventory.json. Splitting the vendor compound at a chosen plane would invent the distribution it is supposed to measure"
    },
    {
      "display_name": "Rotor 2 rotating assembly",
      "instance_ids": [
        "propeller_2"
      ],
      "is_root": false,
      "link_id": "rotor_2",
      "rationale": "The propeller alone. The motor's bell rotates with it, but T-MOTOR's MN5008 STEP models only housing, shaft and shim -- no winding, magnet or lamination core -- so no rotor/stator mass split is recoverable from it and the bell stays in base_link. This link's inertia is a LOWER bound (MECH_CAD_SOURCE_GAP), short by at most 9.892352e-05 kg*m^2; see design_package/mechanical/mn5008_solid_inventory.json. Splitting the vendor compound at a chosen plane would invent the distribution it is supposed to measure"
    },
    {
      "display_name": "Rotor 3 rotating assembly",
      "instance_ids": [
        "propeller_3"
      ],
      "is_root": false,
      "link_id": "rotor_3",
      "rationale": "The propeller alone. The motor's bell rotates with it, but T-MOTOR's MN5008 STEP models only housing, shaft and shim -- no winding, magnet or lamination core -- so no rotor/stator mass split is recoverable from it and the bell stays in base_link. This link's inertia is a LOWER bound (MECH_CAD_SOURCE_GAP), short by at most 9.892352e-05 kg*m^2; see design_package/mechanical/mn5008_solid_inventory.json. Splitting the vendor compound at a chosen plane would invent the distribution it is supposed to measure"
    },
    {
      "display_name": "Rotor 4 rotating assembly",
      "instance_ids": [
        "propeller_4"
      ],
      "is_root": false,
      "link_id": "rotor_4",
      "rationale": "The propeller alone. The motor's bell rotates with it, but T-MOTOR's MN5008 STEP models only housing, shaft and shim -- no winding, magnet or lamination core -- so no rotor/stator mass split is recoverable from it and the bell stays in base_link. This link's inertia is a LOWER bound (MECH_CAD_SOURCE_GAP), short by at most 9.892352e-05 kg*m^2; see design_package/mechanical/mn5008_solid_inventory.json. Splitting the vendor compound at a chosen plane would invent the distribution it is supposed to measure"
    },
    {
      "display_name": "Rotor 5 rotating assembly",
      "instance_ids": [
        "propeller_5"
      ],
      "is_root": false,
      "link_id": "rotor_5",
      "rationale": "The propeller alone. The motor's bell rotates with it, but T-MOTOR's MN5008 STEP models only housing, shaft and shim -- no winding, magnet or lamination core -- so no rotor/stator mass split is recoverable from it and the bell stays in base_link. This link's inertia is a LOWER bound (MECH_CAD_SOURCE_GAP), short by at most 9.892352e-05 kg*m^2; see design_package/mechanical/mn5008_solid_inventory.json. Splitting the vendor compound at a chosen plane would invent the distribution it is supposed to measure"
    },
    {
      "display_name": "Rotor 6 rotating assembly",
      "instance_ids": [
        "propeller_6"
      ],
      "is_root": false,
      "link_id": "rotor_6",
      "rationale": "The propeller alone. The motor's bell rotates with it, but T-MOTOR's MN5008 STEP models only housing, shaft and shim -- no winding, magnet or lamination core -- so no rotor/stator mass split is recoverable from it and the bell stays in base_link. This link's inertia is a LOWER bound (MECH_CAD_SOURCE_GAP), short by at most 9.892352e-05 kg*m^2; see design_package/mechanical/mn5008_solid_inventory.json. Splitting the vendor compound at a chosen plane would invent the distribution it is supposed to measure"
    }
  ],
  "mass_budget_reservations": [],
  "mass_properties": null,
  "mates": [
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "arm_1_clamp_seat",
      "fastening": "hub_arm_sandwich",
      "flip_z": true,
      "incoming_instance": "arm_clamp_lower_1",
      "incoming_port": "back_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_1_clamp_lower_to_hub",
      "mate_type": "face_to_face",
      "notes": "The clamp seat carries the arm azimuth in its own x-axis, so this one declaration serves all six arms without an angle appearing here.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_1",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_clamp_upper_1",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_1_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "Split-clamp halves meet on the arm-tube axis plane; both halves are the same part number, which is why the upper half is a flip of the lower.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_1",
      "base_port": "bore",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_tube_1",
      "incoming_port": "end_a",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_1_tube_to_clamp",
      "mate_type": "coaxial",
      "notes": "The tube's inboard end stops short of the hub centre by the clamp's own radius, so the offset is negative: the tube enters the bore from outboard and the two axes are antiparallel, hence flip_z.",
      "offset_basis": "arm_tube_inner_radius_mm - arm_clamp_centre_radius_mm = 60.0 - 105.0",
      "offset_mm": -45.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_1",
      "base_port": "bore",
      "fastening": "motor_boom_sandwich",
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_1",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_1_boom_lower_to_clamp",
      "mate_type": "coaxial",
      "notes": "Slid outboard along the same bore axis the hub clamp defines, so the rotor radius is one subtraction rather than a placed coordinate.",
      "offset_basis": "arm_radius_mm - arm_clamp_centre_radius_mm = 490.0 - 105.0",
      "offset_mm": 385.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_lower_1",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "boom_mount_upper_1",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_1_boom_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_upper_1",
      "base_port": "back_face",
      "fastening": "motor_boom_sandwich",
      "flip_z": true,
      "incoming_instance": "motor_plate_1",
      "incoming_port": "boom_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_1_motor_plate_to_boom",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_plate_1",
      "base_port": "motor_seat",
      "fastening": "motor_to_plate",
      "flip_z": true,
      "incoming_instance": "motor_1",
      "incoming_port": "base_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_1_motor_to_plate",
      "mate_type": "face_to_face",
      "notes": "No roll is declared: the plate's clearance pattern and the motor's tapped pattern are both generated at motor_mount_phase_deg in their own local frames, so they arrive aligned. A roll here would silently un-align them.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_1",
      "base_port": "prop_mount",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "propeller_1",
      "incoming_port": "hub_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_1_propeller_to_motor",
      "mate_type": "face_to_face",
      "notes": "Rotor disc plane falls out of the motor's published height plus the propeller hub's own half thickness; the mounting interface itself is an open MECH_CAD_SOURCE_GAP, so only the seat plane is grounded.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_1",
      "base_port": "bore",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_1",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_1_esc_saddle_upper_to_clamp",
      "mate_type": "coaxial",
      "notes": "Mated to the *upper* clamp half rather than the lower one because the upper half is the unflipped one, so the saddle inherits a pure Rz and its ESC pad faces up without a roll correction.",
      "offset_basis": "esc_clip_radius_mm - arm_clamp_centre_radius_mm = 320.0 - 105.0",
      "offset_mm": 215.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_1",
      "base_port": "split_face",
      "fastening": "esc_saddle_clamp",
      "flip_z": true,
      "incoming_instance": "esc_saddle_lower_1",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_1_esc_saddle_lower_to_upper",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_1",
      "base_port": "esc_pad",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "esc_1",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_1_esc_to_saddle",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_1",
      "base_port": "end_b",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_1",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_1_boom_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The boom mount is placed from the hub clamp bore; this asserts independently that it also lands on the arm tube's own outboard end frame, which is what actually carries the rotor load. A residual here means the tube length and the rotor radius disagree.",
      "offset_basis": "arm_radius_mm - arm_tube_outer_radius_mm = 490.0 - 525.0",
      "offset_mm": -35.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_1",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_1",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_1_esc_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The 180 deg roll is real, not a fudge: the tube's mid-span axis frame inherits its x-axis pointing down from the lower clamp bore, while the saddle's bore x-axis is its own +Z, which points up. Without the roll the closure would report a 180 deg rotation residual on a part that is in exactly the right place.",
      "offset_basis": "esc_clip_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 320.0 - 292.5; 180 deg undoes the arm tube axis frame's x-axis, which the lower clamp bore leaves pointing down (-Z), against the saddle bore's x-axis, which is the saddle's own +Z and points up",
      "offset_mm": 27.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "arm_2_clamp_seat",
      "fastening": "hub_arm_sandwich",
      "flip_z": true,
      "incoming_instance": "arm_clamp_lower_2",
      "incoming_port": "back_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_2_clamp_lower_to_hub",
      "mate_type": "face_to_face",
      "notes": "The clamp seat carries the arm azimuth in its own x-axis, so this one declaration serves all six arms without an angle appearing here.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_2",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_clamp_upper_2",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_2_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "Split-clamp halves meet on the arm-tube axis plane; both halves are the same part number, which is why the upper half is a flip of the lower.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_2",
      "base_port": "bore",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_tube_2",
      "incoming_port": "end_a",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_2_tube_to_clamp",
      "mate_type": "coaxial",
      "notes": "The tube's inboard end stops short of the hub centre by the clamp's own radius, so the offset is negative: the tube enters the bore from outboard and the two axes are antiparallel, hence flip_z.",
      "offset_basis": "arm_tube_inner_radius_mm - arm_clamp_centre_radius_mm = 60.0 - 105.0",
      "offset_mm": -45.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_2",
      "base_port": "bore",
      "fastening": "motor_boom_sandwich",
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_2",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_2_boom_lower_to_clamp",
      "mate_type": "coaxial",
      "notes": "Slid outboard along the same bore axis the hub clamp defines, so the rotor radius is one subtraction rather than a placed coordinate.",
      "offset_basis": "arm_radius_mm - arm_clamp_centre_radius_mm = 490.0 - 105.0",
      "offset_mm": 385.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_lower_2",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "boom_mount_upper_2",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_2_boom_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_upper_2",
      "base_port": "back_face",
      "fastening": "motor_boom_sandwich",
      "flip_z": true,
      "incoming_instance": "motor_plate_2",
      "incoming_port": "boom_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_2_motor_plate_to_boom",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_plate_2",
      "base_port": "motor_seat",
      "fastening": "motor_to_plate",
      "flip_z": true,
      "incoming_instance": "motor_2",
      "incoming_port": "base_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_2_motor_to_plate",
      "mate_type": "face_to_face",
      "notes": "No roll is declared: the plate's clearance pattern and the motor's tapped pattern are both generated at motor_mount_phase_deg in their own local frames, so they arrive aligned. A roll here would silently un-align them.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_2",
      "base_port": "prop_mount",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "propeller_2",
      "incoming_port": "hub_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_2_propeller_to_motor",
      "mate_type": "face_to_face",
      "notes": "Rotor disc plane falls out of the motor's published height plus the propeller hub's own half thickness; the mounting interface itself is an open MECH_CAD_SOURCE_GAP, so only the seat plane is grounded.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_2",
      "base_port": "bore",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_2",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_2_esc_saddle_upper_to_clamp",
      "mate_type": "coaxial",
      "notes": "Mated to the *upper* clamp half rather than the lower one because the upper half is the unflipped one, so the saddle inherits a pure Rz and its ESC pad faces up without a roll correction.",
      "offset_basis": "esc_clip_radius_mm - arm_clamp_centre_radius_mm = 320.0 - 105.0",
      "offset_mm": 215.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_2",
      "base_port": "split_face",
      "fastening": "esc_saddle_clamp",
      "flip_z": true,
      "incoming_instance": "esc_saddle_lower_2",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_2_esc_saddle_lower_to_upper",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_2",
      "base_port": "esc_pad",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "esc_2",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_2_esc_to_saddle",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_2",
      "base_port": "end_b",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_2",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_2_boom_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The boom mount is placed from the hub clamp bore; this asserts independently that it also lands on the arm tube's own outboard end frame, which is what actually carries the rotor load. A residual here means the tube length and the rotor radius disagree.",
      "offset_basis": "arm_radius_mm - arm_tube_outer_radius_mm = 490.0 - 525.0",
      "offset_mm": -35.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_2",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_2",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_2_esc_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The 180 deg roll is real, not a fudge: the tube's mid-span axis frame inherits its x-axis pointing down from the lower clamp bore, while the saddle's bore x-axis is its own +Z, which points up. Without the roll the closure would report a 180 deg rotation residual on a part that is in exactly the right place.",
      "offset_basis": "esc_clip_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 320.0 - 292.5; 180 deg undoes the arm tube axis frame's x-axis, which the lower clamp bore leaves pointing down (-Z), against the saddle bore's x-axis, which is the saddle's own +Z and points up",
      "offset_mm": 27.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "arm_3_clamp_seat",
      "fastening": "hub_arm_sandwich",
      "flip_z": true,
      "incoming_instance": "arm_clamp_lower_3",
      "incoming_port": "back_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_3_clamp_lower_to_hub",
      "mate_type": "face_to_face",
      "notes": "The clamp seat carries the arm azimuth in its own x-axis, so this one declaration serves all six arms without an angle appearing here.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_3",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_clamp_upper_3",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_3_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "Split-clamp halves meet on the arm-tube axis plane; both halves are the same part number, which is why the upper half is a flip of the lower.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_3",
      "base_port": "bore",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_tube_3",
      "incoming_port": "end_a",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_3_tube_to_clamp",
      "mate_type": "coaxial",
      "notes": "The tube's inboard end stops short of the hub centre by the clamp's own radius, so the offset is negative: the tube enters the bore from outboard and the two axes are antiparallel, hence flip_z.",
      "offset_basis": "arm_tube_inner_radius_mm - arm_clamp_centre_radius_mm = 60.0 - 105.0",
      "offset_mm": -45.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_3",
      "base_port": "bore",
      "fastening": "motor_boom_sandwich",
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_3",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_3_boom_lower_to_clamp",
      "mate_type": "coaxial",
      "notes": "Slid outboard along the same bore axis the hub clamp defines, so the rotor radius is one subtraction rather than a placed coordinate.",
      "offset_basis": "arm_radius_mm - arm_clamp_centre_radius_mm = 490.0 - 105.0",
      "offset_mm": 385.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_lower_3",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "boom_mount_upper_3",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_3_boom_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_upper_3",
      "base_port": "back_face",
      "fastening": "motor_boom_sandwich",
      "flip_z": true,
      "incoming_instance": "motor_plate_3",
      "incoming_port": "boom_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_3_motor_plate_to_boom",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_plate_3",
      "base_port": "motor_seat",
      "fastening": "motor_to_plate",
      "flip_z": true,
      "incoming_instance": "motor_3",
      "incoming_port": "base_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_3_motor_to_plate",
      "mate_type": "face_to_face",
      "notes": "No roll is declared: the plate's clearance pattern and the motor's tapped pattern are both generated at motor_mount_phase_deg in their own local frames, so they arrive aligned. A roll here would silently un-align them.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_3",
      "base_port": "prop_mount",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "propeller_3",
      "incoming_port": "hub_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_3_propeller_to_motor",
      "mate_type": "face_to_face",
      "notes": "Rotor disc plane falls out of the motor's published height plus the propeller hub's own half thickness; the mounting interface itself is an open MECH_CAD_SOURCE_GAP, so only the seat plane is grounded.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_3",
      "base_port": "bore",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_3",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_3_esc_saddle_upper_to_clamp",
      "mate_type": "coaxial",
      "notes": "Mated to the *upper* clamp half rather than the lower one because the upper half is the unflipped one, so the saddle inherits a pure Rz and its ESC pad faces up without a roll correction.",
      "offset_basis": "esc_clip_radius_mm - arm_clamp_centre_radius_mm = 320.0 - 105.0",
      "offset_mm": 215.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_3",
      "base_port": "split_face",
      "fastening": "esc_saddle_clamp",
      "flip_z": true,
      "incoming_instance": "esc_saddle_lower_3",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_3_esc_saddle_lower_to_upper",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_3",
      "base_port": "esc_pad",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "esc_3",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_3_esc_to_saddle",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_3",
      "base_port": "end_b",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_3",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_3_boom_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The boom mount is placed from the hub clamp bore; this asserts independently that it also lands on the arm tube's own outboard end frame, which is what actually carries the rotor load. A residual here means the tube length and the rotor radius disagree.",
      "offset_basis": "arm_radius_mm - arm_tube_outer_radius_mm = 490.0 - 525.0",
      "offset_mm": -35.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_3",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_3",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_3_esc_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The 180 deg roll is real, not a fudge: the tube's mid-span axis frame inherits its x-axis pointing down from the lower clamp bore, while the saddle's bore x-axis is its own +Z, which points up. Without the roll the closure would report a 180 deg rotation residual on a part that is in exactly the right place.",
      "offset_basis": "esc_clip_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 320.0 - 292.5; 180 deg undoes the arm tube axis frame's x-axis, which the lower clamp bore leaves pointing down (-Z), against the saddle bore's x-axis, which is the saddle's own +Z and points up",
      "offset_mm": 27.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "arm_4_clamp_seat",
      "fastening": "hub_arm_sandwich",
      "flip_z": true,
      "incoming_instance": "arm_clamp_lower_4",
      "incoming_port": "back_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_4_clamp_lower_to_hub",
      "mate_type": "face_to_face",
      "notes": "The clamp seat carries the arm azimuth in its own x-axis, so this one declaration serves all six arms without an angle appearing here.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_4",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_clamp_upper_4",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_4_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "Split-clamp halves meet on the arm-tube axis plane; both halves are the same part number, which is why the upper half is a flip of the lower.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_4",
      "base_port": "bore",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_tube_4",
      "incoming_port": "end_a",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_4_tube_to_clamp",
      "mate_type": "coaxial",
      "notes": "The tube's inboard end stops short of the hub centre by the clamp's own radius, so the offset is negative: the tube enters the bore from outboard and the two axes are antiparallel, hence flip_z.",
      "offset_basis": "arm_tube_inner_radius_mm - arm_clamp_centre_radius_mm = 60.0 - 105.0",
      "offset_mm": -45.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_4",
      "base_port": "bore",
      "fastening": "motor_boom_sandwich",
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_4",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_4_boom_lower_to_clamp",
      "mate_type": "coaxial",
      "notes": "Slid outboard along the same bore axis the hub clamp defines, so the rotor radius is one subtraction rather than a placed coordinate.",
      "offset_basis": "arm_radius_mm - arm_clamp_centre_radius_mm = 490.0 - 105.0",
      "offset_mm": 385.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_lower_4",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "boom_mount_upper_4",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_4_boom_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_upper_4",
      "base_port": "back_face",
      "fastening": "motor_boom_sandwich",
      "flip_z": true,
      "incoming_instance": "motor_plate_4",
      "incoming_port": "boom_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_4_motor_plate_to_boom",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_plate_4",
      "base_port": "motor_seat",
      "fastening": "motor_to_plate",
      "flip_z": true,
      "incoming_instance": "motor_4",
      "incoming_port": "base_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_4_motor_to_plate",
      "mate_type": "face_to_face",
      "notes": "No roll is declared: the plate's clearance pattern and the motor's tapped pattern are both generated at motor_mount_phase_deg in their own local frames, so they arrive aligned. A roll here would silently un-align them.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_4",
      "base_port": "prop_mount",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "propeller_4",
      "incoming_port": "hub_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_4_propeller_to_motor",
      "mate_type": "face_to_face",
      "notes": "Rotor disc plane falls out of the motor's published height plus the propeller hub's own half thickness; the mounting interface itself is an open MECH_CAD_SOURCE_GAP, so only the seat plane is grounded.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_4",
      "base_port": "bore",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_4",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_4_esc_saddle_upper_to_clamp",
      "mate_type": "coaxial",
      "notes": "Mated to the *upper* clamp half rather than the lower one because the upper half is the unflipped one, so the saddle inherits a pure Rz and its ESC pad faces up without a roll correction.",
      "offset_basis": "esc_clip_radius_mm - arm_clamp_centre_radius_mm = 320.0 - 105.0",
      "offset_mm": 215.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_4",
      "base_port": "split_face",
      "fastening": "esc_saddle_clamp",
      "flip_z": true,
      "incoming_instance": "esc_saddle_lower_4",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_4_esc_saddle_lower_to_upper",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_4",
      "base_port": "esc_pad",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "esc_4",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_4_esc_to_saddle",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_4",
      "base_port": "end_b",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_4",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_4_boom_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The boom mount is placed from the hub clamp bore; this asserts independently that it also lands on the arm tube's own outboard end frame, which is what actually carries the rotor load. A residual here means the tube length and the rotor radius disagree.",
      "offset_basis": "arm_radius_mm - arm_tube_outer_radius_mm = 490.0 - 525.0",
      "offset_mm": -35.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_4",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_4",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_4_esc_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The 180 deg roll is real, not a fudge: the tube's mid-span axis frame inherits its x-axis pointing down from the lower clamp bore, while the saddle's bore x-axis is its own +Z, which points up. Without the roll the closure would report a 180 deg rotation residual on a part that is in exactly the right place.",
      "offset_basis": "esc_clip_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 320.0 - 292.5; 180 deg undoes the arm tube axis frame's x-axis, which the lower clamp bore leaves pointing down (-Z), against the saddle bore's x-axis, which is the saddle's own +Z and points up",
      "offset_mm": 27.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "arm_5_clamp_seat",
      "fastening": "hub_arm_sandwich",
      "flip_z": true,
      "incoming_instance": "arm_clamp_lower_5",
      "incoming_port": "back_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_5_clamp_lower_to_hub",
      "mate_type": "face_to_face",
      "notes": "The clamp seat carries the arm azimuth in its own x-axis, so this one declaration serves all six arms without an angle appearing here.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_5",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_clamp_upper_5",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_5_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "Split-clamp halves meet on the arm-tube axis plane; both halves are the same part number, which is why the upper half is a flip of the lower.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_5",
      "base_port": "bore",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_tube_5",
      "incoming_port": "end_a",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_5_tube_to_clamp",
      "mate_type": "coaxial",
      "notes": "The tube's inboard end stops short of the hub centre by the clamp's own radius, so the offset is negative: the tube enters the bore from outboard and the two axes are antiparallel, hence flip_z.",
      "offset_basis": "arm_tube_inner_radius_mm - arm_clamp_centre_radius_mm = 60.0 - 105.0",
      "offset_mm": -45.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_5",
      "base_port": "bore",
      "fastening": "motor_boom_sandwich",
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_5",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_5_boom_lower_to_clamp",
      "mate_type": "coaxial",
      "notes": "Slid outboard along the same bore axis the hub clamp defines, so the rotor radius is one subtraction rather than a placed coordinate.",
      "offset_basis": "arm_radius_mm - arm_clamp_centre_radius_mm = 490.0 - 105.0",
      "offset_mm": 385.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_lower_5",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "boom_mount_upper_5",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_5_boom_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_upper_5",
      "base_port": "back_face",
      "fastening": "motor_boom_sandwich",
      "flip_z": true,
      "incoming_instance": "motor_plate_5",
      "incoming_port": "boom_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_5_motor_plate_to_boom",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_plate_5",
      "base_port": "motor_seat",
      "fastening": "motor_to_plate",
      "flip_z": true,
      "incoming_instance": "motor_5",
      "incoming_port": "base_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_5_motor_to_plate",
      "mate_type": "face_to_face",
      "notes": "No roll is declared: the plate's clearance pattern and the motor's tapped pattern are both generated at motor_mount_phase_deg in their own local frames, so they arrive aligned. A roll here would silently un-align them.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_5",
      "base_port": "prop_mount",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "propeller_5",
      "incoming_port": "hub_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_5_propeller_to_motor",
      "mate_type": "face_to_face",
      "notes": "Rotor disc plane falls out of the motor's published height plus the propeller hub's own half thickness; the mounting interface itself is an open MECH_CAD_SOURCE_GAP, so only the seat plane is grounded.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_5",
      "base_port": "bore",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_5",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_5_esc_saddle_upper_to_clamp",
      "mate_type": "coaxial",
      "notes": "Mated to the *upper* clamp half rather than the lower one because the upper half is the unflipped one, so the saddle inherits a pure Rz and its ESC pad faces up without a roll correction.",
      "offset_basis": "esc_clip_radius_mm - arm_clamp_centre_radius_mm = 320.0 - 105.0",
      "offset_mm": 215.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_5",
      "base_port": "split_face",
      "fastening": "esc_saddle_clamp",
      "flip_z": true,
      "incoming_instance": "esc_saddle_lower_5",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_5_esc_saddle_lower_to_upper",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_5",
      "base_port": "esc_pad",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "esc_5",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_5_esc_to_saddle",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_5",
      "base_port": "end_b",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_5",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_5_boom_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The boom mount is placed from the hub clamp bore; this asserts independently that it also lands on the arm tube's own outboard end frame, which is what actually carries the rotor load. A residual here means the tube length and the rotor radius disagree.",
      "offset_basis": "arm_radius_mm - arm_tube_outer_radius_mm = 490.0 - 525.0",
      "offset_mm": -35.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_5",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_5",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_5_esc_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The 180 deg roll is real, not a fudge: the tube's mid-span axis frame inherits its x-axis pointing down from the lower clamp bore, while the saddle's bore x-axis is its own +Z, which points up. Without the roll the closure would report a 180 deg rotation residual on a part that is in exactly the right place.",
      "offset_basis": "esc_clip_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 320.0 - 292.5; 180 deg undoes the arm tube axis frame's x-axis, which the lower clamp bore leaves pointing down (-Z), against the saddle bore's x-axis, which is the saddle's own +Z and points up",
      "offset_mm": 27.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "arm_6_clamp_seat",
      "fastening": "hub_arm_sandwich",
      "flip_z": true,
      "incoming_instance": "arm_clamp_lower_6",
      "incoming_port": "back_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_6_clamp_lower_to_hub",
      "mate_type": "face_to_face",
      "notes": "The clamp seat carries the arm azimuth in its own x-axis, so this one declaration serves all six arms without an angle appearing here.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_6",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_clamp_upper_6",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_6_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "Split-clamp halves meet on the arm-tube axis plane; both halves are the same part number, which is why the upper half is a flip of the lower.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_6",
      "base_port": "bore",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "arm_tube_6",
      "incoming_port": "end_a",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_6_tube_to_clamp",
      "mate_type": "coaxial",
      "notes": "The tube's inboard end stops short of the hub centre by the clamp's own radius, so the offset is negative: the tube enters the bore from outboard and the two axes are antiparallel, hence flip_z.",
      "offset_basis": "arm_tube_inner_radius_mm - arm_clamp_centre_radius_mm = 60.0 - 105.0",
      "offset_mm": -45.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_lower_6",
      "base_port": "bore",
      "fastening": "motor_boom_sandwich",
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_6",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_6_boom_lower_to_clamp",
      "mate_type": "coaxial",
      "notes": "Slid outboard along the same bore axis the hub clamp defines, so the rotor radius is one subtraction rather than a placed coordinate.",
      "offset_basis": "arm_radius_mm - arm_clamp_centre_radius_mm = 490.0 - 105.0",
      "offset_mm": 385.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_lower_6",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "boom_mount_upper_6",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_6_boom_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "boom_mount_upper_6",
      "base_port": "back_face",
      "fastening": "motor_boom_sandwich",
      "flip_z": true,
      "incoming_instance": "motor_plate_6",
      "incoming_port": "boom_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_6_motor_plate_to_boom",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_plate_6",
      "base_port": "motor_seat",
      "fastening": "motor_to_plate",
      "flip_z": true,
      "incoming_instance": "motor_6",
      "incoming_port": "base_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_6_motor_to_plate",
      "mate_type": "face_to_face",
      "notes": "No roll is declared: the plate's clearance pattern and the motor's tapped pattern are both generated at motor_mount_phase_deg in their own local frames, so they arrive aligned. A roll here would silently un-align them.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "motor_6",
      "base_port": "prop_mount",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "propeller_6",
      "incoming_port": "hub_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:arm_6_propeller_to_motor",
      "mate_type": "face_to_face",
      "notes": "Rotor disc plane falls out of the motor's published height plus the propeller hub's own half thickness; the mounting interface itself is an open MECH_CAD_SOURCE_GAP, so only the seat plane is grounded.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_6",
      "base_port": "bore",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_6",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_6_esc_saddle_upper_to_clamp",
      "mate_type": "coaxial",
      "notes": "Mated to the *upper* clamp half rather than the lower one because the upper half is the unflipped one, so the saddle inherits a pure Rz and its ESC pad faces up without a roll correction.",
      "offset_basis": "esc_clip_radius_mm - arm_clamp_centre_radius_mm = 320.0 - 105.0",
      "offset_mm": 215.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_6",
      "base_port": "split_face",
      "fastening": "esc_saddle_clamp",
      "flip_z": true,
      "incoming_instance": "esc_saddle_lower_6",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_6_esc_saddle_lower_to_upper",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "esc_saddle_upper_6",
      "base_port": "esc_pad",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "esc_6",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:arm_6_esc_to_saddle",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_6",
      "base_port": "end_b",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "boom_mount_lower_6",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_6_boom_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The boom mount is placed from the hub clamp bore; this asserts independently that it also lands on the arm tube's own outboard end frame, which is what actually carries the rotor load. A residual here means the tube length and the rotor radius disagree.",
      "offset_basis": "arm_radius_mm - arm_tube_outer_radius_mm = 490.0 - 525.0",
      "offset_mm": -35.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_tube_6",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "esc_saddle_upper_6",
      "incoming_port": "bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:arm_6_esc_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure. The 180 deg roll is real, not a fudge: the tube's mid-span axis frame inherits its x-axis pointing down from the lower clamp bore, while the saddle's bore x-axis is its own +Z, which points up. Without the roll the closure would report a 180 deg rotation residual on a part that is in exactly the right place.",
      "offset_basis": "esc_clip_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 320.0 - 292.5; 180 deg undoes the arm tube axis frame's x-axis, which the lower clamp bore leaves pointing down (-Z), against the saddle bore's x-axis, which is the saddle's own +Z and points up",
      "offset_mm": 27.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "arm_clamp_upper_1",
      "base_port": "back_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "hub_plate_top",
      "incoming_port": "arm_1_clamp_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:hub_plate_top_to_arm_1",
      "mate_type": "face_to_face",
      "notes": "The top hub plate is reached through arm 1 only. Arms 2 to 6 each assert the same plate position as a loop closure, so a wrong clamp-seat azimuth on any single arm is a measured residual instead of a plate that tilts.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_2",
      "base_port": "back_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "hub_plate_top",
      "incoming_port": "arm_2_clamp_seat",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:hub_plate_top_arm_2_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure on the top hub plate through arm 2.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_3",
      "base_port": "back_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "hub_plate_top",
      "incoming_port": "arm_3_clamp_seat",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:hub_plate_top_arm_3_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure on the top hub plate through arm 3.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_4",
      "base_port": "back_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "hub_plate_top",
      "incoming_port": "arm_4_clamp_seat",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:hub_plate_top_arm_4_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure on the top hub plate through arm 4.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_5",
      "base_port": "back_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "hub_plate_top",
      "incoming_port": "arm_5_clamp_seat",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:hub_plate_top_arm_5_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure on the top hub plate through arm 5.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_6",
      "base_port": "back_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "hub_plate_top",
      "incoming_port": "arm_6_clamp_seat",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:hub_plate_top_arm_6_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure on the top hub plate through arm 6.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "arm_clamp_upper_1",
      "base_port": "bore",
      "fastening": "leg_clamp",
      "flip_z": false,
      "incoming_instance": "leg_clamp_lower_1",
      "incoming_port": "arm_bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_1_clamp_lower_to_arm",
      "mate_type": "coaxial",
      "notes": "Leg 1 hangs from arm 1, matched by azimuth (30.0 deg) rather than by a hard-coded index. Mated to the unflipped upper clamp half so the leg clamp inherits a pure Rz.",
      "offset_basis": "leg_clamp_radius_mm - arm_clamp_centre_radius_mm = 200.0 - 105.0",
      "offset_mm": 95.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_clamp_lower_1",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_clamp_upper_1",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_1_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_clamp_lower_1",
      "base_port": "leg_socket",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_tube_1",
      "incoming_port": "end_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_1_tube_to_clamp",
      "mate_type": "press_fit",
      "notes": "Negative because the socket's axis points out of the part, downward, while the tube seats upward into it by the socket depth.",
      "offset_basis": "-leg_socket_depth_mm = -22.8",
      "offset_mm": -22.8,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_tube_1",
      "base_port": "end_a",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_elbow_1",
      "incoming_port": "leg_socket",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_1_elbow_to_tube",
      "mate_type": "press_fit",
      "notes": "The roll of 30.0 deg is the one place a leg's azimuth is undone. Everything above the elbow inherits Rz(azimuth) from the arm, but the skid bore has to point along X on all four legs or the two skid tubes cannot be straight. The leg tube is a body of revolution, so rolling about its own axis is free.",
      "offset_basis": "-leg_socket_depth_mm = -22.8; leg_azimuths_deg[0] = 30.0; the elbow's skid bore must lie along X on all four legs, so the arm's azimuth is cancelled here",
      "offset_mm": -22.8,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 30.0
    },
    {
      "base_instance": "arm_tube_1",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "leg_clamp_lower_1",
      "incoming_port": "arm_bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:leg_1_clamp_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure: the leg clamp is placed from the hub clamp bore, and this asserts it also lands on the arm tube's own mid-span axis.",
      "offset_basis": "leg_clamp_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 200.0 - 292.5; 180 deg, for the same reason as the ESC saddle check: the tube's mid-span axis frame carries a downward x-axis and the clamp bore's is upward",
      "offset_mm": -92.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "arm_clamp_upper_3",
      "base_port": "bore",
      "fastening": "leg_clamp",
      "flip_z": false,
      "incoming_instance": "leg_clamp_lower_2",
      "incoming_port": "arm_bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_2_clamp_lower_to_arm",
      "mate_type": "coaxial",
      "notes": "Leg 2 hangs from arm 3, matched by azimuth (150.0 deg) rather than by a hard-coded index. Mated to the unflipped upper clamp half so the leg clamp inherits a pure Rz.",
      "offset_basis": "leg_clamp_radius_mm - arm_clamp_centre_radius_mm = 200.0 - 105.0",
      "offset_mm": 95.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_clamp_lower_2",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_clamp_upper_2",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_2_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_clamp_lower_2",
      "base_port": "leg_socket",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_tube_2",
      "incoming_port": "end_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_2_tube_to_clamp",
      "mate_type": "press_fit",
      "notes": "Negative because the socket's axis points out of the part, downward, while the tube seats upward into it by the socket depth.",
      "offset_basis": "-leg_socket_depth_mm = -22.8",
      "offset_mm": -22.8,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_tube_2",
      "base_port": "end_a",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_elbow_2",
      "incoming_port": "leg_socket",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_2_elbow_to_tube",
      "mate_type": "press_fit",
      "notes": "The roll of 150.0 deg is the one place a leg's azimuth is undone. Everything above the elbow inherits Rz(azimuth) from the arm, but the skid bore has to point along X on all four legs or the two skid tubes cannot be straight. The leg tube is a body of revolution, so rolling about its own axis is free.",
      "offset_basis": "-leg_socket_depth_mm = -22.8; leg_azimuths_deg[1] = 150.0; the elbow's skid bore must lie along X on all four legs, so the arm's azimuth is cancelled here",
      "offset_mm": -22.8,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 150.0
    },
    {
      "base_instance": "arm_tube_3",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "leg_clamp_lower_2",
      "incoming_port": "arm_bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:leg_2_clamp_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure: the leg clamp is placed from the hub clamp bore, and this asserts it also lands on the arm tube's own mid-span axis.",
      "offset_basis": "leg_clamp_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 200.0 - 292.5; 180 deg, for the same reason as the ESC saddle check: the tube's mid-span axis frame carries a downward x-axis and the clamp bore's is upward",
      "offset_mm": -92.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "arm_clamp_upper_4",
      "base_port": "bore",
      "fastening": "leg_clamp",
      "flip_z": false,
      "incoming_instance": "leg_clamp_lower_3",
      "incoming_port": "arm_bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_3_clamp_lower_to_arm",
      "mate_type": "coaxial",
      "notes": "Leg 3 hangs from arm 4, matched by azimuth (210.0 deg) rather than by a hard-coded index. Mated to the unflipped upper clamp half so the leg clamp inherits a pure Rz.",
      "offset_basis": "leg_clamp_radius_mm - arm_clamp_centre_radius_mm = 200.0 - 105.0",
      "offset_mm": 95.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_clamp_lower_3",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_clamp_upper_3",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_3_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_clamp_lower_3",
      "base_port": "leg_socket",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_tube_3",
      "incoming_port": "end_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_3_tube_to_clamp",
      "mate_type": "press_fit",
      "notes": "Negative because the socket's axis points out of the part, downward, while the tube seats upward into it by the socket depth.",
      "offset_basis": "-leg_socket_depth_mm = -22.8",
      "offset_mm": -22.8,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_tube_3",
      "base_port": "end_a",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_elbow_3",
      "incoming_port": "leg_socket",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_3_elbow_to_tube",
      "mate_type": "press_fit",
      "notes": "The roll of 210.0 deg is the one place a leg's azimuth is undone. Everything above the elbow inherits Rz(azimuth) from the arm, but the skid bore has to point along X on all four legs or the two skid tubes cannot be straight. The leg tube is a body of revolution, so rolling about its own axis is free.",
      "offset_basis": "-leg_socket_depth_mm = -22.8; leg_azimuths_deg[2] = 210.0; the elbow's skid bore must lie along X on all four legs, so the arm's azimuth is cancelled here",
      "offset_mm": -22.8,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 210.0
    },
    {
      "base_instance": "arm_tube_4",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "leg_clamp_lower_3",
      "incoming_port": "arm_bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:leg_3_clamp_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure: the leg clamp is placed from the hub clamp bore, and this asserts it also lands on the arm tube's own mid-span axis.",
      "offset_basis": "leg_clamp_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 200.0 - 292.5; 180 deg, for the same reason as the ESC saddle check: the tube's mid-span axis frame carries a downward x-axis and the clamp bore's is upward",
      "offset_mm": -92.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "arm_clamp_upper_6",
      "base_port": "bore",
      "fastening": "leg_clamp",
      "flip_z": false,
      "incoming_instance": "leg_clamp_lower_4",
      "incoming_port": "arm_bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_4_clamp_lower_to_arm",
      "mate_type": "coaxial",
      "notes": "Leg 4 hangs from arm 6, matched by azimuth (330.0 deg) rather than by a hard-coded index. Mated to the unflipped upper clamp half so the leg clamp inherits a pure Rz.",
      "offset_basis": "leg_clamp_radius_mm - arm_clamp_centre_radius_mm = 200.0 - 105.0",
      "offset_mm": 95.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_clamp_lower_4",
      "base_port": "split_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_clamp_upper_4",
      "incoming_port": "split_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_4_clamp_upper_to_lower",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_clamp_lower_4",
      "base_port": "leg_socket",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_tube_4",
      "incoming_port": "end_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_4_tube_to_clamp",
      "mate_type": "press_fit",
      "notes": "Negative because the socket's axis points out of the part, downward, while the tube seats upward into it by the socket depth.",
      "offset_basis": "-leg_socket_depth_mm = -22.8",
      "offset_mm": -22.8,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_tube_4",
      "base_port": "end_a",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "leg_elbow_4",
      "incoming_port": "leg_socket",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:leg_4_elbow_to_tube",
      "mate_type": "press_fit",
      "notes": "The roll of 330.0 deg is the one place a leg's azimuth is undone. Everything above the elbow inherits Rz(azimuth) from the arm, but the skid bore has to point along X on all four legs or the two skid tubes cannot be straight. The leg tube is a body of revolution, so rolling about its own axis is free.",
      "offset_basis": "-leg_socket_depth_mm = -22.8; leg_azimuths_deg[3] = 330.0; the elbow's skid bore must lie along X on all four legs, so the arm's azimuth is cancelled here",
      "offset_mm": -22.8,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 330.0
    },
    {
      "base_instance": "arm_tube_6",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "leg_clamp_lower_4",
      "incoming_port": "arm_bore",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:leg_4_clamp_on_tube_check",
      "mate_type": "coaxial",
      "notes": "Loop closure: the leg clamp is placed from the hub clamp bore, and this asserts it also lands on the arm tube's own mid-span axis.",
      "offset_basis": "leg_clamp_radius_mm - (arm_tube_inner_radius_mm + arm_tube_length_mm / 2) = 200.0 - 292.5; 180 deg, for the same reason as the ESC saddle check: the tube's mid-span axis frame carries a downward x-axis and the clamp bore's is upward",
      "offset_mm": -92.5,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "leg_elbow_1",
      "base_port": "skid_bore",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "skid_tube_1",
      "incoming_port": "end_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:skid_1_tube_to_elbow",
      "mate_type": "coaxial",
      "notes": "Skid 1 is inserted from leg 1, the one on +x, so both skids are declared the same way and the far elbow becomes an independent check.",
      "offset_basis": "skid_tube_length_mm / 2 - leg_clamp_radius_mm * cos(leg azimuth) = 215.0 - 173.20508075688775",
      "offset_mm": 41.79491924311225,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_elbow_2",
      "base_port": "skid_bore",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "skid_tube_1",
      "incoming_port": "end_a",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:skid_1_far_elbow_check",
      "mate_type": "coaxial",
      "notes": "Loop closure across the skid: the two elbows on one tube are reached through two entirely different arms, so this is the only check that the left and right halves of the airframe agree on where the ground is.",
      "offset_basis": "leg_clamp_radius_mm * cos(leg azimuth) - skid_tube_length_mm / 2 = 173.20508075688775 - 215.0",
      "offset_mm": -41.79491924311225,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "skid_tube_1",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "skid_wear_sleeve_1",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:skid_1_sleeve_1",
      "mate_type": "press_fit",
      "notes": "The sleeves are the ground-contact parts: their OD sets z_ground_contact_mm, and the skid tube itself clears the ground by half the difference between sleeve OD and tube OD.",
      "offset_basis": "+sleeve_centre_x_mm = 60.0",
      "offset_mm": 60.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "skid_tube_1",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "skid_wear_sleeve_2",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:skid_1_sleeve_2",
      "mate_type": "press_fit",
      "notes": "The sleeves are the ground-contact parts: their OD sets z_ground_contact_mm, and the skid tube itself clears the ground by half the difference between sleeve OD and tube OD.",
      "offset_basis": "-sleeve_centre_x_mm = -60.0",
      "offset_mm": -60.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_elbow_4",
      "base_port": "skid_bore",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "skid_tube_2",
      "incoming_port": "end_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:skid_2_tube_to_elbow",
      "mate_type": "coaxial",
      "notes": "Skid 2 is inserted from leg 4, the one on +x, so both skids are declared the same way and the far elbow becomes an independent check.",
      "offset_basis": "skid_tube_length_mm / 2 - leg_clamp_radius_mm * cos(leg azimuth) = 215.0 - 173.20508075688775",
      "offset_mm": 41.79491924311225,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "leg_elbow_3",
      "base_port": "skid_bore",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "skid_tube_2",
      "incoming_port": "end_a",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:skid_2_far_elbow_check",
      "mate_type": "coaxial",
      "notes": "Loop closure across the skid: the two elbows on one tube are reached through two entirely different arms, so this is the only check that the left and right halves of the airframe agree on where the ground is.",
      "offset_basis": "leg_clamp_radius_mm * cos(leg azimuth) - skid_tube_length_mm / 2 = 173.20508075688775 - 215.0",
      "offset_mm": -41.79491924311225,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "skid_tube_2",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "skid_wear_sleeve_3",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:skid_2_sleeve_3",
      "mate_type": "press_fit",
      "notes": "The sleeves are the ground-contact parts: their OD sets z_ground_contact_mm, and the skid tube itself clears the ground by half the difference between sleeve OD and tube OD.",
      "offset_basis": "+sleeve_centre_x_mm = 60.0",
      "offset_mm": 60.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "skid_tube_2",
      "base_port": "axis",
      "fastening": null,
      "flip_z": false,
      "incoming_instance": "skid_wear_sleeve_4",
      "incoming_port": "bore",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:skid_2_sleeve_4",
      "mate_type": "press_fit",
      "notes": "The sleeves are the ground-contact parts: their OD sets z_ground_contact_mm, and the skid tube itself clears the ground by half the difference between sleeve OD and tube OD.",
      "offset_basis": "-sleeve_centre_x_mm = -60.0",
      "offset_mm": -60.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "rail_1_seat",
      "fastening": "payload_rail_to_hub_plate",
      "flip_z": true,
      "incoming_instance": "payload_rail_1",
      "incoming_port": "plate_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:payload_rail_1_to_hub",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "rail_2_seat",
      "fastening": "payload_rail_to_hub_plate",
      "flip_z": true,
      "incoming_instance": "payload_rail_2",
      "incoming_port": "plate_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:payload_rail_2_to_hub",
      "mate_type": "face_to_face",
      "notes": "One rail part number serves both sides, and the rail is not symmetric about its own centreline: the bolt row is at +11 mm and the CG slots at -11 mm. Without this roll the -Y rail's bolt row would land at y = -49 while the plate's holes for it are at y = -71.",
      "offset_basis": "180 deg: the rail is asymmetric about its own centreline, with the bolt row at +rail_bolt_y_local_mm and the CG slots at -rail_bolt_y_local_mm, and the -Y rail must present the bolt row outboard",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "payload_rail_1",
      "base_port": "payload_face",
      "fastening": "iso_deck_to_rails",
      "flip_z": true,
      "incoming_instance": "iso_deck",
      "incoming_port": "rail_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_deck_to_rail_1",
      "mate_type": "face_to_face",
      "notes": "The deck spans both rails, so it is centred on the aircraft while the rail it is mated to is not. This is the only in-plane offset in the assembly and the reason Mate carries offset_u/offset_v at all: the alternative is to place the deck at an absolute coordinate.",
      "offset_basis": "rail_offset_y_mm = 60.0",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 60.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "payload_rail_2",
      "base_port": "payload_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_deck",
      "incoming_port": "rail_seat",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:iso_deck_rail_2_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure: the deck must reach the same place from either rail.",
      "offset_basis": "rail_offset_y_mm = 60.0; 180 deg, inherited: the -Y rail is itself rolled 180 deg, so the deck must be rolled back to arrive at the same orientation it has from rail 1",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 60.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "hub_plate_top",
      "base_port": "topside",
      "fastening": "battery_tray_to_hub_plate",
      "flip_z": true,
      "incoming_instance": "battery_tray",
      "incoming_port": "plate_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:battery_tray_to_hub_top",
      "mate_type": "face_to_face",
      "notes": "",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "battery_tray",
      "base_port": "battery_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "battery",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:battery_to_tray",
      "mate_type": "face_to_face",
      "notes": "The pack's mounting orientation is not available from the vendor: the product page states the envelope twice and the two statements disagree on which extent is which. The bounding box is sound in any orientation, so the seat plane is grounded and the axis assignment is an open defect.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "hub_plate_top",
      "base_port": "fc_pad",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "flight_controller",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:flight_controller_to_hub_top",
      "mate_type": "face_to_face",
      "notes": "Hung under the top plate, inside the bay the arm clamps already occupy, so it needs no structure of its own.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "hub_plate_top",
      "base_port": "topside",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "dls2",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "secondary",
      "mate_id": "@mate:dls2_to_hub_top",
      "mate_type": "face_to_face",
      "notes": "Aft of the battery tray on the same plate face; the offset is along the plate's own y so it moves with the tray if the tray grows.",
      "offset_basis": "dls_centre_y_mm = -113.0",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": -113.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "iso_bracket_float_1",
      "base_port": "foot_face",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "camera_subtray",
      "incoming_port": "bracket_1_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:camera_subtray_to_float_bracket_1",
      "mate_type": "face_to_face",
      "notes": "The sub-tray is placed through isolator 1 and float bracket 1 only. Its other three brackets are then placed from the sub-tray and checked back against their own isolators, which is what makes the four-isolator loop a measurement rather than an assumption. The 180 deg roll is the bracket's published Ry(180) sub-tray orientation: a hanging bracket turned into a standing one, with its foot still pointing inboard.",
      "offset_basis": "180 deg: with flip_z this composes to the bracket's published Ry(180) sub-tray orientation, which inverts Z to turn a hanging bracket into a standing one while leaving the foot pointing inboard",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "camera_subtray",
      "base_port": "camera_seat",
      "fastening": "camera_to_subtray",
      "flip_z": true,
      "incoming_instance": "camera",
      "incoming_port": "top_mount",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:camera_to_subtray",
      "mate_type": "face_to_face",
      "notes": "The only grounded bolt pattern in the payload; the boss depth is not published, which is a recorded MECH_CAD_SOURCE_GAP.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "battery_tray",
      "base_port": "battery_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "battery_retainer_1",
      "incoming_port": "tray_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:battery_retainer_1_to_tray",
      "mate_type": "face_to_face",
      "notes": "The roll on the -X retainer turns its battery-bearing face inboard. Without it the face would point away from the pack and the retainer would hold nothing.",
      "offset_basis": "+battery_retainer_centre_x_mm = 126.0",
      "offset_mm": 0.0,
      "offset_u_mm": 126.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "battery_tray",
      "base_port": "battery_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "battery_retainer_2",
      "incoming_port": "tray_seat",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:battery_retainer_2_to_tray",
      "mate_type": "face_to_face",
      "notes": "The roll on the -X retainer turns its battery-bearing face inboard. Without it the face would point away from the pack and the retainer would hold nothing.",
      "offset_basis": "-battery_retainer_centre_x_mm = -126.0; 180 deg: the retainer's battery-bearing face is on its own -X, so the -X retainer must be turned to face the pack",
      "offset_mm": 0.0,
      "offset_u_mm": -126.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "iso_deck",
      "base_port": "bracket_1_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_fixed_1",
      "incoming_port": "foot_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_bracket_fixed_1_to_deck",
      "mate_type": "face_to_face",
      "notes": "Deck brackets hang: identity on +Y and Rz(180) on -Y, which is the orientation set the bracket is designed for. Rz keeps the foot pointing inboard on the far side; a plain Rx flip would push it off the deck.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "iso_bracket_fixed_1",
      "base_port": "isolator_face_inner",
      "fastening": "isolator_to_brackets",
      "flip_z": true,
      "incoming_instance": "isolator_1",
      "incoming_port": "bar_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:isolator_1_to_fixed_bracket",
      "mate_type": "face_to_face",
      "notes": "The roll is needed because the isolator is placed from its far bar: without it the part lands in the right position with a 180 deg rotation error about its own bar axis, which the loop closure would then report on a part that is geometrically fine. Enidine publish no bar hole pitch, so a single central M3 is all that is grounded.",
      "offset_basis": "180 deg because the isolator is placed from its far bar: the position is right either way, but without the roll the part carries a 180 deg error about its own bar axis and the float-side closure would report it",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "iso_deck",
      "base_port": "bracket_2_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_fixed_2",
      "incoming_port": "foot_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_bracket_fixed_2_to_deck",
      "mate_type": "face_to_face",
      "notes": "Deck brackets hang: identity on +Y and Rz(180) on -Y, which is the orientation set the bracket is designed for. Rz keeps the foot pointing inboard on the far side; a plain Rx flip would push it off the deck.",
      "offset_basis": "180 deg is the bracket's published Rz(180) deck orientation for a -Y position; it inverts Y without inverting Z, which keeps the foot inboard instead of overhanging the deck edge",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "iso_bracket_fixed_2",
      "base_port": "isolator_face_inner",
      "fastening": "isolator_to_brackets",
      "flip_z": true,
      "incoming_instance": "isolator_2",
      "incoming_port": "bar_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:isolator_2_to_fixed_bracket",
      "mate_type": "face_to_face",
      "notes": "The roll is needed because the isolator is placed from its far bar: without it the part lands in the right position with a 180 deg rotation error about its own bar axis, which the loop closure would then report on a part that is geometrically fine. Enidine publish no bar hole pitch, so a single central M3 is all that is grounded.",
      "offset_basis": "180 deg because the isolator is placed from its far bar: the position is right either way, but without the roll the part carries a 180 deg error about its own bar axis and the float-side closure would report it",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "iso_deck",
      "base_port": "bracket_3_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_fixed_3",
      "incoming_port": "foot_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_bracket_fixed_3_to_deck",
      "mate_type": "face_to_face",
      "notes": "Deck brackets hang: identity on +Y and Rz(180) on -Y, which is the orientation set the bracket is designed for. Rz keeps the foot pointing inboard on the far side; a plain Rx flip would push it off the deck.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "iso_bracket_fixed_3",
      "base_port": "isolator_face_inner",
      "fastening": "isolator_to_brackets",
      "flip_z": true,
      "incoming_instance": "isolator_3",
      "incoming_port": "bar_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:isolator_3_to_fixed_bracket",
      "mate_type": "face_to_face",
      "notes": "The roll is needed because the isolator is placed from its far bar: without it the part lands in the right position with a 180 deg rotation error about its own bar axis, which the loop closure would then report on a part that is geometrically fine. Enidine publish no bar hole pitch, so a single central M3 is all that is grounded.",
      "offset_basis": "180 deg because the isolator is placed from its far bar: the position is right either way, but without the roll the part carries a 180 deg error about its own bar axis and the float-side closure would report it",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "iso_deck",
      "base_port": "bracket_4_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_fixed_4",
      "incoming_port": "foot_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_bracket_fixed_4_to_deck",
      "mate_type": "face_to_face",
      "notes": "Deck brackets hang: identity on +Y and Rz(180) on -Y, which is the orientation set the bracket is designed for. Rz keeps the foot pointing inboard on the far side; a plain Rx flip would push it off the deck.",
      "offset_basis": "180 deg is the bracket's published Rz(180) deck orientation for a -Y position; it inverts Y without inverting Z, which keeps the foot inboard instead of overhanging the deck edge",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "iso_bracket_fixed_4",
      "base_port": "isolator_face_inner",
      "fastening": "isolator_to_brackets",
      "flip_z": true,
      "incoming_instance": "isolator_4",
      "incoming_port": "bar_b",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:isolator_4_to_fixed_bracket",
      "mate_type": "face_to_face",
      "notes": "The roll is needed because the isolator is placed from its far bar: without it the part lands in the right position with a 180 deg rotation error about its own bar axis, which the loop closure would then report on a part that is geometrically fine. Enidine publish no bar hole pitch, so a single central M3 is all that is grounded.",
      "offset_basis": "180 deg because the isolator is placed from its far bar: the position is right either way, but without the roll the part carries a 180 deg error about its own bar axis and the float-side closure would report it",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "isolator_1",
      "base_port": "bar_a",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_float_1",
      "incoming_port": "isolator_face_outer",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_bracket_float_1_to_isolator_1",
      "mate_type": "face_to_face",
      "notes": "The single path from the fixed side of the isolation stack to the float side; everything below it hangs on isolator 1.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "camera_subtray",
      "base_port": "bracket_2_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_float_2",
      "incoming_port": "foot_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_bracket_float_2_to_subtray",
      "mate_type": "face_to_face",
      "notes": "Sub-tray brackets stand: Ry(180) on +Y and Rx(180) on -Y. Both invert Z, which is what turns the hanging bracket into a standing one.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "isolator_2",
      "base_port": "bar_a",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_float_2",
      "incoming_port": "isolator_face_outer",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:isolator_2_float_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure through isolator 2: the float bracket is placed from the sub-tray, so this measures whether isolator 2 is parallel to isolator 1 or is being asked to stretch.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "camera_subtray",
      "base_port": "bracket_3_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_float_3",
      "incoming_port": "foot_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_bracket_float_3_to_subtray",
      "mate_type": "face_to_face",
      "notes": "Sub-tray brackets stand: Ry(180) on +Y and Rx(180) on -Y. Both invert Z, which is what turns the hanging bracket into a standing one.",
      "offset_basis": "180 deg composes with flip_z to the bracket's published Ry(180) sub-tray orientation on +Y",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 180.0
    },
    {
      "base_instance": "isolator_3",
      "base_port": "bar_a",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_float_3",
      "incoming_port": "isolator_face_outer",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:isolator_3_float_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure through isolator 3: the float bracket is placed from the sub-tray, so this measures whether isolator 3 is parallel to isolator 1 or is being asked to stretch.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "camera_subtray",
      "base_port": "bracket_4_seat",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_float_4",
      "incoming_port": "foot_face",
      "is_verification_only": false,
      "load_path": "primary",
      "mate_id": "@mate:iso_bracket_float_4_to_subtray",
      "mate_type": "face_to_face",
      "notes": "Sub-tray brackets stand: Ry(180) on +Y and Rx(180) on -Y. Both invert Z, which is what turns the hanging bracket into a standing one.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "isolator_4",
      "base_port": "bar_a",
      "fastening": null,
      "flip_z": true,
      "incoming_instance": "iso_bracket_float_4",
      "incoming_port": "isolator_face_outer",
      "is_verification_only": true,
      "load_path": "secondary",
      "mate_id": "@mate:isolator_4_float_check",
      "mate_type": "face_to_face",
      "notes": "Loop closure through isolator 4: the float bracket is placed from the sub-tray, so this measures whether isolator 4 is parallel to isolator 1 or is being asked to stretch.",
      "offset_basis": "",
      "offset_mm": 0.0,
      "offset_u_mm": 0.0,
      "offset_v_mm": 0.0,
      "roll_deg": 0.0
    },
    {
      "base_instance": "hub_plate_top",
      "base_port": "topside",
      "fastening": "article_mount:article_u_oa1",
      "flip_z": true,
      "incoming_instance": "article_u_oa1",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "non_structural",
      "mate_id": "@mate:article_u_oa1_to_hub_plate_top",
      "mate_type": "face_to_face",
      "notes": "Scanning obstacle lidar on the front strip of the hexagonal top plate. Its footprint is turned 60 deg so its outer edge runs parallel to the plate's 60 deg edge (3 mm margin), and it sits 2.4 mm clear of the battery tray. Its forward axis runs along the gap between rotors 1 and 2. The sweep is at about z 47, below the propeller discs (z 54.6). The cone is kept narrow so the upper ray passes under ",
      "offset_basis": "judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa1: offsets in the host port's own axes as proposed and accepted; judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa1: the article is not symmetric about its mounting normal",
      "offset_mm": 0.0,
      "offset_u_mm": 20.0,
      "offset_v_mm": 120.5,
      "roll_deg": 60.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "topside",
      "fastening": "article_mount:article_u_oa2_u_oa5",
      "flip_z": true,
      "incoming_instance": "article_u_oa2_u_oa5_1",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "non_structural",
      "mate_id": "@mate:article_u_oa2_u_oa5_1_to_hub_plate_bottom",
      "mate_type": "face_to_face",
      "notes": "TFmini-S lying flat in the avionics bay. All four units share one orientation; only the roll differs. This one looks along +x through the gap between arm clamps 1 and 6, about 6.8 mm clear of each clamp. Its beam at z -15 covers the low sector below the scanner plane.",
      "offset_basis": "judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa2_u_oa5_1: offsets in the host port's own axes as proposed and accepted; judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa2_u_oa5_1: the article is not symmetric about its mounting normal",
      "offset_mm": 0.0,
      "offset_u_mm": 118.0,
      "offset_v_mm": 0.0,
      "roll_deg": -90.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "topside",
      "fastening": "article_mount:article_u_oa2_u_oa5",
      "flip_z": true,
      "incoming_instance": "article_u_oa2_u_oa5_2",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "non_structural",
      "mate_id": "@mate:article_u_oa2_u_oa5_2_to_hub_plate_bottom",
      "mate_type": "face_to_face",
      "notes": "Same lying orientation, in the bay gap between arm clamps 3 and 4. It looks along -x below the scanner plane, which the battery blocks behind the front-mounted SF45.",
      "offset_basis": "judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa2_u_oa5_2: offsets in the host port's own axes as proposed and accepted; judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa2_u_oa5_2: the article is not symmetric about its mounting normal",
      "offset_mm": 0.0,
      "offset_u_mm": -118.0,
      "offset_v_mm": 0.0,
      "roll_deg": 90.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "topside",
      "fastening": "article_mount:article_u_oa2_u_oa5",
      "flip_z": true,
      "incoming_instance": "article_u_oa2_u_oa5_3",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "non_structural",
      "mate_id": "@mate:article_u_oa2_u_oa5_3_to_hub_plate_bottom",
      "mate_type": "face_to_face",
      "notes": "Same lying orientation, in the bay gap between arm clamps 4 and 5. It looks toward 240 deg into the rear blind arc of the SF45 (the arc behind the battery), clear of the PDIB reservation and the arm tubes.",
      "offset_basis": "judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa2_u_oa5_3: offsets in the host port's own axes as proposed and accepted; judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa2_u_oa5_3: the article is not symmetric about its mounting normal",
      "offset_mm": 0.0,
      "offset_u_mm": -59.0,
      "offset_v_mm": -102.2,
      "roll_deg": 150.0
    },
    {
      "base_instance": "hub_plate_bottom",
      "base_port": "topside",
      "fastening": "article_mount:article_u_oa2_u_oa5",
      "flip_z": true,
      "incoming_instance": "article_u_oa2_u_oa5_4",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "non_structural",
      "mate_id": "@mate:article_u_oa2_u_oa5_4_to_hub_plate_bottom",
      "mate_type": "face_to_face",
      "notes": "Same lying orientation, in the bay gap between arm clamps 5 and 6. It looks toward 300 deg and completes cover of the SF45's rear blind arc. No unit looks down: every downward face would put the centre of mass below the -30.8 mm envelope floor.",
      "offset_basis": "judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa2_u_oa5_4: offsets in the host port's own axes as proposed and accepted; judged article placement mechanical/article_mounts/article_mounts.json#article_u_oa2_u_oa5_4: the article is not symmetric about its mounting normal",
      "offset_mm": 0.0,
      "offset_u_mm": 59.0,
      "offset_v_mm": -102.2,
      "roll_deg": 210.0
    },
    {
      "base_instance": "hub_plate_top",
      "base_port": "topside",
      "fastening": "article_mount:article_u_pm",
      "flip_z": true,
      "incoming_instance": "article_u_pm",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "non_structural",
      "mate_id": "@mate:article_u_pm_to_hub_plate_top",
      "mate_type": "face_to_face",
      "notes": "The 12S DroneCAN power module lies flat on the front-left top-plate strip, 2 mm clear of the battery tray, which keeps the main-current leads short. It sits 4.5 mm clear of the SF45 and 1.4 mm inside the hexagon edge.",
      "offset_basis": "judged article placement mechanical/article_mounts/article_mounts.json#article_u_pm: offsets in the host port's own axes as proposed and accepted",
      "offset_mm": 0.0,
      "offset_u_mm": -40.5,
      "offset_v_mm": 106.5,
      "roll_deg": 0.0
    },
    {
      "base_instance": "hub_plate_top",
      "base_port": "topside",
      "fastening": "article_mount:article_u_telem",
      "flip_z": true,
      "incoming_instance": "article_u_telem",
      "incoming_port": "seat",
      "is_verification_only": false,
      "load_path": "non_structural",
      "mate_id": "@mate:article_u_telem_to_hub_plate_top",
      "mate_type": "face_to_face",
      "notes": "The RFD900x stands on its 57 x 12.8 mm edge on the rear-right top-plate strip. A flat 57 x 30 mm footprint does not fit inside the hexagon there. It sits 2.7 mm clear of the DLS 2 and 2 mm clear of the tray, on top of the airframe so the 900 MHz antenna runs stay short.",
      "offset_basis": "judged article placement mechanical/article_mounts/article_mounts.json#article_u_telem: offsets in the host port's own axes as proposed and accepted",
      "offset_mm": 0.0,
      "offset_u_mm": 63.0,
      "offset_v_mm": -92.4,
      "roll_deg": 0.0
    }
  ],
  "notes": [
    "mass_properties is null for the ASSEMBLY because the placed geometry is not the whole aircraft: the mate solve closed and every placed body's mass, centre of mass and inertia tensor ARE measured (see per_link_mass_properties and design_package/mechanical/exports/canonical_model.json), but the take-off mass includes unplaced terms -- the payload allocation remainder above the identified sensors, external electrical devices owned by Stage 2B, catalogue fasteners and quantified reservations -- that have mass and no geometry, so they have no position. An aircraft centre of mass integrated over the placed fraction only would be a real integral over an incomplete aircraft, and it is precisely the number a reader would mistake for the CG. It stays null until the unplaced mass is placed.",
    "every placement in `instances` is the output of the mate solve in anubis.stage2a.assembly.solver; none is hand-authored, and the model refuses to build if the loop residuals do not close",
    "per_link_mass_properties are OCCT GProp_GProps volume integrals over the placed B-Reps, copied from the same measurement the STEP, URDF, USD and MJCF exports carry -- not recomputed here",
    "mechanical_requirements.footprint_max_m remains a declared MECH_SPEC_GAP (design_not_yet_produced); see design_package/mechanical/design_variables.json. It is listed in design_variable_ids as an OWNED variable, not as a filled one",
    "the rotor links carry the propeller only, so each rotor inertia is a LOWER bound and the motor's whole vendor mass sits in base_link (MECH_CAD_SOURCE_GAP). T-MOTOR's own STEP for the MN5008 holds five named solids -- a steel ring, two covers, a steel shaft and a shim -- and no winding, magnet or lamination core, so it is a housing representation and the rotor/stator split is not recoverable from it at any fidelity. The deficit is BOUNDED rather than assumed: at most 9.892352000000001e-05 kg*m^2 per rotor, which is 13.73 % of the spin inertia the model carries. See design_package/mechanical/mn5008_solid_inventory.json for the per-solid inventory, the vendor names and the derivation of that bound",
    "mass_budget_reservations lists the 0 QUANTIFIED reservation(s) only. 2 further reservation(s) are declared with no derivable mass and are therefore NOT in that tuple, because a required mass_kg of 0.0 would let a sum over it read as complete: avionics_mounting_provisions (MECH_SPEC_GAP/design_not_yet_produced) - Stage 2B has now published its avionics set (PM08-CAN, RFD900x, H-RTK ZED-F9P, Remote ID, SF45/B, 4 x TFmini-S). The devices are in 2B's mass; the brackets, standoffs and hardware that hold them are mine and no geometry exists for them, so no mass is derivable. The structural total is a lower bound until they are designed.; adhesive_and_consumables (MECH_SPEC_GAP/process_capability) - Every tube-to-clamp joint in this design is adhesive bonded as well as clamped. Bond-line mass depends on a bond-line thickness that no load case has yet fixed, so it is not derivable and is not estimated.. They are why the structural mass is a LOWER bound."
  ],
  "parts": [
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Hub arm clamp half, laminated CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "arm_clamp",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "8 bonded plies of 2.8 mm CFS-RI = 22.4 mm, leaving 7.4 mm of backing above the bore crown.",
        "One part number serves both the upper and the lower half.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 8"
      ],
      "part_id": "arm_clamp",
      "ports": [
        {
          "depth_mm": 56.0,
          "description": "Half-bore for the tube; nominal fit, adhesive bonded and clamped, so axial retention is friction plus bond, not a shoulder",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_clamp:bore",
          "port_type": "BORE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Split plane; mates against the opposing clamp half",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3006.5708264711484,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_clamp:split_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Outer face; seats against the hub plate or the motor plate",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_clamp:back_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": -20.0,
              "y": -22.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_clamp:bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": -20.0,
              "y": 22.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_clamp:bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": 20.0,
              "y": -22.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_clamp:bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": 20.0,
              "y": 22.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_clamp:bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Arm tube, 30 x 27 mm roll-wrapped CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "arm_tube",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_rollwrapped_tube",
      "notes": [
        "465 mm cut from the grounded 1000 mm stock length; one stock length per arm.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0"
      ],
      "part_id": "arm_tube",
      "ports": [
        {
          "depth_mm": null,
          "description": "Tube end A",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_tube:end_a",
          "port_type": "SHAFT",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Tube end B",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 465.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_tube:end_b",
          "port_type": "SHAFT",
          "thread_designation": null
        },
        {
          "depth_mm": 465.0,
          "description": "Tube axis at mid-length, for clamp mates",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 232.5
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:arm_tube:axis",
          "port_type": "SHAFT",
          "thread_designation": null
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Battery end retainer, PA12",
      "effective_density_g_per_mm3": null,
      "factory_id": "battery_retainer",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "non_structural",
      "manufacturing_process": "sls_or_mjf_pa12",
      "material_id": "pa12_sls_mjf",
      "notes": [
        "PA12 is permitted here because battery retention is not a primary load path; the pack's inertial load reaches the airframe through the tray.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0"
      ],
      "part_id": "battery_retainer",
      "ports": [
        {
          "depth_mm": null,
          "description": "Bolted down onto the battery tray",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_retainer:tray_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Inboard face bearing against the battery end",
          "frame": {
            "origin_mm": {
              "x": -7.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": -1.0,
              "y": 0.0,
              "z": 0.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_retainer:battery_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Retainer to tray bolt",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": -60.0,
              "z": 24.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_retainer:bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Retainer to tray bolt",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 60.0,
              "z": 24.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_retainer:bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Battery tray, CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "battery_tray",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "Sized to the 238 x 160 mm bay plus the two 14 mm end retainers, not to the 233 x 158 mm nominal pack.",
        "The bay is the nominal pack grown by the vendor's own published production tolerance, so a pack built anywhere inside specification still goes in. Using the nominal footprint here would have made the tray 5 mm short in X and 2 mm short in Y against a conforming pack.",
        "The battery_seat port area is the NOMINAL footprint, because that is what actually bears on the tray; the bay clearance is empty air and counting it would understate the seat pressure.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 1"
      ],
      "part_id": "battery_tray",
      "ports": [
        {
          "depth_mm": null,
          "description": "Battery rests here, retained by the two end blocks and a strap",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 36814.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:battery_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bolted to the upper hub plate",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:plate_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Tray to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": -100.0,
              "y": -60.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:plate_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Tray to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": -100.0,
              "y": 60.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:plate_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Tray to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": 100.0,
              "y": -60.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:plate_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Tray to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": 100.0,
              "y": 60.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:plate_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Battery end-retainer bolt; nut seats under the tray",
          "frame": {
            "origin_mm": {
              "x": -126.0,
              "y": -60.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:retainer_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Battery end-retainer bolt; nut seats under the tray",
          "frame": {
            "origin_mm": {
              "x": -126.0,
              "y": 60.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:retainer_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Battery end-retainer bolt; nut seats under the tray",
          "frame": {
            "origin_mm": {
              "x": 126.0,
              "y": -60.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:retainer_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Battery end-retainer bolt; nut seats under the tray",
          "frame": {
            "origin_mm": {
              "x": 126.0,
              "y": 60.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery_tray:retainer_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Motor boom clamp half, laminated CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "boom_mount",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "The 26 mm square bolt pattern is the smallest that clears the 30 mm tube bore with a 4 mm edge margin on a 70 mm footprint.",
        "One part number serves both the upper and the lower half.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 8"
      ],
      "part_id": "boom_mount",
      "ports": [
        {
          "depth_mm": 70.0,
          "description": "Half-bore for the tube; nominal fit, adhesive bonded and clamped, so axial retention is friction plus bond, not a shoulder",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:boom_mount:bore",
          "port_type": "BORE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Split plane; mates against the opposing clamp half",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 4546.570826471148,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:boom_mount:split_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Outer face; seats against the hub plate or the motor plate",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 4900.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:boom_mount:back_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": -26.0,
              "y": -26.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:boom_mount:bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": -26.0,
              "y": 26.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:boom_mount:bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": 26.0,
              "y": -26.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:boom_mount:bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": 26.0,
              "y": 26.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:boom_mount:bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Isolated camera sub-tray, CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "camera_subtray",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "secondary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "Only the sprung mass hangs below the isolators: sub-tray, four floating brackets and the camera. That mass is what the isolator sizing used.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 1"
      ],
      "part_id": "camera_subtray",
      "ports": [
        {
          "depth_mm": null,
          "description": "Camera bolts up against this face, optical axis nadir",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 5468.4,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:camera_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bonded seat for floating isolator bracket 1",
          "frame": {
            "origin_mm": {
              "x": -35.0,
              "y": 40.2,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:bracket_1_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bonded seat for floating isolator bracket 2",
          "frame": {
            "origin_mm": {
              "x": -35.0,
              "y": -40.2,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:bracket_2_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bonded seat for floating isolator bracket 3",
          "frame": {
            "origin_mm": {
              "x": 35.0,
              "y": 40.2,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:bracket_3_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bonded seat for floating isolator bracket 4",
          "frame": {
            "origin_mm": {
              "x": 35.0,
              "y": -40.2,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:bracket_4_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "M3 into the camera's tapped mounting bosses, 60 x 35 mm pattern",
          "frame": {
            "origin_mm": {
              "x": -30.0,
              "y": -17.5,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:camera_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        },
        {
          "depth_mm": null,
          "description": "M3 into the camera's tapped mounting bosses, 60 x 35 mm pattern",
          "frame": {
            "origin_mm": {
              "x": -30.0,
              "y": 17.5,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:camera_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        },
        {
          "depth_mm": null,
          "description": "M3 into the camera's tapped mounting bosses, 60 x 35 mm pattern",
          "frame": {
            "origin_mm": {
              "x": 30.0,
              "y": -17.5,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:camera_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        },
        {
          "depth_mm": null,
          "description": "M3 into the camera's tapped mounting bosses, 60 x 35 mm pattern",
          "frame": {
            "origin_mm": {
              "x": 30.0,
              "y": 17.5,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera_subtray:camera_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "ESC saddle half, PA12",
      "effective_density_g_per_mm3": null,
      "factory_id": "esc_saddle",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "non_structural",
      "manufacturing_process": "sls_or_mjf_pa12",
      "material_id": "pa12_sls_mjf",
      "notes": [
        "Mounted at r = 320 mm, which is the only band on the arm clear of the hub clamp, the landing-leg clamp and the boom mount simultaneously.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0"
      ],
      "part_id": "esc_saddle",
      "ports": [
        {
          "depth_mm": 86.7,
          "description": "Half-bore clamping the arm tube",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:esc_saddle:bore",
          "port_type": "BORE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Split plane against the opposing saddle half",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:esc_saddle:split_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Flat pad the ESC is bonded to; KDE publish no bolt pattern for the UAS75HVC, so this interface is adhesive",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 18.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": 2557.75,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:esc_saddle:esc_pad",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Saddle clamp bolt, clear of the arm bore",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": -19.0,
              "z": 18.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:esc_saddle:bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        },
        {
          "depth_mm": null,
          "description": "Saddle clamp bolt, clear of the arm bore",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 19.0,
              "z": 18.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:esc_saddle:bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Lower hub plate, hexagonal CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "hub_plate_bottom",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "Identical outline and arm pattern to the upper plate so both nest in one sheet layout; only the secondary hole pattern differs.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 1"
      ],
      "part_id": "hub_plate_bottom",
      "ports": [
        {
          "depth_mm": null,
          "description": "Upper surface: arm clamp lower halves",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:topside",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Lower surface: underbody payload rails",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:underside",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 1 lower clamp half",
          "frame": {
            "origin_mm": {
              "x": 90.93266739736606,
              "y": 52.49999999999999,
              "z": 2.8
            },
            "x_axis": {
              "x": 0.8660254037844387,
              "y": 0.49999999999999994,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_1_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 2 lower clamp half",
          "frame": {
            "origin_mm": {
              "x": 6.429395695523604e-15,
              "y": 105.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 6.123233995736766e-17,
              "y": 1.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_2_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 3 lower clamp half",
          "frame": {
            "origin_mm": {
              "x": -90.93266739736606,
              "y": 52.49999999999999,
              "z": 2.8
            },
            "x_axis": {
              "x": -0.8660254037844387,
              "y": 0.49999999999999994,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_3_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 4 lower clamp half",
          "frame": {
            "origin_mm": {
              "x": -90.93266739736605,
              "y": -52.500000000000014,
              "z": 2.8
            },
            "x_axis": {
              "x": -0.8660254037844386,
              "y": -0.5000000000000001,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_4_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 5 lower clamp half",
          "frame": {
            "origin_mm": {
              "x": -1.928818708657081e-14,
              "y": -105.0,
              "z": 2.8
            },
            "x_axis": {
              "x": -1.8369701987210297e-16,
              "y": -1.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_5_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 6 lower clamp half",
          "frame": {
            "origin_mm": {
              "x": 90.93266739736603,
              "y": -52.50000000000005,
              "z": 2.8
            },
            "x_axis": {
              "x": 0.8660254037844384,
              "y": -0.5000000000000004,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_6_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for underbody payload rail 1",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 60.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 13200.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_1_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for underbody payload rail 2",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": -60.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 13200.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_2_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 84.6121593216773,
              "y": 23.44744111674234,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 62.6121593216773,
              "y": 61.552558883257646,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 119.25317547305484,
              "y": 43.44744111674234,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 97.25317547305484,
              "y": 81.55255888325765,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 22.000000000000004,
              "y": 85.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_5",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -21.999999999999996,
              "y": 85.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_6",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 22.000000000000007,
              "y": 125.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_7",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -21.999999999999993,
              "y": 125.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_8",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -62.6121593216773,
              "y": 61.552558883257646,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_9",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -84.6121593216773,
              "y": 23.44744111674234,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_10",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -97.25317547305484,
              "y": 81.55255888325765,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_11",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -119.25317547305484,
              "y": 43.44744111674234,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_12",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -84.61215932167728,
              "y": -23.447441116742358,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_13",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -62.61215932167728,
              "y": -61.55255888325766,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_14",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -119.25317547305482,
              "y": -43.44744111674237,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_15",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -97.25317547305482,
              "y": -81.55255888325766,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_16",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -22.000000000000014,
              "y": -85.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_17",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 21.999999999999986,
              "y": -85.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_18",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": -22.00000000000002,
              "y": -125.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_19",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 21.99999999999998,
              "y": -125.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_20",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 62.612159321677254,
              "y": -61.55255888325768,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_21",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 84.61215932167728,
              "y": -23.44744111674239,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_22",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 97.25317547305478,
              "y": -81.5525588832577,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_23",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; nut seats on the plate lower surface",
          "frame": {
            "origin_mm": {
              "x": 119.25317547305481,
              "y": -43.44744111674241,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:arm_bolt_24",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": -120.0,
              "y": 71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": -70.0,
              "y": 71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": -25.0,
              "y": 71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": 25.0,
              "y": 71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": 70.0,
              "y": 71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_5",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": 120.0,
              "y": 71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_6",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": -120.0,
              "y": -71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_7",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": -70.0,
              "y": -71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_8",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": -25.0,
              "y": -71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_9",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": 25.0,
              "y": -71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_10",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": 70.0,
              "y": -71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_11",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Payload rail retention bolt",
          "frame": {
            "origin_mm": {
              "x": 120.0,
              "y": -71.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:rail_bolt_12",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "PDIB standoff fastener: the standoff seats on the plate upper surface at the reserved board mounting plane, screw from the lower face (clear of the rails)",
          "frame": {
            "origin_mm": {
              "x": -37.5,
              "y": -33.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:pdib_mount_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        },
        {
          "depth_mm": null,
          "description": "PDIB standoff fastener: the standoff seats on the plate upper surface at the reserved board mounting plane, screw from the lower face (clear of the rails)",
          "frame": {
            "origin_mm": {
              "x": 37.5,
              "y": -33.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:pdib_mount_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        },
        {
          "depth_mm": null,
          "description": "PDIB standoff fastener: the standoff seats on the plate upper surface at the reserved board mounting plane, screw from the lower face (clear of the rails)",
          "frame": {
            "origin_mm": {
              "x": 37.5,
              "y": 33.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:pdib_mount_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        },
        {
          "depth_mm": null,
          "description": "PDIB standoff fastener: the standoff seats on the plate upper surface at the reserved board mounting plane, screw from the lower face (clear of the rails)",
          "frame": {
            "origin_mm": {
              "x": -37.5,
              "y": 33.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_bottom:pdib_mount_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Upper hub plate, hexagonal CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "hub_plate_top",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "Single 2.8 mm CFS-RI ply; the 330 mm across-corners outline fits the 2000 x 980 mm sheet limit.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 1"
      ],
      "part_id": "hub_plate_top",
      "ports": [
        {
          "depth_mm": null,
          "description": "Upper surface: battery tray and DLS 2 mount here",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:topside",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Lower surface: arm clamp upper halves and the avionics bay",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:underside",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Adhesive damping-pad seat for the flight controller; the Pixhawk 6X standard publishes no bolt pattern",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": 5418.16,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:fc_pad",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 1 upper clamp half",
          "frame": {
            "origin_mm": {
              "x": 90.93266739736606,
              "y": 52.49999999999999,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.8660254037844387,
              "y": 0.49999999999999994,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_1_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 2 upper clamp half",
          "frame": {
            "origin_mm": {
              "x": 6.429395695523604e-15,
              "y": 105.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 6.123233995736766e-17,
              "y": 1.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_2_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 3 upper clamp half",
          "frame": {
            "origin_mm": {
              "x": -90.93266739736606,
              "y": 52.49999999999999,
              "z": 0.0
            },
            "x_axis": {
              "x": -0.8660254037844387,
              "y": 0.49999999999999994,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_3_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 4 upper clamp half",
          "frame": {
            "origin_mm": {
              "x": -90.93266739736605,
              "y": -52.500000000000014,
              "z": 0.0
            },
            "x_axis": {
              "x": -0.8660254037844386,
              "y": -0.5000000000000001,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_4_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 5 upper clamp half",
          "frame": {
            "origin_mm": {
              "x": -1.928818708657081e-14,
              "y": -105.0,
              "z": 0.0
            },
            "x_axis": {
              "x": -1.8369701987210297e-16,
              "y": -1.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_5_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Seat for arm 6 upper clamp half",
          "frame": {
            "origin_mm": {
              "x": 90.93266739736603,
              "y": -52.50000000000005,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.8660254037844384,
              "y": -0.5000000000000004,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 3360.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_6_clamp_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 84.6121593216773,
              "y": 23.44744111674234,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 62.6121593216773,
              "y": 61.552558883257646,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 119.25317547305484,
              "y": 43.44744111674234,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 97.25317547305484,
              "y": 81.55255888325765,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 22.000000000000004,
              "y": 85.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_5",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -21.999999999999996,
              "y": 85.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_6",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 22.000000000000007,
              "y": 125.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_7",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -21.999999999999993,
              "y": 125.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_8",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -62.6121593216773,
              "y": 61.552558883257646,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_9",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -84.6121593216773,
              "y": 23.44744111674234,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_10",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -97.25317547305484,
              "y": 81.55255888325765,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_11",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -119.25317547305484,
              "y": 43.44744111674234,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_12",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -84.61215932167728,
              "y": -23.447441116742358,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_13",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -62.61215932167728,
              "y": -61.55255888325766,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_14",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -119.25317547305482,
              "y": -43.44744111674237,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_15",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -97.25317547305482,
              "y": -81.55255888325766,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_16",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -22.000000000000014,
              "y": -85.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_17",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 21.999999999999986,
              "y": -85.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_18",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -22.00000000000002,
              "y": -125.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_19",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 21.99999999999998,
              "y": -125.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_20",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 62.612159321677254,
              "y": -61.55255888325768,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_21",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 84.61215932167728,
              "y": -23.44744111674239,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_22",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 97.25317547305478,
              "y": -81.5525588832577,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_23",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Arm-clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 119.25317547305481,
              "y": -43.44744111674241,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:arm_bolt_24",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Battery tray retention bolt",
          "frame": {
            "origin_mm": {
              "x": -100.0,
              "y": -60.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:tray_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Battery tray retention bolt",
          "frame": {
            "origin_mm": {
              "x": -100.0,
              "y": 60.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:tray_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Battery tray retention bolt",
          "frame": {
            "origin_mm": {
              "x": 100.0,
              "y": -60.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:tray_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Battery tray retention bolt",
          "frame": {
            "origin_mm": {
              "x": 100.0,
              "y": 60.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:hub_plate_top:tray_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Isolator L-bracket, CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "iso_bracket",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "secondary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "The isolators work in their shear/roll axis, which is the softest axis Enidine publish, so the bracket webs are parallel and the bar length axis is vertical.",
        "One part number serves the fixed and the floating positions.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 1"
      ],
      "part_id": "iso_bracket",
      "ports": [
        {
          "depth_mm": null,
          "description": "Bonded flat to the isolator deck underside or the camera sub-tray top face; the port origin is the bracket datum, so the mate solver places the datum directly on the seat",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_bracket:foot_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Outer web face; the isolator bar bears here on the sub-tray brackets. Bearing area is not recorded because Enidine publish no bar cross-section width",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 2.8,
              "z": -23.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 1.0,
              "z": 0.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_bracket:isolator_face_outer",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Inner web face; the isolator bar bears here on the deck brackets",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": -23.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 0.0,
              "y": -1.0,
              "z": 0.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_bracket:isolator_face_inner",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Single central M3 into the isolator's tapped bar; Enidine do not publish the two-hole bar pitch, so only the centre is grounded",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 1.4,
              "z": -23.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 1.0,
              "z": 0.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.4,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_bracket:isolator_bolt",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M3x0.5"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Isolator deck, CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "iso_deck",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "secondary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "Bolts through the rail CG slots, giving +/-42.8 mm of longitudinal CG trim.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 1"
      ],
      "part_id": "iso_deck",
      "ports": [
        {
          "depth_mm": null,
          "description": "Clamped up against the payload rails through their CG slots",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:rail_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bonded seat for fixed isolator bracket 1",
          "frame": {
            "origin_mm": {
              "x": -35.0,
              "y": 70.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:bracket_1_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bonded seat for fixed isolator bracket 2",
          "frame": {
            "origin_mm": {
              "x": -35.0,
              "y": -70.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:bracket_2_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bonded seat for fixed isolator bracket 3",
          "frame": {
            "origin_mm": {
              "x": 35.0,
              "y": 70.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:bracket_3_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Bonded seat for fixed isolator bracket 4",
          "frame": {
            "origin_mm": {
              "x": 35.0,
              "y": -70.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": 600.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:bracket_4_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Deck to rail bolt, clamping inside the CG slot",
          "frame": {
            "origin_mm": {
              "x": -55.0,
              "y": -49.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:rail_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Deck to rail bolt, clamping inside the CG slot",
          "frame": {
            "origin_mm": {
              "x": -55.0,
              "y": 49.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:rail_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Deck to rail bolt, clamping inside the CG slot",
          "frame": {
            "origin_mm": {
              "x": 55.0,
              "y": -49.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:rail_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Deck to rail bolt, clamping inside the CG slot",
          "frame": {
            "origin_mm": {
              "x": 55.0,
              "y": 49.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:iso_deck:rail_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Landing leg clamp, lower half with leg socket, laminated CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "leg_clamp_lower",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "16 bonded plies. The leg socket roof sits 7.0 mm below the arm bore, so the two bores do not break into each other.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 16"
      ],
      "part_id": "leg_clamp_lower",
      "ports": [
        {
          "depth_mm": 52.0,
          "description": "Half-bore clamping the arm tube",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 44.8
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_lower:arm_bore",
          "port_type": "BORE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Split plane against the upper leg-clamp half",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 44.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_lower:split_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": 22.8,
          "description": "Blind bonded socket receiving the vertical leg tube",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_lower:leg_socket",
          "port_type": "PRESS_FIT",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Leg-clamp through bolt; nut seats on the lower face",
          "frame": {
            "origin_mm": {
              "x": -18.0,
              "y": -19.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_lower:bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Leg-clamp through bolt; nut seats on the lower face",
          "frame": {
            "origin_mm": {
              "x": -18.0,
              "y": 19.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_lower:bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Leg-clamp through bolt; nut seats on the lower face",
          "frame": {
            "origin_mm": {
              "x": 18.0,
              "y": -19.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_lower:bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Leg-clamp through bolt; nut seats on the lower face",
          "frame": {
            "origin_mm": {
              "x": 18.0,
              "y": 19.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_lower:bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Landing leg clamp, upper half, laminated CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "leg_clamp_upper",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "The 56 mm clamp width is set by the bolt pattern: 19 mm transverse is the smallest offset that clears the 30 mm arm bore, and 5 mm of edge margin then forces the width.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 8"
      ],
      "part_id": "leg_clamp_upper",
      "ports": [
        {
          "depth_mm": 52.0,
          "description": "Half-bore for the tube; nominal fit, adhesive bonded and clamped, so axial retention is friction plus bond, not a shoulder",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_upper:bore",
          "port_type": "BORE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Split plane; mates against the opposing clamp half",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 2558.5708264711484,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_upper:split_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Outer face; seats against the hub plate or the motor plate",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 2912.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_upper:back_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": -18.0,
              "y": -19.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_upper:bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": -18.0,
              "y": 19.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_upper:bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": 18.0,
              "y": -19.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_upper:bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Clamp through bolt",
          "frame": {
            "origin_mm": {
              "x": 18.0,
              "y": 19.0,
              "z": 22.4
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_clamp_upper:bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Landing gear elbow, laminated CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "leg_elbow",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "22 bonded plies = 61.6 mm, which is the smallest laminate in which the blind leg socket, the through skid bore and a full ply of floor under the bore all fit without intersecting.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 22"
      ],
      "part_id": "leg_elbow",
      "ports": [
        {
          "depth_mm": 22.8,
          "description": "Blind bonded socket receiving the leg tube from above",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 61.599999999999994
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_elbow:leg_socket",
          "port_type": "PRESS_FIT",
          "thread_designation": null
        },
        {
          "depth_mm": 46.0,
          "description": "Through bore bonded to the skid tube",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 17.8
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_elbow:skid_bore",
          "port_type": "BORE",
          "thread_designation": null
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Landing leg tube, 30 x 27 mm roll-wrapped CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "leg_tube",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_rollwrapped_tube",
      "notes": [
        "150 mm; length solved from the required 60 mm clearance under the camera, rounded up to a 10 mm cut.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0"
      ],
      "part_id": "leg_tube",
      "ports": [
        {
          "depth_mm": null,
          "description": "Tube end A",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_tube:end_a",
          "port_type": "SHAFT",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Tube end B",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 150.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_tube:end_b",
          "port_type": "SHAFT",
          "thread_designation": null
        },
        {
          "depth_mm": 150.0,
          "description": "Tube axis at mid-length, for clamp mates",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 75.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:leg_tube:axis",
          "port_type": "SHAFT",
          "thread_designation": null
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Motor mounting plate, laminated CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "motor_plate",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "4 bonded plies = 11.2 mm; the underside pocket removes 5.6 mm to clear the M4 socket heads, leaving a 5.6 mm web under the motor.",
        "Plate is 70 mm square so the 69.50 mm motor base boss is fully supported.",
        "Central 0 mm through hole clears the motor's 6.80 mm rear protrusion (measured radius 7.669 mm in KDE's STEP) with 1.33 mm to spare, and stays inside the 12.25 mm inner radius of the motor's annular mounting face so no bearing area is lost.",
        "Motor bolts are on KDE's 40 mm M4 circle at its native 84.77 deg phase. The 30 mm circle of the same triple-90 pattern would leave a 3.85 mm web to the central hole, under the 4.40 mm edge distance this design is checked against; the 40 mm circle leaves 8.85 mm.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 4"
      ],
      "part_id": "motor_plate",
      "ports": [
        {
          "depth_mm": null,
          "description": "Upper surface, net of the central clearance hole and the eight through holes; the motor's annular flange lands on it. The bearing area of the joint is the smaller of this face and the motor's own 1744.27 mm^2 annulus, and is resolved where the load cases are built, not here",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 11.2
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 4772.765497529614,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:motor_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Lower surface; bonded and bolted to the upper boom clamp half",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:boom_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Motor retention screw; head seats in the relief pocket and the screw threads up into the motor base",
          "frame": {
            "origin_mm": {
              "x": 1.1393138987292355,
              "y": 12.447970269893899,
              "z": 5.6
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:motor_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Motor retention screw; head seats in the relief pocket and the screw threads up into the motor base",
          "frame": {
            "origin_mm": {
              "x": -12.447970269893899,
              "y": 1.1393138987292337,
              "z": 5.6
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:motor_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Motor retention screw; head seats in the relief pocket and the screw threads up into the motor base",
          "frame": {
            "origin_mm": {
              "x": -1.1393138987292344,
              "y": -12.447970269893899,
              "z": 5.6
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:motor_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Motor retention screw; head seats in the relief pocket and the screw threads up into the motor base",
          "frame": {
            "origin_mm": {
              "x": 12.447970269893899,
              "y": -1.1393138987292353,
              "z": 5.6
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:motor_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Boom clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -26.0,
              "y": -26.0,
              "z": 11.2
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:boom_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Boom clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": -26.0,
              "y": 26.0,
              "z": 11.2
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:boom_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Boom clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 26.0,
              "y": -26.0,
              "z": 11.2
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:boom_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Boom clamp through bolt; head seats on the plate upper surface",
          "frame": {
            "origin_mm": {
              "x": 26.0,
              "y": 26.0,
              "z": 11.2
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor_plate:boom_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Slotted underbody payload rail, CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "payload_rail",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_cfs_ri_3mm",
      "notes": [
        "Rigid by design. The IR requires both payload rails and camera vibration isolation; those cannot be the same interface without putting one configuration on resonance, so the camera hangs on a separate isolated sub-assembly and these rails stay stiff.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0",
        "laminate ply count 1"
      ],
      "part_id": "payload_rail",
      "ports": [
        {
          "depth_mm": null,
          "description": "Bolted up against the lower hub plate",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 2.8
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 13200.0,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:plate_seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Rigid payload interface; carries task_requirements.payload_kg",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:payload_face",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Rail to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": -120.0,
              "y": 11.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:plate_bolt_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Rail to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": -70.0,
              "y": 11.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:plate_bolt_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Rail to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": -25.0,
              "y": 11.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:plate_bolt_3",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Rail to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": 25.0,
              "y": 11.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:plate_bolt_4",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Rail to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": 70.0,
              "y": 11.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:plate_bolt_5",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "Rail to hub plate bolt",
          "frame": {
            "origin_mm": {
              "x": 120.0,
              "y": 11.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:plate_bolt_6",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "90 mm CG-adjustment slot; payload bolts clamp anywhere along it",
          "frame": {
            "origin_mm": {
              "x": -55.0,
              "y": -11.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:cg_slot_1",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        },
        {
          "depth_mm": null,
          "description": "90 mm CG-adjustment slot; payload bolts clamp anywhere along it",
          "frame": {
            "origin_mm": {
              "x": 55.0,
              "y": -11.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.5,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:payload_rail:cg_slot_2",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": "M4x0.7"
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Landing skid tube, 30 x 27 mm roll-wrapped CFRP",
      "effective_density_g_per_mm3": null,
      "factory_id": "skid_tube",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": "carbon_fiber_composite_fabrication",
      "material_id": "cfrp_rollwrapped_tube",
      "notes": [
        "430 mm, spanning both elbows on one side with 15 mm of overhang beyond each.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0"
      ],
      "part_id": "skid_tube",
      "ports": [
        {
          "depth_mm": null,
          "description": "Tube end A",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:skid_tube:end_a",
          "port_type": "SHAFT",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Tube end B",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 430.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:skid_tube:end_b",
          "port_type": "SHAFT",
          "thread_designation": null
        },
        {
          "depth_mm": 430.0,
          "description": "Tube axis at mid-length, for clamp mates",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 215.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:skid_tube:axis",
          "port_type": "SHAFT",
          "thread_designation": null
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": null,
      "dimensions": [],
      "display_name": "Landing skid wear sleeve, PA12",
      "effective_density_g_per_mm3": null,
      "factory_id": "skid_wear_sleeve",
      "factory_version": "1.0.0",
      "geometry_fidelity": "exact",
      "load_path": "non_structural",
      "manufacturing_process": "sls_or_mjf_pa12",
      "material_id": "pa12_sls_mjf",
      "notes": [
        "Sacrificial ground-contact part, satisfying the IR DFM requirement for a field-replaceable landing component.",
        "PA12 is permitted here because this is explicitly not a primary load path.",
        "Replacement procedure is 'unbolt one leg elbow and slide the sleeve off the skid end', not 'spring it off in place': the solid is a closed annulus. An earlier revision of this port claimed a split sleeve that the geometry has never had. A genuine C-section would need a snap-over strain calculation on the 3.0 mm PA12 wall that nothing here grounds, so the closed sleeve is what is built and the procedure is what is recorded.",
        "Bore and skid OD are both nominally 30.00 mm. That is deliberate: nominal CAD geometry for a fitted joint is line-to-line and the interference or clearance is carried by the tolerance callout. The callout itself is NOT grounded \u2014 neither the roll-wrapped tube's OD tolerance nor the SLS PA12 bore tolerance is published in the sources used here \u2014 so the fit class is an open item rather than a specified one.",
        "generated by anubis.stage2a.parts.factories, library version 1.0.0"
      ],
      "part_id": "skid_wear_sleeve",
      "ports": [
        {
          "depth_mm": 80.0,
          "description": "Bore onto the skid tube OD, nominally line-to-line at 30.00 mm; the fit lives in the tolerance callout, not in the nominal geometry. The sleeve is CLOSED \u2014 it is not a snap-on C-section \u2014 so replacement means unbolting one leg elbow and sliding it off the end of the skid",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 40.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 30.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:skid_wear_sleeve:bore",
          "port_type": "PRESS_FIT",
          "thread_designation": null
        }
      ],
      "source_strategy": "cached_factory",
      "standard_designation": null,
      "vendor_mass_g": null
    },
    {
      "catalog_id": "article_u_oa1",
      "dimensions": [
        {
          "justification": "Size 51 mm x 48 mm x 44 mm",
          "name": "extent_x_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/lightware_sf45b__sf45-b-50-m.html#Specifications (method=vendor_published)",
          "units": "mm",
          "value": 51.0
        },
        {
          "justification": "Size 51 mm x 48 mm x 44 mm",
          "name": "extent_y_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/lightware_sf45b__sf45-b-50-m.html#Specifications (method=vendor_published)",
          "units": "mm",
          "value": 48.0
        },
        {
          "justification": "Size 51 mm x 48 mm x 44 mm",
          "name": "extent_z_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/lightware_sf45b__sf45-b-50-m.html#Specifications (method=vendor_published)",
          "units": "mm",
          "value": 44.0
        }
      ],
      "display_name": "LightWare LiDAR SF45/B",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "non_structural",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "envelope of the stated overall size [51.0, 48.0, 44.0] mm (box); no maker model of this article was accepted, so the robot carries the datasheet envelope",
        "mass is the stated figure; the density is that mass over this envelope's volume",
        "placed by the article mount record mechanical/article_mounts/article_mounts.json (judged placement; the model only proposed it)",
        "LightWare LiDAR SF45/B; retrieved 2026-08-31T13:31:40+00:00 from https://lightwarelidar.com/shop/sf45-b-50-m/",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article",
        "MECH_CAD_SOURCE_GAP: no maker CAD of this exact MPN was accepted; the shape is the stated overall size"
      ],
      "part_id": "article_u_oa1",
      "ports": [
        {
          "depth_mm": null,
          "description": "Mounting face of the article (z out of the article), seated on the judged host face",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:article_u_oa1:seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 59.0
    },
    {
      "catalog_id": "article_u_oa2_u_oa5",
      "dimensions": [
        {
          "justification": "Measured by 42 mm x 15 mm x 16 mm",
          "name": "extent_x_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/benewake_tfminis__index.html#Section 01 (method=vendor_published)",
          "units": "mm",
          "value": 42.0
        },
        {
          "justification": "Measured by 42 mm x 15 mm x 16 mm",
          "name": "extent_y_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/benewake_tfminis__index.html#Section 01 (method=vendor_published)",
          "units": "mm",
          "value": 16.0
        },
        {
          "justification": "Measured by 42 mm x 15 mm x 16 mm",
          "name": "extent_z_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/benewake_tfminis__index.html#Section 01 (method=vendor_published)",
          "units": "mm",
          "value": 15.0
        }
      ],
      "display_name": "Benewake TFmini-S",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "non_structural",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "envelope of the stated overall size [42.0, 15.0, 16.0] mm (box); no maker model of this article was accepted, so the robot carries the datasheet envelope",
        "mass is the stated figure; the density is that mass over this envelope's volume",
        "placed by the article mount record mechanical/article_mounts/article_mounts.json (judged placement; the model only proposed it)",
        "Benewake TFmini-S; retrieved 2026-08-31T13:31:32+00:00 from https://en.benewake.com/TFminiS/index.html",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article",
        "MECH_CAD_SOURCE_GAP: no maker CAD of this exact MPN was accepted; the shape is the stated overall size"
      ],
      "part_id": "article_u_oa2_u_oa5",
      "ports": [
        {
          "depth_mm": null,
          "description": "Mounting face of the article (z out of the article), seated on the judged host face",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:article_u_oa2_u_oa5:seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 5.0
    },
    {
      "catalog_id": "article_u_pm",
      "dimensions": [
        {
          "justification": "Dimensions | 45 x 41 x 26mm (Not Include Cable)",
          "name": "extent_x_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/holybro_pm_compare_md__power-module-comparison.md# (method=vendor_published)",
          "units": "mm",
          "value": 45.0
        },
        {
          "justification": "Dimensions | 45 x 41 x 26mm (Not Include Cable)",
          "name": "extent_y_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/holybro_pm_compare_md__power-module-comparison.md# (method=vendor_published)",
          "units": "mm",
          "value": 41.0
        },
        {
          "justification": "Dimensions | 45 x 41 x 26mm (Not Include Cable)",
          "name": "extent_z_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/holybro_pm_compare_md__power-module-comparison.md# (method=vendor_published)",
          "units": "mm",
          "value": 26.0
        }
      ],
      "display_name": "Holybro PM08-CAN",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "non_structural",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "envelope of the stated overall size [45.0, 41.0, 26.0] mm (box); no maker model of this article was accepted, so the robot carries the datasheet envelope",
        "mass is the stated figure; the density is that mass over this envelope's volume",
        "placed by the article mount record mechanical/article_mounts/article_mounts.json (judged placement; the model only proposed it)",
        "Holybro PM08-CAN; retrieved 2026-08-31T13:31:48+00:00 from https://docs.holybro.com/power-module-and-pdb/power-module-comparison.md",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article",
        "MECH_CAD_SOURCE_GAP: no maker CAD of this exact MPN was accepted; the shape is the stated overall size"
      ],
      "part_id": "article_u_pm",
      "ports": [
        {
          "depth_mm": null,
          "description": "Mounting face of the article (z out of the article), seated on the judged host face",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:article_u_pm:seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 185.0
    },
    {
      "catalog_id": "article_u_telem",
      "dimensions": [
        {
          "justification": "Dimensions of 30mm x 57mm x 12.8mm",
          "name": "extent_x_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/rfd900x_ds__RFD900x_20DataSheet.pdf# (method=vendor_published)",
          "units": "mm",
          "value": 57.0
        },
        {
          "justification": "Dimensions of 30mm x 57mm x 12.8mm",
          "name": "extent_y_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/rfd900x_ds__RFD900x_20DataSheet.pdf# (method=vendor_published)",
          "units": "mm",
          "value": 12.8
        },
        {
          "justification": "Dimensions of 30mm x 57mm x 12.8mm",
          "name": "extent_z_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/electrical/datasheet_records/raw/rfd900x_ds__RFD900x_20DataSheet.pdf# (method=vendor_published)",
          "units": "mm",
          "value": 30.0
        }
      ],
      "display_name": "RFDesign RFD900x",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "non_structural",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "envelope of the stated overall size [30.0, 57.0, 12.8] mm (box); no maker model of this article was accepted, so the robot carries the datasheet envelope",
        "mass is the stated figure; the density is that mass over this envelope's volume",
        "placed by the article mount record mechanical/article_mounts/article_mounts.json (judged placement; the model only proposed it)",
        "RFDesign RFD900x; retrieved 2026-08-31T13:28:43+00:00 from https://files.rfdesign.com.au/Files/documents/RFD900x%20DataSheet.pdf",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article",
        "MECH_CAD_SOURCE_GAP: no maker CAD of this exact MPN was accepted; the shape is the stated overall size"
      ],
      "part_id": "article_u_telem",
      "ports": [
        {
          "depth_mm": null,
          "description": "Mounting face of the article (z out of the article), seated on the judged host face",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:article_u_telem:seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 14.0
    },
    {
      "catalog_id": "battery_tattu_neo_compact_26000_12s",
      "dimensions": [
        {
          "justification": "26000mAh 12S1P",
          "name": "capacity_ah",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Product title (method=vendor_published)",
          "units": "Ah",
          "value": 26.0
        },
        {
          "justification": "Discharge Rate (C): 10C",
          "name": "discharge_c_rating",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "C",
          "value": 10.0
        },
        {
          "justification": "Dimensions (L x W x H) : 233 x 158 x 100 mm",
          "name": "height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "mm",
          "value": 100.0
        },
        {
          "justification": "Length(+/-5mm): 233 Width(+/-2mm): 158 Height(+/-2mm): 100",
          "name": "height_tolerance_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "mm",
          "value": 2.0
        },
        {
          "justification": "Dimensions (L x W x H) : 233 x 158 x 100 mm",
          "name": "length_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "mm",
          "value": 233.0
        },
        {
          "justification": "Length(+/-5mm): 233 Width(+/-2mm): 158 Height(+/-2mm): 100",
          "name": "length_tolerance_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "mm",
          "value": 5.0
        },
        {
          "justification": "Net Weight(+/-200g): 4250",
          "name": "mass_tolerance_g",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "g",
          "value": 200.0
        },
        {
          "justification": "44.4V",
          "name": "nominal_voltage_v",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Product title (method=vendor_published)",
          "units": "V",
          "value": 44.4
        },
        {
          "justification": "Discharge Wire Length(mm): 230mm",
          "name": "pigtail_length_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "mm",
          "value": 230.0
        },
        {
          "justification": "Dimensions (L x W x H) : 233 x 158 x 100 mm",
          "name": "width_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "mm",
          "value": 158.0
        },
        {
          "justification": "Length(+/-5mm): 233 Width(+/-2mm): 158 Height(+/-2mm): 100",
          "name": "width_tolerance_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tattu/TattuNEOCompact-26000-12S/product_page.html#Specifications table (method=vendor_published)",
          "units": "mm",
          "value": 2.0
        }
      ],
      "display_name": "Tattu NEO Compact 26000 mAh 12S1P LiPo pack",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "non_structural",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "Envelope 233.0 x 158.0 x 100.0 mm from the vendor's published outline. Mass is the vendor figure; the density used for the mass-properties run is the vendor mass divided by this envelope volume, so the total mass and the centre of mass are right and only the internal mass distribution is idealised.",
        "Selection of the pack capacity is Stage 2B's design variable; Stage 2A owns only the mechanical envelope and retention.",
        "This solid is the nominal 233 x 158 x 100 mm envelope. The pack's published tolerance is +5/+2/+2 mm, so the bay around it is built to 238 x 160 x 102 mm and this box is deliberately smaller than the space reserved for it.",
        "Tattu (Grepow) Tattu NEO Compact 26000mAh 12S1P; retrieved 2026-08-31 from https://genstattu.com/tattu-neo-compact-26000mah-12s1p-44-4v-10c-smart-uav-lipo-battery-with-as150u-f-plug/",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article"
      ],
      "part_id": "battery",
      "ports": [
        {
          "depth_mm": null,
          "description": "Seating face of the published outline envelope",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:battery:seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 4250.0
    },
    {
      "catalog_id": "cam_micasense_rededge_p",
      "dimensions": [
        {
          "justification": "Height 67.35 mm",
          "name": "height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/micasense/RedEdge-P/RedEdge-P-Guide-Dec2021.pdf#p.6 Physical table (method=vendor_published)",
          "units": "mm",
          "value": 67.35
        },
        {
          "justification": "Length 86.8 mm",
          "name": "length_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/micasense/RedEdge-P/RedEdge-P-Guide-Dec2021.pdf#p.6 Physical table (method=vendor_published)",
          "units": "mm",
          "value": 86.8
        },
        {
          "justification": "There are four M3 screw holes at 60 mm x 35 mm on-center.",
          "name": "mount_hole_pitch_x_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/micasense/RedEdge-P/RedEdge-P-Guide-Dec2021.pdf#p.5, 'Mounting' section (method=vendor_published)",
          "units": "mm",
          "value": 60.0
        },
        {
          "justification": "There are four M3 screw holes at 60 mm x 35 mm on-center.",
          "name": "mount_hole_pitch_y_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/micasense/RedEdge-P/RedEdge-P-Guide-Dec2021.pdf#p.5, 'Mounting' section (method=vendor_published)",
          "units": "mm",
          "value": 35.0
        },
        {
          "justification": "Width 63 mm",
          "name": "width_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/micasense/RedEdge-P/RedEdge-P-Guide-Dec2021.pdf#p.6 Physical table (method=vendor_published)",
          "units": "mm",
          "value": 63.0
        }
      ],
      "display_name": "MicaSense RedEdge-P multispectral camera",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "secondary",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "Envelope 86.8 x 63.0 x 67.35 mm from the RedEdge-P integration guide. Datum is the top face because that is the mating face.",
        "MicaSense (AgEagle) RedEdge-P; retrieved 2026-08-31 from https://xcopter.com/download/RedEdge-P-Guide-Dec2021.pdf",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article"
      ],
      "part_id": "camera",
      "ports": [
        {
          "depth_mm": null,
          "description": "Top face; bolts up against the isolated sub-tray",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera:top_mount",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Four M3 holes at 60.0 x 35.0 mm on-centre (rectangular, not a bolt circle)",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.0,
          "pattern_bcd_mm": null,
          "pattern_count": 4,
          "port_id": "@port:camera:mount_threads",
          "port_type": "THREAD_INTERNAL",
          "thread_designation": "M3x0.5"
        },
        {
          "depth_mm": null,
          "description": "Nadir-facing lens plane; the lowest payload surface and the feature the landing-gear height is solved against",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": -67.35
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:camera:optical_axis",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 245.0
    },
    {
      "catalog_id": "dls2_micasense",
      "dimensions": [
        {
          "justification": "Height 14.03 mm",
          "name": "height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/micasense/RedEdge-P/RedEdge-P-Guide-Dec2021.pdf#p.19 (method=vendor_published)",
          "units": "mm",
          "value": 14.03
        },
        {
          "justification": "Length 63.50 mm",
          "name": "length_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/micasense/RedEdge-P/RedEdge-P-Guide-Dec2021.pdf#p.19 (method=vendor_published)",
          "units": "mm",
          "value": 63.5
        },
        {
          "justification": "Width 46.00 mm",
          "name": "width_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/micasense/RedEdge-P/RedEdge-P-Guide-Dec2021.pdf#p.19 (method=vendor_published)",
          "units": "mm",
          "value": 46.0
        }
      ],
      "display_name": "MicaSense DLS 2 downwelling light sensor and GPS",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "non_structural",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "Envelope 63.5 x 46.0 x 14.03 mm from the vendor's published outline. Mass is the vendor figure; the density used for the mass-properties run is the vendor mass divided by this envelope volume, so the total mass and the centre of mass are right and only the internal mass distribution is idealised.",
        "Must sit on the topside with an unobstructed upward hemisphere, which is why it is on the top plate beside the battery tray and not under it.",
        "MicaSense (AgEagle) DLS 2; retrieved 2026-08-31 from https://xcopter.com/download/RedEdge-P-Guide-Dec2021.pdf",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article"
      ],
      "part_id": "dls2",
      "ports": [
        {
          "depth_mm": null,
          "description": "Seating face of the published outline envelope",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:dls2:seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 54.0
    },
    {
      "catalog_id": "esc_tmotor_alpha_60a_12s",
      "dimensions": [
        {
          "justification": "Size | 78.7*32.5*16.2mm\uff08L*W*H\uff09",
          "name": "body_height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/ALPHA-60A-12S-V1.2/product_page.html#div class=\"basicParameterBox\" Specification table, row \"Size\" (method=vendor_published)",
          "units": "mm",
          "value": 16.2
        },
        {
          "justification": "Size | 78.7*32.5*16.2mm\uff08L*W*H\uff09",
          "name": "body_length_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/ALPHA-60A-12S-V1.2/product_page.html#div class=\"basicParameterBox\" Specification table, row \"Size\" (method=vendor_published)",
          "units": "mm",
          "value": 78.7
        },
        {
          "justification": "Size | 78.7*32.5*16.2mm\uff08L*W*H\uff09",
          "name": "body_width_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/ALPHA-60A-12S-V1.2/product_page.html#div class=\"basicParameterBox\" Specification table, row \"Size\" (method=vendor_published)",
          "units": "mm",
          "value": 32.5
        }
      ],
      "display_name": "T-MOTOR ALPHA 60A 12S V1.2 electronic speed controller",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "non_structural",
      "manufacturing_process": null,
      "material_id": "al7075_t6",
      "notes": [
        "Envelope 78.7 x 32.5 x 16.2 mm from the vendor's published outline. Mass is the vendor figure; the density used for the mass-properties run is the vendor mass divided by this envelope volume, so the total mass and the centre of mass are right and only the internal mass distribution is idealised.",
        "Envelope taken from the product page's printed 'Size' row, 78.7 x 32.5 x 16.2 mm, and read here from the layout so the ESC and its saddle clip are sized from one figure rather than two.",
        "Retained by a saddle clip on the arm tube and bonded to its pad, exactly as the retired KDE ESC was, and for the same reason: no published bolt pattern. That the two agree is a coincidence of the vendors' publishing habits, not a design choice carried across.",
        "T-MOTOR ALPHA 60A 12S V1.2; retrieved 2026-08-31 from https://store.tmotor.com/product/alpha-60a-12s-esc.html",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article",
        "MECH_CAD_SOURCE_GAP: T-MOTOR publish no 3D model for the ALPHA 60A 12S, so its envelope is a printed outline rather than a queried solid and its internal mass distribution is idealised as uniform. The published 73 g is used for the total and the centre of mass; only the inertia about its own centre is an idealisation.",
        "MECH_CAD_SOURCE_GAP: No published mounting-hole pattern for the ALPHA 60A 12S. The saddle clip is therefore a friction-and-bond interface and no fastener holes are invented for it. A bolted ESC interface needs a vendor answer."
      ],
      "part_id": "esc",
      "ports": [
        {
          "depth_mm": null,
          "description": "Seating face of the published outline envelope",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:esc:seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 73.0
    },
    {
      "catalog_id": "fc_pixhawk6x_standard",
      "dimensions": [
        {
          "justification": "Standard Baseboard: 52.4 x 103.4 x 16.7mm",
          "name": "baseboard_height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/holybro/Pixhawk6X/px4_docs_pixhawk6x.html#Mechanical data / Dimensions (method=vendor_published)",
          "units": "mm",
          "value": 16.7
        },
        {
          "justification": "Standard Baseboard: 52.4 x 103.4 x 16.7mm",
          "name": "baseboard_length_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/holybro/Pixhawk6X/px4_docs_pixhawk6x.html#Mechanical data / Dimensions (method=vendor_published)",
          "units": "mm",
          "value": 103.4
        },
        {
          "justification": "Standard Baseboard: 52.4 x 103.4 x 16.7mm",
          "name": "baseboard_width_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/holybro/Pixhawk6X/px4_docs_pixhawk6x.html#Mechanical data / Dimensions (method=vendor_published)",
          "units": "mm",
          "value": 52.4
        },
        {
          "justification": "Flight Controller Module: 38.8 x 31.8 x 14.6mm",
          "name": "module_height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/holybro/Pixhawk6X/px4_docs_pixhawk6x.html#Mechanical data / Dimensions (method=vendor_published)",
          "units": "mm",
          "value": 14.6
        },
        {
          "justification": "Flight Controller Module: 38.8 x 31.8 x 14.6mm",
          "name": "module_length_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/holybro/Pixhawk6X/px4_docs_pixhawk6x.html#Mechanical data / Dimensions (method=vendor_published)",
          "units": "mm",
          "value": 38.8
        },
        {
          "justification": "Flight Controller Module: 38.8 x 31.8 x 14.6mm",
          "name": "module_width_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/holybro/Pixhawk6X/px4_docs_pixhawk6x.html#Mechanical data / Dimensions (method=vendor_published)",
          "units": "mm",
          "value": 31.8
        }
      ],
      "display_name": "Holybro Pixhawk 6X (Pixhawk Autopilot v6X standard) flight controller",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "non_structural",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "Envelope 103.4 x 52.4 x 31.299999999999997 mm from the vendor's published outline. Mass is the vendor figure; the density used for the mass-properties run is the vendor mass divided by this envelope volume, so the total mass and the centre of mass are right and only the internal mass distribution is idealised.",
        "The Pixhawk Autopilot v6X standard (DS-012) specifies the electrical and mechanical interface of the flight-management unit but does not publish a baseboard fastener pattern, so this part is bonded to a damping pad on the underside of the top plate rather than bolted.",
        "Holybro Pixhawk 6X (Standard Baseboard); retrieved 2026-08-31 from https://docs.px4.io/main/en/flight_controller/pixhawk6x.html",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article",
        "MECH_CAD_SOURCE_GAP: DS-012 Pixhawk Autopilot v6X Standard publishes the FMU form factor but no baseboard mounting-hole pattern for the Holybro 6X carrier, so the flight-controller interface is an adhesive damping pad. A bolted interface would need a vendor drawing that does not exist in the cached set."
      ],
      "part_id": "flight_controller",
      "ports": [
        {
          "depth_mm": null,
          "description": "Seating face of the published outline envelope",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "non_structural",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:flight_controller:seat",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 74.0
    },
    {
      "catalog_id": "isolator_enidine_cr2_400",
      "dimensions": [
        {
          "justification": ".64 (16,3)",
          "name": "bar_length_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.41 CR2 Series drawing, mount-bar length (method=vendor_published)",
          "units": "mm",
          "value": 16.3
        },
        {
          "justification": ".44 (11,2)",
          "name": "bar_width_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.41 CR2 Series drawing, mount-bar width (method=vendor_published)",
          "units": "mm",
          "value": 11.2
        },
        {
          "justification": "CR2-400 1.07 (27) 1.06 (27) 0.16 (4,5)",
          "name": "height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.41 CR2 Series sizing table, height 'H' (method=vendor_published)",
          "units": "mm",
          "value": 27.0
        },
        {
          "justification": "4 CR2-400 1.1 (4,9) 0.62 (15,7) 20 (3,5) 7 (1,2)",
          "name": "max_static_compression_load_n",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.42 CR2 Series Compression table, curve 4 (method=vendor_published)",
          "units": "N",
          "value": 4.9
        },
        {
          "justification": "4 CR2-400 0.45 (2,0) 0.68 (17,3) 3 (0,53) 3 (0,53)",
          "name": "max_static_shear_load_n",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.42 CR2 Series Shear/Roll table, curve 4 (method=vendor_published)",
          "units": "N",
          "value": 2.0
        },
        {
          "justification": "Thread ... #4-40 UNC (M3 X 0,5)",
          "name": "mount_thread_metric_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.41 CR2 Series mounting options note (method=vendor_published)",
          "units": "mm",
          "value": 3.0
        },
        {
          "justification": "4 CR2-400 1.1 (4,9) 0.62 (15,7) 20 (3,5) 7 (1,2)",
          "name": "vibration_stiffness_compression_n_per_m",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.42 CR2 Series Compression table, curve 4, Kv (method=vendor_published)",
          "units": "N/m",
          "value": 3500.0
        },
        {
          "justification": "4 CR2-400 0.45 (2,0) 0.68 (17,3) 3 (0,53) 3 (0,53)",
          "name": "vibration_stiffness_shear_n_per_m",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.42 CR2 Series Shear/Roll table, curve 4, Kv (method=vendor_published)",
          "units": "N/m",
          "value": 530.0
        },
        {
          "justification": "CR2-400 1.07 (27) 1.06 (27) 0.16 (4,5)",
          "name": "width_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/enidine/CR-series/WR_Catalog.pdf#p.41 CR2 Series sizing table, width 'W' (Ref) (method=vendor_published)",
          "units": "mm",
          "value": 27.0
        }
      ],
      "display_name": "ITT Enidine CR2-400 compact wire-rope isolator",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "envelope_only",
      "load_path": "secondary",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "Envelope 27.0 x 27.0 x 16.3 mm from the WR catalogue outline. The cable loops are not modelled; only the installed envelope and the two bar faces matter for assembly.",
        "Enidine (ITT) CR2-400-D; retrieved 2026-08-31 from https://www.enidine.com/en-us/products/compact-wire-rope-isolators",
        "no vendor CAD published; geometry is built from datasheet dimensions and the fidelity field says how far that is from the article",
        "MECH_CAD_SOURCE_GAP: The Enidine WR catalogue dimensions the mounting bar length but not the bar's two-hole pitch, so each isolator is retained by a single central M3 through the bracket web instead of the catalogue's two holes. A two-hole bracket pattern cannot be drawn from the cached catalogue without inventing the pitch."
      ],
      "part_id": "isolator",
      "ports": [
        {
          "depth_mm": null,
          "description": "Mounting bar on the sprung-mass side",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 0.0,
              "y": -1.0,
              "z": 0.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:isolator:bar_a",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Mounting bar on the airframe side",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 27.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 1.0,
              "z": 0.0
            }
          },
          "load_path": "secondary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": null,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:isolator:bar_b",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 4.5
    },
    {
      "catalog_id": "motor_tmotor_mn5008_kv170",
      "dimensions": [
        {
          "justification": "GeomAbs_Cylinder radius 27.8000",
          "name": "body_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#largest z-axial cylindrical face in the assembly (method=brep_queried)",
          "units": "mm",
          "value": 55.6
        },
        {
          "justification": "airframe mount ring: 4 holes; measured hole radius spans [1.24999999999999, 1.24999999999999], bolt-circle radius spans [12.5, 12.5], angles 84.770512, 174.770512, 264.770512, 354.770512 deg, modelled depths [7.0] mm",
          "name": "mount_bolt_circle_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#tap-drill ring on solid 2 (the bearing-housing solid) (method=brep_queried)",
          "units": "mm",
          "value": 25.0
        },
        {
          "justification": "area 188.361 mm2 over r [7.7000, 15.5000]",
          "name": "mount_face_bearing_area_mm2",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#GProp_GProps.SurfaceProperties on the face at z=42.1000 (method=brep_queried)",
          "units": "mm2",
          "value": 188.361492298
        },
        {
          "justification": "face r extent [7.7000, 15.5000], area 188.361 mm2",
          "name": "mount_face_inner_radius_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#planar face at z=42.1000 on solid 2 (method=brep_queried)",
          "units": "mm",
          "value": 7.7
        },
        {
          "justification": "face r extent [7.7000, 15.5000], area 188.361 mm2",
          "name": "mount_face_outer_radius_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#planar face at z=42.1000 on solid 2 (method=brep_queried)",
          "units": "mm",
          "value": 15.5
        },
        {
          "justification": "z min 42.10000 vs mount face 42.10000",
          "name": "mount_face_protrusion_height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#assembly z minimum vs the mount face datum (method=brep_queried)",
          "units": "mm",
          "value": 0.0
        },
        {
          "justification": "mount face z=42.1000, rotor face z=69.1000",
          "name": "mount_face_to_rotor_face_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#planar face z datums at the two ends (method=brep_queried)",
          "units": "mm",
          "value": 27.0
        },
        {
          "justification": "airframe mount ring: 4 holes; measured hole radius spans [1.24999999999999, 1.24999999999999], bolt-circle radius spans [12.5, 12.5], angles 84.770512, 174.770512, 264.770512, 354.770512 deg, modelled depths [7.0] mm",
          "name": "mount_hole_count",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#tap-drill ring on solid 2 (method=brep_queried)",
          "units": "holes",
          "value": 4.0
        },
        {
          "justification": "airframe mount ring: 4 holes; measured hole radius spans [1.24999999999999, 1.24999999999999], bolt-circle radius spans [12.5, 12.5], angles 84.770512, 174.770512, 264.770512, 354.770512 deg, modelled depths [7.0] mm",
          "name": "mount_phase_deg",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#tap-drill ring on solid 2, first hole by angle (method=brep_queried)",
          "units": "deg",
          "value": 84.770512047
        },
        {
          "justification": "airframe mount ring: 4 holes; measured hole radius spans [1.24999999999999, 1.24999999999999], bolt-circle radius spans [12.5, 12.5], angles 84.770512, 174.770512, 264.770512, 354.770512 deg, modelled depths [7.0] mm",
          "name": "mount_tap_drill_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#tap-drill ring on solid 2 (method=brep_queried)",
          "units": "mm",
          "value": 2.5
        },
        {
          "justification": "z [42.10000, 74.00000]; both extremes are set by planar faces, so the OCCT bounding box agrees to within 0.000000 mm here, unlike the radial extent",
          "name": "overall_height_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#triangulation z extent at 0.005 mm deflection, whole assembly (method=brep_queried)",
          "units": "mm",
          "value": 31.9
        },
        {
          "justification": "rotor inner ring: 4 holes; measured hole radius spans [1.24999999999999, 1.24999999999999], bolt-circle radius spans [5.99999999999983, 6], angles 45.000000, 135.000000, 225.000000, 315.000000 deg, modelled depths [8.500528182, 8.500853458] mm",
          "name": "prop_bolt_circle_inner_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#tap-drill ring on solid 1 (the magnet-can solid) (method=brep_queried)",
          "units": "mm",
          "value": 12.0
        },
        {
          "justification": "rotor outer ring: 4 holes; measured hole radius spans [1.24999999999999, 1.24999999999999], bolt-circle radius spans [8.99999999999975, 9.00000000000025], angles 0.000000, 90.000000, 180.000000, 270.000000 deg, modelled depths [2.993777001] mm",
          "name": "prop_bolt_circle_outer_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#tap-drill ring on solid 1 (the magnet-can solid) (method=brep_queried)",
          "units": "mm",
          "value": 18.0
        },
        {
          "justification": "max |p - axis| over 63961 nodes = 27.80000; the same query at 0.05 mm deflection gives 27.80000, so the value is converged",
          "name": "radial_envelope_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#maximum node radius about the part axis over a triangulation at 0.005 mm deflection, whole assembly (method=brep_queried)",
          "units": "mm",
          "value": 55.6
        },
        {
          "justification": "rotor face z=69.1000 - mount face z=42.1000",
          "name": "rotor_face_height_above_mount_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#planar face at z=69.1000 on solid 1 (method=brep_queried)",
          "units": "mm",
          "value": 27.0
        },
        {
          "justification": "face r extent [4.0000, 12.0000], area 362.854 mm2",
          "name": "rotor_face_inner_radius_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#planar face at z=69.1000 on solid 1 (method=brep_queried)",
          "units": "mm",
          "value": 4.0
        },
        {
          "justification": "face r extent [4.0000, 12.0000], area 362.854 mm2",
          "name": "rotor_face_outer_radius_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#planar face at z=69.1000 on solid 1 (method=brep_queried)",
          "units": "mm",
          "value": 12.0
        },
        {
          "justification": "GeomAbs_Cylinder radius 3.0000 on axis",
          "name": "shaft_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#on-axis cylinder through the bearing span (method=brep_queried)",
          "units": "mm",
          "value": 6.0
        },
        {
          "justification": "GeomAbs_Cylinder radius 2.0000 on axis, z [69.000, 73.700]",
          "name": "shaft_stub_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#the assembly's only on-axis cylinder of this radius (method=brep_queried)",
          "units": "mm",
          "value": 4.0
        },
        {
          "justification": "z max 74.00000 - rotor face z 69.10000",
          "name": "shaft_stub_height_above_rotor_face_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#assembly z maximum vs the rotor face datum (method=brep_queried)",
          "units": "mm",
          "value": 4.9
        },
        {
          "justification": "axis at (-2.7006678810, -4.3885853066)",
          "name": "step_axis_x_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#axis of the largest z-axial cylinder, x component, in the file's own frame (method=brep_queried)",
          "units": "mm",
          "value": -2.700667881
        },
        {
          "justification": "axis at (-2.7006678810, -4.3885853066)",
          "name": "step_axis_y_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#axis of the largest z-axial cylinder, y component, in the file's own frame (method=brep_queried)",
          "units": "mm",
          "value": -4.388585307
        },
        {
          "justification": "mount face z=42.1000000000, which is also the assembly's lowest triangulated extent z0=42.1000000000 (checked to 0.01 mm above); the rotor is therefore in +Z and re-datuming this part is a pure translation",
          "name": "step_mount_face_z_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step#z of the planar face the O25 tapped ring breaks out onto, file's own frame (method=brep_queried)",
          "units": "mm",
          "value": 42.1
        }
      ],
      "display_name": "T-MOTOR MN5008 KV170 brushless motor",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": null,
      "material_id": "al7075_t6",
      "notes": [
        "Vendor STEP re-datumed by translation only: (+2.700667881, +4.388585307, -42.100000000) mm, putting the mount face on z = 0 and the part axis on the local Z axis. No rotation, because the file is already authored mount-face-down.",
        "Re-datumed bounding box z = [-0.000, 31.900] mm against a published overall height of 31.9 mm. The lower bound is exactly zero and is asserted, not observed: nothing on this motor stands below its mounting face.",
        "Mount face to rotor face 27.0 mm plus shaft stub 4.9 mm equals the 31.9 mm overall height exactly, which is the second, independent reason the mount face carries no protrusion.",
        "Mass is T-MOTOR's published 'Motor Weight(Incl. Cable) 128g' for the KV170 variant, so the STEP volume is only used to derive an effective density for the mass-properties run. The file is simplified internally and its volume cannot imply a mass.",
        "The bolt pattern is kept at its native 84.770512047 deg phase. Aligning it with the motor plate is the mate's job, so the required roll ends up in the recorded placement transform instead of being baked into the geometry.",
        "T-MOTOR MN5008 KV170; retrieved 2026-08-31 from https://store.tmotor.com/product/mn5008-kv170-motor-antigravity-type.html",
        "vendor CAD design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step (units mm)",
        "MECH_SPEC_GAP: T-MOTOR publish no thread depth, thread class or seat torque for the MN5008's four M3 airframe taps. The 2.5 mm tap drill identifies the thread as M3 and nothing more. The O25.0 tapped cores in design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step sit at three distinct Z planes and span 7.0 mm in total, so the solid determines no single rotor-side depth and a modelled core depth is not a thread depth. No screw length is derived from it; the motor_to_plate group is carried unresolved with its real count instead. The retired KDE motor's 8.5 mm is a KDE dimension and must not be reused here.",
        "MECH_CAD_SOURCE_GAP: The phase-wire exit is not modelled in design_package/mechanical/vendor_cad/tmotor/MN5008-KV170/mn5008-motor-3d-model.step. Its radial envelope O55.6 equals its published body diameter to the digit, so the widest feature in the file is the magnet can; the retired KDE motor's own STEP does model its wire block, at a radius wider than its body. No wire aperture is therefore cut in the motor plate. The direction of that omission is disclosed rather than left implicit: an aperture removes material, so the modelled plate is HEAVIER than the manufacturable one and every structural mass bound built on it is pessimistic.",
        "a conservative superset solid is used for interference checks because the vendor B-Rep was measured to break OCCT booleans"
      ],
      "part_id": "motor",
      "ports": [
        {
          "depth_mm": null,
          "description": "Mounting face; the four M3 taps open onto it. An ANNULUS, r = 7.7 to 15.5 mm, net bearing area 188.361492298 mm2 after the central bore and the four thread mouths. It is FLAT: measured protrusion 0.0 mm, so the motor plate carries no central relief hole",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": 188.361492298,
          "nominal_size_mm": 31.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor:base_mount",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "4 M3 tapped holes on a 25.0 mm bolt circle, first hole on the port frame's local +X (84.770512047 deg in the vendor frame). The thread is identified by its 2.5 mm tap drill and by nothing else: depth_mm is None because T-MOTOR publish no depth and a modelled core is not a thread",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 0.09114511189833885,
              "y": 0.9958376215915119,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.0,
          "pattern_bcd_mm": 25.0,
          "pattern_count": 4,
          "port_id": "@port:motor:base_threads",
          "port_type": "THREAD_INTERNAL",
          "thread_designation": "M3"
        },
        {
          "depth_mm": null,
          "description": "Rotor-side bell face at z = 27.0 mm, r out to 12.0 mm; the propeller bolts straight to it with no adapter",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 27.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 24.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor:prop_mount",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Four M3 taps on the 12.0 mm circle. The P18 uses two of them: its hub has a 12.0 mm bolt circle with two holes, which is how this circle was identified as the propeller interface rather than the airframe one the 2D sheet labels it",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 27.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.0,
          "pattern_bcd_mm": 12.0,
          "pattern_count": 4,
          "port_id": "@port:motor:prop_threads_inner",
          "port_type": "THREAD_INTERNAL",
          "thread_designation": "M3"
        },
        {
          "depth_mm": null,
          "description": "Four more M3 taps on the 18.0 mm circle, unused by the P18. Recorded because they exist in the solid and a later propeller may land on them, not because anything in this design fastens through them",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 27.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.0,
          "pattern_bcd_mm": 18.0,
          "pattern_count": 4,
          "port_id": "@port:motor:prop_threads_outer",
          "port_type": "THREAD_INTERNAL",
          "thread_designation": "M3"
        },
        {
          "depth_mm": 4.9,
          "description": "Rotor axis, and the rotor joint axis. The O4.0 mm stub stands 4.9 mm above the bell face and spigots the propeller bore",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 27.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 4.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:motor:shaft",
          "port_type": "SHAFT",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 128.0
    },
    {
      "catalog_id": "prop_tmotor_p18x61_cf",
      "dimensions": [
        {
          "justification": "seating face at z=-5.2152, blade reference plane at z=0",
          "name": "blade_reference_offset_above_seat_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#seating face z in the propeller's own frame (method=brep_queried)",
          "units": "mm",
          "value": 5.215162349
        },
        {
          "justification": "hub clearance ring: GeomAbs_Cylinder radius 1.5000 at axis radius 6.0000, z extent [-5.215, -1.036], 2 instances at 0.00, 180.00 deg",
          "name": "hub_bolt_circle_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#through-hole ring in the hub (method=brep_queried)",
          "units": "mm",
          "value": 12.0
        },
        {
          "justification": "hub clearance ring: GeomAbs_Cylinder radius 1.5000 at axis radius 6.0000, z extent [-5.215, -1.036], 2 instances at 0.00, 180.00 deg",
          "name": "hub_bolt_clearance_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#through-hole ring in the hub (method=brep_queried)",
          "units": "mm",
          "value": 3.0
        },
        {
          "justification": "hub clearance ring: GeomAbs_Cylinder radius 1.5000 at axis radius 6.0000, z extent [-5.215, -1.036], 2 instances at 0.00, 180.00 deg",
          "name": "hub_bolt_count",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#through-hole ring in the hub (method=brep_queried)",
          "units": "holes",
          "value": 2.0
        },
        {
          "justification": "GeomAbs_Cylinder radius 3.0000 on axis, z [-5.215, -1.036]",
          "name": "hub_bore_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#on-axis cylindrical face through the hub (method=brep_queried)",
          "units": "mm",
          "value": 6.0
        },
        {
          "justification": "planar face at z=-5.2152, r extent [3.0000, 25.0070], area 691.621 mm2",
          "name": "hub_seating_face_outer_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#outer radius of the planar face the hub bears on (method=brep_queried)",
          "units": "mm",
          "value": 50.013916239
        },
        {
          "justification": "planar faces at z=-5.2152 and z=-1.0364, each 691.621 mm2 over r [3.000, 25.007]",
          "name": "hub_thickness_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#the two parallel planar faces spanning the hub bore (method=brep_queried)",
          "units": "mm",
          "value": 4.178780357
        },
        {
          "justification": "max |p - axis| over 86438 nodes = 228.63423; the same query at 0.05 mm deflection gives 228.63422, so the value is converged",
          "name": "installation_diameter_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#twice the maximum node radius about the propeller axis over a triangulation at 0.005 mm deflection (method=brep_queried)",
          "units": "mm",
          "value": 457.268461517
        },
        {
          "justification": "lowest node inside r<=27.8000 at z=-5.62155, seating face z=-5.21516",
          "name": "lowest_material_below_seat_within_motor_envelope_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#minimum node z inside the mating motor's 27.8000 mm envelope radius, vs the seating face (method=brep_queried)",
          "units": "mm",
          "value": 0.406390699
        },
        {
          "justification": "z max 9.02339 - seating face -5.21516",
          "name": "top_above_seat_mm",
          "source": "component_datasheet",
          "source_ref": "design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step#triangulation z maximum at 0.005 mm deflection, vs the seating face (method=brep_queried)",
          "units": "mm",
          "value": 14.238551471
        }
      ],
      "display_name": "T-MOTOR P18*6.1 CF Polish propeller (two blades, integrated)",
      "effective_density_g_per_mm3": null,
      "factory_id": null,
      "factory_version": null,
      "geometry_fidelity": "exact",
      "load_path": "primary",
      "manufacturing_process": null,
      "material_id": "vendor_effective_density",
      "notes": [
        "Vendor STEP re-datumed by translation only: (0, 0, +5.215162349) mm, putting the seating face on z = 0. No rotation: the extraction verifies the hub bore's axis is on the file's origin before publishing any dimension from it.",
        "Swept disc 457.268461517 mm, measured over the triangulation about the part axis rather than from the OCCT bounding box, because the two tips are 180 deg apart but not on a box axis. It is 0.0685 mm larger than the nominal 457.2 mm printed as '18 in', and the layout's arm-radius rule is fed the measured figure.",
        "Hub 4.178780357 mm thick; the part reaches 14.238551471 mm above its own seat. Both from planar-face and triangulation queries on this solid, not from the bounding box, which overstates the top by bounding the blades' splines with their control-pole hull.",
        "Mass is T-MOTOR's published figure for the two-blade integrated moulding (2 x 31.5 g), so the STEP volume is only used to derive an effective density for the mass-properties run.",
        "Rotor inertia comes from the real two-blade solid, so the disc idealisation the retired KDE propeller had to carry does not apply here. That is a genuine improvement in the dynamics input and not a change of method: the retired part is still a disc, because KDE publish no blade geometry.",
        "T-MOTOR P18*6.1 CF Polish; retrieved 2026-08-31 from https://store.tmotor.com/product/p18x6-1-prop-polish.html",
        "vendor CAD design_package/mechanical/vendor_cad/tmotor/P18X6.1-CF-POLISH/p18-propeller-3d-model.step (units mm)",
        "MECH_SPEC_GAP: The published mass carries T-MOTOR's own tolerance of +/-1.5 g per blade, i.e. +/-3.0 g per propeller and +/-18.0 g over six rotors. The nominal 63.0 g is used and the tolerance is stated rather than absorbed into a margin.",
        "MATERIAL_ALLOWABLE_GAP: This part has EXACT outer geometry and no single bulk density: it is a carbon-fibre layup with resin-rich regions and a hub bushing, so no registered material's density times this volume is its real mass. The vendor's published mass is therefore authoritative and the effective density is a back-solve over the real solid, which is declared here rather than left to be inferred from the sentinel material id. Assigning a CFRP laminate density instead would compute a mass rather than report one, and would be a fabricated number wearing a material citation. The gap is a material allowable and not a mass gap: the mass is grounded, the through-thickness allowables needed for a blade stress case are not."
      ],
      "part_id": "propeller",
      "ports": [
        {
          "depth_mm": null,
          "description": "Hub underside, O50.013916239 mm, landing DIRECTLY on the motor bell -- there is no adapter in the selected set. It is not a plane over its whole width: 0.406390699 mm of material descends below it inside the motor's own radial envelope, measured rather than assumed flat",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 50.013916239,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:propeller:hub_mount",
          "port_type": "FLAT_FACE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "2 O3.0 mm through holes on a 12.0 mm circle, an M3 close fit. The motor's 12.0 mm tapped ring carries four; this propeller uses 2 of them",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 0.0
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": -1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 3.0,
          "pattern_bcd_mm": 12.0,
          "pattern_count": 2,
          "port_id": "@port:propeller:hub_bolts",
          "port_type": "CLEARANCE_HOLE",
          "thread_designation": null
        },
        {
          "depth_mm": null,
          "description": "Rotor spin axis at the blade reference plane, 5.215162349 mm above the seat. The O6.0 mm bore spigots on the motor's O4 shaft stub with clearance, so the bolts and not the bore carry the torque",
          "frame": {
            "origin_mm": {
              "x": 0.0,
              "y": 0.0,
              "z": 5.215162349
            },
            "x_axis": {
              "x": 1.0,
              "y": 0.0,
              "z": 0.0
            },
            "z_axis": {
              "x": 0.0,
              "y": 0.0,
              "z": 1.0
            }
          },
          "load_path": "primary",
          "mating_face_area_mm2": null,
          "nominal_size_mm": 6.0,
          "pattern_bcd_mm": null,
          "pattern_count": 1,
          "port_id": "@port:propeller:rotor_axis",
          "port_type": "SHAFT",
          "thread_designation": null
        }
      ],
      "source_strategy": "vendor_cots",
      "standard_designation": null,
      "vendor_mass_g": 63.0
    }
  ],
  "per_link_mass_properties": {
    "base_link": {
      "com_m": [
        -0.00041765015177326056,
        0.0014146807755782303,
        0.01628941620641057
      ],
      "inertia_kg_m2": [
        [
          0.5072321123455149,
          0.0007289433192503101,
          0.00010660142529108035
        ],
        [
          0.0007289433192503101,
          0.5456926083467192,
          -0.0005552190125328049
        ],
        [
          0.00010660142529108035,
          -0.0005552190125328049,
          0.9285774318958233
        ]
      ],
      "inertia_reference": "about_com_body_axes",
      "mass_kg": 13.002509341714509,
      "occt_version": "7.9.3",
      "source": "occt_gprop_gprops",
      "volume_mm3": 9704850.312981782
    },
    "rotor_1": {
      "com_m": [
        0.4243528127221386,
        0.24500027257485604,
        0.06270591248164047
      ],
      "inertia_kg_m2": [
        [
          0.00019105090407971805,
          -0.00031184203456459104,
          -2.2447288502007723e-12
        ],
        [
          -0.00031184203456459104,
          0.0005303125108928289,
          -5.662990151904524e-12
        ],
        [
          -2.2447288502007723e-12,
          -5.662990151904524e-12,
          0.0007204179311982431
        ]
      ],
      "inertia_reference": "about_com_body_axes",
      "mass_kg": 0.063,
      "occt_version": "7.9.3",
      "source": "occt_gprop_gprops",
      "volume_mm3": 47685.493872328065
    },
    "rotor_2": {
      "com_m": [
        -5.362286795375819e-08,
        0.49000045227218036,
        0.06270591248164047
      ],
      "inertia_kg_m2": [
        [
          0.0007155602330903132,
          9.016432267854091e-06,
          3.781928929094236e-12
        ],
        [
          9.016432267854091e-06,
          5.803181882234902e-06,
          -4.7754873521625995e-12
        ],
        [
          3.781928929094236e-12,
          -4.7754873521625995e-12,
          0.0007204179311982431
        ]
      ],
      "inertia_reference": "about_com_body_axes",
      "mass_kg": 0.06300000000000001,
      "occt_version": "7.9.3",
      "source": "occt_gprop_gprops",
      "volume_mm3": 47685.49387232807
    },
    "rotor_3": {
      "com_m": [
        -0.4243528663450066,
        0.24500017969732427,
        0.06270591248164047
      ],
      "inertia_kg_m2": [
        [
          0.00017543398528879043,
          0.00030282560229673706,
          6.02665776386857e-12
        ],
        [
          0.00030282560229673706,
          0.0005459294296837561,
          8.875029161572457e-13
        ],
        [
          6.02665776386857e-12,
          8.875029161572457e-13,
          0.0007204179311982431
        ]
      ],
      "inertia_reference": "about_com_body_axes",
      "mass_kg": 0.06300000000000001,
      "occt_version": "7.9.3",
      "source": "occt_gprop_gprops",
      "volume_mm3": 47685.49387232807
    },
    "rotor_4": {
      "com_m": [
        -0.42435281272213854,
        -0.24500027257485613,
        0.06270591248164047
      ],
      "inertia_kg_m2": [
        [
          0.00019105090407971805,
          -0.00031184203456459104,
          2.2447288502007723e-12
        ],
        [
          -0.00031184203456459104,
          0.0005303125108928289,
          5.662990151904524e-12
        ],
        [
          2.2447288502007723e-12,
          5.662990151904524e-12,
          0.0007204179311982431
        ]
      ],
      "inertia_reference": "about_com_body_axes",
      "mass_kg": 0.063,
      "occt_version": "7.9.3",
      "source": "occt_gprop_gprops",
      "volume_mm3": 47685.493872328065
    },
    "rotor_5": {
      "com_m": [
        5.3622867895333635e-08,
        -0.49000045227218036,
        0.06270591248164047
      ],
      "inertia_kg_m2": [
        [
          0.0007155602330903132,
          9.016432267854002e-06,
          -3.781928929445233e-12
        ],
        [
          9.016432267854002e-06,
          5.803181882234902e-06,
          4.7754873521625995e-12
        ],
        [
          -3.781928929445233e-12,
          4.7754873521625995e-12,
          0.0007204179311982431
        ]
      ],
      "inertia_reference": "about_com_body_axes",
      "mass_kg": 0.06300000000000001,
      "occt_version": "7.9.3",
      "source": "occt_gprop_gprops",
      "volume_mm3": 47685.49387232807
    },
    "rotor_6": {
      "com_m": [
        0.42435286634500635,
        -0.24500017969732452,
        0.06270591248164047
      ],
      "inertia_kg_m2": [
        [
          0.00017543398528879092,
          0.00030282560229673706,
          -6.02665776386857e-12
        ],
        [
          0.00030282560229673706,
          0.0005459294296837561,
          -8.875029161572457e-13
        ],
        [
          -6.02665776386857e-12,
          -8.875029161572457e-13,
          0.0007204179311982431
        ]
      ],
      "inertia_reference": "about_com_body_axes",
      "mass_kg": 0.06299999999999999,
      "occt_version": "7.9.3",
      "source": "occt_gprop_gprops",
      "volume_mm3": 47685.49387232805
    }
  },
  "root_instance_id": "hub_plate_bottom",
  "schema_version": "mechanical_assembly_spec/1.0.0",
  "stage2a_version": "1.0.0",
  "unit_policy": {
    "cad_internal_length": "mm",
    "cad_internal_mass": "g",
    "conversion_boundary": "anubis.stage2a.exports.canonical_model",
    "placement": "4x4 row-major, millimetres, column-vector convention",
    "spec_inertia": "kg*m^2",
    "spec_length": "m",
    "spec_mass": "kg"
  }
}
