Welcome to MEDWEAR
MEDWEAR is a collaborative project funded by ETH Zurich’s Open Research Data initiative. We aim to define open standards for raw wearable sensor data that are vendor-agnostic and FAIR (Findable, Accessible, Interoperable, and Reusable).
Through community-driven development, we are creating:
- Expanding Open mHealth schemas (based on IEEE 1752).
- Online conversion to ROS 2 message for robotic applications.
- Libraries for real time data stream support and educational materials.
Installation
To use MEDWEAR schemas and libraries, clone our repository (fork from Open mHealth) from GitHub:
git clone https://github.com/SCAI-Lab/ord_schemas
# Follow further instructions in README.md
Ballistocardiogram (BCG)
The BCG schema represents waveform data from a specific lead with signal quality and temporal context. The BCGInfo schema describes metadata about the sensor and acquisition parameters.
JSON Schemas
BCG Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "BCG Data",
"description": "This schema represents bcg waveform data from a specific lead with signal quality and temporal context",
"type": "object",
"definitions": {
"time_frame": { "$ref": "time-frame-1.0.json" },
"time_interval": { "$ref": "time-interval-1.0.json" }
},
"properties": {
"session_id": {
"type": "string",
"description": "Session identifier matching BCGInfo's session_id"
},
"sample_size": {
"type": "integer",
"minimum": 0,
"maximum": 65535,
"description": "Number of samples in bcg and signal_quality arrays"
},
"bcg": {
"type": "array",
"items": { "type": "number" },
"description": "Raw or filtered BCG values"
},
"signal_quality": {
"type": "array",
"items": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"description": "Signal quality values from 0 (poor) to 1 (excellent)"
}
},
"required": ["session_id", "sample_size", "bcg", "signal_quality"]
}
BCGInfo Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "BCGInfo",
"description": "Metadata describing BCG data acquisition parameters and sensor characteristics.",
"type": "object",
"definitions": {
"device_info": {
"type": "object",
"description": "Device information details",
"properties": {
"manufacturer": { "type": "string" },
"model": { "type": "string" },
"serial_number": { "type": "string" }
},
"required": ["manufacturer", "model"]
},
"filter_base": {
"type": "object",
"description": "Filter metadata",
"properties": {
"filter_type": { "type": "string" },
"cutoff_frequency_hz": { "type": "number" },
"order": { "type": "integer" }
}
}
},
"properties": {
"device_info": { "$ref": "#/definitions/device_info" },
"session_id": {
"type": "string",
"description": "Session identifier linking to BCG data"
},
"sampling_frequency": {
"type": "number",
"minimum": 0,
"description": "Sampling frequency in Hz"
},
"window_size_samples": {
"type": "integer",
"minimum": 1,
"description": "Number of samples per BCG message"
},
"quality_window_size_samples": {
"type": "integer",
"minimum": 1,
"description": "Number of samples per quality value"
},
"units": {
"type": "string",
"enum": ["UNIT_UNKNOWN", "UNIT_MV", "UNIT_UV", "UNIT_COUNTS", "UNIT_M_S2", "UNIT_NEWTON"],
"description": "Units for the BCG data"
},
"gain": {
"type": "number",
"description": "Multiplicative factor (e.g., µV/count); set to 1.0 if signal is already scaled"
},
"adc_resolution": {
"type": "integer",
"minimum": 1,
"maximum": 32,
"description": "ADC resolution in bits"
},
"sensor_placement": {
"type": "string",
"enum": [
"PLACEMENT_UNKNOWN", "PLACEMENT_CHEST", "PLACEMENT_BACK", "PLACEMENT_MATTRESS",
"PLACEMENT_CHAIR", "PLACEMENT_ANKLE", "PLACEMENT_FOOT", "PLACEMENT_WRIST",
"PLACEMENT_ARM", "PLACEMENT_DESK", "PLACEMENT_CLOTHING", "PLACEMENT_CUSTOM"
],
"description": "Physical placement of the sensor"
},
"sensing_direction": {
"type": "string",
"enum": [
"DIRECTION_UNKNOWN", "DIRECTION_DORSO_VENTRAL", "DIRECTION_LONGITUDINAL",
"DIRECTION_MEDIO_LATERAL", "DIRECTION_CUSTOM"
],
"description": "Direction of sensing axis"
},
"sensing_modality": {
"type": "string",
"enum": [
"MODALITY_UNKNOWN", "MODALITY_PIEZOELECTRIC_FILM", "MODALITY_FORCEPLATE",
"MODALITY_ACCELEROMETER", "MODALITY_PIEZOELECTRIC_CRYSTAL", "MODALITY_CUSTOM"
],
"description": "Sensor modality"
},
"measurement_system": {
"type": "string",
"enum": ["SYSTEM_UNKNOWN", "SYSTEM_STARR", "SYSTEM_NICKERSON", "SYSTEM_DOCK", "SYSTEM_CUSTOM"],
"description": "Measurement system used"
},
"filter": { "$ref": "#/definitions/filter_base" }
},
"required": [
"device_info", "session_id", "sampling_frequency", "window_size_samples",
"quality_window_size_samples", "units", "gain", "adc_resolution",
"sensor_placement", "sensing_direction", "sensing_modality", "measurement_system"
]
}
ROS 2 Message Definitions
BCG.msg
std_msgs/Header header
string session_id # Match BCGInfo's session_id
uint16 sample_size
float32[] bcg # Raw or filtered BCG values
float32[] signal_quality # From 0 (poor) to 1 (excellent)
BCGInfo.msg
DeviceInfo device_info
string session_id
float32 sampling_frequency # Hz
uint32 window_size_samples # Number of samples per BCG.msg
uint32 quality_window_size_samples # Number of samples per quality value
# Units Enum
uint8 UNIT_UNKNOWN = 0
uint8 UNIT_MV = 1 # Millivolts (less common for BCG)
uint8 UNIT_UV = 2 # Microvolts (biopotential signals, maybe less common for BCG)
uint8 UNIT_COUNTS = 3 # Raw ADC counts
uint8 UNIT_M_S2 = 4 # Meters per second squared
uint8 UNIT_NEWTON = 5 # Newtons (force)
uint8 units # e.g., UNIT_MV
float32 gain # Multiplicative factor
uint8 adc_resolution # Bits (e.g., 12, 16)
# Sensor Placement Enum
uint8 PLACEMENT_UNKNOWN = 0
uint8 PLACEMENT_CHEST = 1
uint8 PLACEMENT_BACK = 2
uint8 PLACEMENT_MATTRESS = 3
uint8 PLACEMENT_CHAIR = 4
uint8 PLACEMENT_ANKLE = 5
uint8 PLACEMENT_FOOT = 6
uint8 PLACEMENT_WRIST = 7
uint8 PLACEMENT_ARM = 8
uint8 PLACEMENT_DESK = 9
uint8 PLACEMENT_CLOTHING = 10
uint8 PLACEMENT_CUSTOM = 255
uint8 sensor_placement
# Sensing Direction Enum
uint8 DIRECTION_UNKNOWN = 0
uint8 DIRECTION_DORSO_VENTRAL = 1 # Front to back
uint8 DIRECTION_LONGITUDINAL = 2 # Head to toe
uint8 DIRECTION_MEDIO_LATERAL = 3 # Side to side
uint8 DIRECTION_CUSTOM = 255
uint8 sensing_direction
# Sensing Modality Enum
uint8 MODALITY_UNKNOWN = 0
uint8 MODALITY_PIEZOELECTRIC_FILM = 1
uint8 MODALITY_FORCEPLATE = 2
uint8 MODALITY_ACCELEROMETER = 3
uint8 MODALITY_PIEZOELECTRIC_CRYSTAL = 4
uint8 MODALITY_CUSTOM = 255
uint8 sensing_modality
# Measurement System Enum
uint8 SYSTEM_UNKNOWN = 0
uint8 SYSTEM_STARR = 1
uint8 SYSTEM_NICKERSON = 2
uint8 SYSTEM_DOCK = 3
uint8 SYSTEM_CUSTOM = 255
uint8 measurement_system
FilterBase filter
Recent Highlights
- 🏥 Symposium: "Toward the Next Standard for Medical Wearables in Switzerland."
- 📊 E-Survey with 31 participants from academia, clinics, and industry.
- 🛠 GitHub repo containing new data schemas.