كيف صنعت بدلة التقاط الحركة



مقدمة


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

الشروع في العمل




لقد بدأت في إنشاء نماذج أولية للجهاز في المستقبل بمجرد تلقي المكونات اللازمة. وهي:

  • Arduino UNO هو مصمم تحكم معروف ، والذي يسمح لك بتطوير نموذج أولي في وقت قصير.
  • HC-06 - وحدة بلوتوث ، ستعمل كوسيلة للاتصال اللاسلكي. الوحدة بسيطة للغاية ، ولها واجهة UART.
  • MPU-6050 - أجهزة استشعار القصور الذاتي الوحيدة المتاحة لي في ذلك الوقت. اشتريت على الفور 2 للتحقق من كيفية عملها في أزواج ، لأنه في المستقبل من الضروري استخدام ما يصل إلى 15 مستشعرًا في نظام واحد. يجمع هذا المستشعر مقياس التسارع والجيروسكوب ، بالإضافة إلى مستشعر درجة الحرارة لضبط الإخراج.

بعد أن تلقيت كل شيء من هذه القائمة ، كنت متحمسًا بالفعل لرؤية وحدة المعالجة المركزية في العمل. في منتدى Arduino الرسمي ، كانت هناك العديد من الأمثلة على استخدام هذه المستشعرات ، واستخدمت أحدها. لتوصيل أجهزة الاستشعار ، يتم استخدام 5 دبابيس (جهات اتصال):

  • VCC ، GND - كل شيء واضح ، قوة وأرض. تجدر الإشارة إلى أن جهد العمل في المستشعر هو 3.3 فولت ، ولكن عند 5 فولت يبدو جيدًا. استهلاك الطاقة أقل من 0.05Ah
  • SCL ، SDA - في الواقع الدبابيس التي يتم من خلالها "الاتصال" مع المستشعر. هذه الدبابيس هي المسؤولة عن واجهة i2c. تطبق هذه الواجهة التبديل بين الأجهزة الموجودة على نفس الحافلة ، وبعبارة أخرى ، الحافلة هي الشارع ، والمنازل الموجودة عليها هي الأجهزة.
  • INT - دبوس للمقاطعات. بمجرد أن تصبح البيانات الموجودة على المستشعر جاهزة ، تأخذها وحدة التحكم الرئيسية في المقاطعة.

ومع ذلك ، لم يعرض هذا المثال سوى القيم "الأولية" من مقياس التسارع في المحطة الطرفية ، وتمت كتابة التعليمات البرمجية للتحويل إلى زوايا مألوفة ، ثم تم تنفيذ عامل تصفية Kalman ، وقد احتل كل هذا معًا حوالي 70٪ من موارد Arduino UNO. ومع ذلك ، كانت القيم الملساء إلى حد ما تصل بالفعل إلى المحطة ، كان الجهاز سريعًا جدًا في الفضاء ، على الرغم من بضع دقائق فقط ، وبعدها كان المخزن المؤقت FIFO ممتلئًا. لكنها عملت!



استقر!


تدريجياً ، طغت مدة النظام بأكمله على فرحة مستشعر العمل. بقدر ما لم أكافح مع المخزن المؤقت FIFO ، فاض. تجدر الإشارة إلى أنه في ذلك الوقت كان هناك القليل من المعلومات حول هذه المستشعرات والأنظمة المتشابهة بشكل عام ، وكان لا بد من جمعها حرفًا تلو الآخر. بعد أن قررت أن المشكلة تكمن في تنفيذ واجهة i2c ، بدأت في جوجل في هذا الاتجاه ووجدت مكتبة مستخدم I2Cdev ، والتي تم تصميمها لتحل محل مكتبة الأسلاك القياسية لاردوينو. كانت المفاجأة السارة هي الأمثلة المتداخلة لاستخدام هذه المكتبة بالاقتران مع mpu-6050. بعد إعادة بناء المشروع في هذه المكتبة ، تلقيت أيضًا بيانات أولية وقمت بتحويلها إلى زوايا باستخدام الكود الخاص بي ، ولكن لم يعد هناك تجاوزات. كان هذا انتصارا صغيرا. في وقت لاحق ، أثناء دراسة داخل المكتبة ، وجدت الكثير من الأشياء المفيدة. على سبيل المثالالآن باستخدام البيانات من كل من أجهزة الاستشعار - وجهاز التسارع والجيروسكوب. والحقيقة هي أن مقياس التسارع يسمح لك بتحديد زوايا الإمالة الدقيقة للجهاز في حالة الراحة فقط حتى تعمل القوى الخارجية عليه ، وقد تم تصميم الجيروسكوب لتعويض هذه القوى نفسها. أصبح استخدام البيانات من كلا المستشعرين واضحًا ، وهنا وجد عامل تصفية مكمل التطبيق. ومع ذلك ، كانت هناك مشكلة عدم وجود انجراف ، ولكن المزيد حول ذلك لاحقًا.

!


ومرة أخرى الشعاب المرجانية. هذه المرة كانت المشكلة التي ظهرت قبلي هي استخدام مستشعر mpu-6050 الثاني. لقد قدمت بالفعل تشبيهًا لواجهة i2c في هذه المقالة ، حيث الحافلة هي الشارع والأجهزة في المنزل. تخيل أن حزمة البيانات التي يجب أن تصل إلى جهاز معين هي ساعي بريد. يحتاج ساعي البريد إلى شيئين - الحزمة والعنوان ، وكل منزل له عنوان فريد خاص به ، ويجب أن يكون للأجهزة عناوين خاصة بها. تكمن المشكلة بدقة في عنوان مستشعر mpu-6050 ، وهي واحدة لجميع أجهزة الاستشعار هذه - 0x68. يتم وميض هذا العنوان في وحدة تحكم المستشعر في المصنع ، ولكن لا يمكن العثور على البرنامج الثابت وتغيير العنوان لكل مستشعر. أعطت المنتديات الأجنبية حلاً واحدًا: توصيل أجهزة الاستشعار واحدًا تلو الآخر ، يتم توصيل إحدى ساق جهاز الاستشعار الأول بدبوس AD0 من الثانية ،ويصبح متاحًا عند 0x69 ، ولكن هذه الطريقة تتضمن استخدام ما لا يزيد عن 2 وحدة معالجة مركزية وقمت بإسقاطها على الفور.

كان الحل هو الترانزستورات. كانت الفكرة هي وضع زوج من الترانزستورات على دبابيس i2c أمام كل مستشعر وفتحها بالتناوب. الخوارزمية بسيطة - من الضروري قراءة البيانات من المستشعر الخامس ، وإغلاق جميع البوابات باستثناء الخامسة (أو فتحها إذا لزم الأمر) وقراءتها ، ثم الحصول على البيانات من الباقي. يمكن رؤية النتيجة في الصورة الأولى في هذه المقالة ، وهي وظيفية تمامًا. بطريقة مماثلة ، تمكنت من توصيل 4 أجهزة استشعار ، وهذا لم يؤثر على الاستقرار بأفضل طريقة ، وعندما نفدت الترانزستورات ، قررت استخدام دوائر صغيرة مدمجة وأكثر استقرارًا.

مخطط الأسلاك
image

الصورة الوحيدة الباقية من تلك المرحلة (أعتذر عن الجودة):



تحكم البوابة


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

في حرارة الحرارة






الآن يبقى للتحقق من الجهاز في العمل. بعد توصيل 10 مستشعرات في وقت واحد ، ظهرت نفس الرسائل الممتعة بالضبط حول التهيئة الناجحة في الشاشة - الجهاز يعمل!



قفل جيمبل ، Quaternions ، التصور


قفل Gimble ، بقفل مفصلي روسي أو إطارات قابلة للطي - ظاهرة غير سارة في مجال الجيروسكوبات ، وفي بعض الحالات ، التوجه في الفضاء. بدون شرح طويل لهذه الظاهرة (هناك مقاطع فيديو توضيحية ومرئية جيدة حول هذا الموضوع) سأقول فقط أن هذا القفل المفصلي لا يسمح للمستشعر بالتدوير 360 درجة. إن محاور XZ (الانحرافات عن المستوى الأفقي) محدودة من -45 إلى 45 درجة ، ولا يتم تعريفها بشكل صحيح بعد هذه الحدود. بعد دراسة هذا الموضوع بمزيد من التفصيل ، اتضح أن الحل تحت أنفي. MPU-6050 عبارة عن مستشعرات سداسية المحاور ، ولديها dmp على متن الطائرة. يقوم Dmp (معالج الحركة الرقمي) بكل ما كتبته في الكود الرئيسي لوميض وحدة التحكم الرئيسية لفترة طويلة ، وحتى تصفية القيم. بالإضافة إلى ذلك ، يمكن لـ dmp إخراج البيانات في شكل رباعيات ،والذي يسمح لك بتجاوز قفل المفصلة ، كما يسمح لك بتقليل حجم الحزم المعاد توجيهها. عند هذه النقطة ، استمر معرفتي بالأخوات ، وعملت معهم في وقت سابق في Unity3D وكان لدي فكرة. بعبارات بسيطة ، رباعي هو نظام من الأرقام (4 أرقام) يصف دوران شيء في الفضاء. فقط أتذكر الوحدة ، حاولت تصوير شيء كهذا:



تحكم


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



الإسكان


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

طابعة ثلاثية الأبعاد




من أجل المحاكاة ، تم اختيار برنامج 123D-Design. البرنامج بديهي ، وأي شخص لديه خبرة قليلة على الأقل في محرري الرسومات ثلاثية الأبعاد سوف يتقنها بسرعة.



ثم طبع جميع الحالات ، وربط المستشعرات بجهاز التحكم من خلال أسلاك رفيعة ذات 4 سنون ، وصنع حوامل لأجهزة الاستشعار ، وجمع كل شيء معًا وحصل على بدلة جاهزة وقابلة للارتداء جاهزة. للنموذج الأول مناسب تمامًا.







البرمجيات


بسبب بعض الظروف ، أجلت Unity3D "لوقت لاحق" ، كانت المواعيد النهائية تنفد واضطررت إلى كتابة برنامج للتصور بسرعة. لقد كنت أعمل مع محرك رسومات Xors3D لفترة طويلة (ربما شخص يعرف ذلك) وهذه المرة لم يخذلني. ومع ذلك ، بعد أن سدد ، لم أعود إلى الوحدة ، لكنني واصلت تطوير البيئة البصرية للزي على هذا المحرك بالذات.



قائمة الميزات الحالية:

  • التصور - يعرض البرنامج نموذج الشخص ، والذي يكرر في الوقت الحقيقي جميع حركات الشخص في البدلة
  • المعايرة التلقائية - تتيح لك معايرة بدلتك على الفور في أي وقت
  • التموضع - يتحرك النموذج أيضًا في الفضاء مثل الشخص ، ويمكنه الانحناء والمشي ، إلخ.
  • التسجيل / التشغيل - يمكن تسجيل جميع الحركات وتشغيلها.
  • وضع عرض الشخص الأول - يتم توفير إخراج الصورة لصدع العين وخوذات الواقع الافتراضي الأخرى.
  • التفاعل - يمكن للشخص الذي يرتدي بدلة أن يؤثر على العالم الافتراضي. ركل الكرات ، وفتح الأبواب ، واللف الدائري ، إلخ. (محرك مادي)

الخلاصة


في الوقت الحالي ، يحتوي المشروع على نموذج أولي يعمل بشكل كامل ومستقل ويمكن ارتداؤه ولاسلكي وجميع البرامج اللازمة. استغرق الأمر 8 أشهر لتطوير هذا الزي (الذي استريحت منه 2 ، ما مجموعه 6) ، لكن بالنسبة لي هذا عصر كامل. خلال المشروع ، قمت بضخ مهاراتي ، وحاولت وفعلت الكثير مما لم أكن أعرفه من قبل ، وكنت قادرًا على كسب القليل.

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

Source: https://habr.com/ru/post/ar392353/


All Articles