جدول المحتويات:

دراسة تجريبية للحركة التوافقية البسيطة: 5 خطوات
دراسة تجريبية للحركة التوافقية البسيطة: 5 خطوات

فيديو: دراسة تجريبية للحركة التوافقية البسيطة: 5 خطوات

فيديو: دراسة تجريبية للحركة التوافقية البسيطة: 5 خطوات
فيديو: الحركة التوافقية البسيطة (1) 2024, يوليو
Anonim

اتبع المزيد من قبل المؤلف:

Walking Strandbeest و Java / Python والتحكم في التطبيق
Walking Strandbeest و Java / Python والتحكم في التطبيق
Walking Strandbeest و Java / Python والتحكم في التطبيق
Walking Strandbeest و Java / Python والتحكم في التطبيق

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

السؤال الأول ، علينا أن نقرر أن جسم البندول عبارة عن سلك عديم الوزن أو قضيب موحد صلب. يبدو أن نهج الحبل أسهل. من ممارسة بناء واحد ، لدي اعتبارات المقايضة التالية: قد تكون أسهل طريقة لتعليق نظام البندول هي تعليقه على الحافة العلوية لبابك. وهذا يعطي طول بندولك بمقدار 2 متر تقريبًا دون القيام بأي أعمال بناء هيكلية. لكنها تحتاج إلى أن الأرجوحة لن تلمس سطح الباب ، الأمر الذي يدمر التجربة بأكملها ببساطة. لذلك يجب أن تكون الطائرة المتأرجحة موازية بدقة لسطح الحائط / الباب. يميل الحبل عديم الوزن إلى أن يكون رقيقًا ، ويمكن أن يدور بسهولة ، ويعقد قياس زاوية التأرجح. نريد استخدام قياس واحد لتمثيل حالة التأرجح. يمكن أن يكون الحبل الرفيع ، مثل خط السمك ، مرنًا وقابلًا للمط ، مما يؤثر على أحد أهم ثوابتنا التي قمنا بقياسها واستخدامها في المعادلة ، وهو طول البندول. قد يتأثر البعض أيضًا بدرجة الحرارة. يجب أن تكون كتلة الوزن المعلقة في نهاية الحبل ثقيلة بدرجة كافية بحيث يصبح وزن الحبل ضئيلًا. يرجى التعليق إذا كنت توافق عليها أو لا توافق عليها ، أو لديك أفكار أخرى لمقايضة التصميم. لدراسة هذه المشكلة ، نحتاج إلى جهاز خفيف جدًا بحيث يمكن تجاهل وزنه وما زلنا نتعامل مع نظام البندول كقضيب موحد صلب. أنا أستخدم وحدة تحكم إلكترونية قابلة للارتداء COTS ، والتي توفر معلومات الدوران والتسارع والزاوية إلينا عبر اتصال البلوتوث. سيتم تخزين هذه القياسات في ملف بيانات تطبيق الهاتف المحمول. بعد ذلك ، سنقوم بتحليل البيانات الخاصة بتجربتنا البسيطة للحركة التوافقية. يركز التحليل العددي على الموضوعات التالية: 1) توقع فترة تذبذب البندول 2) جمع بيانات تجربة الحركة التوافقية البسيطة البندول بشكل برمجي 3) استخدم kmean لتجميع البيانات وإزالة القيم المتطرفة في عملية التحليل 4) استخدم FFT قصير الوقت لتقدير تردد تذبذب البندول

اللوازم

جهاز قياس بلوتوث

تطبيق هاتف Android: انتقل إلى متجر Google playstore ، وابحث عن M2ROBOTS وقم بتثبيت تطبيق التحكم. في حالة صعوبة الوصول إلى متجر Google playstore ، قم بزيارة صفحتي الرئيسية الشخصية للتعرف على طريقة تنزيل التطبيق البديلة

قضيب الخشب

عدد قليل من الأجزاء المطبوعة ثلاثية الأبعاد

شفرات المنشار أو مادة معدنية مماثلة

الخطوة 1: ما هو البندول؟ كيف نمذجة ذلك؟

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

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

T1 = 2 * pi * (l / g) ^ 0.5

g = تسارع الجاذبية ، حوالي 9.8 م / ث ^ 2

إذا تم استبدال الحبل عديم الوزن بقضيب موحد صلب ، مرة أخرى بطول l ، فإن فترة حركته التوافقية البسيطة T2 تعطى بواسطة T1 = 2 * pi * (2l / 3g) ^ 0.5

بشكل فعال ، لها نفس الفترة مثل بندول الحبل عديم الوزن الذي يمثل ثلثي طول قضيب موحد صلب.

هذه هي الخلفية ، ويمكننا البدء في إعداد تجربتنا.

الخطوة 2: تحضير الأجزاء لبناء الأجهزة

تحضير الأجزاء لبناء الأجهزة
تحضير الأجزاء لبناء الأجهزة
تحضير الأجزاء لبناء الأجهزة
تحضير الأجزاء لبناء الأجهزة
تحضير الأجزاء لبناء الأجهزة
تحضير الأجزاء لبناء الأجهزة

لبناء هيكل البندول ، نقوم بطباعة ثلاثية الأبعاد لبعض الأجزاء ، وإعادة تدوير شيء لدينا بالفعل. يظهر هيكل البندول العام في الشكل 1. إنه مزيج من أجزاء الطباعة ثلاثية الأبعاد مع بعض الأجزاء المصنوعة يدويًا وقطعة طويلة من قضيب الخشب من Lowe'S.

الجزء المطبوع ثلاثي الأبعاد في الشكل 2 معلق على الحافة العلوية للباب ، لأن بابنا سطح مستوٍ سهل بالنسبة لنا لتعليق شيء ما. رابط تنزيل ملف STL:

xiapeiqing.github.io/doc/kits/pendulum/pen…

يربط الجزء الأخضر في الشكل 3 قضيب الخشب بشفرة ، وتوضع الشفرة أعلى قطعتين من السكة المثبتة على شماعات الباب المطبوعة ثلاثية الأبعاد السابقة. رابط تنزيل ملف STL:

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

آخر جزء مطبوع ثلاثي الأبعاد في الشكل 5 عبارة عن صينية صغيرة لتثبيت جهاز القياس الإلكتروني.

رابط التحميل:

يولد جهاز القياس الذي يعمل بالبلوتوث تقدير الزاوية وقياس الدوران وقياس التسارع. كل هذه البيانات متاحة لنا من خلال رابط البلوتوث اللاسلكي.

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

الخطوة 3: تجربة جمع البيانات

جمع بيانات التجربة
جمع بيانات التجربة
جمع بيانات التجربة
جمع بيانات التجربة
جمع بيانات التجربة
جمع بيانات التجربة

هناك طريقتان يمكن تنفيذهما لجمع البيانات التجريبية قبل تحليل مجموعة البيانات المكتسبة:

1) استخدم تطبيق هاتف Android المحدد في قسم المتطلبات لتسجيل جميع القياسات التي ينتجها الجهاز في ملف بيانات مخزن في بطاقة SD بهاتفك. يمكننا نسخ الملف ونشر معالجة المعلومات.

2) استخدم جهاز كمبيوتر مزودًا بتقنية البلوتوث أو كمبيوتر شخصي أو كمبيوتر محمول أو كمبيوتر صغير RaspberryPi لإنشاء اتصال Bluetooth بالجهاز وقراءة البيانات للتحليل في الوقت الفعلي أو دون الاتصال بالإنترنت.

توجد إيجابيات وسلبيات لكل طريقة ، سنقوم بتجربتها وإخبار الاختلاف في هذه التعليمات.

بالنسبة للطريقة (1) باستخدام تطبيق android ، بمجرد دخولنا إلى واجهة التحكم في تطبيق android ، سيتم تسجيل بيانات القياس عن بُعد المرسلة من جهاز قياس البلوتوث إلى هاتف android في ملف سجل باسم m2flightDatayyyymmdd_hhmmss.txt. يمكن العثور عليها في مجلد Download / m2LogFiles بهاتف Android. المجلد "Download" هو مجلد موجود مسبقًا في نظام التشغيل android بهاتفك و "m2LogFiles" هو مجلد أنشأه التطبيق. محتوى اسم الملف yyyymmdd_hhmmss هو طريقة لتشفير وقت بدء التجربة (السنة والشهر واليوم والساعة والدقيقة والثانية) في اسم الملف.

كل سطر في ملف السجل هو سجل واحد. يبدأ بالطابع الزمني للحدث ، سلسلة التمهيد "eam:" ، متبوعة بـ 4 بيانات ثلاثية ، وهي:

قراءة محور التسارع XYZ في أجهزة المستشعر الخام تسجل قيم إعادة القراءة

قراءة محور الجيروسكوب XYZ في أجهزة الاستشعار الخام تسجل قيم إعادة القراءة

قراءة محور مقياس المغنطيسية XYZ في أجهزة المستشعر الخام تسجل قيم إعادة القراءة

على متن الطائرة المقدرة لفة / الملعب / الخام في الدرجة

سيستخدم ملف البيانات الذي تم إنشاؤه باستخدام برنامج Python للكمبيوتر تنسيق ملف بيانات متطابقًا ، بحيث لا يتأثر البرنامج الذي نستخدمه في خطوة تحليل البيانات بمصدر البيانات الذي يتم إنتاجه بواسطة برنامج python أو تطبيق android الخاص بنا.

لنبدأ الترميز باستخدام الطريقة (2).

للتفاعل مع جهاز قياس البلوتوث ، يتم توفير نوعين من SDK:

1) Python SDK ، والتي يمكن تثبيتها عن طريق "pip3 install m2controller" ، python3 هي اللغة المستخدمة. يتم تخزين أمثلة كود تطبيق المستخدم في https://github.com/xiapeiqing/m2robots/tree/maste… في هذه التجربة ، سوف نستخدم pendulum1.py النصي python

2) Java SDK ، والتي لم يتم استخدامها في هذه التعليمات لأننا نريد لاحقًا تصورًا وتحليلًا لبيانات البندول المكتسبة ، والتي قد تتطلب مجهودًا أكبر قليلاً بالنسبة لنا للبرمجة في Java.

يحتوي الكود المصدري لبرنامج جمع البيانات python3 على العديد من التعليقات لتفاصيل وظائف الكود. يتم توفير لقطة من شفرة المصدر هنا.

#! / usr / bin / env python # - * - الترميز: UTF-8 - * - من m2controller import m2controller من m2controller import m2Const استيراد إشارة وقت استيراد تاريخ استيراد usrCfg استيراد بندول 2

requestExit = خطأ

################################################################

# نريد استخدام نفس اصطلاح تسمية ملف السجل بحيث يمكن لوحدة تحليل البيانات ، pendulum2.py ، أن تكون محايدة لكيفية الحصول على ملف بيانات السجل ################# ############################################## logfilename = " m2flightData٪ s.txt "٪ (datetime.datetime.fromtimestamp (time.time ()). strftime ('٪ Y٪ m٪ d_٪ H٪ M٪ S')) dataLogfile = open (logfilename،" w ")

معالج إشارة def (سيج ، إطار):

طلب عالمي الخروج طباعة ('المستخدم Ctrl-C للخروج من تنفيذ البرنامج') requestExit = True signal.signal (signal. SIGINT، signal_handler)

################################################################

# عند توفر كل بيانات قياس بمعدل 20 هرتز ، سيتم استدعاء وظيفة "رد الاتصال" هذه ################################ ################################ def callbackfunc (telemetry): strTimeStamp = datetime.datetime.fromtimestamp (time.time ()). strftime ('٪ H:٪ M:٪ S.٪ f') [: - 3] dataStr = "٪ s، eam:٪ d،٪ d،٪ d،٪ d،٪ d،٪ d ،٪ d،٪ d،٪ d،٪ 2.1f،٪ 2.1f،٪ 2.1f / n "٪ (strTimeStamp ، القياس عن بعد ['m_fAccelHwUnit'] [0] ، القياس عن بعد ['m_fAccelHwUnit'] [1] ، القياس عن بعد ['m_fAccelHwUnit'] [2] ، القياس عن بُعد ['m_fGyroHwUnit'] [0] ، القياس عن بُعد ['m_fGyroHwUnit'] [1] ، القياس عن بُعد ['m_fGyroHwUnit'] [2] ، القياس عن بُعد ['m_fMag] [0] 'm_fMagHwUnit'] [1] ، القياس عن بُعد ['m_fMagHwUnit'] [2] ، القياس عن بُعد ['m_fRPYdeg'] [0] ، القياس عن بُعد ['m_fRPYdeg'] [1] ، القياس عن بُعد ['m_fRPYdeg'] [2]) ################################################## ############ # نقوم بطباعة سلسلة البيانات على الشاشة وحفظها في ملف السجل ####################### ######################################## طباعة (dataStr) dataLogfile.writelines (dataStr)

################################################################

# تهيئة وحدة التحكم ، تذكر تعيين الحقل BleMAC العنوان ليكون عنوان MAC لجهازك ################################# ############################### # TODO: دعنا نهيئ BleMACaddress إذا لم يتم تعيينه من قبل المستخدم. controller = m2controller. BleCtrller (m2Const.etDebian، callbackfunc، usrCfg. BleMACaddress) controller.connect () بينما صحيح: ########################## ##################################### # انتظر بيانات القياس التي تم إنشاؤها وإرسالها من قياس البندول جهاز ################################################# ############### controller.m_CommsTunnel.waitForNotifications (1.0) if requestExit: ######################## ######################################## ################################################## ############## controller.stop () dataLogfile.close () break

################################################################

# اكتمل جمع البيانات ، فلنحلل الآن بيانات السجل ######################################## ######################## pendulum2.parseDataLogFile (logfilename)

لتحديث طويل المدى ، يرجى مراجعة https://github.com/xiapeiqing/m2robots/blob/maste …

الآن دعونا نشرح طريقة عملها. تمت كتابة برنامج python هذا أعلى حزمة قابلة للتثبيت باسم m2controller. توفر الحزمة ذات المستوى الأدنى آلية رد اتصال ، بحيث يؤدي كل تحديث قياس مستلم إلى تشغيل وظيفة رد الاتصال التي كتبناها ، وحفظ البيانات في ملف سجل محلي. يتطابق تنسيق محتوى بيانات ملف السجل مع ما يتم إنتاجه بواسطة التطبيق المصاحب لنظام Android ، بحيث يكون ملف سجل البيانات الذي تم إنشاؤه بواسطة برنامج python أو التطبيق المرافق andriod قابلاً للاستبدال.

يتم تمرير إشارة المستخدم ctrl-C ، التي يلتقطها نظام التشغيل ، إلى البرنامج ، وتوقف الحلقة اللانهائية في انتظار وصول بيانات القياس الجديدة.

حتى الآن ، تم إنشاء ملف السجل بنجاح ، وسيقوم هذا البرنامج باستدعاء برنامج التحليل لدراسة نتائج تجربتنا.

فيما يلي تجربتان ، وتظهر المقارنة الفرق الملحوظ للغاية من خلال توصيل جهاز 7 جرام في مواقع مختلفة.

في الشكل 2 ، نستخدم مقياسًا لتحديد الوزن الفعلي لجهاز قياس البلوتوث هذا.

يوضح الشكل 3 إعداد البندول حيث يتم توصيل جهاز 7gram بالطرف السفلي للبندول. يحتوي تكوين الإعداد في الشكل 4 على كتلة 7 جرام تقع بالقرب من المحور المتأرجح.

الشكل 5 عبارة عن عرض عن قرب لهيكل البندول.

الخطوة 4: تحليل البيانات

تحليل البيانات
تحليل البيانات
تحليل البيانات
تحليل البيانات
تحليل البيانات
تحليل البيانات

يزن جهاز القياس الذي يعمل بالبلوتوث حوالي 7 جرام ، والذي يزن أقل بكثير من عصا خشبية طويلة بطول 1.6 متر. استخدم افتراض "قضيب موحد صلب" ، ولدينا معادلة فترة البندول هذه ، T1 = 2 * pi * (2l / 3g) ^ 0.5

للحصول على ثابت الجاذبية ، يمكننا استخدام 9.8m / s ^ 2. ولكن يمكن استرداد ثابت الجاذبية الأكثر دقة في أي موقع جغرافي معين من خدمة الويب هذه:

www.wolframalpha.com/widgets/view.jsp؟id=e…

بالنسبة لسان فرانسيسكو ، تبلغ 9.81278 م / ث ^ 2

تم قياس طول البندول ليكون 64.5 بوصة

يعطي 2 * pi * sqrt (2 * 64.5 * 0.0254 / (3 * 9.81278)) فترة البندول المتوقعة البالغة 2.0962 (ثانية).

دعونا نرى ما إذا كان يتفق مع تجاربنا.

في التجربة الأولى ، يحتوي إعداد البندول على جهاز 7 جرام متصل بالطرف السفلي للبندول. يمكن تنزيل ملف السجل الخاص بي في:

xiapeiqing.github.io/doc/kits/pendulum/pen…

قم بإعادة تسميته إلى "PendulumTestData.txt" ووضعه في نفس مجلد برنامج تحليل Python. يتم توفير لقطة من شفرة المصدر هنا.

#! / usr / bin / env python # - * - الترميز: UTF-8 - * - استيراد csv import matplotlib.pyplot as plt plt.style.use ('seaborn-whitegrid') استيراد numpy كـ np من تاريخ استيراد ووقت ، timedelta استيراد seaborn as sns من sklearn.cluster استيراد KMeans من مجموعات استيراد عداد ################################### ############################## # تدير هذه الوظيفة عمل تحليل ملف البيانات ############# ################################################## ## def parseDataLogFile (datafilename): ########################################## ###################### # استخراج البيانات في ملف سجل البيانات المفصول بفاصلة (CSV) وحفظ المحتوى في كل عمود في متغير واحد من النوع العائم ## ################################################## ############ with open (datafilename) as csvfile: readCSV = csv.reader (csvfile، delimiter = '،') timestampS = fAccelHwUnit_x = fAccelHwUnit_y = fAccelHw = [Unit fGyroHwUnit_x = fGyroHwUnit_y = fGyroHwUnit_z = fMagHwUnit_x = fMagHwUnit_y = fMagHwUni t_z = fRPYdeg_r = fRPYdeg_p = fRPYdeg_y = للصف في readCSV: جرب: x = datetime.strptime (الصف [0].split ('،') [0]، '٪ H:٪ M:٪ S.٪ f ') timestampS.append (timedelta (hours = x.hour، minutes = x.minute، seconds = x.seconds، microseconds = x.microsecond).total_seconds ()) fAccelHwUnit_x.append (float (row) [1] [4:])) fAccelHwUnit_y.append (float (row [2])) fAccelHwUnit_z.append (float (row [3])) fGyroHwUnit_x.append (float (row [4])) fGyroHwUnit_y.append (float (row [3])) fGyroHwUnit_x.append (float (row [4])) fGyroHwUnit_y.append (float (row [5])) fGyroHwUnit_z.append (float (row [6])) fMagHwUnit_x.append (float (row [7])) fMagHwUnit_y.append (float (row [8])) fMagHwUnit_z.append (float (row) [9])) fRPYdeg_r.append (float (row [10])) fRPYdeg_p.append (float (row [11])) fRPYdeg_y.append (float (row [12])) باستثناء: pass timestampS = np.asarray (الطوابع) الطوابع = الطوابع - الطوابع [0] fAccelHwUnit_x = np.asarray (fAccelHwUnit_x) fAccelHwUnit_y = np.asarray (fAccelHwUnit_y) fAccelHwUnit_z = np.asarray (fAccelHwUnit_z) fGyroHwUnit_x = np.asarray (fGyroHwUnit_x) fGyroHwUnit_y = np.asarray (fGyroHwUnit_y) fGyroH wUnit_z = np.asarray (fGyroHwUnit_z) fMagHwUnit_x = np.asarray (fMagHwUnit_x) fMagHwUnit_y = np.asarray (fMagHwUnit_y) fMagHwUnit_z = np.asarray (fMagHwUnit_z) fRPYdeg_r = np.asarray (fRPYdeg_r) fRPYdeg_p = np.asarray (fRPYdeg_p) fRPYdeg_p = fRPYdeg_p - np.mean (fRPYdeg_p) fRPYdeg_y = np.asarray (fRPYdeg_y)

################################################################

# نحتاج إلى تقدير دقيق لتكرار أخذ العينات لتقدير فترة التذبذب الدقيق ##################################### ########################### FsHz = getSamplingIntervalS (timestampS) ################ ################################################ # استعمال مكون الملعب في إخراج نظام مرجع عنوان الموقف لتحليل فترة البندول ###################################### ########################### analysis_timeSequence (timestampS، fRPYdeg_p، FsHz، 'Pitch') ########### ################################################## ### # استخدام إخراج القياس الأولي للمسرع لتحليل فترة البندول ###################################### ########################## لتحليل_الوقت ################################################## ### # استخدام ناتج القياس الدوراني الخام لتحليل فترة البندول ##################################### ########################## analysis_timeSequence (timestampS، fGyroHwUnit_y، FsHz، ' gyro ') print (' done، تهانينا:-) ') plt.show () ############################### ################################# # في عملية اتصال البلوتوث ، هناك فرصة نادرة أن حزمة أوامر البيانات يمكن تضيع # نحن نستخدم K-mean لعزل بيانات القياس 20 هرتز من القيم المتطرفة ، والتي تنتج عن إسقاط الحزمة # الغوص في "الإشارة والنظام لمزيد من التفاصيل" ################ ############################################### def getSamplingIntervalS (الطابع الزمني): plt.figure () sampleIntervalS = np.diff (timestampS) sns.distplot (sampleIntervalS) plt.ylabel ('Histogram') plt.xlabel ('فاصل القياس (فترات)') الكتلة Cnt = 5 كم = KMeans (n_clusters = clusterCnt) km.fit (sampleIntervalS.reshape (-1، 1)) centroids = km.cluster_centers_ elemCnt = عداد (km.labels_) تحدث Cnt = بالنسبة إلى ii في النطاق (clusterCnt): الواقع Cnt.append (elemCnt [ii)]) FsHz = 1 / centroids [ensenceCnt.index (max (ensenceCnt))] إرجاع FsHz

################################################################

# استخدام مقياس الطيف ، على سبيل المثال ، وقت قصير FFT للحصول على مكون التردد ، ذروة بن هو أفضل تقدير لدينا لتذبذب البندول ########################## #################################### fig، (ax1، ax2) = plt.subplots (nrows = 2) ax1.plot (timestampS، timeSeqData، marker = 'o'، markerfacecolor = 'blue'، markersize = 2، color = 'skyblue'، linewidth = 1) ax1.set_title ("قياس مجال وقت البندول -٪ s"٪ strComment) ax1.set_xlabel ("وقت أخذ العينات (ثانيًا)") ax1.set_ylabel (strComment) ؛ NFFT = 2048 # طول مقاطع النوافذ

Pxx ، التكرار ، الصناديق ، im = ax2.specgram (timeSeqData ، NFFT = NFFT ، Fs = FsHz ، noverlap = NFFT / 2)

ax2.set_title ("مخطط طيفي") ax2.set_xlabel ("عينات") ax2.set_ylabel ("تردد (هرتز)") ؛

# طريقة `specgram` ترجع 4 كائنات. هم انهم:

# - Pxx: الرسم البياني # - التكرار: متجه التردد # - الصناديق: مراكز صناديق الوقت # - im: matplotlib.image. AxesImage الذي يمثل البيانات في المؤامرة pkresult = np.where (Pxx == np.amax (Pxx)) oscFreqHz = التكرار [pkresult [0] [0] الطباعة ('تذبذب البندول التكرار (هرتز) =٪ f ، الفترة (ثانية) =٪ f ، مصدر بيانات التقدير:٪ s'٪ (oscFreqHz ، 1 / oscFreqHz، strComment)) إرجاع 1 / oscFreqHz

################################################################

# يجب علينا تشغيل هذا البرنامج بشكل مستقل ، على سبيل المثال ، لا يتم استدعاؤنا من قبل pendulum1.py ، # نحدد اسم ملف بيانات السجل الافتراضي ليتم تحليله #################### ############################################ إذا _name_ == "_main_ ": defaultFilename = './PendulumTestData.txt' استيراد os.path إذا كان os.path.isfile (اسم الملف الافتراضي): parseDataLogFile (اسم الملف الافتراضي) وإلا: طباعة (" ملف السجل الافتراضي٪ s غير موجود "٪ defaultFilename)

لتحديث طويل المدى ، يرجى مراجعة https://github.com/xiapeiqing/m2robots/blob/maste …

يحتوي الكود المصدري على تعليقات مفصلة ، دعنا نعطي ملخصًا عالي المستوى للتقدير الرياضي هنا.

1) قرأنا أولاً محتوى ملف CSV في الكمبيوتر ، باستخدام حزمة python تسمى "csv". لدينا قياس دوري.

21: 34: 26.362 ، eam: 0 ، -128 ، 14464 ، -8 ، 144 ، -96 ، 2112 ، -1280 ، 1664 ، -0.5 ، -5.5 ، 40.5

21: 34: 26.373 ، eam: 128 ، 0 ، 14272 ، -8 ، 136 ، 40 ، 2112 ، -1280 ، 1664 ، -0.5 ، -6.5 ، 40.0

21: 34: 26.412 ، eam: 448 ، -64 ، 14208 ، -8 ، 136 ، 24 ، 2176 ، -1280 ، 1664 ، -0.5 ، -7.5 ، 40.5

21: 34: 26.462 ، eam: 448 ، -128 ، 14272 ، -8 ، 120 ، 16 ، 2176 ، -1280 ، 1664 ، -0.5 ، -8.0 ، 40.5

2) نظرًا لأن معدل القياس بالغ الأهمية ويقدم بشكل مباشر خطأ تقدير فترة البندول ، فنحن نريد تقديرها. فاصل القياس الاسمي لدينا هو 50 مللي ثانية ، أي 20 هرتز. يبدو المتوسط على جميع القياسات جيدًا ، لكننا نفقد أحيانًا حزمة نقل البيانات ، يصبح الفاصل الزمني للتحديث 100 مللي ثانية أو 150 مللي ثانية ، …

إذا رسمنا حدوث هذه البيانات ، انظر الشكل 1 ، كإنسان ، يمكننا بسهولة الحصول على قيمة مقلة تبلغ 0.05 ثانية. ومع ذلك ، هل يمكننا أن نفعل ما هو أفضل من ذلك؟

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

3) الشكل 2 يحتوي على صورتين. المخطط العلوي هو تسلسل مجال زمني لقياس زاوية التأرجح الخاص بنا بالدرجة. بالرجوع إلى الطابع الزمني للمحور x في الثانية ، يمكننا قراءة ما يقرب من 22.5 دورة في 50 ثانية ، وهو ما يُترجم إلى فترة بندول 2.22 ثانية. هل هناك طريقة لأتمتة هذه العملية والحصول على تقدير أكثر دقة؟ نعم ، يمكننا استخدام أداة رياضية تسمى Spectrogram ، والتي تستخدم جزءًا صغيرًا من بيانات القياس وتخبرنا عن ترددها ، انظر الشكل أدناه. قراءة المحور الصادي لأحلك خط هو تردد التذبذب في البندول. كونه خط أفقي يؤكد أن تذبذب البندول لم يتغير على الإطلاق طوال التجربة. القيمة العكسية لتردد التذبذب هي فترة تذبذب البندول.

التقرير النهائي الذي أعده البرنامج عبارة عن ملخص نصي:

تذبذب البندول التكرار (هرتز) = 0.449224 ، الدورة (ثانية) = 2.226059 ، مصدر بيانات التقدير: الملعب

يمكننا أن نجد أن نتيجة حساب اليد المقلدة السابقة ، 2.22 ثانية ، متوافقة إلى حد ما مع القيمة المحسوبة للبرنامج.

بالمقارنة مع القيمة المحسوبة نظريًا 2.0962 (ثانية) ، لدينا حوالي 5٪ خطأ متبقي. كيف تتخلص منهم؟ تذكر الافتراض هو "قضيب موحد جامد"؟ حتى الوزن الزائد البالغ 7 جرام يبدو تافهًا ، فهو أكبر سبب للخطأ المتبقي.

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

xiapeiqing.github.io/doc/kits/pendulum/pen…

قم بتشغيل نفس خطوات التحليل ، ونحصل على فترة 2.089867 (ثانية) ، انظر الشكل 3 ، وهو مطابق تقريبًا للتنبؤ النظري. رائعة!

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

هذه هي النتيجة كإخراج نهائي لبرنامج بايثون قيد التشغيل:

تذبذب البندول التكرار (هرتز) = 0.478499 ، الدورة (ثانية) = 2.089867 ، مصدر بيانات التقدير: الملعب

تذبذب البندول التكرار (هرتز) = 0.478499 ، الدورة (ثانية) = 2.089867 ، مصدر بيانات التقدير: تسريع

تذبذب البندول التكرار (هرتز) = 0.478499 ، الدورة (ثانية) = 2.089867 ، مصدر بيانات التقدير: الدوران

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

الخطوة الخامسة: توصيات العمل المستقبلي

هناك فئات قليلة من توصيات العمل في المستقبل.

في خطوة سابقة ، تمكنا من تقليل خطأ التجربة من ~ 5٪ إلى أقل من 1٪ ، هل يمكننا أن نفعل ما هو أفضل من ذلك؟ عند ملاحظة انخفاض حجم التذبذب بشكل كبير ، يمكن أن يكون أحد العوامل المساهمة هو سحب الهواء الناتج عند تأرجح البندول. قد يحتاج المقطع العرضي للبندول إلى التعديل ليكون ذا شكل انسيابي لتقليل السحب الديناميكي الهوائي.

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

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

قرصنة سعيدة

موصى به: