> ## 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.

# Driving

> A car with surround cameras, LiDAR, radar, vehicle-bus signals and GPS.

A road vehicle is `kind: "vehicle"`. This example follows a nuScenes-style rig: surround cameras, a
roof LiDAR, bumper radars, CAN-bus signals and GPS, with the vehicle kinematics under the
[`nomadic.driving.v1`](/mcap-spec/signals#nomadic-driving-v1) profile.

## Channels

| Channel | Message | Content |
| - | - | - |
| `/cam/front`, `/cam/front_left`, `/cam/front_right` | `foxglove.CompressedVideo` | cameras |
| `/cam/*/calibration` | `foxglove.CameraCalibration` | intrinsics, one per camera |
| `/lidar/top` | `foxglove.PointCloud` | roof LiDAR in its sensor frame, with `intensity` and `ring` |
| `/radar/front` | `foxglove.PointCloud` | front radar, velocities already in the `vehicle` frame |
| `/tf` | `foxglove.FrameTransform` | one static transform per sensor, `vehicle` → sensor, at `t0` |
| `/ego/pose` | `foxglove.PoseInFrame` | the vehicle's pose in the map frame: the [body pose](/mcap-spec/frames-and-units#body-pose) |
| `/gnss/fix` | `foxglove.LocationFix` | GPS |
| `/sig/*` | `nomadic.Signal` | vehicle-bus signals |

## Overlay

```json overlay.json theme={null}
{
  "spec_version": "1.1",
  "profile": "nomadic.driving.v1",
  "recording": {
    "id": "scene-0061",
    "clock": "log_time",
    "t0_ns": 1532402927647951000,
    "task": {"instruction": "Continue straight for 200 m, then turn left at the intersection."},
    "platform": {
      "kind": "vehicle",
      "ego_platform": "sedan",
      "body_dimensions": {"length": 4.08, "width": 1.73, "height": 1.56}
    }
  },
  "primary_view": "/cam/front",
  "views": [
    {"channel": "/cam/front",       "role": "front",       "label": "Front"},
    {"channel": "/cam/front_left",  "role": "front_left",  "label": "Front left"},
    {"channel": "/cam/front_right", "role": "front_right", "label": "Front right"}
  ],
  "point_clouds": [
    {"channel": "/lidar/top",   "name": "lidar_top",   "kind": "lidar"},
    {"channel": "/radar/front", "name": "radar_front", "kind": "radar"}
  ],
  "signals": [
    {"channel": "/sig/speed",  "name": "speed",  "type": "float", "unit": "m/s",   "rate_hz": 50},
    {"channel": "/sig/gyroz",  "name": "gyroz",  "type": "float", "unit": "rad/s", "rate_hz": 100},
    {"channel": "/sig/accelx", "name": "accelx", "type": "float", "unit": "m/s^2", "rate_hz": 100},
    {"channel": "/sig/accely", "name": "accely", "type": "float", "unit": "m/s^2", "rate_hz": 100},
    {"channel": "/sig/yaw",    "name": "yaw",    "type": "float", "unit": "rad",   "rate_hz": 100},
    {"channel": "/sig/steering_wheel_angle", "name": "steering_wheel_angle", "type": "float", "unit": "rad", "rate_hz": 100,
     "note": "measured steering-wheel angle"},
    {"channel": "/sig/brake_pressed", "name": "brake_pressed", "type": "bool", "rate_hz": 50},
    {"channel": "/sig/gear", "name": "gear", "type": "enum", "values": ["P", "R", "N", "D"], "rate_hz": 10,
     "note": "selected gear"},
    {"channel": "/sig/wheel_speeds", "name": "wheel_speeds", "type": "vector", "dim": 4, "unit": "rad/s", "rate_hz": 50,
     "components": ["front_left", "front_right", "rear_left", "rear_right"]},
    {"channel": "/sig/navigation_instruction", "name": "navigation_instruction", "type": "string",
     "note": "turn-by-turn instruction from the route planner"}
  ],
  "source": {"dataset": "nuScenes", "scene": "scene-0061"}
}
```

## Sanity-checking the geometry

Each sensor's height in the `vehicle` frame is the z of its `FrameTransform.translation`. For this
rig:

```text theme={null}
lidar_top          x=+0.944  y=+0.000  z=+1.840     roof
cam_front          x=+1.701  y=+0.016  z=+1.511
cam_front_left     x=+1.524  y=+0.495  z=+1.509     +y is LEFT
cam_front_right    x=+1.551  y=-0.493  z=+1.496     -y is RIGHT
radar_front        x=+3.412  y=+0.000  z=+0.500     front bumper, ahead of the cameras
```

Every z is positive because the origin is on the ground, not at a sensor. Cameras sit near 1.5 m,
the roof LiDAR at 1.84 m, the bumper radar near 0.5 m. If your equivalent table shows the roof
LiDAR at −1.84, your z axis is inverted; at 0.0, your origin is at the sensor rather than on the
ground.

## Notes

* **Kinematics.** Under `nomadic.driving.v1`, `speed` and `gyroz` are required, with exactly the
  units shown. Convert km/h and deg/s in your converter.
* **Two steering angles.** A rig often logs a steering-wheel angle and a road-wheel angle, in
  different units. Publish both, each with its own name and `unit`.
* **Rates differ.** Signals in one recording commonly range from 1 Hz to 1 kHz. Publish each at its
  native rate; nothing needs resampling.
* **Route.** `recording.task` holds the route for the whole recording; the
  `navigation_instruction` signal holds the instruction active at each moment.


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