見出し画像

[HealthKit] watchOSで心電図(ECG)を取得する

Apple Watchでの心電図測定機能は、シリーズ4 / watchOS 5の頃から利用可能だったが(※)、iOS 14 / watchOS 7からはHealthKitに新APIが追加され、プログラムから心電図データにアクセスできるようになった。

画像2

※米国など利用可能地域に制限あり。日本で利用可能になったのはつい最近

ハードウェアとしては Apple Watch Series 4、Series 5、Series 6が対応している。

標準でインストールされている心電図 Appを用いた計測方法は以下:

人差し指でデジタルクラウンに触れた状態で計測する。

画像1

HealthKitではHKElectrocardiogramという新クラス(Electrocardiogramは「心電図」の意)を使用することでこの心電図の計測データを取得できる。

https://developer.apple.com/documentation/healthkit/hkelectrocardiogram

An HKElectrocardiogram is a collection of voltage values representing waveforms from one or more leads. The HKElectrocardiogram sample provides high-level details about the ECG reading, such as the sampling frequency or classification.
(HKElectrocardiogramは、1つまたは複数のリードからの波形を表す電圧値の集合体です。HKElectrocardiogram サンプルは、サンプリング周波数や分類など、ECG 読み取りに関する高レベルの詳細を提供します。)

なお、「計測の実行」自体は公式アプリからしかできないようだ。

HealthKit provides read-only access to electrocardiogram (ECG) data saved by Apple Watch.
(HealthKitは、Apple Watchで保存された心電図(ECG)データへの読み取り専用のアクセスを提供します。)

簡単な実装方法がこのリファレンスページに載っている。本記事ではその実装に関する諸々を書いていく。

なお、HealthKit × watchOSの基本実装としてはこちらのOSSを参考にするといいと思う。watchOS 2と冠しているが、多くの実装がwatchOS 7でもそのまま使える。

心電図データを取得する

取得したいデータのタイプとしてHKElectrocardiogramTypeを指定してクエリ(HKSampleQuery)を生成し、実行(execute)するだけ。

// Create the electrocardiogram sample type.
let ecgType = HKObjectType.electrocardiogramType()


// Query for electrocardiogram samples
let ecgQuery = HKSampleQuery(sampleType: ecgType,
                            predicate: nil,
                            limit: HKObjectQueryNoLimit,
                            sortDescriptors: nil) { (query, samples, error) in
   if let error = error {
       // Handle the error here.
       fatalError("*** An error occurred \(error.localizedDescription) ***")
   }
   
   guard let ecgSamples = samples as? [HKElectrocardiogram] else {
       fatalError("*** Unable to convert \(String(describing: samples)) to [HKElectrocardiogram] ***")
   }
   
   for sample in ecgSamples {
       // Handle the samples here.
       
   }
}

// Execute the query.
healthStore.execute(ecgQuery)​

HKSampleQueryは従来から(HealthKitが登場したiOS 8から)あるAPIなので、タイプとしてHKElectrocardiogramTypeが加わった以外、何ら新しい要素はない。

ここでresultsHandlerのsamples引数から、HKElectrocardiogramオブジェクトの配列が得られる。

心房細動 (AFib) の判定

HKElectrocardiogramのclassificationプロパティからHKElectrocardiogram.Classification型のenum値を取得できる。

public enum Classification : Int {
   case notSet = 0
   case sinusRhythm = 1
   case atrialFibrillation = 2
   case inconclusiveLowHeartRate = 3
   case inconclusiveHighHeartRate = 4
   case inconclusivePoorReading = 5
   case inconclusiveOther = 6
   case unrecognized = 100
}

自分で計測してみた結果では`sinusRhythm`が得られた。

The sample exhibits no signs of atrial fibrillation. (サンプルには心房細動の兆候は見られない。)

平均心拍数の取得

取得した心電図内における平均心拍数が、HKElectrocardiogramのaverageHeartRateより取得できる。

var averageHeartRate: HKQuantity? { get }

電圧値を取得する

前述のようにして取得したHKElectrocardiogramオブジェクトから、さらにHKElectrocardiogramQueryを利用して次のように電圧値を取得できる。

// Create a query for the voltage measurements
let voltageQuery = HKElectrocardiogramQuery(ecgSample) { (query, result) in
   switch(result) {
   
   case .measurement(let measurement):
       if let voltageQuantity = measurement.quantity(for: .appleWatchSimilarToLeadI) {
           // Do something with the voltage quantity here.

       }
   
   case .done:
       // No more voltage measurements. Finish processing the existing measurements.

   case .error(let error):
       // Handle the error here.

   }
}

// Execute the query.
healthStore.execute(voltageQuery)

結果を処理するクロージャで次のようにprintすると、

case .measurement(let voltageMeasurement):
   if let voltageQuantity = voltageMeasurement.quantity(for: .appleWatchSimilarToLeadI) {
       print("voltage:\(voltageQuantity)")
   }
   
case .done:
   print("done")

実行時にドバーッと電圧値が出力される。

...
voltage:-11.8911 mcV
voltage:-14.4115 mcV
done

その数15000以上(15349)。これはHKElectrocardiogramのnumberOfVoltageMeasurementsプロパティの出力値と一致していた。

またHKElectrocardiogramのsamplingFrequencyを出力したところ、511.617 Hzとなった。計測時間は30秒程度ということになる。

ここから先は

0字
昨年は書籍という形にまとめましたが、今年はこのマガジンに集約することにしました。 最初は記事が少ないので格安から開始して、充実してくるごとに本来あるべき価格に戻していく予定です。というわけで早いうちに買うと非常にお得です。 昨年の書籍は約80ページ+本に載せなかった事項もたくさん、ということで最終的にはそれなりの量になるのではと思います。

堤がWWDC 2020およびiOS 14についてセッションやサンプルを見つつ勉強したことを記事にしていくマガジンです。NDAの都合上、Ap…

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/