{
  "id": "booster_t1_walk",
  "name": "Booster T1 velocity walking",
  "robotId": "booster/t1",
  "model": "booster_t1_gym",
  "task": "Velocity tracking with a gait clock (forward, lateral, yaw rate)",
  "license": "Apache-2.0",
  "licenseUrl": "https://github.com/BoosterRobotics/booster_gym/blob/da396a06d6eed99e2de72d7749c48ee8748950f9/LICENSE",
  "source": {
    "repo": "https://github.com/BoosterRobotics/booster_gym",
    "ref": "da396a06d6eed99e2de72d7749c48ee8748950f9",
    "checkpoint": "deploy/models/T1.pt",
    "checkpointSha256": "697cac61dbed2e76f25519c97ceb686f244d065dabf7d5d7ca386573143d215b",
    "reference": "play_mujoco.py",
    "config": "envs/T1.yaml",
    "trainConfig": "envs/T1.yaml",
    "framework": "booster_gym (Isaac Gym) PPO, MLP 47-256-128-128-12, ELU"
  },
  "export": {
    "from": "TorchScript of model.actor (booster_gym export_model.py); play_mujoco.py uses dist.loc = actor(obs), the same mean action",
    "to": "ONNX opset 17, weights unchanged",
    "sha256": "14f3e1ca7e3caf8b7b3d9eb22e373b9fc389b182559ff01914473625632754ec",
    "parity": "max |a_torch - a_onnx| < 3e-6 over 200 random inputs (onnxruntime 1.x CPU)"
  },
  "hardware": {
    "documented": true,
    "note": "booster_gym's real-robot deploy config (deploy/configs/T1.yaml) loads this same models/T1.pt, and the README links a video of the deploy on a physical T1.",
    "url": "https://github.com/BoosterRobotics/booster_gym/blob/da396a06d6eed99e2de72d7749c48ee8748950f9/deploy/README.md"
  },
  "onnx": {
    "file": "policy.onnx",
    "obs": "obs",
    "action": "actions"
  },
  "sim": {
    "dt": 0.002,
    "decimation": 10,
    "loop": "before-step",
    "init": {
      "base": {
        "pos": [
          0,
          0,
          0.72
        ],
        "quat": [
          1,
          0,
          0,
          0
        ]
      }
    },
    "float32State": true
  },
  "joints": [
    "Left_Hip_Pitch",
    "Left_Hip_Roll",
    "Left_Hip_Yaw",
    "Left_Knee_Pitch",
    "Left_Ankle_Pitch",
    "Left_Ankle_Roll",
    "Right_Hip_Pitch",
    "Right_Hip_Roll",
    "Right_Hip_Yaw",
    "Right_Knee_Pitch",
    "Right_Ankle_Pitch",
    "Right_Ankle_Roll"
  ],
  "pd": {
    "kp": [
      200,
      200,
      200,
      200,
      50,
      50,
      200,
      200,
      200,
      200,
      50,
      50
    ],
    "kd": [
      5,
      5,
      5,
      5,
      1,
      1,
      5,
      5,
      5,
      5,
      1,
      1
    ],
    "targetVel": 0,
    "output": "motor-ctrl"
  },
  "defaultAngles": [
    -0.2,
    0,
    0,
    0.4,
    -0.25,
    0,
    -0.2,
    0,
    0,
    0.4,
    -0.25,
    0
  ],
  "actionScale": 1.0,
  "actionClip": 1.0,
  "obs": [
    {
      "term": "projected_gravity",
      "size": 3,
      "scale": 1.0,
      "source": {
        "sensor": "orientation"
      }
    },
    {
      "term": "base_ang_vel",
      "scale": 1.0,
      "size": 3,
      "source": {
        "sensor": "angular-velocity"
      }
    },
    {
      "term": "command",
      "scale": [
        1.0,
        1.0,
        1.0
      ],
      "size": 3
    },
    {
      "term": "gait_clock",
      "frequency": 1.5,
      "size": 2
    },
    {
      "term": "joint_pos_rel",
      "scale": 1.0,
      "size": 12
    },
    {
      "term": "joint_vel",
      "scale": 0.1,
      "size": 12
    },
    {
      "term": "last_action",
      "size": 12
    }
  ],
  "obsSize": 47,
  "commands": {
    "init": [
      0.5,
      0.0,
      0.0
    ],
    "trained": {
      "vx": [
        -1.0,
        1.0
      ],
      "vy": [
        -1.0,
        1.0
      ],
      "wz": [
        -1.0,
        1.0
      ]
    },
    "ui": {
      "vx": [
        -0.6,
        1.0
      ],
      "vy": [
        -0.5,
        0.5
      ],
      "wz": [
        -0.8,
        0.8
      ]
    }
  },
  "notes": [
    "Loop order follows play_mujoco.py: at every 10th step (from step 0) the policy runs on the current state, then PD, then mj_step, then the gait clock advances by dt * f.",
    "Gravity and angular velocity come from the MJCF's framequat 'orientation' and gyro 'angular-velocity' sensors on the trunk IMU site, read from sensordata exactly as the script does.",
    "PD torque is clipped to each motor's ctrlrange (MuJoCo clamps limited ctrl). Actions are clipped to +-1 before use and fed back as the last-action term.",
    "Gait frequency is the mean of the trained range [1.0, 2.0] Hz while any command is non-zero, and 0 (clock terms zeroed) when all commands are zero, as in play_mujoco.py.",
    "The sensors declare noise in the MJCF; MuJoCo does not apply sensor noise, so the replay is deterministic.",
    "Replay check: this runtime (MuJoCo WASM + onnxruntime-web in Node) and the reference script (MuJoCo 3.14 Python + TorchScript) give the same base trajectory to the centimetre over 30 s at [0.5, 0, 0] (x 10.09 m, y -7.19 m). At that command the policy curves to the right in the reference script as well; steer with yaw."
  ]
}
