Lightweight converter for motion data to BIDS format
Project description
motionbids
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
- Motivation - Why BIDS for motion?
- Workflow - Complete workflow guide
- Class Reference - MotionData API
- Schema Fields - All BIDS fields
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
- 📖 Documentation
- 🐛 Issues
- 📜 BIDS Spec
License
MIT License - see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e0713a36318c514461664a92512a409e7ed163fef9eed6092d546c91540c8df
|
|
| MD5 |
aeb0fe53b0e442f38c3d23c1ee682582
|
|
| BLAKE2b-256 |
dc0b7e584164e5659cfab1700883a0e06f8827160261f0b69a4bcc4de47836b0
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15ac5316269bfda889bcf2bc4e9e01789472b449c6becd790aa70191ef8deef5
|
|
| MD5 |
50d9a31160db7773b28d88db4af722af
|
|
| BLAKE2b-256 |
c4ac15ac15d80022effeaa8b19c4b467fa83931ca4d5bf65d988d8bcc01d3752
|