私はBluetoothチェストストラップから心拍数データを収集するiOSフィットネスアプリを持っています。私は最近、Apple Watchエクステンションを追加し、胸のストラップの代わりに時計の心拍センサーに触れました。残念ながら、私はそれが基本的に役に立たないほど不正確であることを発見しました。ここでは赤い線胸部ストラップから収集されたデータを示し、青い線は、Appleウォッチから収集されたデータを示し、3マイルのハイキングの例です:Appleからの心拍数データがきわめて不正確
私はチェストストラップデータを伝えることができますこの2つの方程式の方が正確です。なぜなら、標高データに重ね合わせると、高い心拍数が上のセクションに非常によく一致するからです。 (また、アップルウォッチのように、私の心拍数が60から120、または110から160に飛ぶとは思わないでしょう...)
ここにあります私は時計のデータを収集するために使用しているコードです。より正確なデータを取得するためにこれを設定する別の方法がありますか、それともこのハードウェアで得られるのと同じくらいですか?
- (void)startWorkoutSession {
if (self.workoutSession) {
return;
}
// configure a HealthKit workout
HKWorkoutConfiguration *configuration = [[HKWorkoutConfiguration alloc] init];
configuration.activityType = HKWorkoutActivityTypeHiking;
configuration.locationType = HKWorkoutSessionLocationTypeOutdoor;
// start the workout
NSError *error = nil;
self.workoutSession = [[HKWorkoutSession alloc] initWithConfiguration:configuration error:&error];
if (!self.workoutSession) {
//NSLog(@"*** Unable to create the workout session: %@ ***", error.localizedDescription);
NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:
@"createWorkoutSession", @"error",
error.localizedDescription, @"description",
nil];
[self.iosApp sendMessage:data replyHandler:nil errorHandler:^(NSError * _Nonnull error) {
// maybe show a local alert here?
}];
return;
}
self.workoutSession.delegate = self;
[self.healthStore startWorkoutSession:self.workoutSession];
// update the controls view and show the tracking view
self.controls.status = StatusStarted;
if (![self.activeController isEqual:self.tracking]) {
[self.tracking becomeCurrentPage];
}
}
- (void)workoutSession:(HKWorkoutSession *)workoutSession didChangeToState:(HKWorkoutSessionState)toState fromState:(HKWorkoutSessionState)fromState date:(NSDate *)date {
// required method
if (toState == HKWorkoutSessionStateRunning) {
[self requestHeartRate:date];
}
}
- (void)requestHeartRate:(NSDate *)date {
__weak typeof(self) weakSelf = self;
NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:date endDate:nil options:HKQueryOptionNone];
HKSampleType *heartRateType = [HKSampleType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
HKAnchoredObjectQuery *query = [[HKAnchoredObjectQuery alloc] initWithType:heartRateType predicate:predicate anchor:0 limit:0 resultsHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *samples, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *anchor, NSError *error) {
if ((!error)&&(samples.count > 0)) {
[weakSelf receiveHeartRate:(HKQuantitySample *)[samples objectAtIndex:0]];
} else {
NSLog(@"error with initial heart rate query: %@", error);
}
}];
[query setUpdateHandler:^(HKAnchoredObjectQuery *query, NSArray<HKSample *> *samples, NSArray<HKDeletedObject *> *deletedObjects, HKQueryAnchor *anchor, NSError *error) {
if ((!error)&&(samples.count > 0)) {
[weakSelf receiveHeartRate:(HKQuantitySample *)[samples objectAtIndex:0]];
} else {
NSLog(@"error with updated heart rate query: %@", error);
}
}];
[self.healthStore executeQuery:query];
}
- (void)receiveHeartRate:(HKQuantitySample *)sample {
HKQuantity *quantity = sample.quantity;
int value = (int)[quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]];
//NSLog(@"got heart rate %i", value);
// display the heart rate in the tracking view
[self.tracking updateHeartRate:value];
}
更新:
私はAppleの時計から期待すべき精度の指標としてthis comparison chartを見ていました。今はアップルウォッチと別のウォッチベースの(手首)センサーを比較していることに気付きました。だからおそらくそのチャートは、両方の手首ベースのモデルが同様に不正確であることを示しているに過ぎません。
ウェブで「Apple watch heart rate accuracy」を検索し、それがどれほど正確であるかについての多くのストーリーを見つけることができますが、誰も私が見ているような結果を表示していません。
私はこのテストのためにかなり窮屈な腕時計を持っていました。 – arlomedia
手首ベースの心臓モニターは、常に胸に装着されたモデルよりも精度が低くなります。 Appleだけが生データをより良くすることができますが、生の値を直接使用するのではなく、最後のN回の測定の平均を使用してみることもできます。 –
@TomHarrington、素晴らしいアイデア。私はテストデータで5分のローリング平均を試しましたが、悲しいことに、表示された値は1分に25-50bpmだけ離れていました。期間が短いと、生の時計データと基本的に一致するデータが得られました。私は、このようなデータが正しいよりもしばしば間違っているのではなく、偶発的なアウトライヤーをクリーンアップする方が良いと考えています。 – arlomedia