{
  "schemaVersion": 1,
  "id": "robot-custom-1792818760352",
  "name": "Sentinel · Inspection Rover",
  "template": "custom",
  "parts": [
    {
      "id": "chassis-9a889b",
      "defId": "chassis",
      "name": "Rover chassis",
      "position": [
        0,
        0.09,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {}
    },
    {
      "id": "esp32-s3-45b547",
      "defId": "esp32-s3",
      "name": "ESP32-S3 · virtual controller",
      "position": [
        0.08,
        0.1195,
        -0.08
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "battery-2s-4400-72519b",
      "defId": "battery-2s-4400",
      "name": "2S battery · 4.4 Ah",
      "position": [
        0,
        0.146,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "regulator-5v-5a-870e3b",
      "defId": "regulator-5v-5a",
      "name": "5 V buck regulator · 5 A",
      "position": [
        0,
        0.1205,
        -0.04
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "motor-driver-686fb5",
      "defId": "motor-driver",
      "name": "Dual H-bridge",
      "position": [
        0,
        0.12249999999999998,
        0.04
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "compute-9bfd24",
      "defId": "compute",
      "name": "AI compute module",
      "position": [
        -0.07,
        0.12349999999999998,
        -0.05
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "camera-3e9be9",
      "defId": "camera",
      "name": "RGB camera",
      "position": [
        0.05,
        0.1285,
        0.04
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "range-a6be7f",
      "defId": "range",
      "name": "Forward range sensor",
      "position": [
        0.145,
        0.13,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "imu-04fe49",
      "defId": "imu",
      "name": "6-axis IMU",
      "position": [
        -0.04,
        0.11599999999999999,
        0.03
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "display-594b0c",
      "defId": "display",
      "name": "Emoji OLED display",
      "position": [
        -0.06,
        0.13349999999999998,
        0.02
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "microphone-737712",
      "defId": "microphone",
      "name": "MEMS microphone",
      "position": [
        -0.04,
        0.11699999999999999,
        0.05
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "speaker-23f319",
      "defId": "speaker",
      "name": "Mini speaker",
      "position": [
        0,
        0.121,
        -0.08
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "led-ff87b2",
      "defId": "led",
      "name": "Status LED module",
      "position": [
        0.03,
        0.1195,
        -0.06
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "switch-d09538",
      "defId": "switch",
      "name": "Power switch",
      "position": [
        0,
        0.12249999999999998,
        0.07
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "fuse-8a1790",
      "defId": "fuse",
      "name": "Inline fuse",
      "position": [
        0.07,
        0.118,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "servo-57dc11",
      "defId": "servo",
      "name": "Position servo",
      "position": [
        0.05,
        0.13349999999999998,
        0.07
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "anchored": 0
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "dc-motor-be831d",
      "defId": "dc-motor",
      "name": "Left drive motor",
      "position": [
        -0.065,
        0.046,
        -0.1
      ],
      "rotation": [
        0,
        1.5707963267948966,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    },
    {
      "id": "dc-motor-d29768",
      "defId": "dc-motor",
      "name": "Right drive motor",
      "position": [
        -0.065,
        0.046,
        0.1
      ],
      "rotation": [
        0,
        -1.5707963267948966,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    },
    {
      "id": "wheel-0e1ee7",
      "defId": "wheel",
      "name": "Left traction wheel",
      "position": [
        -0.065,
        0.046,
        -0.145
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    },
    {
      "id": "wheel-8b5d99",
      "defId": "wheel",
      "name": "Right traction wheel",
      "position": [
        -0.065,
        0.046,
        0.145
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    },
    {
      "id": "caster-323a48",
      "defId": "caster",
      "name": "Rear ball caster",
      "position": [
        0.115,
        0.021,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    },
    {
      "id": "encoder-95af44",
      "defId": "encoder",
      "name": "Left wheel encoder",
      "position": [
        -0.065,
        0.074,
        -0.104
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    },
    {
      "id": "encoder-2068b3",
      "defId": "encoder",
      "name": "Right wheel encoder",
      "position": [
        -0.065,
        0.074,
        0.104
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {
        "side": 1
      },
      "parentId": "chassis-9a889b"
    },
    {
      "id": "bracket-c15c8f",
      "defId": "bracket",
      "name": "Left motor bracket",
      "position": [
        -0.065,
        0.064,
        -0.1
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    },
    {
      "id": "bracket-2ffbac",
      "defId": "bracket",
      "name": "Right motor bracket",
      "position": [
        -0.065,
        0.064,
        0.1
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    },
    {
      "id": "bracket-8c003e",
      "defId": "bracket",
      "name": "Rear caster bracket",
      "position": [
        0.115,
        0.0545,
        0
      ],
      "rotation": [
        0,
        0,
        0
      ],
      "joint": "fixed",
      "params": {},
      "parentId": "chassis-9a889b"
    }
  ],
  "wires": [
    {
      "id": "d1e6d760-ed75-4043-aab9-237f94757be6",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "POS"
      },
      "to": {
        "part": "fuse-8a1790",
        "pin": "IN"
      }
    },
    {
      "id": "db061382-7ec3-4878-b4c2-26d3f318fdb6",
      "from": {
        "part": "fuse-8a1790",
        "pin": "OUT"
      },
      "to": {
        "part": "switch-d09538",
        "pin": "IN"
      }
    },
    {
      "id": "991ccd0d-c4c3-4401-810a-a22e26a10b77",
      "from": {
        "part": "switch-d09538",
        "pin": "OUT"
      },
      "to": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VIN"
      }
    },
    {
      "id": "f5d2a3d9-f523-4c46-9315-1406aac586d8",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "GND"
      }
    },
    {
      "id": "a668b55e-688a-4805-b5ef-9423fa126a35",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "esp32-s3-45b547",
        "pin": "VIN"
      }
    },
    {
      "id": "8032c9e1-fb96-4a5f-9fad-89a0f142d28f",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "motor-driver-686fb5",
        "pin": "VM"
      }
    },
    {
      "id": "768cda21-9d77-4005-98c8-078d004b7a84",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "compute-9bfd24",
        "pin": "VCC"
      }
    },
    {
      "id": "a92fbf24-bf5b-4ca9-8c0a-5fe621803075",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "camera-3e9be9",
        "pin": "VCC"
      }
    },
    {
      "id": "b2db28b6-9f1d-4ac0-a4e1-3c4cbdb2d303",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "range-a6be7f",
        "pin": "VCC"
      }
    },
    {
      "id": "49d2a582-5732-4805-b306-f0e690cf3b97",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "imu-04fe49",
        "pin": "VCC"
      }
    },
    {
      "id": "937e7747-cdfb-4707-8ba1-39f849caa51e",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "display-594b0c",
        "pin": "VCC"
      }
    },
    {
      "id": "4f7c06b5-c5d1-4dc9-9e16-6913b84fdad8",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "microphone-737712",
        "pin": "VCC"
      }
    },
    {
      "id": "4f0d3ca6-44ca-420c-bbd2-d4fb7e8c3440",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "speaker-23f319",
        "pin": "VCC"
      }
    },
    {
      "id": "23135acb-9b22-4ec3-9200-1e02135d989c",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "servo-57dc11",
        "pin": "VCC"
      }
    },
    {
      "id": "efc05827-df95-499c-867b-d76ef8e85986",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "encoder-95af44",
        "pin": "VCC"
      }
    },
    {
      "id": "442b50f0-0244-48e7-8646-199225a48043",
      "from": {
        "part": "regulator-5v-5a-870e3b",
        "pin": "VOUT"
      },
      "to": {
        "part": "encoder-2068b3",
        "pin": "VCC"
      }
    },
    {
      "id": "e6255856-6e45-464a-9568-503d2d24d4e6",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "esp32-s3-45b547",
        "pin": "GND"
      }
    },
    {
      "id": "4ada9f56-69a0-4ce4-8634-1286f661a583",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "motor-driver-686fb5",
        "pin": "GND"
      }
    },
    {
      "id": "3f4a9595-82f2-440e-823d-2c179ec1ceea",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "compute-9bfd24",
        "pin": "GND"
      }
    },
    {
      "id": "603d2bb5-ebd4-45ad-9e62-9a843abdca64",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "camera-3e9be9",
        "pin": "GND"
      }
    },
    {
      "id": "101c2339-f92c-4420-baff-9786a76471af",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "range-a6be7f",
        "pin": "GND"
      }
    },
    {
      "id": "24d1bc61-9291-4f97-a3ae-7a819d2afd23",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "imu-04fe49",
        "pin": "GND"
      }
    },
    {
      "id": "63da6706-2d17-4903-98e3-7ea496d4cee4",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "display-594b0c",
        "pin": "GND"
      }
    },
    {
      "id": "2baf6c04-6e8d-43c7-b3c6-158ee3446fad",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "microphone-737712",
        "pin": "GND"
      }
    },
    {
      "id": "4157438a-36ed-4a35-8243-996aa2fe410d",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "speaker-23f319",
        "pin": "GND"
      }
    },
    {
      "id": "f90adfb6-60d6-4aa0-9cda-19a7d7f5a027",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "servo-57dc11",
        "pin": "GND"
      }
    },
    {
      "id": "b827eef1-b597-4095-8c75-48a4c13eaec0",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "encoder-95af44",
        "pin": "GND"
      }
    },
    {
      "id": "24606c81-4e3e-4a75-b5f6-8b07629b5e01",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "encoder-2068b3",
        "pin": "GND"
      }
    },
    {
      "id": "27a84bda-8e9c-419c-a178-4a5bb8f44fde",
      "from": {
        "part": "battery-2s-4400-72519b",
        "pin": "GND"
      },
      "to": {
        "part": "led-ff87b2",
        "pin": "GND"
      }
    },
    {
      "id": "ecbd4ed8-3854-4d8b-966d-ac11ff41d09b",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "PWM_L"
      },
      "to": {
        "part": "motor-driver-686fb5",
        "pin": "PWM_A"
      }
    },
    {
      "id": "d9da5c10-1266-4c45-a326-dd4d011bae37",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "PWM_R"
      },
      "to": {
        "part": "motor-driver-686fb5",
        "pin": "PWM_B"
      }
    },
    {
      "id": "6cda4e53-b078-4ccc-9731-4ad4175abea7",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "PWM_SERVO"
      },
      "to": {
        "part": "servo-57dc11",
        "pin": "PWM"
      }
    },
    {
      "id": "fe0e4df2-58ca-4b12-9fff-6aaaf155a564",
      "from": {
        "part": "motor-driver-686fb5",
        "pin": "A+"
      },
      "to": {
        "part": "dc-motor-be831d",
        "pin": "+"
      }
    },
    {
      "id": "551e31ff-edbe-432f-9eae-2e430c7507ed",
      "from": {
        "part": "motor-driver-686fb5",
        "pin": "A-"
      },
      "to": {
        "part": "dc-motor-be831d",
        "pin": "-"
      }
    },
    {
      "id": "3a835ade-8fda-464b-bbb8-22975daf734e",
      "from": {
        "part": "motor-driver-686fb5",
        "pin": "B+"
      },
      "to": {
        "part": "dc-motor-d29768",
        "pin": "+"
      }
    },
    {
      "id": "2fb0ee0c-4e42-4089-ac63-203af657aa12",
      "from": {
        "part": "motor-driver-686fb5",
        "pin": "B-"
      },
      "to": {
        "part": "dc-motor-d29768",
        "pin": "-"
      }
    },
    {
      "id": "7202e26c-cac3-4288-ac48-2ce0600cc863",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "SDA"
      },
      "to": {
        "part": "range-a6be7f",
        "pin": "SDA"
      }
    },
    {
      "id": "400d1991-c8dd-49c8-98e1-c1af0cdd0796",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "SCL"
      },
      "to": {
        "part": "range-a6be7f",
        "pin": "SCL"
      }
    },
    {
      "id": "9d3dad89-ea85-4516-88a1-5090b82b1b62",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "SDA"
      },
      "to": {
        "part": "imu-04fe49",
        "pin": "SDA"
      }
    },
    {
      "id": "66991c62-9225-4d79-8575-bba874a71286",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "SCL"
      },
      "to": {
        "part": "imu-04fe49",
        "pin": "SCL"
      }
    },
    {
      "id": "1d15bdb8-293d-4c09-b1bc-781c00e790a8",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "SDA"
      },
      "to": {
        "part": "display-594b0c",
        "pin": "SDA"
      }
    },
    {
      "id": "f76efca9-1151-431c-95ba-2591726b7d88",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "SCL"
      },
      "to": {
        "part": "display-594b0c",
        "pin": "SCL"
      }
    },
    {
      "id": "c3a7b898-4607-4baa-92bf-fb6bb0d85a72",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "SDA"
      },
      "to": {
        "part": "compute-9bfd24",
        "pin": "SDA"
      }
    },
    {
      "id": "19107925-8535-48f3-bd0d-1da5ca303455",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "SCL"
      },
      "to": {
        "part": "compute-9bfd24",
        "pin": "SCL"
      }
    },
    {
      "id": "02ff3cfb-94bd-44ad-8cf7-8ec742245189",
      "from": {
        "part": "compute-9bfd24",
        "pin": "USB"
      },
      "to": {
        "part": "camera-3e9be9",
        "pin": "DATA"
      }
    },
    {
      "id": "5bff8517-7adb-40bc-9f85-080152833f0f",
      "from": {
        "part": "compute-9bfd24",
        "pin": "USB"
      },
      "to": {
        "part": "microphone-737712",
        "pin": "DATA"
      }
    },
    {
      "id": "46745130-e2e7-46a9-b4c7-a0140618dfe4",
      "from": {
        "part": "compute-9bfd24",
        "pin": "USB"
      },
      "to": {
        "part": "speaker-23f319",
        "pin": "DATA"
      }
    },
    {
      "id": "c6fae0d1-8b0f-4530-9cb7-021fd357d5a7",
      "from": {
        "part": "encoder-95af44",
        "pin": "A"
      },
      "to": {
        "part": "esp32-s3-45b547",
        "pin": "ENC_L_A"
      }
    },
    {
      "id": "f9ab3596-e7cd-4a4b-9578-2d18c81f3449",
      "from": {
        "part": "encoder-95af44",
        "pin": "B"
      },
      "to": {
        "part": "esp32-s3-45b547",
        "pin": "ENC_L_B"
      }
    },
    {
      "id": "c7dab740-ee29-44dd-a95b-61ad73e972ed",
      "from": {
        "part": "encoder-2068b3",
        "pin": "A"
      },
      "to": {
        "part": "esp32-s3-45b547",
        "pin": "ENC_R_A"
      }
    },
    {
      "id": "8c9e072f-71b2-44f5-ae3a-f69f81fecb5e",
      "from": {
        "part": "encoder-2068b3",
        "pin": "B"
      },
      "to": {
        "part": "esp32-s3-45b547",
        "pin": "ENC_R_B"
      }
    },
    {
      "id": "7656e3f2-21bb-40ec-a414-8cb51b0b70a1",
      "from": {
        "part": "esp32-s3-45b547",
        "pin": "GPIO"
      },
      "to": {
        "part": "led-ff87b2",
        "pin": "SIGNAL"
      }
    }
  ],
  "groups": [
    {
      "id": "group-b1bdc6e3-1896-4cf5-b49b-8daef94a5f00",
      "name": "Power and protection",
      "partIds": [
        "battery-2s-4400-72519b",
        "regulator-5v-5a-870e3b",
        "switch-d09538",
        "fuse-8a1790"
      ]
    },
    {
      "id": "group-8edb2c52-df66-496e-8917-4d1214e03f5d",
      "name": "Drivetrain",
      "partIds": [
        "motor-driver-686fb5",
        "dc-motor-be831d",
        "dc-motor-d29768",
        "wheel-0e1ee7",
        "wheel-8b5d99",
        "encoder-95af44",
        "encoder-2068b3"
      ]
    },
    {
      "id": "group-233eefb8-87bc-4575-9816-68a644a5577e",
      "name": "Control and perception",
      "partIds": [
        "esp32-s3-45b547",
        "compute-9bfd24",
        "camera-3e9be9",
        "range-a6be7f",
        "imu-04fe49"
      ]
    },
    {
      "id": "group-ccd0298a-c7e1-4981-8197-463c661201af",
      "name": "Face audio and servo",
      "partIds": [
        "display-594b0c",
        "microphone-737712",
        "speaker-23f319",
        "led-ff87b2",
        "servo-57dc11"
      ]
    },
    {
      "id": "group-6b237454-b274-48de-afa1-c9a19384b265",
      "name": "Frame and supports",
      "partIds": [
        "chassis-9a889b",
        "caster-323a48",
        "bracket-c15c8f",
        "bracket-2ffbac",
        "bracket-8c003e"
      ]
    }
  ],
  "code": "// Sentinel inspection rover. Built from an empty workbench.\n// Virtual JavaScript controller, 20 Hz. PWM values are bounded to [-1, 1].\n// The camera and microphone are available to the optional AI observer.\nlet mode = 'START';\nlet avoidanceUntil = 0;\nlet lastLogSecond = -1;\nfunction step(robot) {\n  const range = robot.sensors.range;\n  if (robot.brownout || robot.battery.voltage < 6.4 || !Number.isFinite(range)) {\n    robot.drive(0, 0);\n    robot.display('STOP');\n    if (mode !== 'STOP') robot.log('Safety stop: supply or range observation unavailable.');\n    mode = 'STOP';\n    return;\n  }\n  if (range < 0.55 && robot.time >= avoidanceUntil) avoidanceUntil = robot.time + 1.3;\n  let next = 'PATROL';\n  if (robot.time < avoidanceUntil - 0.7) {\n    robot.drive(-0.24, -0.24);\n    next = 'REVERSE';\n  } else if (robot.time < avoidanceUntil) {\n    robot.drive(-0.22, 0.25);\n    next = 'TURN';\n  } else {\n    robot.drive(0.38, 0.38);\n  }\n  robot.display(next === 'PATROL' ? '^_^' : '>_<');\n  for (const id of Object.keys(robot.servos)) robot.servo(id, Math.sin(robot.time * 0.7) * 0.35);\n  if (next !== mode) {\n    robot.log('Mode:', next, 'range:', range.toFixed(2), 'm');\n    if (mode === 'START') robot.speak('Sentinel inspection patrol started.');\n    mode = next;\n  }\n  const second = Math.floor(robot.time);\n  if (second !== lastLogSecond && second % 2 === 0) {\n    robot.log('Supply:', robot.battery.voltage.toFixed(2), 'V; encoders:', robot.sensors.encoders.join(','));\n    lastLogSecond = second;\n  }\n}\n",
  "environment": {
    "scenario": "obstacles",
    "slope": 0,
    "friction": 0.8,
    "payload": 0,
    "seed": 42,
    "initialSoc": 1,
    "obstacles": [
      {
        "id": "block-a",
        "position": [
          0.9,
          0.15,
          0
        ],
        "size": [
          0.25,
          0.3,
          0.45
        ]
      },
      {
        "id": "block-b",
        "position": [
          1.7,
          0.2,
          0.5
        ],
        "size": [
          0.3,
          0.4,
          0.3
        ]
      }
    ]
  },
  "ai": {
    "provider": "replay",
    "endpoint": "",
    "model": "recorded-rover-guide",
    "timeoutMs": 15000,
    "prompt": "You control a simulated robot. Use bounded wheel commands. Stop when sensors are unavailable or battery is low. Describe your intended action briefly.",
    "vision": false
  },
  "createdAt": "2026-10-24T05:12:40.352Z",
  "updatedAt": "2026-10-24T05:25:28.586Z"
}