Πίνακας περιεχομένων:

Πειραματική μελέτη απλής αρμονικής κίνησης: 5 βήματα
Πειραματική μελέτη απλής αρμονικής κίνησης: 5 βήματα

Βίντεο: Πειραματική μελέτη απλής αρμονικής κίνησης: 5 βήματα

Βίντεο: Πειραματική μελέτη απλής αρμονικής κίνησης: 5 βήματα
Βίντεο: Πώς να κάνεις καλά πράγματα να σου συμβούν. Ακουστικό βιβλίο 2024, Ιούλιος
Anonim

Ακολουθήστε περισσότερα από τον συγγραφέα:

Walking Strandbeest, Java/Python και App Controlled
Walking Strandbeest, Java/Python και App Controlled
Walking Strandbeest, Java/Python και App Controlled
Walking Strandbeest, Java/Python και App Controlled

Στην τάξη, χρησιμοποιούμε συχνά χρονόμετρο για να πραγματοποιήσουμε το πείραμα με το εκκρεμές ή ένα απλό πείραμα αρμονικής κίνησης. Εδώ είναι μια πρόκληση, μπορούμε να δημιουργήσουμε ένα πραγματικό γράφημα της κίνησής του και να δούμε ποια είναι η στιγμιαία γωνιακή θέση και ταχύτητα, αυτό είναι πολύ περισσότερες πληροφορίες και διασκεδαστικό.

Πρώτη ερώτηση, πρέπει να αποφασίσουμε ότι το σώμα του εκκρεμούς είναι ένα καλώδιο χωρίς βάρος ή μια άκαμπτη ομοιόμορφη ράβδος. Η προσέγγιση του καλωδίου φαίνεται να είναι ευκολότερη. Από την πρακτική της κατασκευής ενός, έχω τις ακόλουθες σκέψεις ανταλλαγής: Ο ευκολότερος τρόπος για να κρεμάσετε ένα σύστημα εκκρεμούς μπορεί να είναι να το κρεμάσετε στο επάνω άκρο της πόρτας σας. Αυτό σας δίνει μήκος εκκρεμούς 2 εκατ. Without χωρίς να εκτελείτε δομικές εργασίες κτιρίου. Χρειάζεται όμως ότι η ταλάντευση δεν θα αγγίξει την επιφάνεια της πόρτας, κάτι που απλά καταστρέφει ολόκληρο το πείραμα. Έτσι, το επίπεδο που θα περιστρέφεται θα πρέπει να είναι ακριβώς παράλληλο με την επιφάνεια του τοίχου/της πόρτας σας. Ένα καλώδιο χωρίς βάρος τείνει να είναι λεπτό, μπορεί να περιστρέφεται εύκολα και να περιπλέκει τη μέτρηση της γωνίας περιστροφής. Θέλουμε να χρησιμοποιήσουμε μία μέτρηση για να αναπαραστήσουμε την κατάσταση ταλάντευσης. Το λεπτό κορδόνι, όπως η γραμμή ψαριού, μπορεί να είναι ελαστικό και τεντώσιμο, το οποίο επηρεάζει μία από τις σημαντικότερες σταθερές μας που μετρήσαμε και χρησιμοποιήσαμε στην εξίσωση, το οποίο είναι το μήκος του εκκρεμούς. Ορισμένα μπορεί επίσης να επηρεαστούν από τη θερμοκρασία. Η μάζα βάρους που κρέμεται στο τέλος του κορδονιού πρέπει να είναι αρκετά βαριά ώστε το βάρος του καλωδίου να είναι αμελητέο. Παρακαλούμε σχολιάστε εάν συμφωνείτε ή διαφωνείτε μαζί τους ή έχετε άλλες ιδέες ανταλλαγής σχεδίου. Για να μελετήσουμε αυτό το πρόβλημα, χρειαζόμαστε μια συσκευή που είναι τόσο ελαφριά ώστε το βάρος της να αγνοείται και εξακολουθούμε να αντιμετωπίζουμε το σύστημα του εκκρεμούς ως μια άκαμπτη ομοιόμορφη ράβδο. Χρησιμοποιώ φορητό ηλεκτρονικό χειριστήριο COTS, το οποίο μας παρέχει πληροφορίες γυροσκοπίου, επιταχυνσιόμετρου και γωνίας μέσω σύνδεσης bluetooth. Αυτές οι μετρήσεις θα αποθηκευτούν σε αρχείο δεδομένων εφαρμογής για κινητά τηλέφωνα. Μετά από αυτό, θα αναλύσουμε τα δεδομένα για το απλό μας πείραμα αρμονικής κίνησης. Η αριθμητική ανάλυση επικεντρώνεται στα ακόλουθα θέματα: 1) Προβλέψτε την περίοδο ταλάντωσης του εκκρεμούς 2) Συλλέξτε με προγραμματισμό τα απλά πειράματα αρμονικής κίνησης του εκκρεμούς 3) Χρησιμοποιήστε το kmean για να ομαδοποιήσετε δεδομένα και αφαιρέστε τα υπερβολικά στη διαδικασία ανάλυσης 4) Χρησιμοποιήστε FFT μικρού χρόνου για εκτίμηση η συχνότητα ταλάντωσης του εκκρεμούς

Προμήθειες

Συσκευή μέτρησης Bluetooth

Εφαρμογή τηλεφώνου Android: Μεταβείτε στο playstore Google, αναζητήστε το M2ROBOTS και εγκαταστήστε την εφαρμογή ελέγχου. Σε περίπτωση που είναι δύσκολη η πρόσβαση στο Google playstore, επισκεφθείτε την προσωπική μου αρχική σελίδα για εναλλακτική μέθοδο λήψης εφαρμογής

ξύλινη ράβδος

λίγα τμήματα τρισδιάστατης εκτύπωσης

λεπίδες πριονιού ή παρόμοιο μεταλλικό υλικό

Βήμα 1: Τι είναι το Εκκρεμές; Πώς να το μοντελοποιήσετε;

Υπάρχουν πολλά άρθρα και βιβλία που εισάγουν την εξίσωση του εκκρεμούς, συμπεριλαμβανομένου του βιβλίου φυσικής του προγράμματος σπουδών σας. Τέτοιο περιεχόμενο ίσως είναι καλύτερα να μην επαναληφθεί εδώ. Μόνο το τελικό συμπέρασμα παρατίθεται εδώ σχετικά με το θέμα της «απλής αρμονικής κίνησης». Για να γνωρίζουμε την περίοδο ενός εκκρεμούς, το μόνο που πρέπει να γνωρίζουμε είναι το μήκος του εκκρεμούς, που συμβολίζεται ως "l", σε μέτρα.

Εάν είμαστε λογικά βέβαιοι ότι το βάρος βρίσκεται σχεδόν εντελώς στο τέλος ενός κορδονιού χωρίς βάρος που κρέμεται σε έναν άξονα και το εκκρεμές κινείται σε μικρές γωνίες θ, ας πούμε λιγότερο από 15 °, η περίοδος Τ1 ενός τέτοιου εκκρεμούς δίνεται από:

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

g = επιτάχυνση της βαρύτητας, περίπου 9,8 m/s^2

Εάν το καλώδιο χωρίς βάρος αντικατασταθεί από μια άκαμπτη ομοιόμορφη ράβδο, πάλι μήκους l, η απλή αρμονική περίοδος κίνησης T2 δίνεται με T1 = 2*pi*(2l/3g)^0,5

Ουσιαστικά έχει την ίδια περίοδο με ένα εκκρεμές καλωδίου χωρίς βάρος που είναι τα δύο τρίτα του άκαμπτου ομοιόμορφου μήκους ράβδου.

Αυτό είναι το υπόβαθρο και μπορούμε να ξεκινήσουμε την προετοιμασία του πειράματός μας.

Βήμα 2: Προετοιμάστε τα εξαρτήματα για την κατασκευή υλικού

Προετοιμάστε τα εξαρτήματα για την κατασκευή υλικού
Προετοιμάστε τα εξαρτήματα για την κατασκευή υλικού
Προετοιμάστε τα εξαρτήματα για την κατασκευή υλικού
Προετοιμάστε τα εξαρτήματα για την κατασκευή υλικού
Προετοιμάστε τα εξαρτήματα για την κατασκευή υλικού
Προετοιμάστε τα εξαρτήματα για την κατασκευή υλικού

Για να χτίσουμε τη δομή του εκκρεμούς, εκτυπώνουμε τρισδιάστατα μέρη και ανακυκλώνουμε κάτι που έχουμε ήδη. Η συνολική δομή του εκκρεμούς φαίνεται στο Σχ. 1. Είναι ένα μείγμα τρισδιάστατων τμημάτων εκτύπωσης μαζί με μερικά χειροποίητα μέρη και ένα μακρύ κομμάτι ξύλινης ράβδου από το Lowe.

Το τρισδιάστατο τυπωμένο τμήμα στο Σχ.2 κρεμάται στο πάνω άκρο μιας πόρτας, επειδή η πόρτα μας είναι μια εύκολη επίπεδη επιφάνεια για να κρεμάσουμε κάτι. Σύνδεσμος λήψης αρχείου STL:

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

Το πράσινο μέρος στο Σχ. 3 συνδέει τη ράβδο ξύλου με μια λεπίδα και η λεπίδα κάθεται πάνω από δύο κομμάτια ράγας τοποθετημένα στην προηγούμενη τρισδιάστατη εκτύπωση κρεμάστρας πόρτας. Σύνδεσμος λήψης αρχείου STL:

Τα δύο κομμάτια σιδηροτροχιάς κατασκευάζονται με το σπάσιμο μιας παλιάς λεπίδας πριονιού στο μισό, βλέπε Εικ. 4. Το τμήμα στο Σχ.2 έχει προετοιμάσει το σωστό μέγεθος σχισμής για αυτά. Ιδανικά μπορούμε να κάνουμε μια εγκοπή σχήματος "V" σε αυτές τις δύο λεπίδες πριονιού χρησιμοποιώντας ένα αρχείο. Ένα εύλογα κοφτερό μέταλλο, όπως μια λεπίδα ξυραφιού ή ένα χειροποίητο μεταλλικό κομμάτι, μπορεί να καθίσει μέσα στις εγκοπές σχήματος "V". Ο λόγος που χρειαζόμαστε μια μικρότερη περιοχή επαφής είναι να μειώσουμε την κινητική ενέργεια που χάνεται κατά την ταλάντευση.

Το τελευταίο τρισδιάστατο τυπωμένο τμήμα στο Σχ. 5 είναι ένας μικρός δίσκος για να χωρέσει την ηλεκτρονική συσκευή μέτρησης.

Ο σύνδεσμος λήψης:

Η συσκευή μέτρησης bluetooth δημιουργεί εκτίμηση γωνίας, γυροσκοπική μέτρηση και επιτάχυνση. Όλα αυτά τα δεδομένα είναι διαθέσιμα σε εμάς μέσω ασύρματης σύνδεσης bluetooth.

Θα πραγματοποιήσουμε πολλαπλά πειράματα με την ανάπτυξη αυτής της συσκευής σε διαφορετική θέση του βραχίονα του εκκρεμούς και θα δούμε τις διαφορές.

Βήμα 3: Πειραματιστείτε τη συλλογή δεδομένων

Πειραματική συλλογή δεδομένων
Πειραματική συλλογή δεδομένων
Πειραματική συλλογή δεδομένων
Πειραματική συλλογή δεδομένων
Πειραματική συλλογή δεδομένων
Πειραματική συλλογή δεδομένων

Υπάρχουν δύο εφικτές μέθοδοι για τη συλλογή πειραματικών δεδομένων πριν αναλύσουμε το σύνολο δεδομένων που αποκτήσαμε:

1) Χρησιμοποιήστε την εφαρμογή τηλεφώνου Android που καθορίζεται στην ενότητα απαιτήσεων για να καταγράψετε όλες τις μετρήσεις που παράγονται από τη συσκευή σε ένα αρχείο δεδομένων που είναι αποθηκευμένο στην κάρτα SD του τηλεφώνου σας. Μπορούμε να αντιγράψουμε το αρχείο και να δημοσιεύσουμε τις πληροφορίες.

2) Χρησιμοποιήστε υπολογιστή με δυνατότητα bluetooth, υπολογιστή, φορητό υπολογιστή ή μίνι υπολογιστή RaspberryPi για να δημιουργήσετε μια σύνδεση bluetooth με τη συσκευή και να διαβάσετε τα δεδομένα για ανάλυση σε πραγματικό χρόνο ή εκτός σύνδεσης.

Υπάρχουν πλεονεκτήματα και μειονεκτήματα για κάθε μέθοδο, θα δοκιμάσουμε και τα δύο και θα πούμε τη διαφορά σε αυτό το διδακτικό.

Για τη μέθοδο (1) χρησιμοποιώντας την εφαρμογή android, μόλις βρεθούμε στη διεπαφή ελέγχου εφαρμογής Android, τα δεδομένα τηλεμετρίας που αποστέλλονται από τη συσκευή μέτρησης bluetooth στο τηλέφωνο android θα καταγράφονται σε ένα αρχείο datalog με το όνομα m2flightDatayyyymmdd_hhmmss.txt. Μπορεί να βρεθεί στο φάκελο Λήψη/m2LogFiles του Android τηλεφώνου σας. Ο φάκελος "Λήψη" είναι ένας προϋπάρχων φάκελος στο λειτουργικό σύστημα Android του τηλεφώνου σας και το "m2LogFiles" είναι ένας φάκελος που η εφαρμογή δημιούργησε. Το περιεχόμενο του ονόματος αρχείου yyyymmdd_hhmmss είναι ο τρόπος κωδικοποίησης του χρόνου έναρξης του πειράματος (έτος, μήνας, ημέρα, ώρα, λεπτό και δευτερόλεπτο) στο όνομα του αρχείου.

Κάθε γραμμή στο αρχείο καταγραφής είναι μία εγγραφή. Ξεκινά με τη χρονική σήμανση του συμβάντος, συμβολοσειρά προοιμίου "eam:", ακολουθούμενη από 4 δεδομένα τρίδυμων, τα οποία είναι:

Η ανάγνωση άξονα επιταχυνσιόμετρου XYZ σε τιμές ακατέργαστου υλικού αισθητήρα καταχωρεί

Ανάγνωση άξονα γυροσκοπίου XYZ σε τιμές αναπαραγωγής μητρώου υλικού αισθητήρα ακατέργαστου

Ανάγνωση άξονα μαγνητόμετρου XYZ σε ακατέργαστες τιμές υλικού καταγραφής μητρώου

επί του σκάφους εκτιμώμενο Roll/Pitch/Raw σε βαθμό

Το αρχείο δεδομένων που δημιουργείται χρησιμοποιώντας πρόγραμμα python υπολογιστή θα χρησιμοποιεί πανομοιότυπη μορφή αρχείου δεδομένων, έτσι ώστε το πρόγραμμα που χρησιμοποιούμε στο βήμα ανάλυσης δεδομένων να μην ενοχλείται από την προέλευση δεδομένων που παράγεται από το πρόγραμμα python ή την εφαρμογή Android.

Ας ξεκινήσουμε την κωδικοποίηση χρησιμοποιώντας τη μέθοδο (2).

Για να αλληλεπιδράσετε με τη συσκευή μέτρησης bluetooth, παρέχονται δύο γεύσεις SDK:

1) Python SDK, το οποίο μπορεί να εγκατασταθεί από το "pip3 install m2controller", το python3 είναι η γλώσσα που χρησιμοποιείται. Τα παραδείγματα κώδικα εφαρμογής χρήστη αποθηκεύονται στη διεύθυνση https://github.com/xiapeiqing/m2robots/tree/maste… Για αυτό το πείραμα, θα χρησιμοποιήσουμε το εκκρεμές script python1.py

2) Java SDK, το οποίο δεν χρησιμοποιείται σε αυτό το εκπαιδευτικό, επειδή θέλουμε αργότερα οπτικοποίηση και ανάλυση των δεδομένων του εκκρεμούς που έχουν αποκτηθεί, κάτι που μπορεί να χρειαστεί λίγο περισσότερη προσπάθεια για να προγραμματίσουμε σε Java.

Ο πηγαίος κώδικας του προγράμματος συλλογής δεδομένων python3 περιέχει πολλά σχόλια για τις λεπτομέρειες της λειτουργικότητας του κώδικα. Ένα στιγμιότυπο του πηγαίου κώδικα παρέχεται εδώ.

#!/usr/bin/env python#-*-κωδικοποίηση: UTF-8-*-από m2controller import m2controller από m2controller import m2Construct σήμα εισαγωγής χρόνου εισαγωγής ημερομηνία ώρας εισαγωγής usrCfg εκκρεμές εισαγωγής2

requestExit = Λάθος

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

#θέλουμε να χρησιμοποιήσουμε την ίδια σύμβαση ονοματοδοσίας αρχείου καταγραφής, έτσι ώστε η ενότητα ανάλυσης δεδομένων, pendulum2.py, να μπορεί να είναι αγνωστική για το πώς λαμβάνουμε το αρχείο δεδομένων καταγραφής ################## ############################################### logfilename = " m2flightData%s.txt "%(datetime.datetime.fromtimestamp (time.time ()). strftime ('%Y%m%d_%H%M%S')) dataLogfile = άνοιγμα (όνομα αρχείου καταγραφής," w ")

def signal_handler (sig, frame):

καθολική αίτηση Έξοδος από εκτύπωση («χρήστης Ctrl-C για έξοδο από την εκτέλεση προγράμματος») requestExit = Αληθινό σήμα

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

#μετά από κάθε μέτρηση που γίνεται διαθέσιμη με ρυθμό 20Hz, αυτή η λειτουργία "επανάκλησης" θα κληθεί ################################ ################################ def def callbackfunc (τηλεμετρία): 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_fMagHwU 'm_fMagHwUnit'] [1], τηλεμετρία ['m_fMagHwUnit'] [2], τηλεμετρία ['m_fRPYdeg'] [0], τηλεμετρία ['m_fRPYdeg'] [1], τηλεμετρία ['m_fRPYdeg'] [2]) ## ################################################### #############εκτυπώνουμε τη συμβολοσειρά δεδομένων στην οθόνη και την αποθηκεύουμε στο αρχείο καταγραφής ######################## ########################################### εκτύπωση (dataStr) dataLogfile.writelines (dataStr)

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

#προετοιμάστε τον ελεγκτή, θυμηθείτε να ορίσετε το πεδίο BleMACaddress να είναι η διεύθυνση MAC της συσκευής σας #################################### ################################TODO: ας αρχικοποιήσουμε την BleMACaddress αν δεν έχει οριστεί από τον χρήστη. controller = m2controller. BleCtrller (m2Const.etDebian, callbackfunc, usrCfg. BleMACaddress) controller.connect () while True: ########################## #######################################περιμένετε μέχρι να δημιουργηθούν και να σταλούν τα δεδομένα μέτρησης από τη μέτρηση του εκκρεμούς συσκευές ################################################## ############### controller.m_CommsTunnel.waitForNotifications (1.0) if requestExit: ######################## ##########################################φύλαξη σπιτιού λειτουργεί εδώ όταν τελειώσουμε την καταγραφή δεδομένων ################################################### ############## controller.stop () dataLogfile.close () break

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

#συλλογή δεδομένων ολοκληρώθηκε, τώρα ας αναλύσουμε τα δεδομένα καταγραφής ######################################## ######################### pendulum2.parseDataLogFile (όνομα αρχείου καταγραφής)

Για μακροπρόθεσμη ενημέρωση, ανατρέξτε στη διεύθυνση

Τώρα ας εξηγήσουμε τον τρόπο λειτουργίας του. Αυτό το πρόγραμμα python είναι γραμμένο πάνω σε ένα πακέτο με δυνατότητα εγκατάστασης pip, που ονομάζεται m2controller. Το πακέτο χαμηλότερου επιπέδου προσφέρει μηχανισμό επανάκλησης, έτσι ώστε κάθε ενημερωμένη λήψη μέτρησης να ενεργοποιεί τη λειτουργία επανάκλησης που γράψαμε και να αποθηκεύει τα δεδομένα σε ένα τοπικό αρχείο καταγραφής. Η μορφή του περιεχομένου δεδομένων αρχείου καταγραφής είναι πανομοιότυπη με αυτήν που παράγεται από την εφαρμογή συνοδευτικής εφαρμογής android, έτσι ώστε το αρχείο καταγραφής δεδομένων που δημιουργήθηκε είτε από πρόγραμμα python είτε από τη συνοδευτική εφαρμογή andriod να είναι ανταλλάξιμο.

Το σήμα χρήστη ctrl-C, που συλλαμβάνεται από το λειτουργικό σύστημα, μεταφέρεται στο πρόγραμμα και σταματά τον άπειρο βρόχο περιμένοντας τη νέα άφιξη των δεδομένων μέτρησης.

Μέχρι τώρα, το αρχείο καταγραφής έχει δημιουργηθεί με επιτυχία και αυτό το πρόγραμμα θα καλέσει το πρόγραμμα ανάλυσης για να μελετήσει τα αποτελέσματα του πειράματός μας.

Ακολουθούν δύο πειράματα και η σύγκριση δείχνει την πολύ αξιοσημείωτη διαφορά συνδέοντας μια συσκευή 7 γραμμαρίων σε διαφορετικές τοποθεσίες.

Στο Σχήμα 2, χρησιμοποιούμε μια κλίμακα για να καθορίσουμε το πραγματικό βάρος αυτής της συσκευής μέτρησης bluetooth.

Το σχήμα 3 απεικονίζει τη ρύθμιση του εκκρεμούς όπου η συσκευή 7 γραμμαρίων είναι προσαρτημένη στο κάτω άκρο του εκκρεμούς. Η διαμόρφωση εγκατάστασης στο Σχήμα 4 έχει τη μάζα 7 γραμμαρίων που βρίσκεται πολύ πιο κοντά στον περιστρεφόμενο περιστροφικό άξονα.

Το Σχήμα 5 είναι μια κοντινή άποψη της δομής του εκκρεμούς.

Βήμα 4: Ανάλυση δεδομένων

Ανάλυση δεδομένων
Ανάλυση δεδομένων
Ανάλυση δεδομένων
Ανάλυση δεδομένων
Ανάλυση δεδομένων
Ανάλυση δεδομένων

Η συσκευή μέτρησης bluetooth ζυγίζει 7 γραμμάρια, το οποίο ζυγίζει πολύ λιγότερο από ένα ξύλινο ραβδί μήκους 1,6 μέτρων. Χρησιμοποιήστε την υπόθεση της "άκαμπτης ομοιόμορφης ράβδου" και έχουμε αυτήν την εξίσωση περιόδου εκκρεμούς, T1 = 2*pi*(2l/3g)^0,5

Για να πάρουμε τη σταθερά της βαρύτητας, μπορούμε να χρησιμοποιήσουμε 9,8m/s^2. Αλλά μια πιο ακριβής σταθερά βαρύτητας σε οποιαδήποτε δεδομένη γεωγραφική τοποθεσία μπορεί να ανακτηθεί από αυτήν την υπηρεσία ιστού:

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

Για το san francisco, είναι 9.81278m/s^2

Το μήκος του εκκρεμούς μετριέται σε 64,5"

2*pi*sqrt (2*64.5*0.0254/(3*9.81278)) δίνει την αναμενόμενη περίοδο εκκρεμούς 2.0962 (sec).

Ας δούμε αν συμφωνεί με τα πειράματά μας.

Στο 1ο πείραμα, η ρύθμιση του εκκρεμούς έχει τη συσκευή 7 γραμμαρίων προσαρτημένη στο κάτω άκρο του εκκρεμούς. Το αρχείο καταγραφής μου θα μπορούσε να μεταφορτωθεί σε:

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

Μετονομάστε το σε "PendulumTestData.txt" και τοποθετήστε το στον ίδιο φάκελο του προγράμματος ανάλυσης python. Ένα στιγμιότυπο του πηγαίου κώδικα παρέχεται εδώ.

#!/usr/bin/env python#-*-κωδικοποίηση: UTF-8-*-import csv import matplotlib.pyplot as plt plt.style.use ('seaborn-whitegrid') import numpy as np from datetime import datetime time, timedelta import seaborn as sns from sklearn.cluster import KM εννοειται απο συλλογες εισαγωγη μετρητη ##################################### ###############################αυτή η λειτουργία εκτελεί την εργασία ανάλυσης αρχείων δεδομένων ############ ################################################### ## def parseDataLogFile (datafilename): ########################################### #######################εξαγάγετε δεδομένα στο αρχείο καταγραφής δεδομένων διαχωρισμένων με κόμμα (CSV) και αποθηκεύστε το περιεχόμενο σε κάθε στήλη σε μία μεταβλητή τύπου float ## ################################################### ############ με ανοιχτό (datafilename) ως csvfile: readCSV = csv.reader (csvfile, delimiter = ',') timestampS = fAccelHwUnit_x = fAccelHwUnit_y = fAccelHwUnit fGyroHwUnit_x = fGyroHwUnit_y = fGyroHwUnit_z = fMagHwUnit_x = fMagHwUnit_y = fMagHwUni t_z = fRPYdeg_r = fRPYdeg_p = fRPYdeg_y = για τη σειρά στο readCSV: try: x = datetime.strptime (row [0].split (',') [0], '%H:%M:%S.%f ') timestampS.append (timedelta (ώρες = x.hour, minutes = x.minute, seconds = x.second, 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 [4])) (σειρά [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 (σειρά [10])) fRPYdeg_p.append (float (σειρά [11])) fRPYdeg_y.append (float (row [12]))) εκτός από: περάστε τη χρονική σήμανσηS = np.asarray (χρονικές σημάνσεις) timestamps = χρονικές σημάνσεις - χρονικές σφραγίδες [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) ################# ################################################ # χρήση συστατικό βήματος στην έξοδο συστήματος αναφοράς επικεφαλίδας στάσης για ανάλυση περιόδου εκκρεμούς ##################################### ########################### analize_timeSequence (timestampS, fRPYdeg_p, FsHz, "pitch") ########### ################################################### ####χρήση ακατέργαστων εξόδων μέτρησης acceleromter για ανάλυση περιόδου εκκρεμούς ###################################### ########################### analize_timeSequence (timestampS, fAccelHwUnit_x, FsHz, 'accel') ########## ################################################### ####χρήση γυροσκοπικής παραγωγής μέτρησης για ανάλυση περιόδου εκκρεμούς ##################################### ########################### analize_timeSequence (timestampS, fGyroHwUnit_y, FsHz, ' γύρο ') εκτύπωση (' έγινε, συγχαρητήρια:-) ') plt.show () ################################ ##################################στη διαδικασία επικοινωνίας bluetooth, υπάρχει μια σπάνια πιθανότητα ότι το πακέτο comm Comm να χαθεί#χρησιμοποιούμε το K-mean για να απομονώσουμε τα δεδομένα μέτρησης 20Hz από υπερβολικές τιμές, τα οποία προκαλούνται από την απόρριψη του πακέτου#κατάδυση στο "σήμα και σύστημα για περισσότερες λεπτομέρειες" ################# ################################################# def getSamplingIntervalS: n_clusters = clusterCnt) km.fit (sampleIntervalS.reshape (-1, 1)) centroids = km.cluster_centers_ elemCnt = Μετρητής (km.labels_) εμφάνισηCnt = για ii σε εμβέλεια (clusterCnt): eventCent.append (elemCnt [ii]) FsHz = 1/centroids [وقγμαCnt.index (μέγ. (ΠεριστατικόCnt))] επιστροφή FsHz

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

#χρησιμοποιήστε φασματόμετρο, δηλαδή, σύντομο χρονικό διάστημα FFT για να λάβετε το στοιχείο της συχνότητας, ο κάδος κορυφής είναι η καλύτερη εκτίμηση της ταλάντωσης του εκκρεμούς ########################### ###################################### def analysis_timeSequence (timestampS, timeSeqData, FsHz, strComment): 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, freqs, bins, im = ax2.specgram (timeSeqData, NFFT = NFFT, Fs = FsHz, noverlap = NFFT/2)

ax2.set_title ("Spectrogram") ax2.set_xlabel ("δείγματα") ax2.set_ylabel ("συχνότητα (Hz)");

# Η μέθοδος `specgram` επιστρέφει 4 αντικείμενα. Αυτοί είναι:

# - Pxx: το περιοδογράφημα # - συχνές: το διάνυσμα συχνότητας # - κάδοι: τα κέντρα των κάδων του χρόνου # - im: το matplotlib.image. AxesImage που αντιπροσωπεύει τα δεδομένα στο διάγραμμα pkresult = np.where (Pxx == np.amax (Pxx)) oscFreqHz = συχνότητες [pkresult [0] [0] εκτύπωση ('ταλάντωση εκκρεμούς Freq (Hz) =%f, Περίοδος (Sec) =%f, προέλευση δεδομένων εκτίμησης:%s'%(oscFreqHz, 1/oscFreqHz, strComment)) επιστροφή 1/oscFreqHz

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

#θα πρέπει να τρέξουμε αυτό το πρόγραμμα ανεξάρτητα, δηλαδή, να μην κληθούμε από το pendulum1.py,#ορίζουμε ένα προεπιλεγμένο όνομα αρχείου αρχείου καταγραφής που θα αναλυθεί ##################### ############################################ εάν _name_ == "_main_ ": defaultFilename = './PendulumTestData.txt' εισαγωγή os.path εάν os.path.isfile (defaultFilename): parseDataLogFile (defaultFilename) else: print (" default αρχείο καταγραφής %s δεν υπάρχει " %defaultFilename)

Για μακροπρόθεσμη ενημέρωση, ανατρέξτε στη διεύθυνση

Ο πηγαίος κώδικας περιέχει λεπτομερή σχόλια, ας δώσουμε μια περίληψη υψηλού επιπέδου της μαθηματικής εκτίμησης εδώ.

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) Δεδομένου ότι ο ρυθμός μέτρησης είναι τόσο κρίσιμος και εισάγει άμεσα σφάλμα εκτίμησης περιόδου εκκρεμούς, θέλουμε να τα εκτιμήσουμε. Το ονομαστικό μας διάστημα μέτρησης είναι 50ms, δηλαδή 20Hz. Ο μέσος όρος σε όλες τις μετρήσεις φαίνεται εντάξει, αλλά περιστασιακά χάνουμε το πακέτο μετάδοσης δεδομένων, το διάστημα ενημέρωσης γίνεται 100ms ή 150ms,…

Αν σχεδιάσουμε την εμφάνιση αυτών των δεδομένων, βλέπε Σχήμα 1, ως άνθρωπος, μπορούμε εύκολα να έχουμε μια τιμή για τα μάτια μας 0,05 δευτερόλεπτα. Ωστόσο, μπορούμε να κάνουμε καλύτερα από αυτό;

Πρέπει να χρησιμοποιήσουμε τη μέθοδο ταξινόμησης για να επιλέξουμε μόνο τις καλές για τον μέσο υπολογισμό. Η Python διαθέτει εργαλειοθήκη που ονομάζεται KMeans για να μας βοηθήσει με την ομαδοποίηση ή την ταξινόμηση. Αυτές οι έννοιες χρησιμοποιούνται σε πολλά μεγάλα δεδομένα και τομείς τεχνητής νοημοσύνης.

3) Το σχήμα 2 περιέχει δύο εικόνες. Το κορυφαίο διάγραμμα είναι μια ακολουθία χρονικού πεδίου της μέτρησης της γωνίας περιστροφής μας σε βαθμίδες. Αναφερόμενοι στη χρονική σήμανση του άξονα Χ στο Δεύτερο, μπορούμε να διαβάσουμε περίπου 22,5 κύκλους σε 50 δευτερόλεπτα, που μεταφράζεται σε περίοδο εκκρεμούς 2,22 δευτ. Υπάρχει τρόπος αυτοματοποίησης αυτής της διαδικασίας και ακριβέστερης εκτίμησης; Ναι, μπορούμε να χρησιμοποιήσουμε μαθηματικό εργαλείο που ονομάζεται φασματογράφημα, το οποίο χρησιμοποιεί ένα μικρό κομμάτι δεδομένων μέτρησης και να μας πει τη συχνότητά του, δείτε το παρακάτω σχήμα. Η ανάγνωση του άξονα y για τη σκοτεινότερη γραμμή είναι η συχνότητα ταλάντωσης του εκκρεμούς. Η οριζόντια γραμμή επιβεβαιώνει ότι η ταλάντωση του εκκρεμούς δεν άλλαξε καθόλου σε όλο το πείραμα. Η αντίστροφη τιμή της συχνότητας ταλάντωσης είναι η περίοδος ταλάντωσης του εκκρεμούς.

Η τελική έκθεση του προγράμματος είναι μια περίληψη κειμένου:

συχνότητα ταλάντωσης εκκρεμούς (Hz) = 0.449224, Περίοδος (Sec) = 2.226059, προέλευση δεδομένων εκτίμησης: βήμα

Μπορούμε να διαπιστώσουμε ότι το προηγούμενο αποτέλεσμα υπολογισμού του χεριού μας, 2,22 δευτερόλεπτα, είναι αρκετά συνεπές με την υπολογισμένη αξία του προγράμματος.

Σε σύγκριση με τη θεωρητικά υπολογισμένη τιμή 2.0962 (sec), έχουμε remaining 5% εναπομένον σφάλμα. Πώς να τα ξεφορτωθείτε; Θυμάστε ότι η υπόθεση είναι "άκαμπτη ομοιόμορφη ράβδος"; Ακόμη και ένα επιπλέον βάρος 7 γραμμαρίων φαίνεται ασήμαντο, είναι η μεγαλύτερη αιτία του εναπομένοντος σφάλματος.

Μετακινούμε τώρα τη συσκευή, κοντά στον άξονα. Δείτε το προηγούμενο βήμα για μια κοντινή φωτογραφία. Μπορείτε να κατεβάσετε το αρχείο καταγραφής που δημιούργησα εδώ:

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

Εκτελέστε τα ίδια βήματα ανάλυσης και παίρνουμε Περίοδος 2.089867 (Sec), βλέπε Σχήμα 3, το οποίο είναι σχεδόν πανομοιότυπο με τη θεωρητική πρόβλεψη. Μεγάλος!

Δεδομένου ότι δεν έχουμε μόνο μέτρηση γωνίας ταλάντωσης, αλλά και γυροσκοπική μέτρηση και μέτρηση επιταχυνσιόμετρου με τον ίδιο ρυθμό. Εκτελέστε την ίδια ανάλυση για τις άλλες δύο μετρήσεις, παίρνουμε αποτελέσματα στο Σχήμα 4 και 5. Οι εκτιμήσεις και από τις τρεις πηγές μέτρησης συμφωνούν, οι οποίες μας κάνουν πιο σίγουρους για την επιτυχία του πειράματός μας.

Εδώ είναι το αποτέλεσμα ως τελική έξοδος του προγράμματος python που εκτελείται:

συχνότητα ταλάντωσης εκκρεμούς (Hz) = 0,478499, Περίοδος (δευτ.) = 2,089867, προέλευση δεδομένων εκτίμησης: βήμα

συχνότητα ταλάντωσης εκκρεμούς (Hz) = 0,478499, Περίοδος (δευτ.) = 2,089867, προέλευση δεδομένων εκτίμησης: accel

συχνότητα ταλάντωσης εκκρεμούς (Hz) = 0,478499, Περίοδος (δευτ.) = 2,089867, προέλευση δεδομένων εκτίμησης: γυροσκόπιο

Τελευταία σκέψη σε αυτό το βήμα, πώς μπορούν τα αποτελέσματα εκτίμησης να είναι ακριβώς πανομοιότυπα χρησιμοποιώντας διαφορετική πηγή δεδομένων εισόδου; Αυτό είναι αντί-διαίσθηση. Θα αφήσω αυτή την ερώτηση στους αναγνώστες. Εδώ είναι μια υπόδειξη: θυμάστε ότι χρησιμοποιούμε το FFT μικρού χρόνου για να εκτιμήσουμε τη συχνότητα ταλάντωσης; Στον ψηφιακό τομέα, η εκτίμηση συχνότητας δίνεται σε ξεχωριστούς κάδους συχνότητας αντί για εκτίμηση κυμαινόμενου αριθμού.

Βήμα 5: Μελλοντικές προτάσεις εργασίας

Υπάρχουν λίγες κατηγορίες μελλοντικών προτάσεων εργασίας.

Σε προηγούμενο βήμα, καταφέρνουμε να μειώσουμε το σφάλμα του πειράματός μας από ~ 5% σε λιγότερο από 1%, μπορούμε καλύτερα από αυτό; Παρατηρώντας ότι το μέγεθος ταλάντωσης μειώνεται εκθετικά, ένας παράγοντας που συμβάλλει μπορεί να είναι η αντίσταση του αέρα που προκαλείται κατά την περιστροφή του εκκρεμούς. Η διατομή του εκκρεμούς μπορεί να χρειαστεί να τροποποιηθεί ώστε να έχει απλό σχήμα, ώστε να μειωθεί η αεροδυναμική αντίσταση.

Μπορούμε να εφαρμόσουμε ένα χρονικά μεταβαλλόμενο κέρδος που μαθαίνουμε χρησιμοποιώντας προσαρμοστικές τεχνικές φίλτρου για την έξοδο ενός σταθερού σήματος μεγέθους κορυφής. Εν τω μεταξύ, συσχετίστε την εξασθένηση μεγέθους με τις εξωτερικές δυνάμεις.

Δύσκολα μπορούμε να βρούμε κάτι πιο απλό από την «απλή αρμονική κίνηση». Μπορούμε να χρησιμοποιήσουμε τις εγκαταστάσεις που αναλύουμε το εκκρεμές για να αναλύσουμε κάτι πιο περίπλοκο, μια αθλητική δραστηριότητα, μια σειρά εκτόξευσης πύραυλων νερού κλπ;

Καλό χάκερ

Συνιστάται: