# MAVLink telemetry logs

Nominal’s first-party extractor reads the [MAVLink](https://mavlink.io/) telemetry logs (`.tlog`) that ground control stations record. Each message field becomes a channel, such as `ATTITUDE.roll`, timestamped with the time the ground control station received it. Each point is tagged with its `system_id` and `component_id`, so you can tell vehicles and components apart.

## Before you start

Enable the extractor in your workspace:

1. In the Nominal app’s sidebar, open **Data** > **File extractors**.
2. Click **NEW EXTRACTOR** > **Native extractor**.
3. Choose **MAVLink Telemetry Log** and click **ENABLE EXTRACTOR**.

## Upload a file

**Nominal app**

1. In the sidebar, click **+** (**New**), then **Upload data**.
2. On the **File extraction** card, click **SELECT** and choose **MAVLink Telemetry Log**.
3. Click **SELECT A DESTINATION** and choose **Standalone dataset**. Pick a dataset, or click **NEW DATASET**, enter a name and click **CREATE DATASET**.
4. Next to **INPUT_FILE**, click **Select file** and choose the `.tlog` file.
5. Click **CONFIRM & INGEST**.

**Python**

Select the extractor’s row on the **File extractors** page to see its **RID**.

```python
from nominal.core import NominalClient

client = NominalClient.from_profile("default")
extractor = client.get_containerized_extractor("<EXTRACTOR_RID>")
dataset = client.create_dataset("Flight 42")
job = dataset.add_containerized(extractor, sources={"INPUT_FILE": "flight.tlog"})
for file in job.as_files_ingested():  # waits for ingestion
    print(file.name, file.ingest_status.name)
```

## Options

| Setting | Nominal app | Python | Extractor variable |
| --- | --- | --- | --- |
| Convert only these message types, such as `ATTITUDE,GLOBAL_POSITION_INT`, in upper or lower case | **Message filter** | `MESSAGE_FILTER` in `arguments` | `MESSAGE_FILTER` |
| A tag on every point | **Tags** | `tags` | — |
