Modular and flexible jaw motion analysis framework (motion capture, calibration, registration, and analysis)
Project description
JawTrackingSystem (JTS): A customizable, low-cost, optical jaw tracking system
A modular and extensible Python package for analyzing jaw motion using motion capture data. Designed for research and clinical applications, it provides a flexible pipeline for calibration, coordinate transformations, registration, smoothing, visualization, and export of jaw kinematics. The models for the hardware components are provided as STL files and inside a FreeCAD project file.
Table of Contents
- Features
- Hardware
- Installation
- Quick Start
- Configuration
- Setup and Usage
- Extending the Framework
- Directory Structure
- Testing
- License
- Citation
Features
- Customizable, 3D-printable hardware components
- Offline or real-time jaw motion analysis (online processing in development)
- Abstract base classes for motion capture data (supports Qualisys, extensible to others)
- Calibration routines for anatomical landmark registration
- Modular pipeline: calibration, relative motion, coordinate transformation, smoothing, visualization, export
- Support for data export in HDF5 format
- Easy configurable via JSON files
- Visualization utilities for 2D/3D trajectories
- Comprehensive logging and error handling
- Test suite for core functionality
Hardware
The hardware components are designed to be low-cost and customizable. The models for the hardware components are provided as STL files and inside a FreeCAD project file. You can find the files in the models directory.
The mouthpiece, teeth attachment, headpiece, and digitizing pointer are designed to be 3D-printed. Since it isn't easy to 3D-print a sharp point for the digitizing pointer, a dart point is used, which can be attached to a 2BA thread connected to the digitizing pointer's tip. For the reflective markers, you can use reflective fibers or reflective tape. The headpiece can be attached and fastened to the head using hook-and-loop tape (see Components).
Components
| Mouthpiece | Teeth attachment | Headpiece | Digitizing pointer |
| 2BA thread | Dart point | Reflective fiber | Temporary dental glue | Hook-and-loop tape |
Installation
Install the package using pip:
python -m pip install jaw-tracking-system
From GitHub:
python -m pip install git+https://github.com/paulotto/jaw_tracking_system.git
Or just clone the repository, copy the jts directory to your project, and install the dependencies:
git clone https://github.com/paulotto/jaw_tracking_system.git
cd jaw_tracking_system
cp -r jts your_project_directory/
python -m pip install -r requirements.txt
Optional Dependencies
python -m pip install plotly==6.0.1 qtm_rt
Quick Start
- Prepare a configuration JSON file (see README for examples).
- Run the analysis pipeline:
python -m jts.core path/to/config.json
- Results (trajectories, plots, exports) will be saved to the output directory specified in your config.
Configuration
All analysis parameters are specified in a JSON config file. Key sections include:
data_source: Type (e.g., "qualisys"), filename, and system-specific parametersanalysis: Calibration, experiment intervals, smoothing, coordinate transformsoutput: Output directory, file formats, export optionsvisualization: Plotting options
See config.json for a template.
Setup and Usage
TODO: Describe experimental setup, hardware assembly, and how to run the system.
As a Script
python -m jts.core path/to/config.json
Optional flags:
--verbosefor detailed logging--plotto show plots interactively
As a Library
from jts.core import JawMotionAnalysis, ConfigManager
config = ConfigManager.load_config('path/to/config.json')
analysis = JawMotionAnalysis(config)
results = analysis.run_analysis()
Extending the Framework
- Add new motion capture system support by subclassing
MotionCaptureData. - Implement new calibration or analysis routines by extending
JawMotionAnalysis. - Add new visualization or export utilities in
helper.py.
Directory Structure
jaw_tracking_system/
├── jts/
│ ├── __init__.py
│ ├── calibration_controllers.py
│ ├── core.py
│ ├── helper.py
│ ├── plotly_visualization.py
│ ├── precision_analysis.py
│ ├── qualisys_streaming.py
│ ├── qualisys.py
│ ├── streaming.py
├── config/
│ ├── README.md
│ └── config.json
├── models/
├── tests/
│ ├── __init__.py
│ ├── test_core.py
│ ├── test_helper.py
│ ├── test_precision_analysis.py
│ └── test_qualisys.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── requirements.txt
├── setup.py
Testing
Run the test suite with:
pytest tests
License
This project is only intended for research and educational purposes and is licensed under the Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0). See the LICENSE file for details.
This license allows you to use, adapt, and distribute the material for non-commercial purposes, provided the following conditions are met:
- Attribution: You must give appropriate credit to the original authors, provide a link to the license, and indicate if changes were made.
- Non-Commercial: You may not use the material for commercial purposes (e.g., selling or profiting from it, directly or indirectly).
- ShareAlike: If you create derivative works (e.g., modify or adapt the material), you must distribute them under the same CC BY-NC-SA 4.0 license.
- No Additional Restrictions: You may not impose additional legal or technological restrictions that prevent others from exercising the rights granted by the license.
Citation
If you use this package in your research, please cite:
@InProceedings{mueller2025jts,
title={An Optical Measurement System for Open-Source Tracking of Jaw Motions},
author={Müller, Paul-Otto and Suppelt, Sven and Kupnik, Mario and {von Stryk}, Oskar},
booktitle = {2025 IEEE Sensors, Vancouver, Canada},
year={2025},
publisher = {IEEE},
doi={10.48550/arXiv.2510.01191},
note={Accepted}
}
For more information, see the project website.
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
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 jaw_tracking_system-1.0.4.tar.gz.
File metadata
- Download URL: jaw_tracking_system-1.0.4.tar.gz
- Upload date:
- Size: 8.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be531a5d321b13790784d28db0a6a3d56d30ffc30fa766c9936ea691e5ad4b17
|
|
| MD5 |
dfa2de6c7a0210f1f62e051518179c20
|
|
| BLAKE2b-256 |
e2769acc4503a129399e780a73c980d792a706b7c100ce258669d8d626bdb60c
|
Provenance
The following attestation bundles were made for jaw_tracking_system-1.0.4.tar.gz:
Publisher:
publish.yml on paulotto/jaw_tracking_system
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jaw_tracking_system-1.0.4.tar.gz -
Subject digest:
be531a5d321b13790784d28db0a6a3d56d30ffc30fa766c9936ea691e5ad4b17 - Sigstore transparency entry: 613011841
- Sigstore integration time:
-
Permalink:
paulotto/jaw_tracking_system@3f6c7f402489af30d8da3e280cae8aff0c142f03 -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/paulotto
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3f6c7f402489af30d8da3e280cae8aff0c142f03 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jaw_tracking_system-1.0.4-py3-none-any.whl.
File metadata
- Download URL: jaw_tracking_system-1.0.4-py3-none-any.whl
- Upload date:
- Size: 86.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
44bd44bd0079caf0b6dbbfe9ebece94616d9da5fb44fa5f961038ff3ac127870
|
|
| MD5 |
1c5278ecdf76f5d2540ad4db7b554ab7
|
|
| BLAKE2b-256 |
70cbfe1be95bf20ba859ef3bafde17dba31f2d63d1f1e5747d2c8d9657a33e26
|
Provenance
The following attestation bundles were made for jaw_tracking_system-1.0.4-py3-none-any.whl:
Publisher:
publish.yml on paulotto/jaw_tracking_system
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jaw_tracking_system-1.0.4-py3-none-any.whl -
Subject digest:
44bd44bd0079caf0b6dbbfe9ebece94616d9da5fb44fa5f961038ff3ac127870 - Sigstore transparency entry: 613011879
- Sigstore integration time:
-
Permalink:
paulotto/jaw_tracking_system@3f6c7f402489af30d8da3e280cae8aff0c142f03 -
Branch / Tag:
refs/tags/v1.0.4 - Owner: https://github.com/paulotto
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3f6c7f402489af30d8da3e280cae8aff0c142f03 -
Trigger Event:
push
-
Statement type: