블루투스 가슴 끈에서 심박수 데이터를 수집하는 iOS 피트니스 앱이 있습니다. 최근에 Apple Watch 확장 기능을 추가하고 가슴 끈의 대안으로 시계의 심박 센서를 사용했습니다. 불행히도, 나는 그것이 기본적으로 쓸모없는만큼 부정확하다는 것을 발견했습니다.심박수 데이터 Apple에서 몹시 부정확하게 보임
나는 가슴 스트랩 데이터를 말할 수있다 : 여기에 레드 라인이 가슴 스트랩과 블루 라인으로부터 수집 된 데이터를 표시하는 3 마일 하이킹의 예는 애플 시계에서 수집 된 데이터를 보여줍니다이다 이 둘 중 더 정확한 것입니다. 왜냐하면 고도 데이터에 오버레이 될 때 높은 심장 박동수가 오르막 구간과 매우 밀접하게 관련되기 때문입니다. (또한 Apple Watch에서 볼 수 있듯이 내 심장 박동수가 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];
}
업데이트 :
은 내가 애플 시계 기대한다 정확도의 표시로 this comparison chart보고 있었다. 이제는 Apple Watch를 다른 시계 기반 (손목) 센서와 비교하는 것만 알았습니다. 아마도이 차트는 두 손목 기반 모델 모두 유사하게 부정확하다는 것을 보여줍니다.
웹에서 "Apple watch heart rate accuracy"를 검색하고 그것이 얼마나 정확한지에 대한 많은 이야기를 찾을 수 있기 때문에 혼란 스럽습니다.하지만 아무도 내가보기에는 꽤 가난하다고 생각하는 결과를 보여주지 못합니다.
나는이 테스트를 위해 아주 단단히 묶은 시계를 가지고있었습니다. – arlomedia
손목에 기반한 심장 모니터는 항상 가슴 착용 모델보다 덜 정확합니다. Apple 만 원시 데이터를 더 잘 만들 수 있지만 원시 값을 직접 사용하는 대신 마지막 N 개 측정의 평균을 사용하여 시도해 볼 수 있습니다. –
@TomHarrington, 좋은 생각입니다. 테스트 데이터에 대해 5 분의 롤링 평균을 시도했지만 슬프게도 표시된 값은 한 번에 분당 25-50 bpm 정도 벗어났습니다. 기간이 짧으면 기본적으로 원시 시계 데이터와 일치하는 데이터가 생성되었습니다. 나는이 접근법이 때로는 특이점을 제거하는 것이 더 낫다고 생각한다. – arlomedia