- CoreMotion - Swift2023년 04월 29일
- 2료일
- 작성자
- 2023.04.29.:22
CoreMotion은 가속도계, 자이로스코프 등을 처리하는 프레임워크이다.
CoreMotion 프레임워크에 있는 것으로서 ios기기 모션센서에 접근할수 있게 해준다. 가속도계가 사용가능한지 확인하구 가능하면 업데이트 간격을 0.1초로 잡고 메인큐에서 업데이트 받는다. data에 가속도계 데이터 포함. 업데이트 사용 끝나면 중지해야함.
1, gyroscope: 핸드폰의 회전을 측정한다.
2. MagnetoMeter : 자기계 측정.
3. Device Motion: 디바이스 가속도, 회전, 중력, 자기력 정보가 담겨져 있음.
4. Accelerometer : 가속도 측정
그런데 여기서 궁금증이 생겼다. 언제 어떤것을 사용하는게 옳을까? 특히 3.4가 헷갈렸다. 그래서 리서치를 진행한 결과
3. DeviceMotion의 데이터는 가속도계, 자이로스코프, 자기계 이 셋센서를 퓨전한 결과값이 나온다. 그러므로 bias, error 값이 삭제되어나온다. 가속도계는 사용자가 편리하계 중력따로 가속도 따로 나온다.
4. Accelerometer는 현재 중력과디바이스 가속도 등 모든 측정된 가속도들의 합이 데이터이다.
CMDeviceMotion.userAcceleration + CMDeviceMotion.gravity = CMAccelerometerData.acceleration
하드웨어와 독립적으로 정확한 값을 나오게 할 수 있는것이 DeviceMotion이므로 주로 쓰인다. 고로 이 밑에서부터는 이걸 팔꺼야
0. isDeviceMotionAvailable를 통해 가능한지 체크하는게 필수!
1.startDeviceMotionUpdates()를 통해 시스템은 필요한 하드웨어를 활성화하고 CMMotionManager객체의 deviceMotion속성을 업데이트 하기 시작한다.
2. 하지만 시점을 알려주지 않으므로 deviceMotionUpdateInterval를 통해 업데이트 주기를 할당해줄수 있다. 보편적으로는 적어도 100Hz.
3. showsDeviceMovementDisplay= true 를 통해 모션추적을 통해 시작포인트를 정확하게 display해줄수 있다.
- 만약 devicemotion들을 생성이되면 저장하고 싶다면 startDeviceMotionUpdates 핸들러를 이용하면된다. 이것은 특정큐에 각각의 새로운 데이터셋들을 넣어준다. 그래서 만약 지금 내 앱이 바쁘고 프로세스가 불가능하더라도 나의 앱이 모든 모션데이터를 저장할수 있게해준다. !!
func startQueuedUpdates() { if motion.isDeviceMotionAvailable { self.motion.deviceMotionUpdateInterval = 1.0 / 60.0 self.motion.showsDeviceMovementDisplay = true self.motion.startDeviceMotionUpdates(using: .xMagneticNorthZVertical, to: self.queue, withHandler: { (data, error) in // Make sure the data is valid before accessing it. if let validData = data { // Get the attitude relative to the magnetic north reference frame. let roll = validData.attitude.roll let pitch = validData.attitude.pitch let yaw = validData.attitude.yaw // Use the motion data in your app. } }) } }
CMAttitude : 참조프레임을 통해기기의 실제방향을 알수있다. (1. 오일러각, 2.쿼터니언, 3. 회전행렬)
오일러각이 가장 읽기 편함. Pitch : x축 회전(앞이 증가), roll : y축회전(오른쪽증가) , yaw : Z축 회전(수직. 반시계 증가) => 오른손법칙
진짜 큰일났다. 여기서 오일러고 뭐고 하나도 모르겠다. 수학을 해야하나... 일단 뒤쪽으로 더 해보자
userAcceleration은 유저가 디바이스에 주는 가속도고 gravity는 디바이스가 받는 중력.
그 외에도 보폭측정, 떨어짐측정, 잠수측정 등 할수 있는게 core motion안에 너무나 많다. 하지만 내가 지금 필요한것은
핸드폰ㄱㅣ 울기에 따라 공을 움직이는 것을 구현하고 싶어서 이것을 쓰기에 userAcceleration과 gravity에만 초점을 맞춰 공부를 할거 같다.
// // TiltView.swift // Haptic // // Created by 235 on 2023/04/29. // import SwiftUI import CoreMotion struct TiltView: View{ var motionManager = CMMotionManager() @State var motionx : Double = 0.0 @State var rotatex: Double = 0.0 @State var ball1Position: CGPoint = .zero @State var ball2Position: CGPoint = .zero @State var ball3Position: CGPoint = .zero @State var pitch = Double.zero @State var yaw = Double.zero @State var rolll = Double.zero @State var devicegravity : CMAcceleration = .init(x: 0, y: 0, z: 0) @State var userAccleration : CMAcceleration = .init(x: 0, y: 0, z: 0) var body: some View{ GeometryReader{ geo in ZStack{ Rectangle() .stroke(Color.white.opacity(0.8), lineWidth: 2) .frame(width: geo.size.width, height: geo.size.height).rotationEffect(Angle(degrees:motionx*90)) .position(x:geo.frame(in: .local).midX,y: geo.frame(in: .local).midY) VStack{ Text("Pitch: \(pitch)") Text("yaw: \(yaw)") Text("roll: \(rolll)") Text("motionx \(motionx)") Text("\(userAccleration.x)") Text("Rotatex\(rotatex)") }.position(x:geo.frame(in: .local).midX,y: geo.frame(in: .local).midY) } }.onAppear { if motionManager.isDeviceMotionAvailable { motionManager.deviceMotionUpdateInterval = 0.1 motionManager.startDeviceMotionUpdates(to: OperationQueue.main){ (data ,err) in guard let data = data else{return} DispatchQueue.main.async { self.pitch = data.attitude.pitch self.rolll = data.attitude.roll self.yaw = data.attitude.yaw } motionx = (data.gravity.x) rotatex = data.rotationRate.x userAccleration = (data.userAcceleration) } } } } }
미안합니다 머가뭔지 1도모르겠어서 일단 다 때려박으면서 기기로 돌리면서 테스트 해봤어요. 하다보니 나는 기기를 왼오른으로 기울이는것만 원하는데 그에 해당하는 것이 바로 gravity였다. 그런데 90도만큼 왼쪽으로 돌리면 -1. 90도만큼 오른쪽으로 돌리면 1.
그래서 *90으로 해주엇다. 왜? 난 수학을 못해.. 파이 기억안나... 피의 게임2에 파이 참여했다더라
아직 수정할거 천지다. 전체적으로 아직도 이해를 못했다.. 좀더 해보자 화이팅
'SWIFT개발' 카테고리의 다른 글
weak, unowned (0) 2023.05.29 MVVM,MVC pattern 좋나요 - swiftui (0) 2023.05.04 Spritekit with swiftui(1) (0) 2023.05.01 Metal - swift (0) 2023.04.22 Swift? 난 이걸 왜 하지? (자기소개 포함) (2) 2023.04.04 다음글이전글이전 글이 없습니다.댓글