2014-12-26 2 views
0

iDevice의 태도를 사용하려고합니다. self.motionManager.deviceMotion.attitude.quaternion 장치가 테이블에 놓여 있지만 값이 동일하지 않습니다. 나쁜 회전을 일으키지 않고이 값을 안정화시키는 방법? 나는 장치 태도를 사용하여 카메라 노드를 회전시키고 있습니다. 낮은 주파수들에서 센서 입력의 고주파 신호 (노이즈, 임의 흔들리는) (고의적 사용자의 움직임)을 분리하는 방법 -iDevice 태도 : 쿼터니온 안정화

(x = -0.0055437298906573507, y = -0.0078092851375721247, z = -0.041180405121897398, w = 0.999105828407855) 
(x = -0.0061666945840810842, y = -0.0067849414785486747, z = -0.041464744435584115, w = 0.99909789881469635) 
(x = -0.0057767614213563457, y = -0.0075097232630314727, z = -0.041803806548186787, w = 0.99908091506248087) 
(x = -0.0054897030127900098, y = -0.0077124534854605253, z = -0.04219926058901851, w = 0.99906436410664467) 
(x = -0.0052714642886002782, y = -0.0078368692177714049, z = -0.042675299607953819, w = 0.99904435034111316) 
(x = -0.0050140321661910547, y = -0.0078121993123853265, z = -0.043041870709832147, w = 0.99903014288315972) 
(x = -0.0050055928591862253, y = -0.0077335374133680208, z = -0.043505056503552082, w = 0.99901073392523531) 
(x = -0.0049666831093899792, y = -0.007717140215596976, z = -0.043913562364765651, w = 0.99899318158145256) 
(x = -0.0047768022686966614, y = -0.0078160798819143576, z = -0.044274861496884942, w = 0.99897739098280313) 
(x = -0.0047310514463435671, y = -0.0078007790545880336, z = -0.044670164461142137, w = 0.9989601300379195) 
(x = -0.004618244779613233, y = -0.0078641769042355775, z = -0.045003270721875412, w = 0.99894520978936451) 
(x = -0.0049526705779270597, y = -0.0076127708990477733, z = -0.045411652395276572, w = 0.99892707371465494) 
(x = -0.0053219441444451315, y = -0.0074858231291817018, z = -0.045723089011719641, w = 0.99891192729581401) 
(x = -0.0056345717154138147, y = -0.0073613453524927486, z = -0.046005287981812061, w = 0.99889818083421522) 
(x = -0.0056064974434034201, y = -0.0074105820596984404, z = -0.046130222648849362, w = 0.99889221291304886) 
(x = -0.0053487406143112462, y = -0.0076910190187535112, z = -0.046331716108766401, w = 0.99888218088156866) 


    self.motionManager = [[CMMotionManager alloc] init]; 
    self.motionManager.deviceMotionUpdateInterval = 1.0/20.0; 
    [self.motionManager startDeviceMotionUpdates]; 

답변

2

은 무엇 당신이 찾고있는 것은 low pass filter입니다.

실시간 필터의 일반적인 공식은 다음과 같이 진행됩니다이다

newValue = (sampledValue * factor) + (lastValue * (1 - factor)) 

, 당신은 NEWVALUE이sampledValue의 선형 보간법 (필터링 입력을 사용할 겁니다) 도착 (미가공 센서로부터 입력) 및 lastValue (이전의 시간 단계에서 계산 된 NEWVALUE 상기 제 1 연산에 재치 무언가를 초기화해야)는 인자 그 제어 방식으로, 얼마나 멀리 블렌드를 따라 갔는지. 요소을 조정하여 필터를 통과하는 신호의 양을 제어 할 수 있습니다.

넌 아마 X, Y, Z 및 쿼터니언의 w 요소 각각에 개별적으로이 수식을 적용하고, 막연히 무난 결과를 얻을 수 있었다. 그러나 a) 같은 코드를 4 번 쓰는 것은 그렇게 재미 있지 않습니다. b) quaternions는이 방법이 시간이 지남에 따라 분해되도록하는 특수 수학을 가지고 있습니다.

대신 CMQuaternionGLKQuaternion으로 만들고 GLKQuaternionSlerp을 한 번 호출하여 혼합 할 수 있습니다. (그리고 마음 당신을위한 특별한 수학.)

filteredAttitude = GLKQuaternionSlerp(lastAttitude, sampledAttitude, factor) 

는 그런 다음 GLKQuaternion에서 SCNQuaternion을하고 당신은 당신의 노드의 방향을 설정할 수 있습니다.

+0

와우! 그것은 눈을 뜨게 해답입니다! 그건 내 문제를 해결했다. 나는 그것을 올바르게하기 위해 며칠 동안 노력해 왔습니다. –