2012-11-28 17 views
5

Şu anki projemde Core Motion'ın CMAttitude tarafından sağlanan kuaternion ile ilgili bir sorun yaşadım. IPhone 5'i (iOS 6.0.1) iyi tanımlanmış bir başlangıç ​​konumuna getirdim. Daha sonra cihazı hızlı bir şekilde hızlı bir şekilde pacing oyunu gibi hareket ettirmeye başlarım. 10-30 saniye sonra başlangıç ​​konumuna geri döndüğümde, bildirilen sapma açısı başlangıç ​​pozisyonundan 10-20 dereceye kadar değişir (çoğu zaman ≈11 °).Hızlı hareket ettikten sonra bükülme açısı

Etkiyi doğrulamak için eski (ve ne yazık ki artık mevcut değil) Çekirdek Hareket Demlik örneğini kullandım. Euler Açıları günlük için CMAttitude doğrudan okunur:

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); 

farklı fabrikalarda farklı zamanlarda üretilen iki farklı iPhone 5 cihazlar üzerinde bulduk. Ama gerçekten garip IOS 5.1.1 çalıştıran benim iPhone 4, beklendiği gibi çalışıyor. Bana bir iOS hatası gibi geldi ve şimdiye kadar bir hata raporu verdim, ama öte yandan hiç kimsenin üzerine gelmediğini hayal bile edemiyorum. Yeniden tasarlanan Çekirdek Hareket API'siyle ilgisi olabileceğinden şüpheleniyorum. Versiyon 5 ile başlayarak magnetometre (pusula) sensör füzyonu için de düşünülmüştür.

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

sorum (ler): Cihaz Hareket kullanırken manyetometre okumaları engellemek için bir şans var mı Konsol LocationD gelen önyargı tahminleri CoreMotion verilmektedir göstermektedir? Yer hizmetlerini devre dışı bırakmayı denedim ancak Çekirdek Hareketi etkilemiyor. Mümkünse alternatif/geçici çözüm nedir, İvmeölçer bazlı yerçekimi kestirimi nedir?

Not: sadece yaw etkilendiğini açıkça görünüyor biraz daha ölçümleri yaptıktan sonra : Biz Dördey bazlı modelleri ile ilgileniyor gibi bu değil Gimbal Lock

DÜZENLEME akrabadır. Eğim ve rulo, tolerans dahilinde sapma gösterir (< = 1 °), yaw başlangıç ​​pozisyonundan bağımsız olarak sürüklenir. CMDeviceMotion.gravity da temiz görünüyor.

DÜZENLEME (2): Ben son XCode versiyonlarına bağlı MotionGraphs örneği ile sorunu yeniden başladı. Yaw grafiği, tekrarlanabilir şekilde kökenden uzaklaşıyor.

+1

Yetkisiz, ilginç bir konu! Evet, ayrıca manyetometre ile de kötü bir deneyimim oldu: (Önyargıya neden oluyor) ve cehennem gibi gürültülü. Ayrıca, gyro'yu doyurmanın kolay olduğunu da gördüm. hızlı hareketlerle. Şüphelilerden doygunluk çıkarmanın bir yolu var mı? – Ali

+0

@Ali Bir yol bilmiyorum. Ancak diğer yandan iOS 5.1.1 ile iPhone 4'üm daha önce yüklenmiş olan iOS 4.3 ile bir çekicilik gibi çalıştı. Karanlıkta bir atış ama IOS 6 suçlu olduğunu düşünüyorum. – Kay

+0

Birisi cevabı bilecek, üzgünüm Yardımcı olamayacağım :( – Ali

cevap

4

Kesin çözüm değil, en azından kendi sorduğum soru için bir çözüm (sizi davet etmek için yanıtsız bırakıyorum). En az DeviceMotion.gravity'un hatadan etkilenmediği ortaya çıktı. Bu nedenle, bu oldukça basit hareket algılama bölümünü yeniden tasarlamaya karar verdim ve cihazı eğerken ana oyuncu karakterini yana taşımak için arcsin (gravity.x/||gravity||)'u kullanın.

Bu, kuaternionda bulunan tam döndürme durumu hakkındaki bilgileri yok ettiği için kesinlikle en iyi ikinci çözümdür.

  1. Ben çoğu geliştirici çoğu insan ilişkin Böylece ileride böcek ;-) Dördey matematikte hakkında böyle eğlenerek değildir çünkü ziyade CMAttitude.quaternion daha yerçekimi vektörü ile hareket algılama eğin düşünüyorum: Ben buna stratejik değerlendirmeler için bu şekilde karar Daha fazla sayıda kullanıcı nedeniyle yerçekimi vektörü muhtemelen beta fazı sırasında sabitlenecektir.
  2. Bir yazılım hatasıysa ve donanım sorunları ile ilgili değilse, ne yazdığımı ve hatanın en kısa sürede düzeltilip düzeltilmeyeceği hâlâ, hangi nedenle herhangi bir nedenle güncellenemeyen bazı aygıtlar var demektir.Böylece, gelecekteki potansiyel müşterinin belaya girmesi riski çok küçüktür, ancak> 0'dır. Dolayısıyla en iyi ikinci çözüm bazen en iyisi olabilir.
1

Kendi kodumda benzer bir şey yaptım ve aynı z ekseni dönüşlü kaymasını (yaw) buldum. Dengeli bir filtre uyguladım. Her hareket yöneticisi zaman aralığında, mevcut kuaterniyonu (z-bileşeni) alıp, sonraki hesaplamalarda kullanmak için eskiz hesaplarından sonra kaydedin. Filtrem, NEW z değerini hemen önünüzdeki z değeriyle dengeler ve çok hızlı bir şekilde hareket etmesini engeller. Donanımınıza ve programınıza tam toleransınıza bağlı olarak, bu şekilde sürüklenmeyi iyi bir şekilde yönetebilirsiniz. Gyro sürüklenmesini biraz göreceksiniz, ancak filtre harekete geçtikçe düzeltilmeye başlayacaksınız. Filtrem böyle bir şeye benziyor ve 0.5 dereceden fazla "kaçak" önler:

filtZ = 0.65 * oldZ + 0.35 * z;

0.65 ve 0.35 değerleri deneysel olarak belirlendi ve size zamanınız olduğu gibi oynamaları tavsiye ediyorum. Çıktı hala 0-1 olarak ölçeklendirilecek ve daha sonra yaptığınız gibi (veya 4 boyutlu tüm throughoutf'u korumanız gerekiyorsa kuaterniona yeniden yerleştirilecek) kullanılabilir.

İlgili konular