2012-11-28 5 views
5

현재 나의 프로젝트에서 나는 Core Motion의 CMAttitude가 제공 한 쿼터니온에 관해 문제를 겪었다. 나는 iPhone 5 (iOS 6.0.1)를 잘 정의 된 시작 위치에 두었습니다. 그런 다음 빠른 페이싱 게임에서와 같이 기기를 빠르게 움직이기 시작합니다. 10-30 초 후 시작 위치로 돌아 가면보고 된 요 각도는 시작 위치와 10-20도 (대부분 ≈11 °)가 다릅니다.빠른 이동 후 요동각

효과를 확인하기 위해 오래된 (그리고 슬프게도 더 이상 사용 가능하지 않은) Core Motion Teapot 샘플을 사용했습니다. 오일러 각도는 로깅 CMAttitude에서 직접 읽기 :

Start PositionSame place after 15 seconds

 NSLog(@"pitch: %f, roll: %f, yaw: %f", attitude.pitch * 180/M_PI, attitude.roll * 180/M_PI, attitude.yaw * 180/M_PI); 

내가 다른 공장에서 서로 다른 시간에 제조 된 두 개의 서로 다른 아이폰 5 기기에이를 발견했다. 하지만 정말 이상한 것은 내 아이폰 4, 아이폰 OS 5.1.1을 실행하는 것이 예상대로 작동하고 있다는 것입니다.. 나에게 iOS 버그가있는 것 같아서 벌써 버그 리포트를 제출했지만 다른 한편으로는 아무도 아직 우연히 발견되지 않았다는 것을 거의 상상할 수 없다. 재 설계된 Core Motion API와 관련이 있을지도 모릅니다. 버전 5부터 자력계 (나침반)가 센서 퓨전으로 간주됩니다.

locationd[41] <Notice>: GYTT inserted: bias,-0.196419,1.749323,-1.828088,variance,0.002644,0.004651,0.002527,temperature,31.554688 

내 질문 (들) : 장치의 모션을 사용하는 경우 자력계 판독을 차단하는 기회가를 콘솔 locationd에서 바이어스 추정이 CoreMotion에 제공되는 것을 알 수? 위치 서비스를 비활성화하려고했지만 Core Motion에는 영향을 미치지 않습니다. 가능하지 않다면 대안/해결 방법은 무엇입니까? 가속도계 기반 중력 추정?

추신 : 단지 요 영향을 것이 분명 보인다 좀 더 측정을 수행 한 후 : 우리는 사원 수를 기반으로 모델을 다루고있는 것처럼이 하지 짐벌 잠금

편집 관련이있다. 시작 위치에 관계없이 편주가 드리프트하는 동안 피치와 롤은 허용 편차 내에서 편차를 표시합니다 (< = 1 °). CMDeviceMotion.gravity도 깨끗하게 보입니다.

EDIT (012) : 최근 XCode 버전에 첨부 된 MotionGraphs 샘플로 문제를 재현 할 수 있습니다. 요잉 그래프는 원점에서 재현 가능하게 벗어납니다.

+1

Upvoted, 재미있는 문제! 네, 자력계에 대한 경험도 좋지 않았습니다. 편향 (편향을 유발합니다!)과 시끄러운 지옥 같은 경험이 있습니다. 나는 또한 자이로가 포화되기 쉽다는 것을 알아 냈다. 빠른 움직임. 용의자들로부터 채도를 빼낼 수있는 방법이 있습니까? – Ali

+0

@Ali 나는 길을 모른다. 그러나 iOS 5.1.1이 설치된 iPhone 4는 이전에 설치된 iOS 4.3과 마찬가지로 매력적이었습니다. 어둠 속에서 한 발 맞았지만 아이폰 OS 6이 탓할 것이라고 생각한다. – Kay

+0

누군가가 대답을 알기를 바랍니다. 도움을 드릴 수 없습니다. ( – Ali

답변

4

확실한 해결책은 아니지만 적어도 내 자신의 질문에 대한 해결책이 될 수 있습니다 (답장을 보내지 않은 상태로 남겨 둡니다). 적어도 DeviceMotion.gravity은 버그의 영향을받지 않는 것으로 밝혀졌습니다. 그래서 나는이 간단한 움직임 감지 부분을 재 설계하고 장치를 기울일 때 주 플레이어 캐릭터를 옆으로 움직이려면 arcsin (gravity.x/||gravity||)을 사용하기로 결정했습니다.

이것은 쿼터니언에 포함 된 전체 회전 상태에 대한 정보를 파괴하기 때문에 확실히 두 번째로 좋은 해결책입니다.

  1. 나는 대부분의 개발자는 대부분의 사람들이 관련 따라서 향후 버그 ;-) 사원 수 수학에 대한 그 즐겁게하지 않기 때문에 오히려 CMAttitude.quaternion보다 중력 벡터와 모션 감지를 기울 할 생각 : 나는 그것을 전략적 고려 사항에 대한 그런 식으로 결정 중력 벡터는 더 많은 사용자 수 때문에 베타 단계에서 고정 될 것입니다.
  2. 소프트웨어 버그이며 하드웨어 문제와 관련이없는 것으로 가정하고 버그가 최대한 빨리 수정되는 경우 어떤 이유로 든 업데이트되지 않을 수있는 많은 장치가 여전히 있습니다.따라서 잠재적 인 미래 고객이 문제를 일으킬 위험은 작지만 0보다 크므로 차선책이 가장 좋은 경우가 있습니다.
1

나는 내 자신의 코드에서 비슷한 작업을 수행했으며 동일한 z 축 회전 드리프트 (편주)를 발견했습니다. 밸런스 필터를 적용했습니다. 각 모션 관리자 시간 간격에서 현재 쿼터니온 (z- 컴포넌트)을 가져 와서 계산 한 후 oldZ로 저장하여 다음 계산 집합에 사용합니다. 필터를 사용하면 NEW z 값과 z 값의 균형을 미리 잡아서 너무 빨리 움직이지 않도록 할 수 있습니다. 하드웨어 및 프로그램의 정확한 허용 오차에 따라 이러한 방식으로 드리프트를 아주 잘 관리 할 수 ​​있습니다. 자이로 드리프트가 약간 보이지만 필터가 계속 작동하면서 보정되기 시작합니다. 내 필터는 다음과 같이 보이며 0.5도 이상의 "누광"을 방지합니다.

filtZ = 0.65 * oldZ + 0.35 * z;

0.65와 0.35 값은 실험적으로 결정되었으므로 시간이 지남에 따라 값을 가지고 놀 것을 권장합니다. 출력은 여전히 ​​0-1로 스케일링되며, 이전과 같은 방식으로 활용 될 수 있습니다 (또는 4 차원을 모두 유지해야하는 경우 쿼터니언으로 다시 도입됩니다).