[iOS] 자이로스코프 이벤트 Gyroscope Events

Madeline👩🏻‍💻·2023년 10월 3일
0

iOS study

목록 보기
18/61
post-custom-banner

https://developer.apple.com/documentation/coremotion/getting_raw_gyroscope_events

자이로스코프가 뭐야

iOS 장치에는 위 그림처럼 3개의 축 각각의 회전 값을 전달하는 3축 자이로스코프가 있다.
회전값은 지정된 축을 중심으로 초당 radian 단위로 측정된다.
회전값은 회전 방향에 따라 양수, 음수일 수 있다.

-> 스코프는 x, y, z축 주위의 회전 속도를 측정합니다.

CoreMotion 프레임워크의 클래스를 사용하여 원시 자이로스코프 데이터에 액세스한다.
특히 이 클래스는 자이로스코프 하드웨어를 활성화하기 위한 인터페이스를 제공한다.
하드웨어를 활성화할 때 앱에 가장 적합한 인터페이스를 선택하세요.

  • 필요할 때만 자이로스코프 데이터를 가져오거나 정기적으로 앱에 업데이트를 푸시하도록 프레임워크에 요청할 수 있습니다.
  • 각 기술에는 서로 다른 구성 단계가 포함되며 사용 사례도 다릅니다.
    🥐 CMMotionManager
    https://developer.apple.com/documentation/coremotion/cmmotionmanager

앱이 자이로스코프 하드웨어에 의존하는 경우 해당 파일 의 키를 값으로 구성하세요. 이 키의 의미에 대한 자세한 내용은 정보 속성 목록 키 참조 를 참조하세요 .UIRequiredDeviceCapabilitiesInfo.plistgyroscope
https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html

자이로스코프 인터페이스에서 전달되는 원시 회전 속도 데이터는 온도와 같은 다른 요인에 의해 편향될 수 있습니다.
앱에 편향되지 않은 회전 값이 필요한 경우 대신 기기 모션 인터페이스를 사용하세요.
장치 모션 인터페이스는 특수 알고리즘을 사용하여 편향을 제거하고 보다 정확한 회전 값을 제공합니다. 자세한 내용은 처리된 장치 동작 데이터 가져오기를 참조하세요.
https://developer.apple.com/documentation/coremotion/getting_processed_device-motion_data

다양한 장치 유형의 좌표축에 대한 자세한 내용은 을(를) 참고하십시오.
🥐 CMMotionManager
https://developer.apple.com/documentation/coremotion/cmmotionmanager

자이로스코프 데이터의 가용성 확인

자이로스코프 데이터는 여러 가지 이유로 사용하지 못할 수 있으므로, 데이터를 얻으려고 하기 전에 데이터를 사용할 수 있는지 확인하십시오.
isGyroAvailableCMMotionManagertrue의 속성 값을 확인하고 true인지 확인하세요.
false이면 업데이트를 시작해도 앱에 데이터가 전달되지 않습니다.

🥐 https://developer.apple.com/documentation/coremotion/cmmotionmanager/1615951-isgyroavailable

VisionOS에서는 앱에 개방형 몰입형 공간이 있는 경우에만 자이로스코프 데이터를 사용할 수 있습니다. 자세한 내용은 을 참조하십시오.
🥐 ImmersiveSpace
https://developer.apple.com/documentation/swiftui/immersivespace

필요할 때만 자이로스코프 데이터 가져오기페이지 링크에서

게임과 같이 자체 일정에 따라 자이로스코프 데이터를 처리하는 앱의 경우 회전 데이터 전달을 시작하는 메서드를 사용합니다. 이 메서드를 호출하면 시스템은 자이로스코프 하드웨어를 활성화하고 개체 의 속성 업데이트를 시작합니다 . 그러나 시스템은 해당 속성을 업데이트할 때 이를 사용자에게 알리지 않습니다. 회전 데이터가 필요한 경우 속성 값을 명시적으로 확인해야 합니다.
startGyroUpdates()CMMotionManagergyroDataCMMotionManager

자이로스코프 업데이트 제공을 시작하기 전에 속성에 값을 할당하여 업데이트 빈도를 지정하세요. 업데이트를 요청할 수 있는 최대 주파수는 하드웨어에 따라 다르지만 일반적으로 최소 100Hz입니다. 하드웨어가 지원하는 것보다 더 큰 주파수를 요청하면 Core Motion은 지원되는 최대값을 대신 사용합니다.
gyroUpdateInterval

Listing 1은 자이로스코프 업데이트가 초당 50회 발생하도록 구성하는 방법을 보여줍니다. 그런 다음 메서드는 동일한 빈도로 해당 업데이트를 가져오고 데이터로 작업을 수행하도록 타이머를 구성합니다. 더 낮은 빈도로 타이머가 실행되도록 구성할 수 있지만 그렇게 하면 하드웨어가 실제로 사용된 것보다 더 많은 업데이트를 생성하게 되므로 전력이 낭비됩니다.

Listing 1 Fetching gyroscope data on demand

func startGyros() {
   if motion.isGyroAvailable {
      self.motion.gyroUpdateInterval = 1.0 / 50.0
      self.motion.startGyroUpdates()


      // Configure a timer to fetch the accelerometer data.
      self.timer = Timer(fire: Date(), interval: (1.0/50.0), 
             repeats: true, block: { (timer) in
         // Get the gyro data.
         if let data = self.motion.gyroData {
            let x = data.rotationRate.x
            let y = data.rotationRate.y
            let z = data.rotationRate.z


            // Use the gyroscope data in your app. 
         }
      })


      // Add the timer to the current run loop.
      RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
   }
}

func stopGyros() {
   if self.timer != nil {
      self.timer?.invalidate()
      self.timer = nil


      self.motion.stopGyroUpdates()
   }
}

꾸준한 자이로스코프 업데이트 스트림 처리

모든 자이로스코프 데이터를 캡처하여 움직임 패턴을 분석하려면 다음 방법을 사용하십시오 . 이 메서드는 지정된 대기열에서 핸들러 블록을 실행하여 각각의 새로운 회전 값 세트를 앱에 푸시합니다. 이러한 블록을 대기열에 추가하면 앱이 사용량이 많아 잠시 동안 업데이트를 처리할 수 없는 경우에도 앱이 모든 자이로스코프 데이터를 수신할 수 있습니다.startGyroUpdates(to:withHandler:)CMMotionManager

자이로스코프 업데이트 제공을 시작하기 전에 속성에 값을 할당하여 업데이트 빈도를 지정하세요 . 업데이트를 요청할 수 있는 최대 주파수는 하드웨어에 따라 다르지만 일반적으로 최소 100Hz입니다. 하드웨어가 지원하는 것보다 더 큰 주파수를 요청하면 Core Motion은 지원되는 최대값을 대신 사용합니다.gyroUpdateInterval

목록 2에서는 추가 컨텍스트를 조사할 수 있는 MotionGraphs 샘플 코드 프로젝트 의 메서드를 보여줍니다. 앱은 온보드 자이로스코프의 회전 데이터에 대한 실시간 그래프를 표시합니다.
사용자는 슬라이더를 사용하여 자이로스코프의 업데이트 빈도를 구성합니다.
이를 변경하면 예제에 표시된 메서드가 호출됩니다. startUpdatesWithSliderValue: 이 방법은 새로운 주파수로 자이로스코프 업데이트를 다시 시작합니다.
새로운 샘플이 수신될 때마다 지정된 블록이 기본 스레드의 대기열에 추가됩니다. 해당 블록은 앱의 그래프 보기와 레이블을 새로운 회전 값으로 업데이트합니다.

Listing 2 Accessing raw gyroscope data

static const NSTimeInterval gyroMin = 0.01;
- (void)startUpdatesWithSliderValue:(int)sliderValue {
   // Determine the update interval
   NSTimeInterval delta = 0.005;
   NSTimeInterval updateInterval = gyroMin + delta * sliderValue;


   // Create a CMMotionManager
   CMMotionManager *mManager = [(APLAppDelegate *)
            [[UIApplication sharedApplication] delegate] sharedManager];
   APLGyroGraphViewController * __weak weakSelf = self;


   // Check whether the gyroscope is available
   if ([mManager isGyroAvailable] == YES) {
      // Assign the update interval to the motion manager
      [mManager setGyroUpdateInterval:updateInterval];
      [mManager startGyroUpdatesToQueue:[NSOperationQueue mainQueue] 
               withHandler:^(CMGyroData *gyroData, NSError *error) {
         [weakSelf.graphView addX:gyroData.rotationRate.x 
                  y:gyroData.rotationRate.y 
                  z:gyroData.rotationRate.z];
         [weakSelf setLabelValueX:gyroData.rotationRate.x 
                  y:gyroData.rotationRate.y 
                  z:gyroData.rotationRate.z];
      }];
   }
   self.updateIntervalLabel.text = [NSString stringWithFormat:@"%f", updateInterval];
}
- (void)stopUpdates{
   CMMotionManager *mManager = [(APLAppDelegate *)
            [[UIApplication sharedApplication] delegate] sharedManager];
   if ([mManager isGyroActive] == YES) {
      [mManager stopGyroUpdates];
   }
}

요걸 활용해서 간단한 자이로스콮 측정기를 만들어보겠습니다

Gyroscope 측정기를 만들어보아요

이 데이터들로 기준만 잘 정하면 요것저것 잘 만들 수 있겠네여

이상 자이로스콮 찍먹이었습니다

profile
🍎 Apple Developer Academy@POSTECH 2기, 🍀 SeSAC iOS 4기
post-custom-banner

0개의 댓글