MEDWEAR

Open, Interoperable Standards for Medical Wearables


🚧 This website is currently under construction. Some content may be incomplete. 🚧

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.