Skip to main content

Lightweight converter for motion data to BIDS format

Project description

motionbids

Python License: MIT Tests codecov

A lightweight Python package for exporting motion capture data to BIDS format.

Quick Start

from motionbids import MotionData, Channel, export_bids_motion
import numpy as np

# Your motion data (1200 timepoints, 32 channels)
data = np.random.randn(1200, 32)

# Define channels following BIDS schema
channels = [
    Channel(
        channel_name=f"marker{i}_{axis}",
        channel_component=axis,
        channel_type="POS",
        channel_tracked_point=f"marker{i}",
        channel_units="mm"
    )
    for i in range(10)
    for axis in ['x', 'y', 'z']
]

# Create BIDS motion object
motion = MotionData(
    subject_id="01",
    task_name="walk",
    tracksys="optical",
    sampling_frequency=120.0,
    tracked_points_count=10,
    manufacturer="Vicon",
    data=data,
    channels=channels
)

# Export to BIDS format
export_bids_motion(motion, out_dir="bids_dataset/")

Output:

bids_dataset/
├── sub-01_task-walk_tracksys-optical_motion.json      # Metadata
├── sub-01_task-walk_tracksys-optical_motion.tsv       # Time series
└── sub-01_task-walk_tracksys-optical_channels.tsv     # Channel info

Installation

📦 Not on PyPI: This package is not yet published on PyPI. Install from source:

# Clone the repository
git clone https://github.com/JuliusWelzel/motionbids.git
cd motionbids

# Install with uv (recommended)
uv venv  # Create virtual environment
uv pip install -e .

# Or with pip
python -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
pip install -e .

Features

Schema-driven - Auto-syncs with BIDS specification
Automatic validation - Catches errors before export
Simple API - Minimal code needed
Complete export - JSON, TSV, channels files
Cross-platform - Tested on Linux, macOS, Windows

Documentation

Full Documentation

Required Fields

motion = MotionData(
    subject_id="01",              # Subject identifier
    task_name="walk",             # Task name
    tracksys="optical",           # Tracking system (optical/imu/video)
    sampling_frequency=120.0,     # Sampling rate in Hz
    tracked_points_count=10,      # Number of markers
    data=data,                    # NumPy array (rows=time, cols=channels)
    channels=channels             # List of Channel objects (BIDS-compliant)
)

Channel Metadata

Each channel requires BIDS-compliant metadata:

from motionbids import Channel

channel = Channel(
    channel_name="marker0_x",           # Channel name
    channel_component="x",              # x, y, z, quat_x, quat_y, quat_z, quat_w, n/a
    channel_type="POS",                 # POS, ORNT, VEL, ACCEL, GYRO, MAGN, etc.
    channel_tracked_point="marker0",    # Label of tracked point
    channel_units="mm"                  # Units (mm, m, rad, deg, etc.)
)

Validation

Important: Package validation is for convenience only and is not officially supported by BIDS. Always use the official BIDS Validator before sharing your dataset.

from motionbids import validate_motion_data

# Convenience validation (checks basic requirements)
validate_motion_data(motion)

# Then validate with official BIDS Validator:
# https://bids-standard.github.io/bids-validator/

Complete Workflow

from motionbids import (
    MotionData,
    export_bids_motion,
    create_bids_directory_structure,
    export_dataset_description
)

# 1. Create directory structure
motion_dir = create_bids_directory_structure(
    base_dir="my_study",
    subject_id="01",
    session_id="01"
)

# 2. Create dataset description
export_dataset_description(
    bids_root="my_study",
    name="Motion Study",
    authors=["Your Name"]
)

# 3. Export motion data
motion = MotionData(...)
export_bids_motion(motion, out_dir=motion_dir)

Supported Systems

Works with any motion tracking technology:

  • Optical: Vicon, Optitrack, Qualisys
  • IMU: Xsens, APDM, Movella
  • Video: OpenPose, MediaPipe, DeepLabCut
  • Other: Custom systems

Development

# Clone and install
git clone https://github.com/juliuswelzel/motionbids.git
cd motionbids
uv pip install -e ".[dev]"

# Run tests
pytest --cov=motionbids

Citation

@software{motionbids,
  author = {Welzel, Julius},
  title = {motion2bids: BIDS converter for motion capture data},
  year = {2025},
  url = {https://github.com/JuliusWelzel/motionbids}
}

Links

License

MIT License - see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

motionbids-0.1.0.tar.gz (34.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

motionbids-0.1.0-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

Details for the file motionbids-0.1.0.tar.gz.

File metadata

  • Download URL: motionbids-0.1.0.tar.gz
  • Upload date:
  • Size: 34.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.19

File hashes

Hashes for motionbids-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8e0713a36318c514461664a92512a409e7ed163fef9eed6092d546c91540c8df
MD5 aeb0fe53b0e442f38c3d23c1ee682582
BLAKE2b-256 dc0b7e584164e5659cfab1700883a0e06f8827160261f0b69a4bcc4de47836b0

See more details on using hashes here.

File details

Details for the file motionbids-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: motionbids-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 24.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.19

File hashes

Hashes for motionbids-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 15ac5316269bfda889bcf2bc4e9e01789472b449c6becd790aa70191ef8deef5
MD5 50d9a31160db7773b28d88db4af722af
BLAKE2b-256 c4ac15ac15d80022effeaa8b19c4b467fa83931ca4d5bf65d988d8bcc01d3752

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page