> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nomadicml.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Humanoid

> A whole-body humanoid robot: arms, hands, legs, torso and head, with its cameras and body pose.

A humanoid recording is `kind: "humanoid"` with one [part](/mcap-spec/body-and-parts#parts) per
limb. Each part carries the data your robot logs: joint angles, a wrist pose, hand contact forces,
ankle force-torque. This example is a humanoid with 7-DoF arms, 6-DoF hands with fingertip force
sensors, 6-DoF legs with ankle force-torque sensors, a 3-DoF waist and a 2-DoF neck, recorded
while it carries a mug to a sink.

## Channels

| Channel | Message | Content |
| - | - | - |
| `/cam/head` | `foxglove.CompressedVideo` | head camera, the primary view |
| `/cam/left_wrist`, `/cam/right_wrist` | `foxglove.CompressedVideo` | wrist cameras |
| `/cam/external` | `foxglove.CompressedVideo` | a fixed camera in the room |
| `/cam/*/calibration` | `foxglove.CameraCalibration` | intrinsics, one per camera |
| `/body/pose` | `foxglove.PoseInFrame` | the pelvis pose in the `world` frame: the [body pose](/mcap-spec/frames-and-units#body-pose), not declared in the overlay |
| `/left_arm/wrist_pose`, `/right_arm/wrist_pose` | `foxglove.PoseInFrame` | wrist poses in the `world` frame |
| `/sig/*` | `nomadic.Signal` | joint angles, forces, IMU and robot state |

## Overlay

```json overlay.json theme={null}
{
  "spec_version": "1.1",
  "recording": {
    "id": "humanoid-kitchen-000123",
    "clock": "log_time",
    "t0_ns": 1760000000000000000,
    "task": {
      "instruction": "Take the mug from the counter and place it in the sink.",
      "success_criteria": "The mug is upright in the sink."
    },
    "segments": [
      {"start_s": 0.0,  "end_s": 6.5,  "text": "Walk to the counter.", "label": "subtask", "skill": "walk"},
      {"start_s": 6.5,  "end_s": 11.0, "text": "Grasp the mug with the right hand.", "label": "subtask", "skill": "pick"},
      {"start_s": 11.0, "end_s": 19.2, "text": "Carry the mug to the sink and release it.", "label": "subtask", "skill": "place"}
    ],
    "platform": {
      "kind": "humanoid",
      "embodiment": "acme_h1_rev3",
      "body_dimensions": {"length": 0.3, "width": 0.5, "height": 1.7},
      "parts": [
        {"name": "left_arm", "type": "arm", "side": "left",
         "joints": {"signal": "left_arm_joints",
                    "names": ["left_shoulder_pitch", "left_shoulder_roll", "left_shoulder_yaw", "left_elbow",
                              "left_wrist_roll", "left_wrist_pitch", "left_wrist_yaw"]},
         "end_pose": {"channel": "/left_arm/wrist_pose"}},
        {"name": "right_arm", "type": "arm", "side": "right",
         "joints": {"signal": "right_arm_joints",
                    "names": ["right_shoulder_pitch", "right_shoulder_roll", "right_shoulder_yaw", "right_elbow",
                              "right_wrist_roll", "right_wrist_pitch", "right_wrist_yaw"]},
         "end_pose": {"channel": "/right_arm/wrist_pose"}},
        {"name": "left_hand", "type": "hand", "side": "left",
         "joints": {"signal": "left_hand_joints",
                    "names": ["left_thumb_yaw", "left_thumb_pitch", "left_index", "left_middle", "left_ring", "left_little"]},
         "force": {"signal": "left_hand_force"}},
        {"name": "right_hand", "type": "hand", "side": "right",
         "joints": {"signal": "right_hand_joints",
                    "names": ["right_thumb_yaw", "right_thumb_pitch", "right_index", "right_middle", "right_ring", "right_little"]},
         "force": {"signal": "right_hand_force"}},
        {"name": "left_leg", "type": "leg", "side": "left",
         "joints": {"signal": "left_leg_joints",
                    "names": ["left_hip_pitch", "left_hip_roll", "left_hip_yaw", "left_knee", "left_ankle_pitch", "left_ankle_roll"]},
         "force": {"signal": "left_ankle_wrench"}},
        {"name": "right_leg", "type": "leg", "side": "right",
         "joints": {"signal": "right_leg_joints",
                    "names": ["right_hip_pitch", "right_hip_roll", "right_hip_yaw", "right_knee", "right_ankle_pitch", "right_ankle_roll"]},
         "force": {"signal": "right_ankle_wrench"}},
        {"name": "torso", "type": "torso",
         "joints": {"signal": "waist_joints", "names": ["waist_yaw", "waist_roll", "waist_pitch"]}},
        {"name": "head", "type": "head",
         "joints": {"signal": "neck_joints", "names": ["neck_yaw", "neck_pitch"]}}
      ]
    }
  },
  "primary_view": "/cam/head",
  "views": [
    {"channel": "/cam/head",        "role": "ego",         "label": "Head"},
    {"channel": "/cam/left_wrist",  "role": "wrist_left",  "label": "Left wrist"},
    {"channel": "/cam/right_wrist", "role": "wrist_right", "label": "Right wrist"},
    {"channel": "/cam/external",    "role": "external_1",  "label": "Room"}
  ],
  "signals": [
    {"channel": "/sig/left_arm_joints", "name": "left_arm_joints", "type": "vector", "dim": 7, "unit": "rad", "rate_hz": 200,
     "components": ["left_shoulder_pitch", "left_shoulder_roll", "left_shoulder_yaw", "left_elbow",
                    "left_wrist_roll", "left_wrist_pitch", "left_wrist_yaw"]},
    {"channel": "/sig/right_arm_joints", "name": "right_arm_joints", "type": "vector", "dim": 7, "unit": "rad", "rate_hz": 200,
     "components": ["right_shoulder_pitch", "right_shoulder_roll", "right_shoulder_yaw", "right_elbow",
                    "right_wrist_roll", "right_wrist_pitch", "right_wrist_yaw"]},
    {"channel": "/sig/left_hand_joints", "name": "left_hand_joints", "type": "vector", "dim": 6, "unit": "rad", "rate_hz": 100,
     "components": ["left_thumb_yaw", "left_thumb_pitch", "left_index", "left_middle", "left_ring", "left_little"]},
    {"channel": "/sig/right_hand_joints", "name": "right_hand_joints", "type": "vector", "dim": 6, "unit": "rad", "rate_hz": 100,
     "components": ["right_thumb_yaw", "right_thumb_pitch", "right_index", "right_middle", "right_ring", "right_little"]},
    {"channel": "/sig/left_hand_force", "name": "left_hand_force", "type": "vector", "dim": 5, "unit": "N", "rate_hz": 100,
     "components": ["thumb", "index", "middle", "ring", "little"], "note": "fingertip normal force"},
    {"channel": "/sig/right_hand_force", "name": "right_hand_force", "type": "vector", "dim": 5, "unit": "N", "rate_hz": 100,
     "components": ["thumb", "index", "middle", "ring", "little"], "note": "fingertip normal force"},
    {"channel": "/sig/left_leg_joints", "name": "left_leg_joints", "type": "vector", "dim": 6, "unit": "rad", "rate_hz": 500,
     "components": ["left_hip_pitch", "left_hip_roll", "left_hip_yaw", "left_knee", "left_ankle_pitch", "left_ankle_roll"]},
    {"channel": "/sig/right_leg_joints", "name": "right_leg_joints", "type": "vector", "dim": 6, "unit": "rad", "rate_hz": 500,
     "components": ["right_hip_pitch", "right_hip_roll", "right_hip_yaw", "right_knee", "right_ankle_pitch", "right_ankle_roll"]},
    {"channel": "/sig/left_ankle_wrench", "name": "left_ankle_wrench", "type": "vector", "dim": 6, "rate_hz": 500,
     "components": ["fx", "fy", "fz", "tx", "ty", "tz"], "note": "ankle force-torque sensor, N and N*m, sensor frame"},
    {"channel": "/sig/right_ankle_wrench", "name": "right_ankle_wrench", "type": "vector", "dim": 6, "rate_hz": 500,
     "components": ["fx", "fy", "fz", "tx", "ty", "tz"], "note": "ankle force-torque sensor, N and N*m, sensor frame"},
    {"channel": "/sig/waist_joints", "name": "waist_joints", "type": "vector", "dim": 3, "unit": "rad", "rate_hz": 500,
     "components": ["waist_yaw", "waist_roll", "waist_pitch"]},
    {"channel": "/sig/neck_joints", "name": "neck_joints", "type": "vector", "dim": 2, "unit": "rad", "rate_hz": 100,
     "components": ["neck_yaw", "neck_pitch"]},
    {"channel": "/sig/pelvis_gyro", "name": "pelvis_gyro", "type": "vector", "dim": 3, "unit": "rad/s", "rate_hz": 500,
     "components": ["x", "y", "z"]},
    {"channel": "/sig/pelvis_accel", "name": "pelvis_accel", "type": "vector", "dim": 3, "unit": "m/s^2", "rate_hz": 500,
     "components": ["x", "y", "z"]},
    {"channel": "/sig/locomotion_mode", "name": "locomotion_mode", "type": "enum",
     "values": ["stand", "walk", "manipulate"], "note": "controller mode"},
    {"channel": "/sig/battery", "name": "battery", "type": "float", "unit": "1", "rate_hz": 1,
     "note": "state of charge, 0 = empty, 1 = full"}
  ],
  "source": {"converter": "acme-to-nomadic 1.2"}
}
```

## Notes

**Body pose.** The pelvis pose goes on its own `foxglove.PoseInFrame` channel (`/body/pose`) in a
static, z-up `world` frame, and is not declared in the overlay. The wrist poses use the same
`world` frame. If your robot logs poses in its pelvis frame, transform them to the world frame in
your converter, using the pelvis pose.

**Hands on arms.** The hands here have no `end_pose` of their own: a hand is paired with the arm of
the same side (`left_hand` with `left_arm`), whose `end_pose` is the wrist. Give a hand its own
`end_pose` only when it is not rigidly attached to that wrist pose.

**Joint vectors.** One `vector` signal per part, with `names` in exactly the vector's order. Prefer
measured joint positions; publish commanded positions, velocities and motor torques as further
signals under any name.

**Forces.** The hands use the contact-force form (unit `N`, one value per fingertip). The ankles
use the single-wrench form (`dim` 6, components `fx … tz`): it carries newtons and newton-metres
together, so the unit is stated in `note` rather than `unit`. Tactile hands with a full wrench per
fingertip use the [per-contact wrench form](/mcap-spec/body-and-parts#force).

## Variations

| Your robot | Change |
| - | - |
| Parallel grippers instead of hands | drop the `hand` parts; add a `grip` signal (unit `"1"`, 0 = closed … 1 = open) to each `arm` |
| Wheeled base, no legs | drop the `leg` parts; keep the body pose |
| A whole-body skeleton from motion capture or a state estimator | add a `body` part with `keypoints`: one `nomadic.Skeleton` channel carrying every tracked joint |
| No joint encoders on the hands, only hand tracking | replace each hand's `joints` with `keypoints` (see [Egocentric](/mcap-spec/examples/egocentric)) |
| A `foot` pose from your state estimator | add it as the leg's `end_pose`. Preflight reminds you that a part's pose is never the body pose; that is expected. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.