{
  "schema_version": 1,
  "meta": {
    "name": "free_humanoid_wheeled",
    "version": "0.1.0",
    "units_length": "Metre",
    "author": "Free Humanoid Wheeled Contributors",
    "description": "Free Humanoid Wheeled — sibling morphology to the Free Humanoid Platform (humanoid_bipedal), the centaur Free Humanoid Centaur (humanoid_quadruped), and the submersible Free Humanoid Submersible (humanoid_submersible). Targeted at the shoal dock-B service mission (urban stormwater outfalls, harbor docks, industrial discharge points — paved curb-edge dock service). Wheeled differential-drive base + tower stand + bipedal upper body inherited verbatim. ~70 kg total system, 2 kWh battery, 30 kg sustained payload at extended reach, 1.5 m/s peak speed, 600x800x350 mm base footprint, 15-inch pneumatic drive wheels. Drive actuator: QDD direct-drive into wheel hub via ~10:1 planetary reduction, T-Motor AK60-6 BLDC + mjbots Moteus n1 controllers (corpus: mit-cheetah-2 / mjbots-moteus). Tower stand: belt-driven linear stage (Igus DryLin SHTS-15 + NEMA-23 stepper, ±150 mm travel) per toyota-hsr telescoping-torso pattern. Outdoor sensing pinned to commercial-off-the-shelf SKUs: Livox MID-360 lidar (tower-top), u-blox ZED-F9P RTK GPS, VectorNav VN-100 IMU (production) or BNO055 (Phase 1 bench), Quectel RM502Q-AE 5G modem. Compute: NVIDIA Jetson Orin Nano Super 8GB (perception + planning) + Raspberry Pi 4 8GB (safety supervisor) on Simplex pattern. Battery: 24V 50Ah Li-ion AGV-class pack (~1.2 kWh shown at 24V; descriptor still nominally 2 kWh @ 48V via dual modules — Phase 2 picks the final cell-and-bus voltage). Frame: 6061-T6 aluminum monocoque + 3D-printed PA12 covers. Upper body actuator distribution inherited from bipedal sibling (corpus: honda-e0 harmonic-drive at shoulder/elbow, shadow-dexterous-hand tendon at wrist/hand, pisa-iit-softhand at synergy hand, mini-cheetah QDD at neck/waist). Safety supervisor: MathGround-style Simplex (corpus: sherman-simplex-architecture, control-barrier-functions) plus wheeled-specific invariants (slope-tilt, edge-proximity, low-battery-on-shore-power). Mission integration with shoal dock-B (cartridge-swap, waste-hopper, biology-reservoir handshake, water-utility EAM). Compiles to URDF / MJCF / STL / BOM via the OpenLoco descriptor compiler. All masses and inertias are scaffold placeholders for now — iterate against physical CAD before any build; Phase 1 numbers are derived from vendor data sheets + reasonable structural estimates.",
    "generator": "free-humanoid-wheeled-scaffold",
    "morphology_class": "humanoid_wheeled",
    "morphology_family": "humanoid_wheeled",
    "alias": "wheeled",
    "inherits_upper_body_from": "free-humanoid-platform",
    "operating_medium": "paved_ground",
    "phase": "Phase 1 — descriptor with vendor-pinned components and BOM-grade actuator/sensor specs (2026-05-07). Phase 2 work: chassis fabrication + drive-base prototype + dry-side bench test. Phase 3: dock-B mock cartridge-swap end-to-end. Phase 4: open-water shoal dock-B municipal-utility pilot.",
    "corpus_anchors": [
      "dlr-justin",
      "pr2",
      "willow-pr1",
      "pepper-softbank",
      "nao",
      "toyota-hsr",
      "reachy-2-pollen-2023",
      "ascento",
      "mit-cheetah-2",
      "mini-cheetah",
      "mjbots-moteus",
      "odrive",
      "sumitomo-cyclo",
      "honda-e0",
      "shadow-dexterous-hand",
      "pisa-iit-softhand",
      "sherman-simplex-architecture",
      "control-barrier-functions",
      "iso-10218-collaborative-robots",
      "reachability-analysis-safe-control",
      "runtime-assurance-rta",
      "shielding-rl",
      "asimov-positronic-robots",
      "williamson-folded-hands",
      "asimovs-zeroth-law",
      "data-tng",
      "hal-9000",
      "robocop-1987",
      "forbidden-planet-robby",
      "magnus-robot-fighter",
      "b-9-lost-in-space",
      "silent-running-drones",
      "hyundai-boston-dynamics-spot",
      "spot-fuel-cell",
      "apptronik-apollo",
      "tesla-optimus",
      "unitree-h1",
      "unitree-g1",
      "berkeley-humanoid",
      "berkeley-humanoid-2024",
      "stanford-toddlerbot-2025",
      "levine-gps-pr2-2016",
      "act-aloha",
      "mobile-aloha",
      "diffusion-policy",
      "rt-1",
      "openai-rt-2",
      "openvla",
      "openvla-stanford-2024",
      "octo-policy",
      "physical-intelligence-pi-zero",
      "physical-intelligence-pi0-2024",
      "huggingface-lerobot-2024",
      "nvidia-isaac-gym-2021",
      "nvidia-isaac-lab-2024",
      "nvidia-groot-2024",
      "genesis-embodied-ai-simulator",
      "drake-tedrake-2019",
      "mujoco-todorov-2012",
      "deepmind-mujoco-mjx-2023",
      "howell-tassa-mujoco-mpc-2025",
      "orb-slam-mur-artal-2015",
      "orb-slam3-2021",
      "roetenberg-xsens-imu",
      "janus-stanag-4748-2017",
      "unetstack-subnero-2014"
    ],
    "corpus_anchors_recommended_future_additions": [
      "t-motor-ak60-6",
      "livox-mid-360-2022",
      "u-blox-zed-f9p-rtk",
      "vectornav-vn-100",
      "quectel-rm502q-ae",
      "nvidia-jetson-orin-nano-super",
      "igus-drylin-shts-linear-stage"
    ],
    "siblings": {
      "bipedal_morphology": "../../free-humanoid-platform/descriptor/free-humanoid.udd.json",
      "centaur_morphology": "../../free-humanoid-centaur/descriptor/free-humanoid-centaur.udd.json",
      "submersible_morphology": "../../free-humanoid-submersible/descriptor/free-humanoid-submersible.udd.json",
      "deployment_partner": "../../clean_fish/ARCHITECTURE.md"
    }
  },
  "robot": {
    "links": [
      { "name": "chassis",          "mass_kg": 8.000, "inertia": [3.5e-1, 5.0e-1, 4.0e-1, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_chassis_v0" }, "_metadata": { "comment": "Wheeled base chassis. 600x800x350 mm 6061-T6 aluminum monocoque + 3D-printed PA12 covers. Houses battery pack(s), Jetson Orin Nano (perception/planning), Raspberry Pi 4 (safety supervisor), Moteus n1 drive controllers, 5G modem, network switch, drive-bus power conditioning, status indicators. Vendor: McMaster 6061-T6 aluminum stock (8975K426 series); Hubs MJF PA12 print run for covers. Corpus citation: dlr-justin (2009), pr2 (2010)." } },
      { "name": "L_drive_wheel",    "mass_kg": 3.500, "inertia": [3.0e-2, 5.0e-2, 3.0e-2, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_wheel_pneumatic_15in_v0" }, "_metadata": { "comment": "15-inch pneumatic drive wheel, left. Phase 1 spec: ServoCity heavy-duty 15-inch pneumatic wheel (ServoCity 3801-0001-0015-class) on a 12 mm bore hub adapter. Pneumatic for 50 mm curb tolerance (corpus: dlr-justin, pr2 outdoor variants). Vendor: ServoCity (or McMaster 2374K11 equivalent)." } },
      { "name": "R_drive_wheel",    "mass_kg": 3.500, "inertia": [3.0e-2, 5.0e-2, 3.0e-2, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_wheel_pneumatic_15in_v0" }, "_metadata": { "comment": "15-inch pneumatic drive wheel, right. Same SKU as left." } },
      { "name": "L_caster",         "mass_kg": 0.800, "inertia": [4.0e-3, 4.0e-3, 4.0e-3, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_caster_swivel_8in_v0" }, "_metadata": { "comment": "8-inch passive swivel caster, left front. Phase 1 spec: McMaster 2810T7 heavy-duty pneumatic-tire swivel caster, 250 lb capacity, top-plate mount. Vendor: McMaster-Carr. Corpus citation: pr2, dlr-justin caster-front + drive-rear pattern." } },
      { "name": "R_caster",         "mass_kg": 0.800, "inertia": [4.0e-3, 4.0e-3, 4.0e-3, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_caster_swivel_8in_v0" }, "_metadata": { "comment": "8-inch passive swivel caster, right front. Same SKU as left." } },
      { "name": "battery_module_a", "mass_kg": 9.000, "inertia": [4.0e-2, 4.0e-2, 2.0e-2, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_battery_module_v0" }, "_metadata": { "comment": "1 kWh hot-swap module, left side, mounted between drive wheels for low COM. Phase 1 spec: 24V 50Ah / 1.2 kWh AGV-class Li-ion pack (e.g. Bioenno BLF-2450A or RoyPow S2450 class) — descriptor still nominally 2 kWh @ 48V via dual modules; Phase 2 picks final cell chemistry, bus voltage, BMS. Vendor: Bioenno Power / RoyPow. Corpus citation: hyundai-boston-dynamics-spot, spot-fuel-cell hot-swap precedent; tesla-optimus / apptronik-apollo / unitree-h1 large-pack precedent." } },
      { "name": "battery_module_b", "mass_kg": 9.000, "inertia": [4.0e-2, 4.0e-2, 2.0e-2, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_battery_module_v0" }, "_metadata": { "comment": "1 kWh hot-swap module, right side. Same SKU as left." } },
      { "name": "tower_stand",      "mass_kg": 4.500, "inertia": [1.5e-1, 1.5e-1, 2.0e-2, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_tower_stand_v0" }, "_metadata": { "comment": "Rigid 6061-T6 aluminum tower stand. Mounts upper body pelvis at 0.55 m above ground via prismatic torso lift. Includes prismatic torso lift +/-150 mm via belt-driven linear stage (Phase 1 spec: Igus DryLin SHTS-15-300 carbon-rail stage + NEMA-23 stepper + GT2 belt + IGUS leadscrew alternative). Lidar mount at top (1.0 m): Livox MID-360 mount fixture. GPS mount at top: u-blox L1/L2 RTK helical antenna. Corpus citation: toyota-hsr (telescoping torso). Vendor: Igus (rail), StepperOnline / OMC (motor)." } },

      { "name": "lidar_top",        "mass_kg": 0.265, "inertia": [3.0e-4, 3.0e-4, 3.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_lidar_mid360_v0" }, "_metadata": { "comment": "Tower-top lidar. Phase 1 spec: Livox MID-360 360-deg non-repetitive scan lidar, 40 m range at 80% reflectivity, ~1.5 deg vertical FoV centered ~+/-7 deg, 20 Hz frame rate, IP67. Used for dock approach, obstacle avoidance, curbedge detection. Vendor: Livox (DJI affiliate). Corpus citation: dlr-justin, pr2 (post-2012 lidar additions), hyundai-boston-dynamics-spot." } },
      { "name": "gps_module",       "mass_kg": 0.150, "inertia": [1.5e-4, 1.5e-4, 1.5e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_gps_zedf9p_v0" }, "_metadata": { "comment": "Tower-top GPS. Phase 1 spec: u-blox ZED-F9P-02B-01B multi-band RTK GNSS receiver + Ardusimple SimpleRTK2B-Pro carrier + ANN-MB-00 L1/L2 helical antenna. RTCM corrections via NTRIP from a public mountpoint (e.g. UNAVCO / state DOT base) or via the dock-B's RTK base station. ~1 cm CEP after RTK fix. Vendor: u-blox (chip), Ardusimple (carrier). Corpus citation: dlr-justin, pr2 outdoor-variant precedent." } },
      { "name": "imu_base",         "mass_kg": 0.050, "inertia": [1.0e-5, 1.0e-5, 1.0e-5, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_imu_vn100_v0" }, "_metadata": { "comment": "Base 9-DoF IMU + dedicated 2-DoF tilt sensor. Phase 1 production spec: VectorNav VN-100 surface-mount industrial AHRS (~$1500). Phase 1 budget alternate: Adafruit BNO055 (~$30) for bench/sim work. Wired direct to safety supervisor (Raspberry Pi 4) for the slope-tilt invariant; also publishes to ROS 2 perception. Corpus citation: roetenberg-xsens-imu (foundational IMU disclosure), dlr-justin (tilt-supervised drive)." } },
      { "name": "modem_5g",         "mass_kg": 0.080, "inertia": [3.0e-5, 3.0e-5, 3.0e-5, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_modem_rm502q_v0" }, "_metadata": { "comment": "Cellular modem for fleet coordination. Phase 1 spec: Quectel RM502Q-AE 5G Sub-6 / LTE Cat 20 M.2 modem on a Waveshare USB-to-M.2 carrier with 4-port MIMO antenna kit. Used when WiFi 6 LAN at the dock is unavailable. Vendor: Quectel (modem), Waveshare (carrier). Corpus citation: dlr-justin and the broader mobile-manipulation lineage; cellular modems in robots are commodity." } },
      { "name": "compute_box",      "mass_kg": 1.200, "inertia": [3.0e-3, 3.0e-3, 1.0e-3, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_wheeled_compute_v0" }, "_metadata": { "comment": "On-platform compute. Phase 1 spec: NVIDIA Jetson Orin Nano Super 8GB Developer Kit (67 TOPS, perception + planning, ROS 2) + Raspberry Pi 4 Model B 8GB (safety supervisor on a separate compute domain per Simplex pattern). Mounted inside the chassis. Corpus citation: nvidia-isaac-gym-2021, nvidia-isaac-lab-2024, sherman-simplex-architecture (compute domain separation), levine-gps-pr2-2016 (PR2-class compute heritage)." } },

      { "name": "pelvis", "mass_kg": 8.000, "inertia": [8.0e-2, 6.0e-2, 4.0e-2, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_pelvis_v0" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "torso", "mass_kg": 14.000, "inertia": [2.5e-1, 2.0e-1, 1.0e-1, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_torso_v0" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "head",  "mass_kg": 3.500, "inertia": [1.5e-2, 1.5e-2, 1.0e-2, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_head_v0" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "neck_yaw_link",   "mass_kg": 0.30, "inertia": [4.0e-4, 4.0e-4, 4.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_neck_yaw_v0" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "L_clavicle",  "mass_kg": 0.50, "inertia": [4.0e-4, 4.0e-4, 4.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_clavicle_v0" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_shoulder_pitch_housing", "mass_kg": 0.80, "inertia": [8.0e-4, 8.0e-4, 6.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_harmonic_drive__ratio-100__motor-bldc-100w" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_shoulder_roll_housing",  "mass_kg": 0.80, "inertia": [8.0e-4, 8.0e-4, 6.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_harmonic_drive__ratio-100__motor-bldc-100w" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_upper_arm",  "mass_kg": 1.50, "inertia": [3.0e-3, 3.0e-3, 1.0e-3, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_brackets_arm_segment__length-300" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_elbow_housing",   "mass_kg": 0.60, "inertia": [6.0e-4, 6.0e-4, 4.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_harmonic_drive__ratio-100__motor-bldc-100w" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_forearm",    "mass_kg": 1.20, "inertia": [2.5e-3, 2.5e-3, 8.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_brackets_arm_segment__length-260" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_wrist_pitch_link", "mass_kg": 0.20, "inertia": [1.5e-4, 1.5e-4, 1.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_tendon_block__channels-3" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_wrist_roll_link",  "mass_kg": 0.20, "inertia": [1.5e-4, 1.5e-4, 1.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_tendon_block__channels-3" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_hand", "mass_kg": 0.45, "inertia": [3.0e-4, 3.0e-4, 2.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_hand_underactuated_v0" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "R_clavicle",  "mass_kg": 0.50, "inertia": [4.0e-4, 4.0e-4, 4.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_clavicle_v0" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_shoulder_pitch_housing", "mass_kg": 0.80, "inertia": [8.0e-4, 8.0e-4, 6.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_harmonic_drive__ratio-100__motor-bldc-100w" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_shoulder_roll_housing",  "mass_kg": 0.80, "inertia": [8.0e-4, 8.0e-4, 6.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_harmonic_drive__ratio-100__motor-bldc-100w" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_upper_arm",  "mass_kg": 1.50, "inertia": [3.0e-3, 3.0e-3, 1.0e-3, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_brackets_arm_segment__length-300" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_elbow_housing",   "mass_kg": 0.60, "inertia": [6.0e-4, 6.0e-4, 4.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_harmonic_drive__ratio-100__motor-bldc-100w" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_forearm",    "mass_kg": 1.20, "inertia": [2.5e-3, 2.5e-3, 8.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_brackets_arm_segment__length-260" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_wrist_pitch_link", "mass_kg": 0.20, "inertia": [1.5e-4, 1.5e-4, 1.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_tendon_block__channels-3" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_wrist_roll_link",  "mass_kg": 0.20, "inertia": [1.5e-4, 1.5e-4, 1.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "catalog_joints_tendon_block__channels-3" }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_hand", "mass_kg": 0.45, "inertia": [3.0e-4, 3.0e-4, 2.0e-4, 0, 0, 0], "geometry_ref": { "type": "mesh_hash", "hash": "free_humanoid_hand_underactuated_v0" }, "_metadata": { "inherited_from": "free-humanoid-platform" } }
    ],
    "joints": [
      { "name": "L_DRIVE_wheel",     "joint_type": "continuous", "parent_link": "chassis", "child_link": "L_drive_wheel", "axis": [0, 1, 0], "origin_xyz": [-0.10,  0.30, 0.190], "origin_rpy": [0, 0, 0], "limits": { "effort_max": 80.0, "velocity_max": 8.0 }, "_metadata": { "comment": "Differential-drive left wheel. 15 inch (~190 mm radius) pneumatic. Driven by T-Motor AK60-6 + Moteus n1, ~10:1 planetary reduction. Corpus citation: dlr-justin, pr2, mit-cheetah-2, mjbots-moteus." } },
      { "name": "R_DRIVE_wheel",     "joint_type": "continuous", "parent_link": "chassis", "child_link": "R_drive_wheel", "axis": [0, 1, 0], "origin_xyz": [-0.10, -0.30, 0.190], "origin_rpy": [0, 0, 0], "limits": { "effort_max": 80.0, "velocity_max": 8.0 }, "_metadata": { "comment": "Differential-drive right wheel. Same SKU as left." } },
      { "name": "L_CASTER_swivel",   "joint_type": "continuous", "parent_link": "chassis", "child_link": "L_caster", "axis": [0, 0, 1], "origin_xyz": [ 0.30,  0.20, 0.100], "origin_rpy": [0, 0, 0], "limits": { "effort_max": 0.0, "velocity_max": 20.0 }, "_metadata": { "passive": true, "comment": "Passive swivel caster, left front. Corpus citation: pr2, dlr-justin." } },
      { "name": "R_CASTER_swivel",   "joint_type": "continuous", "parent_link": "chassis", "child_link": "R_caster", "axis": [0, 0, 1], "origin_xyz": [ 0.30, -0.20, 0.100], "origin_rpy": [0, 0, 0], "limits": { "effort_max": 0.0, "velocity_max": 20.0 }, "_metadata": { "passive": true, "comment": "Passive swivel caster, right front." } },
      { "name": "BATTERY_a_fixed",   "joint_type": "fixed",      "parent_link": "chassis", "child_link": "battery_module_a", "axis": [0, 0, 1], "origin_xyz": [-0.10,  0.13, 0.150], "origin_rpy": [0, 0, 0], "_metadata": { "comment": "Hot-swap mount, single-module-at-a-time. The mating geometry is the CC0 commons spec inherited from free-humanoid-platform commitment #6." } },
      { "name": "BATTERY_b_fixed",   "joint_type": "fixed",      "parent_link": "chassis", "child_link": "battery_module_b", "axis": [0, 0, 1], "origin_xyz": [-0.10, -0.13, 0.150], "origin_rpy": [0, 0, 0], "_metadata": { "comment": "Hot-swap mount, second module." } },
      { "name": "CHASSIS_to_tower",  "joint_type": "fixed",      "parent_link": "chassis", "child_link": "tower_stand", "axis": [0, 0, 1], "origin_xyz": [ 0.00, 0.00, 0.350], "origin_rpy": [0, 0, 0], "_metadata": { "comment": "Tower stand mounts to top of chassis." } },
      { "name": "TOWER_lift",        "joint_type": "prismatic",  "parent_link": "tower_stand", "child_link": "pelvis", "axis": [0, 0, 1], "origin_xyz": [ 0.00, 0.00, 0.200], "origin_rpy": [0, 0, 0], "limits": { "lower": -0.150, "upper": 0.150, "effort_max": 1500.0, "velocity_max": 0.05 }, "_metadata": { "comment": "Torso lift, +/-150 mm. Phase 1 spec: Igus DryLin SHTS-15-300 carbon-rail linear stage + NEMA-23 stepper + GT2 belt (Phase 2 architectural call: GT2 belt vs. Igus dryspin leadscrew). Corpus citation: toyota-hsr telescoping-torso." } },

      { "name": "LIDAR_to_tower",    "joint_type": "fixed", "parent_link": "tower_stand", "child_link": "lidar_top",   "axis": [0, 0, 1], "origin_xyz": [ 0.00, 0.00, 0.450], "origin_rpy": [0, 0, 0], "_metadata": { "comment": "Livox MID-360 mounts at the top of the tower stand, ~1.0 m above ground when torso lift centered." } },
      { "name": "GPS_to_tower",      "joint_type": "fixed", "parent_link": "tower_stand", "child_link": "gps_module",  "axis": [0, 0, 1], "origin_xyz": [ 0.00, 0.00, 0.470], "origin_rpy": [0, 0, 0], "_metadata": { "comment": "u-blox ZED-F9P + L1/L2 RTK helical antenna mounts above the lidar." } },
      { "name": "IMU_to_chassis",    "joint_type": "fixed", "parent_link": "chassis",     "child_link": "imu_base",    "axis": [0, 0, 1], "origin_xyz": [ 0.00, 0.00, 0.150], "origin_rpy": [0, 0, 0], "_metadata": { "comment": "Base IMU + tilt sensor mounts at the chassis center, near the COM." } },
      { "name": "MODEM_to_chassis",  "joint_type": "fixed", "parent_link": "chassis",     "child_link": "modem_5g",    "axis": [0, 0, 1], "origin_xyz": [ 0.20, 0.00, 0.250], "origin_rpy": [0, 0, 0] },
      { "name": "COMPUTE_to_chassis","joint_type": "fixed", "parent_link": "chassis",     "child_link": "compute_box", "axis": [0, 0, 1], "origin_xyz": [ 0.10, 0.00, 0.220], "origin_rpy": [0, 0, 0] },

      { "name": "WAIST_yaw", "joint_type": "revolute", "parent_link": "pelvis", "child_link": "torso", "axis": [0, 0, 1], "origin_xyz": [0.0, 0.0, 0.18], "origin_rpy": [0, 0, 0], "limits": { "lower": -1.5, "upper": 1.5, "effort_max": 80.0, "velocity_max": 4.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "NECK_yaw",   "joint_type": "revolute", "parent_link": "torso", "child_link": "neck_yaw_link", "axis": [0, 0, 1], "origin_xyz": [0.0, 0.0, 0.42], "origin_rpy": [0, 0, 0], "limits": { "lower": -1.4, "upper": 1.4, "effort_max": 8.0, "velocity_max": 6.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "NECK_pitch", "joint_type": "revolute", "parent_link": "neck_yaw_link", "child_link": "head", "axis": [0, 1, 0], "origin_xyz": [0.0, 0.0, 0.06], "origin_rpy": [0, 0, 0], "limits": { "lower": -0.7, "upper": 0.7, "effort_max": 8.0, "velocity_max": 6.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "L_CLAVICLE_fixed", "joint_type": "fixed", "parent_link": "torso", "child_link": "L_clavicle", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.16, 0.36], "origin_rpy": [0, 0, 0], "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_SHOULDER_pitch", "joint_type": "revolute", "parent_link": "L_clavicle", "child_link": "L_shoulder_pitch_housing", "axis": [0, 1, 0], "origin_xyz": [0.00, 0.04, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -3.14, "upper": 3.14, "effort_max": 60.0, "velocity_max": 6.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_SHOULDER_roll",  "joint_type": "revolute", "parent_link": "L_shoulder_pitch_housing", "child_link": "L_shoulder_roll_housing", "axis": [1, 0, 0], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -0.4, "upper": 3.0, "effort_max": 60.0, "velocity_max": 6.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_SHOULDER_yaw",   "joint_type": "revolute", "parent_link": "L_shoulder_roll_housing", "child_link": "L_upper_arm", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -2.5, "upper": 2.5, "effort_max": 40.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_ELBOW_pitch",    "joint_type": "revolute", "parent_link": "L_upper_arm", "child_link": "L_elbow_housing", "axis": [0, 1, 0], "origin_xyz": [0.00, 0.00, -0.30], "origin_rpy": [0, 0, 0], "limits": { "lower": -2.5, "upper": 0.0, "effort_max": 40.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_ELBOW_to_forearm", "joint_type": "fixed", "parent_link": "L_elbow_housing", "child_link": "L_forearm", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_WRIST_yaw",   "joint_type": "revolute", "parent_link": "L_forearm", "child_link": "L_wrist_pitch_link", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.00, -0.26], "origin_rpy": [0, 0, 0], "limits": { "lower": -2.5, "upper": 2.5, "effort_max": 8.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_WRIST_pitch", "joint_type": "revolute", "parent_link": "L_wrist_pitch_link", "child_link": "L_wrist_roll_link", "axis": [0, 1, 0], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -1.0, "upper": 1.0, "effort_max": 8.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_WRIST_roll",  "joint_type": "revolute", "parent_link": "L_wrist_roll_link", "child_link": "L_hand", "axis": [1, 0, 0], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -1.6, "upper": 1.6, "effort_max": 6.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "R_CLAVICLE_fixed", "joint_type": "fixed", "parent_link": "torso", "child_link": "R_clavicle", "axis": [0, 0, 1], "origin_xyz": [0.00, -0.16, 0.36], "origin_rpy": [0, 0, 0], "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_SHOULDER_pitch", "joint_type": "revolute", "parent_link": "R_clavicle", "child_link": "R_shoulder_pitch_housing", "axis": [0, 1, 0], "origin_xyz": [0.00, -0.04, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -3.14, "upper": 3.14, "effort_max": 60.0, "velocity_max": 6.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_SHOULDER_roll",  "joint_type": "revolute", "parent_link": "R_shoulder_pitch_housing", "child_link": "R_shoulder_roll_housing", "axis": [1, 0, 0], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -3.0, "upper": 0.4, "effort_max": 60.0, "velocity_max": 6.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_SHOULDER_yaw",   "joint_type": "revolute", "parent_link": "R_shoulder_roll_housing", "child_link": "R_upper_arm", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -2.5, "upper": 2.5, "effort_max": 40.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_ELBOW_pitch",    "joint_type": "revolute", "parent_link": "R_upper_arm", "child_link": "R_elbow_housing", "axis": [0, 1, 0], "origin_xyz": [0.00, 0.00, -0.30], "origin_rpy": [0, 0, 0], "limits": { "lower": -2.5, "upper": 0.0, "effort_max": 40.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_ELBOW_to_forearm", "joint_type": "fixed", "parent_link": "R_elbow_housing", "child_link": "R_forearm", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_WRIST_yaw",   "joint_type": "revolute", "parent_link": "R_forearm", "child_link": "R_wrist_pitch_link", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.00, -0.26], "origin_rpy": [0, 0, 0], "limits": { "lower": -2.5, "upper": 2.5, "effort_max": 8.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_WRIST_pitch", "joint_type": "revolute", "parent_link": "R_wrist_pitch_link", "child_link": "R_wrist_roll_link", "axis": [0, 1, 0], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -1.0, "upper": 1.0, "effort_max": 8.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_WRIST_roll",  "joint_type": "revolute", "parent_link": "R_wrist_roll_link", "child_link": "R_hand", "axis": [1, 0, 0], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": -1.6, "upper": 1.6, "effort_max": 6.0, "velocity_max": 8.0 }, "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "L_HAND_synergy", "joint_type": "revolute", "parent_link": "L_hand", "child_link": "L_hand", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": 0.0, "upper": 1.0, "effort_max": 6.0, "velocity_max": 52.0 }, "_metadata": { "synergy_dof": true, "spool_radius_m": 0.008, "inherited_from": "free-humanoid-platform", "comment": "Synergy progress DoF [0,1]. Single motor + 14:1 reducer drives all 5 fingers via fixed-ratio mechanical synergy (corpus: pisa-iit-softhand)." } },
      { "name": "R_HAND_synergy", "joint_type": "revolute", "parent_link": "R_hand", "child_link": "R_hand", "axis": [0, 0, 1], "origin_xyz": [0.00, 0.00, 0.00], "origin_rpy": [0, 0, 0], "limits": { "lower": 0.0, "upper": 1.0, "effort_max": 6.0, "velocity_max": 52.0 }, "_metadata": { "synergy_dof": true, "spool_radius_m": 0.008, "inherited_from": "free-humanoid-platform" } }
    ],
    "actuator_slots": [
      { "name": "L_DRIVE_wheel",    "joint": "L_DRIVE_wheel",    "tier": 2, "type": "qdd",            "reducer_ratio": 10.0, "peak_torque_nm": 250.0, "continuous_torque_nm": 80.0, "max_velocity_rad_s": 8.0,  "corpus_citation": "mit-cheetah-2", "_metadata": { "part_number": "T-Motor AK60-6 v1.1", "vendor": "T-Motor (CubeMars)", "controller_part_number": "mjbots Moteus n1", "controller_vendor": "mjbots Robotic Systems", "controller_corpus_citation": "mjbots-moteus", "comment": "QDD direct-drive into 15 inch wheel hub via ~10:1 planetary reduction. Phase 1 spec: T-Motor AK60-6 BLDC (~9 Nm continuous, 24 Nm peak motor-side; ~80 Nm continuous, 240 Nm peak at the wheel after 10:1 planetary). Sufficient to climb a 10 deg ramp at 1 m/s with full payload. Architecture corpus: mit-cheetah-2 (2014), mini-cheetah (2019); controller corpus: mjbots-moteus (2019)." } },
      { "name": "R_DRIVE_wheel",    "joint": "R_DRIVE_wheel",    "tier": 2, "type": "qdd",            "reducer_ratio": 10.0, "peak_torque_nm": 250.0, "continuous_torque_nm": 80.0, "max_velocity_rad_s": 8.0,  "corpus_citation": "mit-cheetah-2", "_metadata": { "part_number": "T-Motor AK60-6 v1.1", "vendor": "T-Motor (CubeMars)", "controller_part_number": "mjbots Moteus n1", "controller_vendor": "mjbots Robotic Systems", "controller_corpus_citation": "mjbots-moteus" } },
      { "name": "TOWER_lift",       "joint": "TOWER_lift",       "tier": 2, "type": "linear",          "peak_force_n": 1500.0, "continuous_force_n": 600.0, "max_velocity_m_s": 0.05, "corpus_citation": "toyota-hsr", "_metadata": { "part_number": "Igus DryLin SHTS-15-300 + NEMA-23 stepper (StepperOnline 23HS45-4204S)", "vendor": "Igus + StepperOnline", "controller_part_number": "Trinamic TMC2209 stepper driver on Moteus-bus carrier", "comment": "Linear actuator for prismatic torso lift, +/-150 mm. Phase 1 spec: Igus DryLin SHTS-15 carbon-rail linear stage with belt-and-pinion drive, NEMA-23 4.2A stepper, GT2 timing belt. Corpus citation: toyota-hsr telescoping-torso disclosure." } },

      { "name": "WAIST_yaw",        "joint": "WAIST_yaw",        "tier": 2, "type": "qdd",            "corpus_citation": "mini-cheetah", "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "NECK_yaw",         "joint": "NECK_yaw",         "tier": 1, "type": "qdd",            "corpus_citation": "mini-cheetah", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "NECK_pitch",       "joint": "NECK_pitch",       "tier": 1, "type": "qdd",            "corpus_citation": "mini-cheetah", "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "L_SHOULDER_pitch", "joint": "L_SHOULDER_pitch", "tier": 2, "type": "harmonic_drive", "corpus_citation": "honda-e0", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_SHOULDER_roll",  "joint": "L_SHOULDER_roll",  "tier": 2, "type": "harmonic_drive", "corpus_citation": "honda-e0", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_SHOULDER_yaw",   "joint": "L_SHOULDER_yaw",   "tier": 2, "type": "harmonic_drive", "corpus_citation": "honda-e0", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_ELBOW_pitch",    "joint": "L_ELBOW_pitch",    "tier": 2, "type": "harmonic_drive", "corpus_citation": "honda-e0", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_WRIST_yaw",      "joint": "L_WRIST_yaw",      "tier": 1, "type": "tendon",         "corpus_citation": "shadow-dexterous-hand", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_WRIST_pitch",    "joint": "L_WRIST_pitch",    "tier": 1, "type": "tendon",         "corpus_citation": "shadow-dexterous-hand", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "L_WRIST_roll",     "joint": "L_WRIST_roll",     "tier": 1, "type": "tendon",         "corpus_citation": "shadow-dexterous-hand", "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "R_SHOULDER_pitch", "joint": "R_SHOULDER_pitch", "tier": 2, "type": "harmonic_drive", "corpus_citation": "honda-e0", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_SHOULDER_roll",  "joint": "R_SHOULDER_roll",  "tier": 2, "type": "harmonic_drive", "corpus_citation": "honda-e0", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_SHOULDER_yaw",   "joint": "R_SHOULDER_yaw",   "tier": 2, "type": "harmonic_drive", "corpus_citation": "honda-e0", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_ELBOW_pitch",    "joint": "R_ELBOW_pitch",    "tier": 2, "type": "harmonic_drive", "corpus_citation": "honda-e0", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_WRIST_yaw",      "joint": "R_WRIST_yaw",      "tier": 1, "type": "tendon",         "corpus_citation": "shadow-dexterous-hand", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_WRIST_pitch",    "joint": "R_WRIST_pitch",    "tier": 1, "type": "tendon",         "corpus_citation": "shadow-dexterous-hand", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_WRIST_roll",     "joint": "R_WRIST_roll",     "tier": 1, "type": "tendon",         "corpus_citation": "shadow-dexterous-hand", "_metadata": { "inherited_from": "free-humanoid-platform" } },

      { "name": "L_HAND_synergy",   "joint": "L_HAND_synergy",   "tier": 2, "type": "tendon",         "reducer_ratio": 14.0, "peak_torque_nm": 6.25, "continuous_torque_nm": 0.82, "max_velocity_rad_s": 52.4, "corpus_citation": "pisa-iit-softhand", "_metadata": { "inherited_from": "free-humanoid-platform" } },
      { "name": "R_HAND_synergy",   "joint": "R_HAND_synergy",   "tier": 2, "type": "tendon",         "reducer_ratio": 14.0, "peak_torque_nm": 6.25, "continuous_torque_nm": 0.82, "max_velocity_rad_s": 52.4, "corpus_citation": "pisa-iit-softhand", "_metadata": { "inherited_from": "free-humanoid-platform" } }
    ],
    "sensors": [
      { "name": "lidar_top",         "type": "rotating_lidar_3d",       "frame": "lidar_top",     "rate_hz": 20,  "_metadata": { "part_number": "MID-360", "vendor": "Livox", "range_m": 40, "ip_rating": "IP67", "comment": "Tower-top 360-deg non-repetitive scan lidar. Used for dock approach, obstacle avoidance, curbedge detection. Corpus citation: dlr-justin (lidar + tilt-supervised drive), pr2 (post-2012 lidar additions), hyundai-boston-dynamics-spot (outdoor lidar precedent)." } },
      { "name": "gps_rtk",           "type": "rtk_gnss_receiver",       "frame": "gps_module",    "rate_hz": 10,  "_metadata": { "part_number": "ZED-F9P-02B-01B (Ardusimple SimpleRTK2B-Pro carrier + ANN-MB-00 antenna)", "vendor": "u-blox + Ardusimple", "comment": "Multi-band RTK GNSS receiver. ~1 cm CEP after RTK fix; RTCM corrections from public NTRIP mountpoint or dock-B base station. Used for free-roam transit between dock-B sites and for dock-finding at the start of a mission. The dock's optical-burst protocol handles fine localization at the dock itself (per shoal ARCHITECTURE 4)." } },
      { "name": "imu_base",          "type": "imu_9dof_industrial",     "frame": "imu_base",      "rate_hz": 200, "_metadata": { "part_number": "VN-100 (production) / BNO055 (Phase 1 budget)", "vendor": "VectorNav (production) / Bosch+Adafruit (budget)", "comment": "Base 9-DoF IMU. Wired direct to the safety supervisor (Raspberry Pi 4) for the slope-tilt and curbedge invariants; also publishes to ROS 2. Corpus citation: roetenberg-xsens-imu, dlr-justin (tilt-supervised drive)." } },
      { "name": "modem_5g",          "type": "cellular_5g_modem",       "frame": "modem_5g",      "rate_hz": 1,   "_metadata": { "part_number": "RM502Q-AE (Waveshare M.2 carrier)", "vendor": "Quectel + Waveshare", "comment": "5G Sub-6 / LTE Cat 20 modem for fleet coordination over the public network when WiFi 6 LAN at the dock-B is unavailable. JANUS receiver (in shoal-fleet stack) for in-water fish coordination is hosted on the same network stack but is a separate hardware path." } },
      { "name": "head_stereo",       "type": "stereo_camera",           "frame": "head",          "rate_hz": 30,  "_metadata": { "inherited_from": "free-humanoid-platform", "comment": "Inherited verbatim from the bipedal sibling. Used for fine dock-approach visual servoing." } }
    ],
    "modes": [
      {
        "name": "safe_pose",
        "_metadata": { "comment": "Wheel-locked, brakes latched, upper body in tucked posture. Default fail-safe state. Corpus citation: sherman-simplex-architecture, control-barrier-functions, robocop-1987 ('Prime Directives'), runtime-assurance-rta." },
        "hold_positions": {
          "L_DRIVE_wheel": 0.0, "R_DRIVE_wheel": 0.0,
          "TOWER_lift": -0.150,
          "WAIST_yaw": 0.0,
          "NECK_yaw": 0.0, "NECK_pitch": 0.0,
          "L_SHOULDER_pitch": 0.0, "L_SHOULDER_roll": 0.0, "L_SHOULDER_yaw": 0.0, "L_ELBOW_pitch": -1.4,
          "L_WRIST_yaw": 0.0, "L_WRIST_pitch": 0.0, "L_WRIST_roll": 0.0,
          "R_SHOULDER_pitch": 0.0, "R_SHOULDER_roll": 0.0, "R_SHOULDER_yaw": 0.0, "R_ELBOW_pitch": -1.4,
          "R_WRIST_yaw": 0.0, "R_WRIST_pitch": 0.0, "R_WRIST_roll": 0.0
        },
        "actuator_roles": {
          "L_DRIVE_wheel": "brake", "R_DRIVE_wheel": "brake",
          "TOWER_lift": "hold",
          "WAIST_yaw": "hold",
          "NECK_yaw": "hold", "NECK_pitch": "hold",
          "L_SHOULDER_pitch": "hold", "L_SHOULDER_roll": "hold", "L_SHOULDER_yaw": "hold", "L_ELBOW_pitch": "hold",
          "L_WRIST_yaw": "hold", "L_WRIST_pitch": "hold", "L_WRIST_roll": "hold",
          "R_SHOULDER_pitch": "hold", "R_SHOULDER_roll": "hold", "R_SHOULDER_yaw": "hold", "R_ELBOW_pitch": "hold",
          "R_WRIST_yaw": "hold", "R_WRIST_pitch": "hold", "R_WRIST_roll": "hold"
        }
      },
      {
        "name": "dock_approach",
        "_metadata": { "comment": "Low-velocity differential-drive toward dock fiducial. Linear vel <= 0.5 m/s, angular vel <= 0.5 rad/s. Curbedge invariant active. Corpus citation: dlr-justin, pr2, levine-gps-pr2-2016." },
        "hold_positions": {},
        "actuator_roles": {
          "L_DRIVE_wheel": "velocity", "R_DRIVE_wheel": "velocity",
          "TOWER_lift": "hold",
          "WAIST_yaw": "impedance",
          "NECK_yaw": "impedance", "NECK_pitch": "impedance",
          "L_SHOULDER_pitch": "impedance", "L_SHOULDER_roll": "impedance", "L_SHOULDER_yaw": "impedance", "L_ELBOW_pitch": "impedance",
          "L_WRIST_yaw": "hold", "L_WRIST_pitch": "hold", "L_WRIST_roll": "hold",
          "R_SHOULDER_pitch": "impedance", "R_SHOULDER_roll": "impedance", "R_SHOULDER_yaw": "impedance", "R_ELBOW_pitch": "impedance",
          "R_WRIST_yaw": "hold", "R_WRIST_pitch": "hold", "R_WRIST_roll": "hold"
        }
      },
      {
        "name": "cartridge_swap",
        "_metadata": { "comment": "Wheels locked, brakes latched, upper body in manipulation. Targets shoal cartridge port. Corpus citation: dlr-justin (mobile manipulation), shadow-dexterous-hand, pisa-iit-softhand, mobile-aloha (bimanual mobile manipulation precedent), diffusion-policy (recommended IL upgrade path). shoal integration: clean_fish ARCHITECTURE 2.2." },
        "hold_positions": { "L_DRIVE_wheel": 0.0, "R_DRIVE_wheel": 0.0 },
        "actuator_roles": {
          "L_DRIVE_wheel": "brake", "R_DRIVE_wheel": "brake",
          "TOWER_lift": "impedance",
          "WAIST_yaw": "impedance",
          "NECK_yaw": "impedance", "NECK_pitch": "impedance",
          "L_SHOULDER_pitch": "impedance", "L_SHOULDER_roll": "impedance", "L_SHOULDER_yaw": "impedance", "L_ELBOW_pitch": "impedance",
          "L_WRIST_yaw": "impedance", "L_WRIST_pitch": "impedance", "L_WRIST_roll": "impedance",
          "R_SHOULDER_pitch": "impedance", "R_SHOULDER_roll": "impedance", "R_SHOULDER_yaw": "impedance", "R_ELBOW_pitch": "impedance",
          "R_WRIST_yaw": "impedance", "R_WRIST_pitch": "impedance", "R_WRIST_roll": "impedance"
        }
      },
      {
        "name": "waste_retrieval",
        "_metadata": { "comment": "Wheels locked. Hopper retrieval from dock. Bilateral grasp likely. Corpus citation: dlr-justin (dual-arm mobile manipulation), mobile-aloha. shoal integration: clean_fish ARCHITECTURE 3." },
        "hold_positions": { "L_DRIVE_wheel": 0.0, "R_DRIVE_wheel": 0.0 },
        "actuator_roles": {
          "L_DRIVE_wheel": "brake", "R_DRIVE_wheel": "brake",
          "TOWER_lift": "impedance",
          "WAIST_yaw": "impedance",
          "NECK_yaw": "impedance", "NECK_pitch": "impedance",
          "L_SHOULDER_pitch": "impedance", "L_SHOULDER_roll": "impedance", "L_SHOULDER_yaw": "impedance", "L_ELBOW_pitch": "impedance",
          "L_WRIST_yaw": "impedance", "L_WRIST_pitch": "impedance", "L_WRIST_roll": "impedance",
          "R_SHOULDER_pitch": "impedance", "R_SHOULDER_roll": "impedance", "R_SHOULDER_yaw": "impedance", "R_ELBOW_pitch": "impedance",
          "R_WRIST_yaw": "impedance", "R_WRIST_pitch": "impedance", "R_WRIST_roll": "impedance"
        }
      },
      {
        "name": "fleet_coordination",
        "_metadata": { "comment": "Idle posture; JANUS acoustic receiver active; comms (WiFi 6, 5G) open; safety supervisor live. Used while listening for fish that are still in-water near the dock. Corpus citation: dlr-justin (mobile coordination hub), janus-stanag-4748-2017, unetstack-subnero-2014. shoal integration: clean_fish ARCHITECTURE 4." },
        "hold_positions": { "L_DRIVE_wheel": 0.0, "R_DRIVE_wheel": 0.0 },
        "actuator_roles": {
          "L_DRIVE_wheel": "brake", "R_DRIVE_wheel": "brake",
          "TOWER_lift": "hold",
          "WAIST_yaw": "hold",
          "NECK_yaw": "impedance", "NECK_pitch": "impedance",
          "L_SHOULDER_pitch": "hold", "L_SHOULDER_roll": "hold", "L_SHOULDER_yaw": "hold", "L_ELBOW_pitch": "hold",
          "L_WRIST_yaw": "hold", "L_WRIST_pitch": "hold", "L_WRIST_roll": "hold",
          "R_SHOULDER_pitch": "hold", "R_SHOULDER_roll": "hold", "R_SHOULDER_yaw": "hold", "R_ELBOW_pitch": "hold",
          "R_WRIST_yaw": "hold", "R_WRIST_pitch": "hold", "R_WRIST_roll": "hold"
        }
      },
      {
        "name": "idle",
        "_metadata": { "comment": "Low-power state. Drive rails de-energized, brakes engaged. Compute and safety supervisor remain live on UPS. Used between work orders." },
        "hold_positions": { "L_DRIVE_wheel": 0.0, "R_DRIVE_wheel": 0.0, "TOWER_lift": -0.150 },
        "actuator_roles": {
          "L_DRIVE_wheel": "brake", "R_DRIVE_wheel": "brake",
          "TOWER_lift": "hold",
          "WAIST_yaw": "hold",
          "NECK_yaw": "hold", "NECK_pitch": "hold",
          "L_SHOULDER_pitch": "hold", "L_SHOULDER_roll": "hold", "L_SHOULDER_yaw": "hold", "L_ELBOW_pitch": "hold",
          "L_WRIST_yaw": "hold", "L_WRIST_pitch": "hold", "L_WRIST_roll": "hold",
          "R_SHOULDER_pitch": "hold", "R_SHOULDER_roll": "hold", "R_SHOULDER_yaw": "hold", "R_ELBOW_pitch": "hold",
          "R_WRIST_yaw": "hold", "R_WRIST_pitch": "hold", "R_WRIST_roll": "hold"
        }
      }
    ]
  }
}
