سؤال

لقد قمت بتجربة Compass و Gyroscope على iPhone 4 وأود بعض المساعدة في مشكلة أواجهها. أريد التعويض عن بطء البوصلة باستخدام بيانات من الجيروسكوب.

استخدام CMMotionManager و CMDeviceMotion هدف (motionManager.deviceMotion)، انا حصلت على CMAttitude هدف. صححني إذا كنت مخطئًا (من فضلك) ، ولكن هنا ما استنتجته من CMAttitude أشياء yaw خاصية (لست بحاجة pitch ولا roll لأغراضي):

  • yaw يتراوح من 0 ل PI عندما يشير الهاتف إلى الأسفل (كما هو موضح بواسطة deviceMotion.gravity.z) والتأرجح عكس اتجاه عقارب الساعة و 0 ل -PI عندما تتأرجح في اتجاه عقارب الساعة
  • عندما يشير الجهاز إلى الأعلى ، yaw يتراوح من -PI ل 0 و PI ل 0, ، على التوالى
  • ومن بيانات البوصلة (أنا أستخدم locationManager.heading.magneticHeading) ، أرى أن البوصلة تعطي القيم من 0 ل 360, ، مع زيادة القيمة عند التأرجح في اتجاه عقارب الساعة

حسنًا ، لذا باستخدام كل هذه المعلومات معًا ، يمكنني الحصول على قيمة أسميها horizontal هذا ، بغض النظر عما إذا كان الجهاز يشير لأعلى أو لأسفل ، سيعطي القيم من 0 ل 360 وزيادة عندما يتم تأرجح الجهاز في اتجاه عقارب الساعة (على الرغم من أنني ما زلت أواجه مشكلة عندما deviceManager.gravity.z موجود 0 -- ال yaw تخيل القيمة في هذا gravity.z القيمة).

يبدو لي أنه يمكنني "مزامنة" horizontal و magneticHeading القيم ، باستخدام محسوبة horizontal قيمة هذا الخرائط magneticHeading, و "مزامنة" horizontal قيمة ل magneticHeading عندما أشعر أن البوصلة "اشتعلت".

لذلك أسئلتي:

  • هل أنا على المسار الصحيح مع هذا؟
  • هل أستخدم بيانات الدوران من CMDeviceMotion بشكل صحيح والافتراضات التي أدرجتها أعلاه صحيحة؟
  • لماذا قد yaw يخاف متى gravity.z موجود 0?

شكراً جزيلاً. إنني أتطلع إلى سماع إجاباتك!

هل كانت مفيدة؟

المحلول

فقط أحاول الإجابة ... صححني إذا كنت مخطئًا ..

1. نعم أنت على المسار الصحيح

2. يتم بالفعل "عزل" الجاذبية في CM من جاذبية المستخدم (قيمة الجاذبية الناتجة عن تسريع المستخدم) ولهذا السبب هناك نوعان من الجاذبية ، "الجاذبية" و "userAcceleration" على وثائق Apple CM // ملاحظة: غير معزولة تمامًا //

3. إذا كان لديك جاذبية 0 يعني أن المحور المقابل عموديًا مع الجاذبية. Gravity.z هي شاشة iPhone ولهذا السبب -9.82m/s2 إذا وضعت على المكتب مع الشاشة بشكل مستقيم ، فعليًا ، من الصعب الحصول على 0 أو أقصى قيمة للجاذبية بسبب ضوضاء المستشعر (إنه طبيعي ، كل المستشعر يحتوي على أ الضوضاء استشعار رخيصة بشكل واضح).

ما أقوم به في تطبيقاتي هو أن أقوم بتبديل محور المرجع الخاص بي إلى محور آخر (في حالتك قد يكون x أو y) لبعض الحدود ، وكيف تعتمد الاستراتيجية على الغرض أو الجانب الذي يكون مرجعك.

الشيء الآخر هو أن الدوران سريع ولكنه غير مستقر ، فأنت بحاجة إلى إعادة معايرة القيمة لعدة فاصل. في حالتي كل 5 ثانية. لقد قمت بتجربة Gyro لحساب الزاوية بين طريقين ، أحاول مع حاكم Exacly 90 ، وسوف يعطي خطأ حوالي 0.5 درجة كل مرة في محاولة للاستمرار في الزيادة ، ولكن هذا هو لي ، وربما يكون لدى الآخرين طريقة أفضل لتجنب خطأ.

أدناه هي خطواتي "

  1. فيه
  2. اقرأ الجاذبية xyz -> xg yg zg
  3. تحقق مما إذا كان xg <0.25 إذا كان صحيحًا جرب yg ثم zg // note 1 = 1g = 9.82 m/s^2
  4. اقرأ البوصلة والديرو
  5. قم بتكوين ومعايرة الدوران اللاحق باستخدام البوصلة و calulate استنادًا إلى المحور الذي أستخدمه في النقطة 3.
  6. إذا تم تمرير 5 ثانية ، فاحرص على إعادة المعايرة ، اقرأ البوصلة
  7. إذا كان الفرق مع قراءة الدوران هو> 5 درجة تخطي recalibartion gyro.
  8. إذا كان الفرق في قراءة الدوران هو <5 درجة معايرة الدوران باستخدام قيمة البوصلة

ملاحظة: بالنسبة للرقم 7: هو التحقق مما إذا كان الهاتف يتأثر بالحقل المغناطيسي أو بالقرب من الفولاذ الضخم مثل الخط الكهربائي العالي الجهد أو في معدات صاخبة وثقيلة في مصنع المصنع.

هذا كل شيء ... أتمنى أن يساعدك هذا ... وآسف على لغتي الإنجليزية ..

نصائح أخرى

فيما يلي مثال على تطبيق iPhone حيث يتم تعويض البوصلة مع الجيروسكوب. يمكن رؤية الكود والمشروع هنا:http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

لا يتم تعريف اتجاه متجه محور Yaw عندما يكون في الجاذبية الصفر (أو الخريف الحرة ، أو يغلق بما فيه الكفاية).

من أجل القيام بالتزامن أثناء الحركة ، تحتاج إلى إنشاء مرشح لقيمة "أفقية" التي لها نفس خصائص استجابة التأخير/التأخير مثل البوصلة المغناطيسية. إما ذلك ، أو انتظر حتى تتوقف الحركة لفترة كافية حتى تستقر كلتا القيمتين قبل إعادة حساب الإزاحة.

الإجابة على السؤال 1 هي نعم ، السؤال 2 أنت على المسار الصحيح ولكن يمكنك استخدام اسم متغير ليس "أفقيًا" ، يتم الإجابة على السؤال 3 بواسطة HotPaw2 وأيضًا ياو في مروحية أو طائرة هليكوبتر على ارتفاع الصفر. الطيار مع إنذار. هناك تأخر زمني لأن جزءًا من البرنامج محلي في حين أن هناك عوامل أخرى يمكن أن تبطئها بما في ذلك الوصول إلى مستشعر للكشف بيانات من Gyro وأجهزة الاستشعار من خلال واجهة بطيئة نسبيًا ، وذلك باستخدام جهاز محمول للأغراض العامة غير مصمم خصيصًا لنوع المهمة التي يتم طرحها عليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top