{
  "seed": 110274,
  "product": "Wooden toy trains",
  "plant": "Hawthorn Toyworks",
  "size_m": [
    120,
    80,
    14
  ],
  "machine_count": 30,
  "machines": [
    {
      "id": "M01",
      "name": "Timber reception roller bed",
      "category": "raw-intake",
      "family": "conveyor",
      "file": "assets/machines/M01.glb",
      "world_x_m": 11.5,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 45900,
      "mesh_groups": 14,
      "glb_bytes": 2144712,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 12.0,
      "belt_speed_m_s": 0.215,
      "cycle_time_s": 35,
      "parallel_servers": 1,
      "mtbf_hours": 175,
      "mttr_minutes": 25,
      "buffer_size": 36,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 0
    },
    {
      "id": "M02",
      "name": "Lumber weight and barcode gantry",
      "category": "inspection",
      "family": "scanner",
      "file": "assets/machines/M02.glb",
      "world_x_m": 20.15,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46884,
      "mesh_groups": 16,
      "glb_bytes": 2203460,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 5.0,
      "belt_speed_m_s": 0.25,
      "cycle_time_s": 24,
      "parallel_servers": 1,
      "mtbf_hours": 190,
      "mttr_minutes": 30,
      "buffer_size": 44,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.745,
      "robot_reach_m": 0
    },
    {
      "id": "M03",
      "name": "Timber moisture scanning tunnel",
      "category": "inspection",
      "family": "scanner",
      "file": "assets/machines/M03.glb",
      "world_x_m": 28.8,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46896,
      "mesh_groups": 16,
      "glb_bytes": 2204368,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 6.0,
      "belt_speed_m_s": 0.285,
      "cycle_time_s": 27,
      "parallel_servers": 1,
      "mtbf_hours": 205,
      "mttr_minutes": 35,
      "buffer_size": 52,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.805,
      "robot_reach_m": 0
    },
    {
      "id": "M04",
      "name": "Low-temperature conditioning kiln",
      "category": "drying",
      "family": "oven",
      "file": "assets/machines/M04.glb",
      "world_x_m": 37.45,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47232,
      "mesh_groups": 18,
      "glb_bytes": 2233392,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "oven_fan_-12",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": 280,
          "max_speed_m_s": null,
          "cycles": 5
        },
        {
          "node": "oven_fan_0",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": 280,
          "max_speed_m_s": null,
          "cycles": 5
        },
        {
          "node": "oven_fan_12",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": 280,
          "max_speed_m_s": null,
          "cycles": 5
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 32.0,
      "belt_speed_m_s": 0.32,
      "cycle_time_s": 65,
      "parallel_servers": 1,
      "mtbf_hours": 220,
      "mttr_minutes": 40,
      "buffer_size": 60,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.625,
      "robot_reach_m": 0
    },
    {
      "id": "M05",
      "name": "Multi-rip timber saw",
      "category": "cutting",
      "family": "saw",
      "file": "assets/machines/M05.glb",
      "world_x_m": 46.1,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47508,
      "mesh_groups": 22,
      "glb_bytes": 2251480,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "spindle_0",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_1",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 28.0,
      "belt_speed_m_s": 0.355,
      "cycle_time_s": 44,
      "parallel_servers": 1,
      "mtbf_hours": 235,
      "mttr_minutes": 45,
      "buffer_size": 68,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.075,
      "robot_reach_m": 0
    },
    {
      "id": "M06",
      "name": "Four-side wood planer",
      "category": "forming",
      "family": "planer",
      "file": "assets/machines/M06.glb",
      "world_x_m": 54.75,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47520,
      "mesh_groups": 22,
      "glb_bytes": 2252392,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "spindle_0",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_1",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 22.0,
      "belt_speed_m_s": 0.39,
      "cycle_time_s": 38,
      "parallel_servers": 1,
      "mtbf_hours": 250,
      "mttr_minutes": 50,
      "buffer_size": 76,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.075,
      "robot_reach_m": 0
    },
    {
      "id": "M07",
      "name": "Optimised crosscut saw",
      "category": "cutting",
      "family": "saw",
      "file": "assets/machines/M07.glb",
      "world_x_m": 63.4,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47532,
      "mesh_groups": 22,
      "glb_bytes": 2253304,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "spindle_0",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_1",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 19.0,
      "belt_speed_m_s": 0.18,
      "cycle_time_s": 31,
      "parallel_servers": 1,
      "mtbf_hours": 265,
      "mttr_minutes": 20,
      "buffer_size": 28,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.075,
      "robot_reach_m": 0
    },
    {
      "id": "M08",
      "name": "Wheel blank CNC router",
      "category": "wheel-machining",
      "family": "robot",
      "file": "assets/machines/M08.glb",
      "world_x_m": 72.05,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46724,
      "mesh_groups": 23,
      "glb_bytes": 2195664,
      "joint_count": 9,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j1",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -145,
            145
          ],
          "motor_kw": 1.4,
          "max_speed_rpm": 72,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -70,
            65
          ],
          "motor_kw": 1.6,
          "max_speed_rpm": 70,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j3",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -120,
            95
          ],
          "motor_kw": 1.5,
          "max_speed_rpm": 82,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j4",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.9,
          "max_speed_rpm": 130,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j5",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -115,
            115
          ],
          "motor_kw": 0.8,
          "max_speed_rpm": 150,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j6",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 0.5,
          "max_speed_rpm": 160,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 21.0,
      "belt_speed_m_s": 0.215,
      "cycle_time_s": 51,
      "parallel_servers": 1,
      "mtbf_hours": 280,
      "mttr_minutes": 25,
      "buffer_size": 36,
      "batch_size": 4,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 2.4
    },
    {
      "id": "M09",
      "name": "Wheel profile turning lathe",
      "category": "turning",
      "family": "lathe",
      "file": "assets/machines/M09.glb",
      "world_x_m": 80.7,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 49508,
      "mesh_groups": 23,
      "glb_bytes": 2317468,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "spindle_0",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_1",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 15.0,
      "belt_speed_m_s": 0.25,
      "cycle_time_s": 47,
      "parallel_servers": 2,
      "mtbf_hours": 160,
      "mttr_minutes": 30,
      "buffer_size": 44,
      "batch_size": 4,
      "min_world_z_m": 0,
      "max_local_z_m": 3.075,
      "robot_reach_m": 0
    },
    {
      "id": "M10",
      "name": "Axle dowel cutting cell",
      "category": "cutting",
      "family": "cutter",
      "file": "assets/machines/M10.glb",
      "world_x_m": 89.35,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47508,
      "mesh_groups": 22,
      "glb_bytes": 2251484,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "spindle_0",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_1",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 10.0,
      "belt_speed_m_s": 0.285,
      "cycle_time_s": 43,
      "parallel_servers": 1,
      "mtbf_hours": 175,
      "mttr_minutes": 35,
      "buffer_size": 52,
      "batch_size": 2,
      "min_world_z_m": 0,
      "max_local_z_m": 3.075,
      "robot_reach_m": 0
    },
    {
      "id": "M11",
      "name": "Train chassis 5-axis router",
      "category": "milling",
      "family": "robot",
      "file": "assets/machines/M11.glb",
      "world_x_m": 98.0,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46724,
      "mesh_groups": 23,
      "glb_bytes": 2195668,
      "joint_count": 9,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j1",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -145,
            145
          ],
          "motor_kw": 1.4,
          "max_speed_rpm": 72,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -70,
            65
          ],
          "motor_kw": 1.6,
          "max_speed_rpm": 70,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j3",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -120,
            95
          ],
          "motor_kw": 1.5,
          "max_speed_rpm": 82,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j4",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.9,
          "max_speed_rpm": 130,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j5",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -115,
            115
          ],
          "motor_kw": 0.8,
          "max_speed_rpm": 150,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j6",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 0.5,
          "max_speed_rpm": 160,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 26.0,
      "belt_speed_m_s": 0.32,
      "cycle_time_s": 59,
      "parallel_servers": 1,
      "mtbf_hours": 190,
      "mttr_minutes": 40,
      "buffer_size": 60,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 2.4
    },
    {
      "id": "M12",
      "name": "Cab and chimney bandsaw",
      "category": "cutting",
      "family": "saw",
      "file": "assets/machines/M12.glb",
      "world_x_m": 106.65,
      "world_y_m": 19.0,
      "world_z_m": 0,
      "rotation_z_rad": 0,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47532,
      "mesh_groups": 22,
      "glb_bytes": 2253304,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "spindle_0",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_1",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 14.0,
      "belt_speed_m_s": 0.355,
      "cycle_time_s": 42,
      "parallel_servers": 1,
      "mtbf_hours": 205,
      "mttr_minutes": 45,
      "buffer_size": 68,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.075,
      "robot_reach_m": 0
    },
    {
      "id": "M13",
      "name": "Axle metal insert sorter",
      "category": "sorting",
      "family": "sorter",
      "file": "assets/machines/M13.glb",
      "world_x_m": 113,
      "world_y_m": 22.5,
      "world_z_m": 0,
      "rotation_z_rad": 1.570796,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46320,
      "mesh_groups": 15,
      "glb_bytes": 2177440,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 5.5,
      "belt_speed_m_s": 0.39,
      "cycle_time_s": 28,
      "parallel_servers": 1,
      "mtbf_hours": 220,
      "mttr_minutes": 50,
      "buffer_size": 76,
      "batch_size": 2,
      "min_world_z_m": 0,
      "max_local_z_m": 3.685,
      "robot_reach_m": 0
    },
    {
      "id": "M14",
      "name": "Wheel edge-radius milling station",
      "category": "forming",
      "family": "mill",
      "file": "assets/machines/M14.glb",
      "world_x_m": 113,
      "world_y_m": 29.5,
      "world_z_m": 0,
      "rotation_z_rad": 1.570796,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47556,
      "mesh_groups": 22,
      "glb_bytes": 2255140,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "spindle_0",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_1",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 12.0,
      "belt_speed_m_s": 0.18,
      "cycle_time_s": 38,
      "parallel_servers": 1,
      "mtbf_hours": 235,
      "mttr_minutes": 20,
      "buffer_size": 28,
      "batch_size": 4,
      "min_world_z_m": 0,
      "max_local_z_m": 3.075,
      "robot_reach_m": 0
    },
    {
      "id": "M15",
      "name": "Fine drum sanding cell",
      "category": "sanding",
      "family": "sander",
      "file": "assets/machines/M15.glb",
      "world_x_m": 113,
      "world_y_m": 36.5,
      "world_z_m": 0,
      "rotation_z_rad": 1.570796,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 48276,
      "mesh_groups": 22,
      "glb_bytes": 2285668,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "spindle_0",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_1",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "spindle_2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 2.3,
          "max_speed_rpm": 1800,
          "max_speed_m_s": null,
          "cycles": 6
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 14.0,
      "belt_speed_m_s": 0.215,
      "cycle_time_s": 49,
      "parallel_servers": 2,
      "mtbf_hours": 250,
      "mttr_minutes": 25,
      "buffer_size": 36,
      "batch_size": 4,
      "min_world_z_m": 0,
      "max_local_z_m": 3.25,
      "robot_reach_m": 0
    },
    {
      "id": "M16",
      "name": "Cab edge softening tumbler",
      "category": "deburring",
      "family": "tumbler",
      "file": "assets/machines/M16.glb",
      "world_x_m": 113,
      "world_y_m": 43.5,
      "world_z_m": 0,
      "rotation_z_rad": 1.570796,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 49592,
      "mesh_groups": 16,
      "glb_bytes": 2269588,
      "joint_count": 4,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "drum",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 4.0,
          "max_speed_rpm": 32,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 11.0,
      "belt_speed_m_s": 0.25,
      "cycle_time_s": 46,
      "parallel_servers": 1,
      "mtbf_hours": 265,
      "mttr_minutes": 30,
      "buffer_size": 44,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.525,
      "robot_reach_m": 0
    },
    {
      "id": "M17",
      "name": "Multi-part filtered air cleaning",
      "category": "cleaning",
      "family": "blower",
      "file": "assets/machines/M17.glb",
      "world_x_m": 113,
      "world_y_m": 50.5,
      "world_z_m": 0,
      "rotation_z_rad": 1.570796,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47076,
      "mesh_groups": 15,
      "glb_bytes": 2208032,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 18.0,
      "belt_speed_m_s": 0.285,
      "cycle_time_s": 39,
      "parallel_servers": 1,
      "mtbf_hours": 280,
      "mttr_minutes": 35,
      "buffer_size": 52,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.685,
      "robot_reach_m": 0
    },
    {
      "id": "M18",
      "name": "Water-based colour mixing skid",
      "category": "mixing",
      "family": "mixer",
      "file": "assets/machines/M18.glb",
      "world_x_m": 113,
      "world_y_m": 57.5,
      "world_z_m": 0,
      "rotation_z_rad": 1.570796,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46920,
      "mesh_groups": 16,
      "glb_bytes": 2196184,
      "joint_count": 4,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "paddle",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 3.2,
          "max_speed_rpm": 110,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 17.0,
      "belt_speed_m_s": 0.32,
      "cycle_time_s": 52,
      "parallel_servers": 1,
      "mtbf_hours": 160,
      "mttr_minutes": 40,
      "buffer_size": 60,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.525,
      "robot_reach_m": 0
    },
    {
      "id": "M19",
      "name": "Automated low-VOC spray booth",
      "category": "finishing",
      "family": "robot",
      "file": "assets/machines/M19.glb",
      "world_x_m": 106.65,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46724,
      "mesh_groups": 23,
      "glb_bytes": 2195668,
      "joint_count": 9,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j1",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -145,
            145
          ],
          "motor_kw": 1.4,
          "max_speed_rpm": 72,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -70,
            65
          ],
          "motor_kw": 1.6,
          "max_speed_rpm": 70,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j3",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -120,
            95
          ],
          "motor_kw": 1.5,
          "max_speed_rpm": 82,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j4",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.9,
          "max_speed_rpm": 130,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j5",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -115,
            115
          ],
          "motor_kw": 0.8,
          "max_speed_rpm": 150,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j6",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 0.5,
          "max_speed_rpm": 160,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 38.0,
      "belt_speed_m_s": 0.355,
      "cycle_time_s": 69,
      "parallel_servers": 2,
      "mtbf_hours": 175,
      "mttr_minutes": 45,
      "buffer_size": 68,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 2.4
    },
    {
      "id": "M20",
      "name": "Warm-air coating cure tunnel",
      "category": "curing",
      "family": "oven",
      "file": "assets/machines/M20.glb",
      "world_x_m": 98.0,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 47232,
      "mesh_groups": 18,
      "glb_bytes": 2233388,
      "joint_count": 6,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "oven_fan_-12",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": 280,
          "max_speed_m_s": null,
          "cycles": 5
        },
        {
          "node": "oven_fan_0",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": 280,
          "max_speed_m_s": null,
          "cycles": 5
        },
        {
          "node": "oven_fan_12",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": 280,
          "max_speed_m_s": null,
          "cycles": 5
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 41.0,
      "belt_speed_m_s": 0.39,
      "cycle_time_s": 86,
      "parallel_servers": 2,
      "mtbf_hours": 190,
      "mttr_minutes": 50,
      "buffer_size": 76,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.625,
      "robot_reach_m": 0
    },
    {
      "id": "M21",
      "name": "Coating thickness optical gauge",
      "category": "inspection",
      "family": "scanner",
      "file": "assets/machines/M21.glb",
      "world_x_m": 89.35,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46872,
      "mesh_groups": 16,
      "glb_bytes": 2202536,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 5.0,
      "belt_speed_m_s": 0.18,
      "cycle_time_s": 32,
      "parallel_servers": 1,
      "mtbf_hours": 205,
      "mttr_minutes": 20,
      "buffer_size": 28,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.685,
      "robot_reach_m": 0
    },
    {
      "id": "M22",
      "name": "Six-axis axle insertion robot",
      "category": "joining",
      "family": "robot",
      "file": "assets/machines/M22.glb",
      "world_x_m": 80.7,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46724,
      "mesh_groups": 23,
      "glb_bytes": 2195668,
      "joint_count": 9,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j1",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -145,
            145
          ],
          "motor_kw": 1.4,
          "max_speed_rpm": 72,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -70,
            65
          ],
          "motor_kw": 1.6,
          "max_speed_rpm": 70,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j3",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -120,
            95
          ],
          "motor_kw": 1.5,
          "max_speed_rpm": 82,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j4",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.9,
          "max_speed_rpm": 130,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j5",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -115,
            115
          ],
          "motor_kw": 0.8,
          "max_speed_rpm": 150,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j6",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 0.5,
          "max_speed_rpm": 160,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 16.0,
      "belt_speed_m_s": 0.215,
      "cycle_time_s": 47,
      "parallel_servers": 1,
      "mtbf_hours": 220,
      "mttr_minutes": 25,
      "buffer_size": 36,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 2.4
    },
    {
      "id": "M23",
      "name": "Servo wheel-fit press",
      "category": "assembly",
      "family": "press",
      "file": "assets/machines/M23.glb",
      "world_x_m": 72.05,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46628,
      "mesh_groups": 16,
      "glb_bytes": 2180432,
      "joint_count": 4,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "ram",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -0.78,
            0.0
          ],
          "motor_kw": 4.0,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 2
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 21.0,
      "belt_speed_m_s": 0.25,
      "cycle_time_s": 51,
      "parallel_servers": 1,
      "mtbf_hours": 235,
      "mttr_minutes": 30,
      "buffer_size": 44,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.525,
      "robot_reach_m": 0
    },
    {
      "id": "M24",
      "name": "Precision cab adhesive dosing",
      "category": "joining",
      "family": "dispenser",
      "file": "assets/machines/M24.glb",
      "world_x_m": 63.4,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46724,
      "mesh_groups": 23,
      "glb_bytes": 2195668,
      "joint_count": 9,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j1",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -145,
            145
          ],
          "motor_kw": 1.4,
          "max_speed_rpm": 72,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -70,
            65
          ],
          "motor_kw": 1.6,
          "max_speed_rpm": 70,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j3",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -120,
            95
          ],
          "motor_kw": 1.5,
          "max_speed_rpm": 82,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j4",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.9,
          "max_speed_rpm": 130,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j5",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -115,
            115
          ],
          "motor_kw": 0.8,
          "max_speed_rpm": 150,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j6",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 0.5,
          "max_speed_rpm": 160,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 9.0,
      "belt_speed_m_s": 0.285,
      "cycle_time_s": 41,
      "parallel_servers": 1,
      "mtbf_hours": 250,
      "mttr_minutes": 35,
      "buffer_size": 52,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 2.4
    },
    {
      "id": "M25",
      "name": "Six-axis cab placement cell",
      "category": "assembly",
      "family": "robot",
      "file": "assets/machines/M25.glb",
      "world_x_m": 54.75,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46724,
      "mesh_groups": 23,
      "glb_bytes": 2195668,
      "joint_count": 9,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j1",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -145,
            145
          ],
          "motor_kw": 1.4,
          "max_speed_rpm": 72,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -70,
            65
          ],
          "motor_kw": 1.6,
          "max_speed_rpm": 70,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j3",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -120,
            95
          ],
          "motor_kw": 1.5,
          "max_speed_rpm": 82,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j4",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.9,
          "max_speed_rpm": 130,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j5",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -115,
            115
          ],
          "motor_kw": 0.8,
          "max_speed_rpm": 150,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j6",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 0.5,
          "max_speed_rpm": 160,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 18.0,
      "belt_speed_m_s": 0.32,
      "cycle_time_s": 48,
      "parallel_servers": 1,
      "mtbf_hours": 265,
      "mttr_minutes": 40,
      "buffer_size": 60,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 2.4
    },
    {
      "id": "M26",
      "name": "Axle rolling force tester",
      "category": "testing",
      "family": "tester",
      "file": "assets/machines/M26.glb",
      "world_x_m": 46.1,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46224,
      "mesh_groups": 16,
      "glb_bytes": 2170976,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 9.0,
      "belt_speed_m_s": 0.355,
      "cycle_time_s": 45,
      "parallel_servers": 1,
      "mtbf_hours": 280,
      "mttr_minutes": 45,
      "buffer_size": 68,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.745,
      "robot_reach_m": 0
    },
    {
      "id": "M27",
      "name": "Vision and safety quality booth",
      "category": "inspection",
      "family": "scanner",
      "file": "assets/machines/M27.glb",
      "world_x_m": 37.45,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46896,
      "mesh_groups": 16,
      "glb_bytes": 2204368,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 7.0,
      "belt_speed_m_s": 0.39,
      "cycle_time_s": 37,
      "parallel_servers": 1,
      "mtbf_hours": 160,
      "mttr_minutes": 50,
      "buffer_size": 76,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.805,
      "robot_reach_m": 0
    },
    {
      "id": "M28",
      "name": "Folding carton erector and labeler",
      "category": "packing",
      "family": "packer",
      "file": "assets/machines/M28.glb",
      "world_x_m": 28.8,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46308,
      "mesh_groups": 14,
      "glb_bytes": 2175720,
      "joint_count": 3,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 12.0,
      "belt_speed_m_s": 0.18,
      "cycle_time_s": 38,
      "parallel_servers": 1,
      "mtbf_hours": 175,
      "mttr_minutes": 20,
      "buffer_size": 28,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.625,
      "robot_reach_m": 0
    },
    {
      "id": "M29",
      "name": "Train-to-carton robotic loader",
      "category": "packing",
      "family": "robot",
      "file": "assets/machines/M29.glb",
      "world_x_m": 20.15,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46724,
      "mesh_groups": 23,
      "glb_bytes": 2195672,
      "joint_count": 9,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j1",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -145,
            145
          ],
          "motor_kw": 1.4,
          "max_speed_rpm": 72,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -70,
            65
          ],
          "motor_kw": 1.6,
          "max_speed_rpm": 70,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j3",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -120,
            95
          ],
          "motor_kw": 1.5,
          "max_speed_rpm": 82,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j4",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.9,
          "max_speed_rpm": 130,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j5",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -115,
            115
          ],
          "motor_kw": 0.8,
          "max_speed_rpm": 150,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j6",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 0.5,
          "max_speed_rpm": 160,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 18.0,
      "belt_speed_m_s": 0.215,
      "cycle_time_s": 46,
      "parallel_servers": 1,
      "mtbf_hours": 190,
      "mttr_minutes": 25,
      "buffer_size": 36,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 2.4
    },
    {
      "id": "M30",
      "name": "Palletiser and dispatch conveyor",
      "category": "storage",
      "family": "palletiser",
      "file": "assets/machines/M30.glb",
      "world_x_m": 11.5,
      "world_y_m": 62,
      "world_z_m": 0,
      "rotation_z_rad": 3.141593,
      "footprint_m": [
        5.75,
        3.6
      ],
      "clearance_required_m": 1.0,
      "geometry_triangles": 46724,
      "mesh_groups": 23,
      "glb_bytes": 2195672,
      "joint_count": 9,
      "joints": [
        {
          "node": "belt",
          "type": "prismatic",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -0.012,
            0.012
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 3
        },
        {
          "node": "feed_roller",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -170,
            170
          ],
          "motor_kw": 1.2,
          "max_speed_rpm": 48,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j1",
          "type": "revolute",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            -145,
            145
          ],
          "motor_kw": 1.4,
          "max_speed_rpm": 72,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j2",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -70,
            65
          ],
          "motor_kw": 1.6,
          "max_speed_rpm": 70,
          "max_speed_m_s": null,
          "cycles": 1
        },
        {
          "node": "arm_j3",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -120,
            95
          ],
          "motor_kw": 1.5,
          "max_speed_rpm": 82,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j4",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -175,
            175
          ],
          "motor_kw": 0.9,
          "max_speed_rpm": 130,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "arm_j5",
          "type": "revolute",
          "axis": [
            0,
            1,
            0
          ],
          "limits": [
            -115,
            115
          ],
          "motor_kw": 0.8,
          "max_speed_rpm": 150,
          "max_speed_m_s": null,
          "cycles": 2
        },
        {
          "node": "arm_j6",
          "type": "revolute",
          "axis": [
            1,
            0,
            0
          ],
          "limits": [
            -160,
            160
          ],
          "motor_kw": 0.5,
          "max_speed_rpm": 160,
          "max_speed_m_s": null,
          "cycles": 3
        },
        {
          "node": "lift",
          "type": "prismatic",
          "axis": [
            0,
            0,
            1
          ],
          "limits": [
            0,
            0.38
          ],
          "motor_kw": 0.7,
          "max_speed_rpm": null,
          "max_speed_m_s": 0.35,
          "cycles": 1
        }
      ],
      "motor_kw": 24.0,
      "belt_speed_m_s": 0.25,
      "cycle_time_s": 58,
      "parallel_servers": 1,
      "mtbf_hours": 205,
      "mttr_minutes": 30,
      "buffer_size": 44,
      "batch_size": 1,
      "min_world_z_m": 0,
      "max_local_z_m": 3.05,
      "robot_reach_m": 2.4
    }
  ]
}