{
 "schema": "mb001-params/1",
 "generated": "2026-11-03 (Asia/Hong_Kong)",
 "tags": {
  "S": "sourced (URL in HANDOFF.md section 17 / source field)",
  "D": "derived by arithmetic/geometry from sourced values",
  "E": "estimate or design choice, not measured",
  "?": "unverified / conflicting / unknown"
 },
 "units": {
  "length": "mm",
  "mass": "g unless key says kg",
  "angle": "deg",
  "time": "ms unless key says s/us"
 },
 "conventions": {
  "cad_frame": "z up; cameras look +Y; x is to the right when looking along +Y; origin at base-plate centre on the underside (z=0 = bed)",
  "gltf_frame": "y-up, cameras look +Z, left of camera = +X. Mapping CAD(x,y,z) -> glTF(-x, z, y)",
  "pan": {
   "axis_cad": [
    0,
    0,
    1
   ],
   "axis_gltf": [
    0,
    1,
    0
   ],
   "positive": "cameras turn LEFT",
   "glb_node": "yoke",
   "glb_set": "rotation.y = +pan_deg"
  },
  "tilt": {
   "axis_cad": [
    1,
    0,
    0
   ],
   "axis_gltf": [
    -1,
    0,
    0
   ],
   "positive": "cameras pitch UP",
   "glb_node": "cam_bar",
   "glb_set": "rotation.x = -tilt_deg"
  },
  "input_to_joint": {
   "udp_yaw_positive": "look RIGHT",
   "pan_deg": "-yaw_deg",
   "tilt_deg": "+pitch_deg",
   "tag": "D (derived; verified only numerically on the box, NOT in TouchDesigner)"
  },
  "touchdesigner_camera_note": "TD Camera COMP looks down -Z by default (general TD knowledge, not re-verified here [?]); rig cameras look +Z in the GLB, so give each Camera COMP ry=180 under its eye node."
 },
 "variants": {
  "module38_sts3215": {
   "derived_dims_mm": {
    "cam_type": "module38",
    "servo_type": "sts3215",
    "cam_spacing": 63.0,
    "cw": 38,
    "ch": 38,
    "cd": 15,
    "sL": 45.2,
    "sW": 24.7,
    "sH": 35.0,
    "shaft_off": 10.0,
    "flange_w": 45.2,
    "horn_d": 25,
    "bar_len": 121.0,
    "bar_h": 52,
    "z_s": 37.0,
    "z_pan_joint": 38.0,
    "z_y": 41.0,
    "arm_x": 63.5,
    "tilt_z": 77.0,
    "yoke_w": 131.0
   },
   "frames_cad_mm": {
    "base_link": [
     0.0,
     0.0,
     0.0
    ],
    "pan_link": [
     0.0,
     0.0,
     38.0
    ],
    "tilt_link": [
     0.0,
     0.0,
     77.0
    ],
    "cam_left_link": [
     -31.5,
     2.0,
     77.0
    ],
    "cam_right_link": [
     31.5,
     2.0,
     77.0
    ]
   },
   "joints": {
    "pan": {
     "parent": "base_link",
     "child": "pan_link",
     "origin_mm": [
      0,
      0,
      38.0
     ],
     "axis_cad": [
      0,
      0,
      1
     ],
     "axis_gltf": [
      0,
      1,
      0
     ],
     "limit_deg": [
      -90,
      90
     ],
     "limit_tag": "design choice [E]"
    },
    "tilt": {
     "parent": "pan_link",
     "child": "tilt_link",
     "origin_mm_in_parent": [
      0,
      0,
      39.0
     ],
     "origin_mm_world": [
      0,
      0,
      77.0
     ],
     "axis_cad": [
      1,
      0,
      0
     ],
     "axis_gltf": [
      -1,
      0,
      0
     ],
     "limit_deg": [
      -30,
      30
     ],
     "limit_tag": "ESTIMATE; sources conflict (-30..+45, -30..+60)"
    }
   },
   "servo": {
    "type": "sts3215",
    "mass_g": 55,
    "mass_tag": "S",
    "mass_src": "Feetech wiki / Waveshare: 55 +-1 g",
    "effort_kgfcm": 19.5,
    "speed_deg_s": 312,
    "at": "7.4 V",
    "s_per_60deg": 0.192,
    "src": "Waveshare ST3215 7.4V page (docs.waveshare.com/ST3215_Servo); Feetech wiki lists 19 kgf.cm @7.4V and 19.5 @6V (conflict)"
   },
   "camera": {
    "type": "module38",
    "dims_mm": [
     38,
     38,
     15
    ],
    "mass_g": 100,
    "mass_tag": "?",
    "mass_src": "ELP listing says 100 g (board+cable?) - UNVERIFIED, weigh the Quanrui USB48MP01-QFZ",
    "projection_centre_offset_mm": [
     0,
     18,
     0
    ],
    "projection_centre_tag": "ASSUMED (lens front face)"
   },
   "part_mass_g": {
    "base": {
     "g": 43.4,
     "tag": "E"
    },
    "yoke": {
     "g": 14.8,
     "tag": "E"
    },
    "cam_bar": {
     "g": 9.5,
     "tag": "E"
    },
    "cam_body_L": {
     "g": 100,
     "tag": "?"
    },
    "cam_body_R": {
     "g": 100,
     "tag": "?"
    },
    "lens_L": {
     "g": 0.0,
     "tag": "S"
    },
    "lens_R": {
     "g": 0.0,
     "tag": "S"
    },
    "servo_pan": {
     "g": 55,
     "tag": "S"
    },
    "horn": {
     "g": 0.6,
     "tag": "E"
    },
    "servo_tilt": {
     "g": 55,
     "tag": "S"
    },
    "pi": {
     "g": 0.0,
     "tag": "?"
    },
    "pca9685": {
     "g": 0.0,
     "tag": "?"
    },
    "ubec": {
     "g": 0.0,
     "tag": "?"
    }
   },
   "link_inertials_kg_m2": {
    "base_link": {
     "mass_kg": 0.0984,
     "com_m": [
      0.007405,
      -0.013698,
      0.012671
     ],
     "parts": [
      "base",
      "servo_pan"
     ]
    },
    "pan_link": {
     "mass_kg": 0.0704,
     "com_m": [
      0.064754,
      0.0,
      0.043044
     ],
     "parts": [
      "yoke",
      "horn",
      "servo_tilt"
     ]
    },
    "tilt_link": {
     "mass_kg": 0.0095,
     "com_m": [
      -0.0,
      0.0,
      0.0
     ],
     "parts": [
      "cam_bar"
     ]
    },
    "cam_left_link": {
     "mass_kg": 0.1,
     "com_m": [
      0.0,
      0.0075,
      0.0
     ],
     "parts": [
      "cam_body_L"
     ]
    },
    "cam_right_link": {
     "mass_kg": 0.1,
     "com_m": [
      0.0,
      0.0075,
      0.0
     ],
     "parts": [
      "cam_body_R"
     ]
    }
   },
   "part_bounds_local_cad_mm": {
    "base": [
     [
      -50.0,
      -112.0,
      0.0
     ],
     [
      50.0,
      46.0,
      25.25
     ]
    ],
    "yoke": [
     [
      -65.5,
      -22.0,
      3.0
     ],
     [
      65.5,
      22.0,
      53.0
     ]
    ],
    "cam_bar": [
     [
      -61.5,
      -7.0,
      -26.0
     ],
     [
      61.5,
      7.0,
      26.0
     ]
    ],
    "cam_body_L": [
     [
      -19.0,
      0.0,
      -19.0
     ],
     [
      19.0,
      15.0,
      19.0
     ]
    ],
    "cam_body_R": [
     [
      -19.0,
      0.0,
      -19.0
     ],
     [
      19.0,
      15.0,
      19.0
     ]
    ],
    "lens_L": [
     [
      -8.55,
      15.0,
      -8.55
     ],
     [
      8.55,
      18.0,
      8.55
     ]
    ],
    "lens_R": [
     [
      -8.55,
      15.0,
      -8.55
     ],
     [
      8.55,
      18.0,
      8.55
     ]
    ],
    "servo_pan": [
     [
      -10.0,
      -12.35,
      6.0
     ],
     [
      35.2,
      12.35,
      43.0
     ]
    ],
    "horn": [
     [
      -12.5,
      -12.5,
      0.0
     ],
     [
      12.5,
      12.5,
      3.0
     ]
    ],
    "servo_tilt": [
     [
      59.5,
      -12.35,
      29.0
     ],
     [
      96.5,
      12.35,
      74.2
     ]
    ],
    "pi": [
     [
      -28.0,
      -112.5,
      11.0
     ],
     [
      28.0,
      -27.5,
      28.0
     ]
    ],
    "pca9685": [
     [
      -31.0,
      -104.0,
      7.0
     ],
     [
      31.0,
      -90.0,
      15.0
     ]
    ],
    "ubec": [
     [
      32.0,
      -60.0,
      7.0
     ],
     [
      46.0,
      -30.0,
      17.0
     ]
    ]
   },
   "glb_node_tree": {
    "base": "mb001_module38_sts3215",
    "servo_pan": "base",
    "pi": "base",
    "pca9685": "base",
    "ubec": "base",
    "yoke": "base",
    "horn": "yoke",
    "servo_tilt": "yoke",
    "cam_bar": "yoke",
    "cam_L": "cam_bar",
    "cam_body_L": "cam_L",
    "lens_L": "cam_L",
    "eye_L": "cam_L",
    "cam_R": "cam_bar",
    "cam_body_R": "cam_R",
    "lens_R": "cam_R",
    "eye_R": "cam_R"
   }
  },
  "module38_sh0257": {
   "derived_dims_mm": {
    "cam_type": "module38",
    "servo_type": "sh0257",
    "cam_spacing": 63.0,
    "cw": 38,
    "ch": 38,
    "cd": 15,
    "sL": 22.8,
    "sW": 12.0,
    "sH": 25.4,
    "shaft_off": 5.5,
    "flange_w": 32.5,
    "horn_d": 20,
    "bar_len": 121.0,
    "bar_h": 52,
    "z_s": 27.4,
    "z_pan_joint": 28.4,
    "z_y": 31.4,
    "arm_x": 63.5,
    "tilt_z": 67.4,
    "yoke_w": 131.0
   },
   "frames_cad_mm": {
    "base_link": [
     0.0,
     0.0,
     0.0
    ],
    "pan_link": [
     0.0,
     0.0,
     28.4
    ],
    "tilt_link": [
     0.0,
     0.0,
     67.4
    ],
    "cam_left_link": [
     -31.5,
     2.0,
     67.4
    ],
    "cam_right_link": [
     31.5,
     2.0,
     67.4
    ]
   },
   "joints": {
    "pan": {
     "parent": "base_link",
     "child": "pan_link",
     "origin_mm": [
      0,
      0,
      28.4
     ],
     "axis_cad": [
      0,
      0,
      1
     ],
     "axis_gltf": [
      0,
      1,
      0
     ],
     "limit_deg": [
      -90,
      90
     ],
     "limit_tag": "design choice [E]"
    },
    "tilt": {
     "parent": "pan_link",
     "child": "tilt_link",
     "origin_mm_in_parent": [
      0,
      0,
      39.00000000000001
     ],
     "origin_mm_world": [
      0,
      0,
      67.4
     ],
     "axis_cad": [
      1,
      0,
      0
     ],
     "axis_gltf": [
      -1,
      0,
      0
     ],
     "limit_deg": [
      -30,
      30
     ],
     "limit_tag": "ESTIMATE; sources conflict (-30..+45, -30..+60)"
    }
   },
   "servo": {
    "type": "sh0257",
    "mass_g": 14,
    "mass_tag": "S",
    "mass_src": "Savox SH-0257MG+ spec: 14 g",
    "effort_kgfcm": 2.2,
    "speed_deg_s": 667,
    "at": "6 V",
    "s_per_60deg": 0.09,
    "src": "Savox SH-0257MG+ page (0.13/0.09 s/60deg at 4.8/6 V; 1.8/2.2 kgf.cm)"
   },
   "camera": {
    "type": "module38",
    "dims_mm": [
     38,
     38,
     15
    ],
    "mass_g": 100,
    "mass_tag": "?",
    "mass_src": "ELP listing says 100 g (board+cable?) - UNVERIFIED, weigh the Quanrui USB48MP01-QFZ",
    "projection_centre_offset_mm": [
     0,
     18,
     0
    ],
    "projection_centre_tag": "ASSUMED (lens front face)"
   },
   "part_mass_g": {
    "base": {
     "g": 41.9,
     "tag": "E"
    },
    "yoke": {
     "g": 14.8,
     "tag": "E"
    },
    "cam_bar": {
     "g": 9.5,
     "tag": "E"
    },
    "cam_body_L": {
     "g": 100,
     "tag": "?"
    },
    "cam_body_R": {
     "g": 100,
     "tag": "?"
    },
    "lens_L": {
     "g": 0.0,
     "tag": "S"
    },
    "lens_R": {
     "g": 0.0,
     "tag": "S"
    },
    "servo_pan": {
     "g": 14,
     "tag": "S"
    },
    "horn": {
     "g": 0.4,
     "tag": "E"
    },
    "servo_tilt": {
     "g": 14,
     "tag": "S"
    },
    "pi": {
     "g": 0.0,
     "tag": "?"
    },
    "pca9685": {
     "g": 0.0,
     "tag": "?"
    },
    "ubec": {
     "g": 0.0,
     "tag": "?"
    }
   },
   "link_inertials_kg_m2": {
    "base_link": {
     "mass_kg": 0.0559,
     "com_m": [
      0.001552,
      -0.024148,
      0.006311
     ],
     "parts": [
      "base",
      "servo_pan"
     ]
    },
    "pan_link": {
     "mass_kg": 0.0292,
     "com_m": [
      0.03716,
      -0.0,
      0.028145
     ],
     "parts": [
      "yoke",
      "horn",
      "servo_tilt"
     ]
    },
    "tilt_link": {
     "mass_kg": 0.0095,
     "com_m": [
      0.0,
      0.0,
      0.0
     ],
     "parts": [
      "cam_bar"
     ]
    },
    "cam_left_link": {
     "mass_kg": 0.1,
     "com_m": [
      0.0,
      0.0075,
      -0.0
     ],
     "parts": [
      "cam_body_L"
     ]
    },
    "cam_right_link": {
     "mass_kg": 0.1,
     "com_m": [
      0.0,
      0.0075,
      -0.0
     ],
     "parts": [
      "cam_body_R"
     ]
    }
   },
   "part_bounds_local_cad_mm": {
    "base": [
     [
      -50.0,
      -112.0,
      0.0
     ],
     [
      50.0,
      46.0,
      19.97
     ]
    ],
    "yoke": [
     [
      -65.5,
      -22.0,
      3.0
     ],
     [
      65.5,
      22.0,
      53.0
     ]
    ],
    "cam_bar": [
     [
      -61.5,
      -7.0,
      -26.0
     ],
     [
      61.5,
      7.0,
      26.0
     ]
    ],
    "cam_body_L": [
     [
      -19.0,
      0.0,
      -19.0
     ],
     [
      19.0,
      15.0,
      19.0
     ]
    ],
    "cam_body_R": [
     [
      -19.0,
      0.0,
      -19.0
     ],
     [
      19.0,
      15.0,
      19.0
     ]
    ],
    "lens_L": [
     [
      -8.55,
      15.0,
      -8.55
     ],
     [
      8.55,
      18.0,
      8.55
     ]
    ],
    "lens_R": [
     [
      -8.55,
      15.0,
      -8.55
     ],
     [
      8.55,
      18.0,
      8.55
     ]
    ],
    "servo_pan": [
     [
      -10.35,
      -6.0,
      6.0
     ],
     [
      22.15,
      6.0,
      33.4
     ]
    ],
    "horn": [
     [
      -10.0,
      -10.0,
      0.0
     ],
     [
      10.0,
      10.0,
      3.0
     ]
    ],
    "servo_tilt": [
     [
      59.5,
      -6.0,
      28.65
     ],
     [
      86.9,
      6.0,
      61.15
     ]
    ],
    "pi": [
     [
      -28.0,
      -112.5,
      11.0
     ],
     [
      28.0,
      -27.5,
      28.0
     ]
    ],
    "pca9685": [
     [
      -31.0,
      -104.0,
      7.0
     ],
     [
      31.0,
      -90.0,
      15.0
     ]
    ],
    "ubec": [
     [
      32.0,
      -60.0,
      7.0
     ],
     [
      46.0,
      -30.0,
      17.0
     ]
    ]
   },
   "glb_node_tree": {
    "base": "mb001_module38_sh0257",
    "servo_pan": "base",
    "pi": "base",
    "pca9685": "base",
    "ubec": "base",
    "yoke": "base",
    "horn": "yoke",
    "servo_tilt": "yoke",
    "cam_bar": "yoke",
    "cam_L": "cam_bar",
    "cam_body_L": "cam_L",
    "lens_L": "cam_L",
    "eye_L": "cam_L",
    "cam_R": "cam_bar",
    "cam_body_R": "cam_R",
    "lens_R": "cam_R",
    "eye_R": "cam_R"
   }
  },
  "brio_mg996r": {
   "derived_dims_mm": {
    "cam_type": "brio",
    "servo_type": "mg996r",
    "cam_spacing": 63.0,
    "cw": 27,
    "ch": 102,
    "cd": 26.5,
    "sL": 40.7,
    "sW": 19.7,
    "sH": 42.9,
    "shaft_off": 10.0,
    "flange_w": 53.0,
    "horn_d": 25,
    "bar_len": 110.0,
    "bar_h": 116,
    "z_s": 44.9,
    "z_pan_joint": 45.9,
    "z_y": 48.9,
    "arm_x": 58.0,
    "tilt_z": 116.9,
    "yoke_w": 120.0
   },
   "frames_cad_mm": {
    "base_link": [
     0.0,
     0.0,
     0.0
    ],
    "pan_link": [
     0.0,
     0.0,
     45.9
    ],
    "tilt_link": [
     0.0,
     0.0,
     116.9
    ],
    "cam_left_link": [
     -31.5,
     2.0,
     116.9
    ],
    "cam_right_link": [
     31.5,
     2.0,
     116.9
    ]
   },
   "joints": {
    "pan": {
     "parent": "base_link",
     "child": "pan_link",
     "origin_mm": [
      0,
      0,
      45.9
     ],
     "axis_cad": [
      0,
      0,
      1
     ],
     "axis_gltf": [
      0,
      1,
      0
     ],
     "limit_deg": [
      -90,
      90
     ],
     "limit_tag": "design choice [E]"
    },
    "tilt": {
     "parent": "pan_link",
     "child": "tilt_link",
     "origin_mm_in_parent": [
      0,
      0,
      71.0
     ],
     "origin_mm_world": [
      0,
      0,
      116.9
     ],
     "axis_cad": [
      1,
      0,
      0
     ],
     "axis_gltf": [
      -1,
      0,
      0
     ],
     "limit_deg": [
      -30,
      30
     ],
     "limit_tag": "ESTIMATE; sources conflict (-30..+45, -30..+60)"
    }
   },
   "servo": {
    "type": "mg996r",
    "mass_g": 55,
    "mass_tag": "S",
    "mass_src": "TowerPro MG996R datasheet: 55 g",
    "effort_kgfcm": 11.0,
    "speed_deg_s": 400,
    "at": "6 V",
    "s_per_60deg": 0.15,
    "src": "TowerPro MG996R (latency doc uses text value 0.15 s/60deg; table says 0.14; 11 kgf.cm @6 V)"
   },
   "camera": {
    "type": "brio",
    "dims_mm": [
     27,
     102,
     26.5
    ],
    "mass_g": 65,
    "mass_tag": "S",
    "mass_src": "Logitech datasheet 65 g; guide says 63 g, some listings 85 g (conflict)",
    "projection_centre_offset_mm": [
     0,
     29.5,
     0
    ],
    "projection_centre_tag": "ASSUMED (lens front face)"
   },
   "part_mass_g": {
    "base": {
     "g": 43.7,
     "tag": "E"
    },
    "yoke": {
     "g": 17.5,
     "tag": "E"
    },
    "cam_bar": {
     "g": 19.6,
     "tag": "E"
    },
    "cam_body_L": {
     "g": 65,
     "tag": "S"
    },
    "cam_body_R": {
     "g": 65,
     "tag": "S"
    },
    "lens_L": {
     "g": 0.0,
     "tag": "S"
    },
    "lens_R": {
     "g": 0.0,
     "tag": "S"
    },
    "servo_pan": {
     "g": 55,
     "tag": "S"
    },
    "horn": {
     "g": 0.6,
     "tag": "E"
    },
    "servo_tilt": {
     "g": 55,
     "tag": "S"
    },
    "pi": {
     "g": 0.0,
     "tag": "?"
    },
    "pca9685": {
     "g": 0.0,
     "tag": "?"
    },
    "ubec": {
     "g": 0.0,
     "tag": "?"
    }
   },
   "link_inertials_kg_m2": {
    "base_link": {
     "mass_kg": 0.0987,
     "com_m": [
      0.006084,
      -0.01366,
      0.015021
     ],
     "parts": [
      "base",
      "servo_pan"
     ]
    },
    "pan_link": {
     "mass_kg": 0.0731,
     "com_m": [
      0.061088,
      0.0,
      0.067054
     ],
     "parts": [
      "yoke",
      "horn",
      "servo_tilt"
     ]
    },
    "tilt_link": {
     "mass_kg": 0.0196,
     "com_m": [
      -0.0,
      0.0,
      -0.0
     ],
     "parts": [
      "cam_bar"
     ]
    },
    "cam_left_link": {
     "mass_kg": 0.065,
     "com_m": [
      0.0,
      0.01325,
      0.0
     ],
     "parts": [
      "cam_body_L"
     ]
    },
    "cam_right_link": {
     "mass_kg": 0.065,
     "com_m": [
      0.0,
      0.01325,
      0.0
     ],
     "parts": [
      "cam_body_R"
     ]
    }
   },
   "part_bounds_local_cad_mm": {
    "base": [
     [
      -50.0,
      -112.0,
      0.0
     ],
     [
      50.0,
      46.0,
      29.6
     ]
    ],
    "yoke": [
     [
      -60.0,
      -22.0,
      3.0
     ],
     [
      60.0,
      22.0,
      85.0
     ]
    ],
    "cam_bar": [
     [
      -56.0,
      -7.0,
      -58.0
     ],
     [
      56.0,
      7.0,
      58.0
     ]
    ],
    "cam_body_L": [
     [
      -13.5,
      0.0,
      -51.0
     ],
     [
      13.5,
      26.5,
      51.0
     ]
    ],
    "cam_body_R": [
     [
      -13.5,
      0.0,
      -51.0
     ],
     [
      13.5,
      26.5,
      51.0
     ]
    ],
    "lens_L": [
     [
      -6.08,
      26.5,
      -6.08
     ],
     [
      6.07,
      29.5,
      6.07
     ]
    ],
    "lens_R": [
     [
      -6.07,
      26.5,
      -6.08
     ],
     [
      6.08,
      29.5,
      6.07
     ]
    ],
    "servo_pan": [
     [
      -16.15,
      -9.85,
      6.0
     ],
     [
      36.85,
      9.85,
      50.9
     ]
    ],
    "horn": [
     [
      -12.5,
      -12.5,
      0.0
     ],
     [
      12.5,
      12.5,
      3.0
     ]
    ],
    "servo_tilt": [
     [
      54.0,
      -9.85,
      54.85
     ],
     [
      98.9,
      9.85,
      107.85
     ]
    ],
    "pi": [
     [
      -28.0,
      -112.5,
      11.0
     ],
     [
      28.0,
      -27.5,
      28.0
     ]
    ],
    "pca9685": [
     [
      -31.0,
      -104.0,
      7.0
     ],
     [
      31.0,
      -90.0,
      15.0
     ]
    ],
    "ubec": [
     [
      32.0,
      -60.0,
      7.0
     ],
     [
      46.0,
      -30.0,
      17.0
     ]
    ]
   },
   "glb_node_tree": {
    "base": "mb001_brio_mg996r",
    "servo_pan": "base",
    "pi": "base",
    "pca9685": "base",
    "ubec": "base",
    "yoke": "base",
    "horn": "yoke",
    "servo_tilt": "yoke",
    "cam_bar": "yoke",
    "cam_L": "cam_bar",
    "cam_body_L": "cam_L",
    "lens_L": "cam_L",
    "eye_L": "cam_L",
    "cam_R": "cam_bar",
    "cam_body_R": "cam_R",
    "lens_R": "cam_R",
    "eye_R": "cam_R"
   }
  }
 },
 "joint_limits_deg": {
  "implemented_in_urdf_and_glb_extras": {
   "pan": [
    -90,
    90
   ],
   "tilt": [
    -30,
    30
   ]
  },
  "conflicts": {
   "servos-power.md": {
    "pan": [
     -90,
     90
    ],
    "tilt": [
     -30,
     45
    ],
    "tag": "E design choice"
   },
   "visionproteleop-deep-dive.md example": {
    "tilt": [
     -30,
     60
    ],
    "tag": "E"
   },
   "cad note (mb001_rig.scad / servos-power.md section D)": {
    "tilt": "about +-30 (collision sweep) tag E, not verified"
   }
  },
  "soft_limit_margin_deg": 5,
  "tag": "E"
 },
 "servos": {
  "sts3215_7v4": {
   "src": "https://docs.waveshare.com/ST3215_Servo (Waveshare SKU 33014), Feetech wiki",
   "dims_mm_LxWxH": [
    45.2,
    24.7,
    35
   ],
   "mass_g": 55,
   "s_per_60deg_noload_7v4": 0.192,
   "noload_deg_s": 312,
   "noload_rpm": 52,
   "stall_torque_kgfcm_7v4": 19.5,
   "stall_torque_conflicts": "Waveshare 19.5 @7.4V; Feetech page text 19.5, its summary table 16.5, a listing 19 [?]",
   "rated_load_kgfcm_7v4": 5,
   "voltage_range_V": "4-7.4",
   "no_load_current_mA": 150,
   "stall_current_A": 2.5,
   "resolution_steps_per_rev": 4096,
   "deg_per_step": 0.08789,
   "range_note": "360 deg magnetic encoder, position 0-4095",
   "gear_ratio": "1:345 (servos-power.md; Feetech wiki)",
   "id_range": "0-253 (Feetech memory table)",
   "baud_range": "38400-1000000 (default 1000000)",
   "tag": "S"
  },
  "sh0257mg_plus": {
   "src": "https://savox-servo.com/en/product/SH-0257MGplus/",
   "dims_mm_LxWxH": [
    22.8,
    12.0,
    25.4
   ],
   "mass_g": 14,
   "torque_kgfcm": {
    "4.8V": 1.8,
    "6V": 2.2
   },
   "s_per_60deg": {
    "4.8V": 0.13,
    "6V": 0.09
   },
   "blocking_current_mA": 1400,
   "rated_current_mA": 180,
   "voltage_V": "4.8-6",
   "tag": "S",
   "note": "marginal for tilt: needs >= 2.5 kgf.cm (light case)"
  },
  "mg996r": {
   "src": "TowerPro / Digikey datasheet via servos-power.md section B",
   "dims_mm_LxWxH": [
    40.7,
    19.7,
    42.9
   ],
   "mass_g": 55,
   "torque_kgfcm": {
    "4.8V": 9.4,
    "6V": 11
   },
   "s_per_60deg": {
    "4.8V": 0.17,
    "6V": 0.14
   },
   "speed_conflict": "TowerPro 0.14 @6V (servos-power.md) vs Waveshare listing 0.18 vs latency-budget.md 0.15 [?]",
   "stall_current_A_6V": 2.5,
   "running_current_mA_6V": "500-900",
   "voltage_V": "4.8-7.2",
   "tag": "S"
  },
  "ds3218": {
   "src": "DSSERVO DS3218 datasheet, reseller copy (etechrobot.com) via servos-power.md",
   "dims_mm_LxWxH": [
    40,
    20,
    40.5
   ],
   "mass_g": 60,
   "torque_kgfcm": {
    "5V": 18,
    "6.8V": 21.5
   },
   "s_per_60deg": {
    "5V": 0.16,
    "6.8V": 0.14
   },
   "stall_current_A": {
    "5V": 1.8,
    "6.8V": 2.2
   },
   "deadband_us": 3,
   "tag": "S"
  },
  "mg90s": {
   "src": "TowerPro MG90S page via servos-power.md (Waveshare listing differs: 2.0/2.8 kgf.cm)",
   "dims_mm_LxWxH": [
    22.8,
    12.2,
    28.5
   ],
   "mass_g": 13.4,
   "torque_kgfcm": {
    "4.8V": 1.8,
    "6V": 2.2
   },
   "s_per_60deg": {
    "4.8V": 0.1,
    "6V": 0.08
   },
   "tag": "S"
  },
  "sc1258tg_plus": {
   "src": "https://savox-servo.com/en/product/SC-1258TGplus/",
   "dims_mm_LxWxH": [
    40.3,
    20.2,
    37.4
   ],
   "mass_g": 64,
   "torque_kgfcm": {
    "4.8V": 9.6,
    "6V": 12.0
   },
   "s_per_60deg": {
    "4.8V": 0.1,
    "6V": 0.08
   },
   "blocking_current_mA": 5000,
   "rated_current_mA": 120,
   "tag": "S"
  }
 },
 "servo_driver": {
  "waveshare_bus_servo_adapter_a": {
   "src": "https://docs.waveshare.com/Bus_Servo_Adapter_A",
   "sku": 25514,
   "price_usd": 4.99,
   "price_src": "https://www.waveshare.com/product/bus-servo-adapter-a.htm (2026-11-03)",
   "interfaces": "USB Type-C and UART (selected by a jumper/switch), DC 5.5x2.1 power jack, power terminal block, bus servo connector",
   "input_voltage": "wiki: 9-12.6 V (must match servo voltage); \"actually 5-8.4 V can also be input\"",
   "input_voltage_tag": "? bench-confirm before connecting 7.4 V",
   "size_mm": [
    42,
    33
   ],
   "mount_hole_dia_mm": 2.5,
   "max_servos": 253
  },
  "adafruit_pca9685_815": {
   "src": "https://www.adafruit.com/product/815",
   "price_usd": 14.95,
   "i2c_default_addr": "0x40",
   "vcc_logic_V": "3-5",
   "v_plus_servo_V": "5-6 (up to 12 per Adafruit)",
   "resolution_bits": 12,
   "rule": "never connect VCC to V+; OE pin disables outputs; 25 mA per pin max",
   "tag": "S"
  },
  "pololu_micro_maestro_1350": {
   "src": "https://www.pololu.com/product/1350",
   "price_usd": 27.95,
   "note": "serial timeout -> servos go home; <200 ns jitter (Pololu)",
   "tag": "S"
  }
 },
 "compute": {
  "rig_machine": "Raspberry Pi 5 (assumed; \"or similar\")",
  "wifi": "onboard 802.11ac (Wi-Fi 5), Infineon CYW43455",
  "h264_hw_encoder": false,
  "psu": "official 27 W USB-C PD 5.1 V/5 A (Adafruit #5814 US$14.04); USB total 1.6 A when 5 A PD negotiated",
  "src": "https://www.raspberrypi.com/products/raspberry-pi-5/"
 },
 "pi5_header": {
  "pins": {
   "1": "3V3",
   "2": "5V",
   "3": "GPIO2 SDA1",
   "4": "5V",
   "5": "GPIO3 SCL1",
   "6": "GND",
   "8": "GPIO14 TXD",
   "10": "GPIO15 RXD"
  },
  "notes": "GPIO is 3.3 V, not 5 V tolerant; SDA/SCL have 1.8 kOhm pull-ups to 3.3 V",
  "src": "https://www.raspberrypi.com/documentation/computers/raspberry-pi.html",
  "tag": "S"
 },
 "power": {
  "servo_rail_separate_from_pi": true,
  "common_ground": true,
  "rail_by_servo": {
   "sts3215": "7.4 V (2S) direct",
   "pwm_servos": "5-6 V via UBEC (DS3218 up to 6.8 V)"
  },
  "stall_current_both_servos_A": {
   "sts3215": 5.0,
   "mg996r": 5.0,
   "ds3218_6v8": 4.4,
   "sh0257": 2.8,
   "sc1258tg_plus": 10.0
  },
  "fuse_A": "about 5-7 (stall-sized) [E]",
  "bulk_cap_uF": "470-2200 [E rule of thumb, unsourced]",
  "camera_current_mA_each": {
   "usb48mp01": "550-610 (ELP listing; Quanrui unit unverified)",
   "brio": "500 declared, ~896 reported live (one user)"
  },
  "ubec_options": {
   "pololu_D24V50F5": "5 V / 5 A fixed, US$32.95",
   "pololu_S18V20F5": "2 A only, US$29.95 (light build only)"
  }
 },
 "network": {
  "pose_udp": {
   "direction": "headset -> rig",
   "transport": "UDP",
   "port": null,
   "port_note": "NOT specified in any source. PROPOSED default 5005 [E]; make configurable.",
   "rate_hz": [
    60,
    90
   ],
   "packet_bytes": 24,
   "endianness": "little",
   "struct": "<HBBIQff",
   "fields": [
    {
     "off": 0,
     "type": "u16",
     "name": "magic",
     "value": "0x4D42 (\"MB\")"
    },
    {
     "off": 2,
     "type": "u8",
     "name": "version",
     "value": 1
    },
    {
     "off": 3,
     "type": "u8",
     "name": "flags",
     "bit0": "recenter request",
     "bit1": "pause/park"
    },
    {
     "off": 4,
     "type": "u32",
     "name": "seq",
     "rule": "drop if <= last"
    },
    {
     "off": 8,
     "type": "u64",
     "name": "t_send_us",
     "note": "headset monotonic us; jitter/age stats only"
    },
    {
     "off": 16,
     "type": "f32",
     "name": "yaw_deg",
     "note": "+ = look RIGHT, relative to recenter"
    },
    {
     "off": 20,
     "type": "f32",
     "name": "pitch_deg",
     "note": "+ = look UP"
    }
   ],
   "example_hex": "424d01000100000040e2010000000000000020410000a0c0",
   "example_args": {
    "flags": 0,
    "seq": 1,
    "t_us": 123456,
    "yaw": 10.0,
    "pitch": -5.0
   },
   "tag": "D/E: packet format is the project design (servos-power.md A.5), not an external standard"
  },
  "visionproteleop": {
   "repo": "https://github.com/Improbable-AI/VisionProTeleop",
   "commit_inspected": "4c549905c2a8b214d79f7cd88e535101a1ce32af",
   "license": "MIT",
   "head_grpc_port": 12345,
   "webrtc_signaling_tcp_port": 9999,
   "http_webrtc_info_port": 8888,
   "head_matrix": "Matrix4x4 m00..m33 (16 floats), Z-up after YUP2ZUP + rotate_head(-90 deg); no timestamp",
   "head_poll_hz": 120,
   "grpc_send_loop_hz": 200,
   "forward_column": "UNVERIFIED",
   "tag": "S (repo inspection); forward axis ?"
  },
  "video_out": {
   "layout": "single side-by-side frame [left | right], 2560x720 @30 (2x 1280x720)",
   "codec": "H.264 (libx264 ultrafast, zerolatency, no B-frames) or VP8; negotiated codec UNKNOWN in VPT",
   "bitrate_mbps_target": [
    8,
    12
   ],
   "bitrate_tag": "E",
   "aiortc_default_caps": "H.264 max 3 Mbps (default 1), VP8 max 1.5 Mbps (default 0.5), 30 fps [S]",
   "alt_td_routes": [
    "NDI Out TOP (visionOS NDI SDK 6.2+)",
    "WebRTC DAT + Video Stream Out TOP",
    "SRT/RTSP"
   ],
   "headset_link": "Wi-Fi 6 (5 GHz, 80 MHz, 2x2, 1200 Mbps PHY)"
  }
 },
 "control_loop": {
  "loop_hz": 100,
  "max_rate_deg_s": 120,
  "max_rate_tag": "E tune to servo/payload",
  "t_hold_ms": 250,
  "t_park_s": 2,
  "park_pose_deg": [
   0,
   0
  ],
  "park_rate_deg_s": 20,
  "extrapolate_max_ms": 50,
  "deadband_deg": [
   0.3,
   0.5
  ],
  "deadband_tag": "S-ish: VPT doc suggestion [E]",
  "filter": {
   "type": "One Euro (Casiez et al., CHI 2012)",
   "mincutoff_hz": 1.0,
   "beta": [
    0.05,
    0.1
   ],
   "dcutoff_hz": 1.0,
   "at_rate_hz": 100,
   "tag": "S start values; tune by eye",
   "src": [
    "https://gery.casiez.net/1euro/",
    "https://github.com/casiez/OneEuroFilter"
   ]
  },
  "prediction_ms": [
   30,
   60
  ],
  "prediction_tag": "E",
  "servo_lag_target_ms": {
   "slow_turns": 40,
   "quick_turns_extra": 60
  },
  "servo_speed_target_deg_s": {
   "noload_min": 400,
   "loaded_min": 280
  },
  "sts3215_speed_limit_deg_s": "just under 300",
  "derate": 0.7,
  "derate_tag": "E",
  "watchdog": "systemd WatchdogSec= on the control process; Maestro: serial timeout",
  "sts3215_protocol": {
   "frame": "FF FF ID LEN INSTR PARAMS CHECKSUM",
   "len": "counts INSTR + PARAMS + CHECKSUM",
   "checksum": "~(ID + LEN + INSTR + PARAMS) & 0xFF",
   "broadcast_id": "0xFE",
   "instr": {
    "ping": "0x01",
    "read": "0x02",
    "write": "0x03",
    "reg_write": "0x04",
    "action": "0x05",
    "sync_read": "0x82",
    "sync_write": "0x83"
   },
   "byte_order_16bit": "low byte first (STS)",
   "registers": {
    "torque_enable": {
     "addr": 40,
     "hex": "0x28",
     "bytes": 1,
     "note": "0 off, 1 on, 2 damping, 128 = set current position to 2048"
    },
    "acceleration": {
     "addr": 41,
     "bytes": 1,
     "unit_deg_s2": 8.79
    },
    "goal_position": {
     "addr": 42,
     "hex": "0x2A",
     "bytes": 2,
     "unit_deg": 0.0879,
     "note": "0-4095 (sign bit BIT15 for direction per Feetech table)"
    },
    "running_speed": {
     "addr": 46,
     "hex": "0x2E",
     "bytes": 2,
     "unit_rpm": 0.732,
     "note": "0 = max"
    },
    "torque_limit": {
     "addr": 48,
     "hex": "0x30",
     "bytes": 2,
     "unit": "0.1 %",
     "default": 1000
    },
    "lock": {
     "addr": 55,
     "hex": "0x37",
     "note": "0 = EEPROM writes persist"
    },
    "present_position": {
     "addr": 56,
     "bytes": 2
    },
    "present_speed": {
     "addr": 58,
     "bytes": 2
    },
    "present_load": {
     "addr": 60,
     "bytes": 2
    },
    "present_voltage": {
     "addr": 62,
     "unit_V": 0.1
    },
    "present_temperature": {
     "addr": 63
    },
    "moving": {
     "addr": 66
    },
    "present_current": {
     "addr": 69,
     "unit_mA": 6.5
    }
   },
   "src": [
    "https://ftservo.github.io/ftservo-wiki/en/reference/protocol/",
    "https://ftservo.github.io/ftservo-wiki/en/reference/parameter/memory-sts/",
    "https://github.com/commanderfun/STS3215/blob/main/REGISTER_REFERENCE.md"
   ],
   "example_sync_write_goal_2048_ids_1_2_hex": "ff ff fe 0a 83 2a 02 01 00 08 02 00 08 35",
   "example_sync_write_pan+90_tilt-30_hex": "ff ff fe 0a 83 2a 02 01 00 0c 02 ab 06 88",
   "examples_tag": "D (computed in Python from the formulas above); not tested on hardware",
   "connector_pinout": "UNVERIFIED - not published by Feetech/Waveshare pages inspected; check the servo label"
  }
 },
 "latency_budget_ms": {
  "tag": "E unless noted; see HANDOFF.md section 10",
  "scenario_a": {
   "S1_head_pose": [
    1,
    6,
    12
   ],
   "S2_wifi_up": [
    2,
    4,
    25
   ],
   "S3_machine_servo_cmd": [
    1,
    3,
    20
   ],
   "S4_servo_response": [
    15,
    40,
    90
   ],
   "S5_camera_usb": [
    50,
    90,
    110
   ],
   "S6_mjpeg_decode_sbs": [
    6,
    14,
    25
   ],
   "S7_x264": [
    8,
    20,
    35
   ],
   "S8_wifi_down": [
    3,
    6,
    40
   ],
   "S9_jitter_buffer": [
    2,
    7,
    20
   ],
   "S10_hw_decode": [
    2,
    5,
    10
   ],
   "S11_render_scanout": [
    8,
    15,
    30
   ],
   "total": [
    98,
    210,
    417
   ]
  },
  "scenario_b_total": [
   96.5,
   207,
   384
  ],
  "scenario_c_typical_total_by_wan_rtt_ms": {
   "20": 237,
   "60": 277,
   "150": 367
  },
  "columns": [
   "best",
   "typical",
   "worst"
  ],
  "measured_anchors": {
   "vpt_wireless_stereo_2560x720_ms": {
    "mean": 59.9,
    "p50": 52,
    "p95": 117
   },
   "vpt_wireless_stereo_3840x1080_ms": {
    "mean": 56.6,
    "p50": 64,
    "p95": 113,
    "p99": 140
   },
   "vpt_wired_stereo_3840x1080_ms": {
    "mean": 23.0
   },
   "vpt_conditions": "synthetic frames, round trip, not glass-to-glass; 1000 trials, 30 fps, MacBook Pro M2 -> Vision Pro over Wi-Fi 6",
   "transitive_ms": {
    "direct_usb_webcam_to_display": 110,
    "local_webrtc": 130,
    "turn_remote": 170
   },
   "tag": "S"
  },
  "head_speed_design_range_deg_s": {
   "slow": [
    30,
    90
   ],
   "quick": [
    250,
    380
   ],
   "not_tracked": 780
  }
 },
 "simulator": {
  "ipd_mm": 63,
  "stereo_eye_resolution": [
   1280,
   720
  ],
  "sbs_resolution": [
   2560,
   720
  ],
  "fps": 30,
  "camera_hfov_deg_assumed": 70,
  "camera_hfov_tag": "? CAM-01 lens variant unconfirmed (~82 deg D / ~70 deg H per vendor family page)",
  "near_far_mm": [
   5,
   5000
  ],
  "tag": "E"
 },
 "fk_expected": {
  "module38_sts3215": [
   {
    "pan_deg": 0,
    "tilt_deg": 0,
    "eye_L_gltf_mm": [
     31.5,
     77.0,
     20.0
    ],
    "eye_R_gltf_mm": [
     -31.5,
     77.0,
     20.0
    ]
   },
   {
    "pan_deg": 30,
    "tilt_deg": 0,
    "eye_L_gltf_mm": [
     37.28,
     77.0,
     1.571
    ],
    "eye_R_gltf_mm": [
     -17.28,
     77.0,
     33.071
    ]
   },
   {
    "pan_deg": 0,
    "tilt_deg": 20,
    "eye_L_gltf_mm": [
     31.5,
     83.84,
     18.794
    ],
    "eye_R_gltf_mm": [
     -31.5,
     83.84,
     18.794
    ]
   },
   {
    "pan_deg": -45,
    "tilt_deg": 25,
    "eye_L_gltf_mm": [
     9.457,
     85.452,
     35.091
    ],
    "eye_R_gltf_mm": [
     -35.091,
     85.452,
     -9.457
    ]
   },
   {
    "pan_deg": 90,
    "tilt_deg": -30,
    "eye_L_gltf_mm": [
     17.321,
     67.0,
     -31.5
    ],
    "eye_R_gltf_mm": [
     17.321,
     67.0,
     31.5
    ]
   }
  ],
  "module38_sh0257": [
   {
    "pan_deg": 0,
    "tilt_deg": 0,
    "eye_L_gltf_mm": [
     31.5,
     67.4,
     20.0
    ],
    "eye_R_gltf_mm": [
     -31.5,
     67.4,
     20.0
    ]
   },
   {
    "pan_deg": 30,
    "tilt_deg": 0,
    "eye_L_gltf_mm": [
     37.28,
     67.4,
     1.571
    ],
    "eye_R_gltf_mm": [
     -17.28,
     67.4,
     33.071
    ]
   },
   {
    "pan_deg": 0,
    "tilt_deg": 20,
    "eye_L_gltf_mm": [
     31.5,
     74.24,
     18.794
    ],
    "eye_R_gltf_mm": [
     -31.5,
     74.24,
     18.794
    ]
   },
   {
    "pan_deg": -45,
    "tilt_deg": 25,
    "eye_L_gltf_mm": [
     9.457,
     75.852,
     35.091
    ],
    "eye_R_gltf_mm": [
     -35.091,
     75.852,
     -9.457
    ]
   },
   {
    "pan_deg": 90,
    "tilt_deg": -30,
    "eye_L_gltf_mm": [
     17.321,
     57.4,
     -31.5
    ],
    "eye_R_gltf_mm": [
     17.321,
     57.4,
     31.5
    ]
   }
  ],
  "brio_mg996r": [
   {
    "pan_deg": 0,
    "tilt_deg": 0,
    "eye_L_gltf_mm": [
     31.5,
     116.9,
     31.5
    ],
    "eye_R_gltf_mm": [
     -31.5,
     116.9,
     31.5
    ]
   },
   {
    "pan_deg": 30,
    "tilt_deg": 0,
    "eye_L_gltf_mm": [
     43.03,
     116.9,
     11.53
    ],
    "eye_R_gltf_mm": [
     -11.53,
     116.9,
     43.03
    ]
   },
   {
    "pan_deg": 0,
    "tilt_deg": 20,
    "eye_L_gltf_mm": [
     31.5,
     127.674,
     29.6
    ],
    "eye_R_gltf_mm": [
     -31.5,
     127.674,
     29.6
    ]
   },
   {
    "pan_deg": -45,
    "tilt_deg": 25,
    "eye_L_gltf_mm": [
     2.087,
     130.212,
     42.461
    ],
    "eye_R_gltf_mm": [
     -42.461,
     130.212,
     -2.087
    ]
   },
   {
    "pan_deg": 90,
    "tilt_deg": -30,
    "eye_L_gltf_mm": [
     27.28,
     101.15,
     -31.5
    ],
    "eye_R_gltf_mm": [
     27.28,
     101.15,
     31.5
    ]
   }
  ]
 },
 "validation_on_box": {
  "module38_sts3215": {
   "yourdfpy_loaded": true,
   "links": 7,
   "joints": 6,
   "actuated": [
    "pan_joint",
    "tilt_joint"
   ],
   "validate_errors": null,
   "mesh_refs": 19,
   "mesh_files_exist": true,
   "scene_geometries_loaded": 13,
   "inertias_positive_definite_and_triangle_ok": true,
   "links_with_inertial": 5,
   "joint_limits_deg": {
    "pan_joint": [
     -90.0,
     90.0
    ],
    "tilt_joint": [
     -30.0,
     30.0
    ]
   },
   "root": "base_link",
   "fk_urdf_vs_glb_max_err_m": 1.3877787807814457e-17,
   "forward_after_pan30_tilt20_cad": [
    -0.4698,
    0.8138,
    0.342
   ],
   "pan_positive_turns_left": true,
   "tilt_positive_pitches_up": true
  },
  "module38_sh0257": {
   "yourdfpy_loaded": true,
   "links": 7,
   "joints": 6,
   "actuated": [
    "pan_joint",
    "tilt_joint"
   ],
   "validate_errors": null,
   "mesh_refs": 19,
   "mesh_files_exist": true,
   "scene_geometries_loaded": 13,
   "inertias_positive_definite_and_triangle_ok": true,
   "links_with_inertial": 5,
   "joint_limits_deg": {
    "pan_joint": [
     -90.0,
     90.0
    ],
    "tilt_joint": [
     -30.0,
     30.0
    ]
   },
   "root": "base_link",
   "fk_urdf_vs_glb_max_err_m": 1.3877787807814457e-17,
   "forward_after_pan30_tilt20_cad": [
    -0.4698,
    0.8138,
    0.342
   ],
   "pan_positive_turns_left": true,
   "tilt_positive_pitches_up": true
  },
  "brio_mg996r": {
   "yourdfpy_loaded": true,
   "links": 7,
   "joints": 6,
   "actuated": [
    "pan_joint",
    "tilt_joint"
   ],
   "validate_errors": null,
   "mesh_refs": 19,
   "mesh_files_exist": true,
   "scene_geometries_loaded": 13,
   "inertias_positive_definite_and_triangle_ok": true,
   "links_with_inertial": 5,
   "joint_limits_deg": {
    "pan_joint": [
     -90.0,
     90.0
    ],
    "tilt_joint": [
     -30.0,
     30.0
    ]
   },
   "root": "base_link",
   "fk_urdf_vs_glb_max_err_m": 2.7755575615628914e-17,
   "forward_after_pan30_tilt20_cad": [
    -0.4698,
    0.8138,
    0.342
   ],
   "pan_positive_turns_left": true,
   "tilt_positive_pitches_up": true
  },
  "urdfpy": "import failed: ImportError: cannot import name 'gcd' from 'fractions' (/usr/lib/python3.13/fractions.py)"
 },
 "files": {
  "cameras_csv": "data/cameras.csv",
  "wiring_svg": "data/wiring.svg",
  "latency_svg": "data/latency-pipeline.svg",
  "scad": "cad/mb001_rig.scad"
 }
}