الملابس ذكية ، لكننا أذكى: كيف صنعنا تي شيرت مع التحكم في الموقف

مرحبا! في الفصل الدراسي الثاني ، يقوم جميع طلاب السنة الأولى في برنامج الرياضيات التطبيقية والمعلوماتية في سانت بطرسبرغ HSE بمشاريع جماعية بلغة C ++ . لقد قمنا بتطوير قميص ذكي.



اقرأ عن ماهيته وما تمكنا من القيام به أثناء العمل في المشروع في هذه المقالة.





نحن ، دينيس تاراسوف ودينيس فيليبوف ، نحن بالفعل طلاب السنة الثانية في المرحلة الجامعية في الرياضيات التطبيقية والمعلوماتية في كلية سان بطرسبرج HSE. لقد عملنا في المشروع مع يان فريدكين وإيفان تشوناريف. درسنا معهم في نفس المدرسة: سانت بطرسبرغ GFML رقم 30.



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



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



  • لتوصيل المزيد من أجهزة الاستشعار ، يلزم وجود معالج بتردد أعلى ، والمزيد من الأجهزة الطرفية والأجهزة الطرفية الأسرع ؛
  • المزيد من ذاكرة الفلاش ، وذاكرة الوصول العشوائي ؛
  • أقل تكلفة؛
  • استقرار الميكروكونترولر.


قررنا أننا بحاجة إلى تغيير الميكروكونترولر. كان لدينا خياران: استخدام متحكم دقيق من سلسلة AVR أكثر قوة (في حالتنا Arduino) أو التبديل إلى سلسلة أخرى من وحدات التحكم الدقيقة ، وهي ARM (في حالتنا STM32). على الرغم من مجتمع Arduino الكبير وسهولة استخدام وحدة التحكم الدقيقة هذه ، فقد قررنا الترقية إلى STM32 لأنه يتمتع بأداء أفضل وذاكرة أكبر. نحن نستخدم حاليًا متحكمًا دقيقًا STM32f4 *.





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





الخطوات الأولى. مضاءة LED



لم تكن لدينا خبرة في برمجة المتحكمات الدقيقة ، وقرأنا أن تهيئة وإعلان أجهزة الاستشعار والمسامير على STM طويلة وصعبة. لذلك ، استخدمنا مستوى عالٍ من التجريد باستخدام مكتبة HAL و STM32CubeMX . STM32CubeMX هي أداة تقوم بتكوين منافذ وحدة التحكم الدقيقة باستخدام واجهة رسومية وتقوم بإنشاء التعليمات البرمجية المناسبة باستخدام مكتبة HAL. أولاً ، قررنا القيام بأبسط شيء في برمجة وحدة التحكم الدقيقة (على مستوى "Hello world") - قم بإضاءة LED.





واجهة STM32CubeMX



بعد بحث طويل عن IDE يكون عبر الأنظمة الأساسية ومجانيًا وسهل التطوير ، استقرنا على STM32CubeIDE







تبين أن مهمة تشغيل LED ليست أسهل مهمة ، نظرًا لوجود قدر كبير من المعلومات حول برمجة STM32 على الإنترنت (خاصةً بالمقارنة مع Arduino). في وقت لاحق ، أدى هذا العامل أيضًا إلى تعقيد العمل في المشروع.



البرامج الثابتة متحكم



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





يتم الاتصال بالمتحكم الدقيق عبر ناقل I2C. بفضل مكتبة HAL ، أصبح نقل البيانات أمرًا سهلاً: تحتاج إلى استدعاء وظيفة للقراءة / الكتابة. مثال على قراءة البيانات من مقياس التسارع من الكود:



HAL_I2C_Mem_Read(i2c_handle, addres, ACCEL_XOUT_H_REG, 1, buffer, 6, 1000)


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



HAL_I2C_Mem_Write(i2c_handle, addres, GYRO_CONFIG_RE	G, 1, &Data, 1, 1000)


كان لدينا أيضًا وحدة Bluetooth (HC-05 و HC-06) ، لكنها لم تتطلب أي معالجات خاصة للعمل. بعد توصيله ، يمكنك ببساطة إرسال البيانات من خلال جهاز الإرسال والاستقبال العالمي غير المتزامن (UART) - وهو جهاز خاص داخل وحدة التحكم الدقيقة يسمح لك بالاتصال بالأجهزة الأخرى. بالنسبة لذلك ، يوفر HAL وظائف مشابهة لتلك الخاصة بـ I2C. لقد كتبنا للتو غلافًا صغيرًا فوقها لتسهيل عرض الرسائل أثناء تصحيح الأخطاء.





HC-06



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



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



class Controller {
std::vector<std::unique_ptr<IMU>> IMUSensors;  //  
std::queue<Request> reqQueue; //  
std::vector<std::pair<std::unique_ptr<BaseFunc>, bool>> mithrilFuncs; //   
//< ,   >
Controller();
void Run(); //   
};


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



ماذا يوجد في النموذج الأولي



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



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



الروبوت التطبيق



وضعنا لأنفسنا هدف إنشاء تطبيق Android مع القدرة على التواصل عبر البلوتوث باستخدام متحكم دقيق. كما في حالة برمجة المتحكمات الدقيقة ، لم تكن لدينا خبرة في كتابة تطبيقات Android ، ولكن تبين أن العثور على معلومات حول Android أسهل بكثير من STM32. لقد تعلمنا الأساسيات باستخدام  الدورة التدريبية على موقع Stepik.org (الدورة جيدة حقًا) ، حيث تقوم أولاً بتحليل أساسيات لغة Kotlin ، ثم التحدث عن البرمجة لنظام Android. 



سمح الإصدار الأول من التطبيق بالاتصال بالميكروكونترولر عبر البلوتوث وإرسال الرسائل إليه. لا يختلف الإصدار الأخير كثيرًا عن الإصدار الأول (لم تكن كتابة أحد التطبيقات أولوية بالنسبة لنا): يحتوي الآن على عناصر واجهة مستخدم لبدء المعايرة وتشغيل / إيقاف وظيفة تتبع الموقف الصحيح. 



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





قائمة التنقل لعلامة





تبويب اتصال Bluetooth





لتبادل البيانات



علاج الموقف



توصلنا إلى طريقتين مختلفتين للتعامل مع الموقف: باستخدام طرق تحليل البيانات وبدونها.



علاج الموقف باستخدام تقنيات تحليل البيانات



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



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





 

لسوء الحظ ، في كلا النموذجين ، كانت هناك مشاكل في أحد أجهزة الاستشعار الأربعة ، لذلك لم يتم استخدام المستشعر رقم 3. وضعناهم بشكل حدسي: أردنا تتبع موضع لوحي الكتف والعمود الفقري بالقرب من الرقبة.







إسقاط البيانات في فضاء ثنائي الأبعاد.



هنا ، يتم تمييز مناطق الموقف الصحيح باللون الأخضر ، ومناطق الوضع غير الصحيح مظللة باللون الأحمر. في الإسقاط على مساحة ثلاثية الأبعاد ، يُلاحظ أن المواضع الصحيحة والمواضع غير الصحيحة يسهل فصلها عن بعضها البعض. 





بعد ذلك ، كان من الضروري اختيار نماذج للتنبؤ. قررنا تجربة الانحدار الخطي ، أو بالأحرى تعديل Ridge ، وآلة متجه الدعم (SVM) بنواة خطية ، وشجرة قرار. يرجع الاختيار إلى بساطة نقل النماذج إلى وحدة التحكم الدقيقة: يتم وصف أول اثنين من خلال عدد معين من المعاملات ، والأخيرة عبارة عن مجموعة من شروط if-else. تم أخذ النماذج من مكتبة scikit-Learn. مثال على ترحيل الانحدار الخطي:



bool isPostureCorrect =
           (a11 * deviceAngles1[0] + a12 * deviceAngles1[1] + a13 * deviceAngles1[2] +
           g11 * deviceGravity1[0] + g12 * deviceGravity1[1] + g13 * deviceGravity1[2] +
           a21 * deviceAngles2[0] + a22 * deviceAngles2[1] + a23 * deviceAngles2[2] +
           g21 * deviceGravity2[0] + g22 * deviceGravity2[1] + g23 * deviceGravity2[2] +
           a41 * deviceAngles3[0] + a42 * deviceAngles3[1] + a43 * deviceAngles3[2] +
           g41 * deviceGravity3[0] + g42 * deviceGravity3[1] + g43 * deviceGravity3[2]) > bias;


القيم أ ؟؟ ، ز ، التحيز مأخوذة من النموذج المدرب.



يمكن رؤية دقة النماذج ذات التكوينات المختلفة في عينة الاختبار في الجدول:





كان حجم عينة الاختبار 33٪ من جميع البيانات. هذه المعدلات المرتفعة على الأرجح بسبب قلة البيانات ، لأن التوقعات جيدة للغاية.



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





مثال على شجرة القرار.



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



الوضعية العكسية بدون طرق تحليل البيانات



من أجل التعامل مع الموقف بدون ML ، كان لا بد من دراسة العديد من المقالات الطبية حول الموقف أولاً. أردت حقًا العثور على معلومات حول الخصائص الكمية التي يمكن قياسها ومقارنتها بالمعيار: أي معرفة النطاق "الطبيعي" للقيم.



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





درجات الموقف لدى الأشخاص المصابين باضطراب اكتئابي كبير قبل العلاج (أ) وبعد العلاج (ب) من J. Canales et al (2010)



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







تكوين جهاز الاستشعار



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





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



فيديو تجريبي



هذا فيديو توضيحي للقميص ويعمل التطبيق:





تبدأ معالجة الموقف أولاً ، ثم تبدأ المعايرة ، ثم تبدأ الرسائل حول الوضع الصحيح في الظهور.



خاتمة



نتيجة لذلك ، تمكنا من معالجة الموقف بطريقتين ، التعامل مع البرمجة لنظام Android ، وكتابة تطبيق لنظام Android ، وفي نفس الوقت فهم قليلاً عن برمجة وحدة التحكم الدقيقة STM32.



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



الآن قليلا عن خططنا للمستقبل. نحن نريد:



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


وصلات إلى جيثب المشروع:



github.com/DT6A/Mithril متحكم الثابتة،

github.com/DT6A/MithrilAppーتطبيق الروبوت،

github.com/DT6A/MithrilData العملーمع البيانات.



All Articles