NM000107#

wrist: Wrist Movement Control from EMG

Access recordings and metadata through EEGDash.

Citation: Patrick Kaifosh, Thomas R. Reardon, CTRL-labs at Reality Labs (2025). wrist: Wrist Movement Control from EMG. 10.5281/zenodo.17282507

Modality: emg Subjects: 100 Recordings: 182 License: CC-BY-NC 4.0 Source: nemar

Metadata: Complete (100%)

Quickstart#

Install

pip install eegdash

Access the data

from eegdash.dataset import NM000107

dataset = NM000107(cache_dir="./data")
# Get the raw object of the first recording
raw = dataset.datasets[0].raw
print(raw.info)

Filter by subject

dataset = NM000107(cache_dir="./data", subject="01")

Advanced query

dataset = NM000107(
    cache_dir="./data",
    query={"subject": {"$in": ["01", "02"]}},
)

Iterate recordings

for rec in dataset:
    print(rec.subject, rec.raw.info['sfreq'])

If you use this dataset in your research, please cite the original authors.

BibTeX

@dataset{nm000107,
  title = {wrist: Wrist Movement Control from EMG},
  author = {Patrick Kaifosh and Thomas R. Reardon and CTRL-labs at Reality Labs},
  doi = {10.5281/zenodo.17282507},
  url = {https://doi.org/10.5281/zenodo.17282507},
}

About This Dataset#

wrist: Wrist Movement Control from EMG

Overview

Dataset: wrist - Wrist posture and movement from wrist-based surface electromyography Task: 1D continuous cursor control via wrist flexion/extension Participants: 100 subjects Sessions: 100 total (1 per subject)

View full README

wrist: Wrist Movement Control from EMG

Overview

Dataset: wrist - Wrist posture and movement from wrist-based surface electromyography Task: 1D continuous cursor control via wrist flexion/extension Participants: 100 subjects Sessions: 100 total (1 per subject) Publication: Kaifosh et al., 2025 - “A generic non-invasive neuromotor interface for human-computer interaction” (Nature)

Purpose

This dataset captures wrist-based sEMG signals during wrist movements for continuous cursor control. Motion capture provides ground-truth wrist angles. The goal is to enable gesture-free control through wrist posture alone, demonstrating sEMG’s ability to decode motor intent before visible movement occurs.

Dataset Details

Participants

  • Sample size: 100 participants

  • Demographics: Not available (marked as n/a)

  • Recording side: Dominant wrist

  • Sessions: 1 per participant

Hardware

  • Device: sEMG-RD (single wristband)

  • Channels: 16 (EMG0-EMG15)

  • Sampling rate: 2000 Hz

  • Reference: Bipolar differential

  • Ground truth: Motion capture wrist angles

Recording Protocol

  1. Participant wears sEMG-RD on dominant wrist

  2. Motion capture tracks wrist angles in real-time

  3. Participant controls horizontal cursor position with wrist flexion/extension

  4. Target acquisition task: Navigate to targets and hold for 500ms

Data Contents

Files per Session

sub-XXX/ses-XXX/emg/
├── sub-XXX_ses-XXX_task-wrist_emg.edf
├── sub-XXX_ses-XXX_task-wrist_emg.json
├── sub-XXX_ses-XXX_task-wrist_channels.tsv
├── sub-XXX_ses-XXX_task-wrist_events.tsv
└── sub-XXX_ses-XXX_electrodes.tsv

Events

  • Stage boundaries: Task phases and movement trials

Coordinate System

Single coordinate system at root (dominant wrist, percent units, no decimals)

Signal Processing

Note: This dataset has significant data quality issues: - Duplicate timestamps found in many sessions (up to 88% duplicates) - Irregular sampling requiring resampling (up to 916% deviation) - Post-processing: Duplicate removal followed by resampling to regular 2000 Hz

Baseline Performance

Published Results (Kaifosh et al., 2025)

Offline Evaluation: - Wrist angle velocity error: <13°/s - Error decreases with more training participants

Closed-loop Performance (n=17 naive test users): - Target acquisition time: Median 1.51s (sEMG decoder) - Dial-in time: Time to re-acquire after premature exit - Learning effects: Improvement from practice to evaluation blocks

Comparison: - Motion capture ground truth: 0.96s - MacBook trackpad: 0.68s - sEMG decoder: 1.51s (2.2× slower than trackpad)

Model architecture: MPF features + LSTM

Key Findings

  • Predictive signals: sEMG precedes movement by tens of milliseconds

  • Generic models work: Out-of-the-box cross-user generalization

  • Continuous control: Demonstrates feasibility of gesture-free interfaces

  • Room for improvement: Performance gap vs traditional inputs

Use Cases

  • Continuous control: Cursor/pointer movement

  • AR/VR navigation: Hands-free interface

  • Low-effort control: Minimal visible movement required

  • Predictive decoding: Intent detection before motion completion

Known Limitations

  • Single degree of freedom (1D control only)

  • Single wrist (dominant hand)

  • Duplicate timestamps (data quality issue)

  • Performance below traditional inputs

  • Extension to 2D control not demonstrated

Citation

Kaifosh, P., Reardon, T.R., & CTRL-labs at Reality Labs. (2025).
A generic non-invasive neuromotor interface for human-computer interaction.
Nature, 645(8081), 702-711. https://doi.org/10.1038/s41586-025-09255-w

Data Curator

Yahya Shirazi SCCN (Swartz Center for Computational Neuroscience) INC (Institute for Neural Computation) University of California San Diego

Version History

v1.0 (2025-10-01): Initial BIDS conversion

BIDS Version: 1.11 | EMG-BIDS: BEP-042 | Updated: Oct 1, 2025

Dataset Information#

Dataset ID

NM000107

Title

wrist: Wrist Movement Control from EMG

Year

2025

Authors

Patrick Kaifosh, Thomas R. Reardon, CTRL-labs at Reality Labs

License

CC-BY-NC 4.0

Citation / DOI

10.5281/zenodo.17282507

Source links

OpenNeuro | NeMAR | Source URL

Copy-paste BibTeX
@dataset{nm000107,
  title = {wrist: Wrist Movement Control from EMG},
  author = {Patrick Kaifosh and Thomas R. Reardon and CTRL-labs at Reality Labs},
  doi = {10.5281/zenodo.17282507},
  url = {https://doi.org/10.5281/zenodo.17282507},
}

Found an issue with this dataset?

If you encounter any problems with this dataset (missing files, incorrect metadata, loading errors, etc.), please let us know!

Report an Issue on GitHub

Technical Details#

Subjects & recordings
  • Subjects: 100

  • Recordings: 182

  • Tasks: 1

Channels & sampling rate
  • Channels: 16

  • Sampling rate (Hz): 2000.0

  • Duration (hours): 0.0

Tags
  • Pathology: Healthy

  • Modality: Visual

  • Type: Motor

Files & format
  • Size on disk: 1.2 MB

  • File count: 182

  • Format: BIDS

License & citation
  • License: CC-BY-NC 4.0

  • DOI: 10.5281/zenodo.17282507

Provenance

API Reference#

Use the NM000107 class to access this dataset programmatically.

class eegdash.dataset.NM000107(cache_dir: str, query: dict | None = None, s3_bucket: str | None = None, **kwargs)[source]#

Bases: EEGDashDataset

OpenNeuro dataset nm000107. Modality: emg; Experiment type: Motor; Subject type: Healthy. Subjects: 100; recordings: 182; tasks: 1.

Parameters:
  • cache_dir (str | Path) – Directory where data are cached locally.

  • query (dict | None) – Additional MongoDB-style filters to AND with the dataset selection. Must not contain the key dataset.

  • s3_bucket (str | None) – Base S3 bucket used to locate the data.

  • **kwargs (dict) – Additional keyword arguments forwarded to EEGDashDataset.

data_dir#

Local dataset cache directory (cache_dir / dataset_id).

Type:

Path

query#

Merged query with the dataset filter applied.

Type:

dict

records#

Metadata records used to build the dataset, if pre-fetched.

Type:

list[dict] | None

Notes

Each item is a recording; recording-level metadata are available via dataset.description. query supports MongoDB-style filters on fields in ALLOWED_QUERY_FIELDS and is combined with the dataset filter. Dataset-specific caveats are not provided in the summary metadata.

References

OpenNeuro dataset: https://openneuro.org/datasets/nm000107 NeMAR dataset: https://nemar.org/dataexplorer/detail?dataset_id=nm000107

Examples

>>> from eegdash.dataset import NM000107
>>> dataset = NM000107(cache_dir="./data")
>>> recording = dataset[0]
>>> raw = recording.load()
__init__(cache_dir: str, query: dict | None = None, s3_bucket: str | None = None, **kwargs)[source]#
save(path, overwrite=False)[source]#

Save the dataset to disk.

Parameters:
  • path (str or Path) – Destination file path.

  • overwrite (bool, default False) – If True, overwrite existing file.

Return type:

None

See Also#