koslibpro Δημοσ. 24 Νοεμβρίου 2012 Δημοσ. 24 Νοεμβρίου 2012 καλησπερα! ψαχνοντας στο play store βρηκα μια εφαρμογη που ουσιαστικα μετραει τα βηματα που κανεις,ενα pedometer. στο promo video της εφαρμογης ειχε ο χρηστης το κινητο στο χερι του και μολις εκανε 1 βημα εμφανιζοταν στην οθονη,αν εκανε ακομη ενα του εμφανιζε οτι εκανε 2 βηματα κλπ κλπ.. απο προγραμματιστικης αποψεως αυτο μου εκανε εντυπωση!πως ακριβως γινεται με τοσο μεγαλη ακριβεια?χρησιμοποιωντας gps και συντεταγμενες δεν νομιζω γιατι θα απαιτοθσε εστω μερικα δευτερολεπτα για να εμφανιστει στην οθονη.. καθως το εψαξα λιγο,βρηκα οτι εχει σχεση με το accelerometer.αυτο ομως δεν το καταλαβαινω,πως σχετιζονται.. απο καθαρα ακαδημαικο ενδιαφερον,μπορει καποιος γνωστης του θεματος να μας δωσει καμια πληροφορια επι αυτου??
albNik Δημοσ. 24 Νοεμβρίου 2012 Δημοσ. 24 Νοεμβρίου 2012 Δεν έχω ασχοληθει αλλά νομίζω έχει θεωρία φυσικής. http://developer.android.com/reference/android/hardware/SensorEvent.html
kagelos Δημοσ. 24 Νοεμβρίου 2012 Δημοσ. 24 Νοεμβρίου 2012 Το επιταχυνσιόμετρο μετράει την επιτάχυνση που δέχεται. Ολοκληρώνοντας την επιτάχυνση βρίσκεις ταχύτητα. Ολοκληρώνοντας την ταχύτητα βρίσκεις την απόσταση. Δηλαδή μιλάμε για απλή πρόσθεση των τιμών της επιτάχυνσης για να βρεις την στιγμιαία ταχύτητα και στη συνέχεια απλή πρόσθεση της κάθε ταχύτητας για να βρεις την απόσταση που διανύθηκε. Το επιταχυνσιόμετρο συνήθως δίνει την επιτάχυνση σε 2 ή 3 άξονες (x,y ή x,y,z) οπότε μιλάμε για διάνυσμα και γνωρίζεις (θεωρητικά) και τη διεύθυνση. Το δύσκολο (και αδύνατο να γίνει με ακρίβεια μόνο με επιταχυνσιόμετρο) είναι να ξεχωρίζεις την στατική από τη δυναμική επιτάχυνση, δηλαδή πότε έχουμε επιτάχυνση κίνησης και πότε επιταχύνση της βαρύτητας (στατική). Οπότε για να δουλέψει η εφαρμογή φαντάζομαι δεν πρέπει να περιστρέφεις το κινητό όσο περπατάς ή να το κουνάς αριστερά δεξιά με δύναμη. Σίγουρα θα έχει μια ανοχή, αλλά από ένα σημείο και μετά θα μπερδευτεί. Για πιο αποτελεσματικό εντοπισμό της σχετικής θέσης χρειάζεσαι μαζί και ένα γυροσκόπιο. Τις τιμές από τα δύο όργανα τις περνάς συνήθως από ένα Site: Kalman filter που διορθώνει κάπως το σφάλμα των μετρήσεων. Είναι δεδομένο πως μετά από ένα χρονικό διάστημα θα έχεις τελείως εσφαλμένη αντίληψη για το που βρίσκεσαι και θα χρειάζεται να κάνεις "reset" της αρχικής θέσης σου με κάποιο εξωτερικό όργανο (π.χ. GPS). Ακολουθώντας το link του albNik Site: βρήκα ένα παράδειγμα του πως να φιλτράρεις την στατική επιτάχυνση: > public void onSensorChanged(SensorEvent event) { // alpha is calculated as t / (t + dT) // with t, the low-pass filter's time-constant // and dT, the event delivery rate final float alpha = 0.8; gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; linear_acceleration[0] = event.values[0] - gravity[0]; linear_acceleration[1] = event.values[1] - gravity[1]; linear_acceleration[2] = event.values[2] - gravity[2]; } απλή πρόσθεση της κάθε ταχύτητας για να βρεις την απόσταση που διανύθηκε. Για την ακρίβεια, πρόσθεση της κάθε ταχύτητας για να βρεις την τρέχουσα θέση, πρόσθεση της απόλυτης τιμής της κάθε ταχύτητας για να βρεις την συνολική απόσταση. 1
koslibpro Δημοσ. 25 Νοεμβρίου 2012 Μέλος Δημοσ. 25 Νοεμβρίου 2012 μαλιστα,ενδιαφεροντα ολα αυτα,θα τους ριξω μια ματια και αργοτερα ευχαριστω για τα λινκς etc
thanos713 Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 Το επιταχυνσιόμετρο συνήθως δίνει την επιτάχυνση σε 2 ή 3 άξονες (x,y ή x,y,z) οπότε μιλάμε για διάνυσμα και γνωρίζεις (θεωρητικά) και τη διεύθυνση. Το δύσκολο (και αδύνατο να γίνει με ακρίβεια μόνο με επιταχυνσιόμετρο) είναι να ξεχωρίζεις την στατική από τη δυναμική επιτάχυνση, δηλαδή πότε έχουμε επιτάχυνση κίνησης και πότε επιταχύνση της βαρύτητας (στατική). Οπότε για να δουλέψει η εφαρμογή φαντάζομαι δεν πρέπει να περιστρέφεις το κινητό όσο περπατάς ή να το κουνάς αριστερά δεξιά με δύναμη. Σίγουρα θα έχει μια ανοχή, αλλά από ένα σημείο και μετά θα μπερδευτεί.Εδώ απλά υπάρχει πρόβλημα με αυτούς που κάνουν αναρρίχηση ή και ακόμα με αυτούς που περπατάνε σε κεκλιμένο επίπεδο. Άμα το επιταχυνσιόμετρο μας δείχνει την συνισταμένη των επιταχύνσεων, θα πρέπει με κάποιο τρόπο να βρίσκουμε την γωνία μεταξύ επιτάχυνσης της βαρύτητας και της δικής μας επιτάχυνσης, έτσι ώστε να αναλύουμε σε 2 συνιστώσες (3 για παραπάνω διαστάσεις) και να βρίσκουμε ακριβώς απόσταση. Για την ακρίβεια, πρόσθεση της κάθε ταχύτητας για να βρεις την τρέχουσα θέση, πρόσθεση της απόλυτης τιμής της κάθε ταχύτητας για να βρεις την συνολική απόσταση.Εδώ απλά ξέχασες τον χρόνο, πώς θα βρεις απόσταση όταν έχεις μόνο ταχύτητες; Είναι άθροισμα απόλυτων τιμών ταχυτήτων (ίσως και μέτρων) επί τον χρόνο. (Όχι ότι δεν το ξέρεις, απλά σου ξέφυγε πάνω στην "βιασύνη").
kagelos Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 Το επιταχυνσιόμετρο δεν δίνει συνισταμένη, είπαμε δίνει την επιτάχυνση σε κάθε άξονα. Επίσης το παραπάνω παράδειγμα δείχνει πως να φιλτράρεις την στατική επιτάχυνση. Ούτε ξέχασα τον χρόνο. Τις τιμές τις παίρνεις ανά κάποιο interval, δηλαδή δειγματοληπτείς. Στον ψηφιακό κόσμο το ολοκλήρωμα είναι απλά το άθροισμα των δειγμάτων. thanos713 αν θυμάμαι καλά ακόμη είσαι μαθητής, οπότε όταν κάνετε ολοκληρώματα και παράλληλα τους νόμους κίνησης του Νεύτωνα, θα μάθεις πως η ταχύτητα είναι η παράγωγος του διαστήματος και η επιτάχυνση παράγωγος της ταχύτητας. Με διπλή ολοκλήρωση της επιτάχυνσης, έχεις την θέση. Για έναν άξονα: > int accelerationX = 0; int velocityX = 0; int positionX = 0; void OnSampleReceived(Vector acceleration) { accelerationX = acceleration.X; velocityX += accelerationX; positionX += velocityX; } Το positionX θα δου δίνει πάντα την απόσταστη, στον άξονα Χ, από το σημείο που βρισκόσουν όταν άρχισε η δειγματοληψία, ενώ το velocityX την τρέχουσα ταχύτητα. 1
thanos713 Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 Το επιταχυνσιόμετρο δεν δίνει συνιστώσα, είπαμε δίνει την επιτάχυνση σε κάθε άξονα. Ούτε ξέχασα τον χρόνο. Τις τιμές τις παίρνεις ανά κάποιο interval, δηλαδή δειγματοληπτείς. Στον ψηφιακό κόσμο το ολοκλήρωμα είναι απλά το άθροισμα των δειγμάτων. thanos713 αν θυμάμαι καλά ακόμη είσαι μαθητής, οπότε όταν κάνετε ολοκληρώματα και παράλληλα τους νόμους κίνησης του Νεύτωνα, θα μάθεις πως η ταχύτητα είναι η παράγωγος του διαστήματος και η επιτάχυνση παράγωγος της ταχύτητας. Με διπλή ολοκλήρωση της επιτάχυνσης, έχεις την θέση. Για έναν άξονα: > int accelerationX = 0; int velocityX = 0; int positionX = 0; void OnSampleReceived(Vector acceleration) { accelerationX = acceleration.X; velocityX += accelerationX; positionX += velocityX; } Το positionX θα δου δίνει πάντα την απόσταστη, στον άξονα Χ, από το σημείο που βρισκόσουν όταν άρχισε η δειγματοληψία. Δεν κατάλαβες τι είπα μάλλον, ίσως δεν το έθεσα καλά. Τα επιταχυνσιόμετρο όπως είπες, δίνει επιτάχυνση σε κάθε άξονα ξεχωριστά, όμως αυτή η επιτάχυνση είναι η συνισταμένη των επιταχύνσεων σε κάθε άξονα ξεχωριστά απ' ότι φαντάζομαι, σωστά; Δηλαδή αν έχεις μια επιτάχυνση a1 και μία a2, η συνισταμένη θα είναι το άθροισμα των διανυσμάτων a1 και a2 και αυτό μετά θα το αναλύσεις στις 3 διαστάσεις. Όμως έτσι, άμα περπατάς κατακόρυφα, πώς θα καταλάβει το πρόγραμμα ότι δεν επιταχύνεσαι βαρυτικά; Για να επιταχύνεσαι βαρυτικά θα θεωρεί μόνο ότι κάνεις ελεύθερη πτώση; Εκεί είναι το πρόβλημά μου, στον διαχωρισμό των επιταχύνσεων και πώς αυτό επιτυγχάνεται. Όσο για το άλλο, κάπου το χάνω. Αν παίρνεις μετρήσεις κάθε ένα πολύ μικρό Δt, έστω ότι είναι 0.1s, πώς θα γίνει χωρίς να μπλέξεις τον χρόνο, ο οποίος είναι η μεταβλητή ως προς την οποία παραγωγίζεις και ολοκληρώνεις αντίστοιχα, να παίρνεις τιμές; Αν το κάνεις έτσι, τα νούμερα θα αυξάνουν πάρα πολύ απότομα, αφού κάθε Δt θα προσθέτεις κι άλλο κι άλλο. Εγώ φαντάζομαι έναν τέτοιο κώδικα: > void OnSampleReceived(Vector acceleration, int t) { accelerationX = acceleration.X; velocityX += accelerationX*t; positionX += velocityX*t; } Αυτή είναι και η μέθοδος Forward Euler (στο περίπου, αν ξεκινούσαμε από κάτι σταθερό, θα ήταν) με την οποία λύνονται και αριθμητικά διαφορικές εξισώσεις. ΥΣ. Ίσως πάλι δεν καταλάβεις τι θέλω να πω στο πρώτο, στην ουσία θέλω να δω πώς διαχωρίζονται οι πολλές επιταχύνσεις προγραμματιστικά.
kagelos Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 Ξαναλέω: Η εφαρμογή δειγματοληπτεί, δηλαδή λαμβάνει στιγμιαίες τιμές από τον σένσορα. Η στιγμιαία επιτάχυνση δεν έχει συνιστώσες. Είναι ένα δεδομένο διάνυσμα το οποίο αναλύεται σε 3 διαστάσεις. Από εκεί και πέρα, όχι ο χρόνος δεν χρειάζεται. Έστω πως ξεκινάει η δειγματοληψία και παίρνουμε τις εξής τιμές ανά 0.1sec που λες (για έναν άξονα για να μη γράφω πολλά): t1: acceleration = 7 m^2/s άρα velocity = 7 m/sec και απόσταση από το αρχικό σημείο 7 m t2: acceleration = 12 m^2/s άρα velocity = 19 m/sec και απόσταση από το αρχικό σημείο 26 m t3: acceleration = -4 m^2/s άρα velocity = 15 m/sec και απόσταση από το αρχικό σημείο 41 m t4: acceleration = -15 m^2/s άρα velocity = 0 m/sec και απόσταση από το αρχικό σημείο 41 m =======> σταμάτησε η κίνηση κλπ κλπ 1
thanos713 Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 Ξαναλέω: Η εφαρμογή δειγματοληπτεί, δηλαδή λαμβάνει στιγμιαίες τιμές από τον σένσορα. Η στιγμιαία επιτάχυνση δεν έχει συνιστώσες. Είναι ένα δεδομένο διάνυσμα το οποίο αναλύεται σε 3 διαστάσεις. Από εκεί και πέρα, όχι ο χρόνος δεν χρειάζεται. Έστω πως ξεκινάει η δειγματοληψία και παίρνουμε τις εξής τιμές ανά 0.1sec που λες (για έναν άξονα για να μη γράφω πολλά): t1: acceleration = 7 m^2/s άρα velocity = 7 m/sec και απόσταση από το αρχικό σημείο 7 m t2: acceleration = 12 m^2/s άρα velocity = 19 m/sec και απόσταση από το αρχικό σημείο 26 m t3: acceleration = -4 m^2/s άρα velocity = 15 m/sec και απόσταση από το αρχικό σημείο 41 m t4: acceleration = -15 m^2/s άρα velocity = 0 m/sec και απόσταση από το αρχικό σημείο 41 m =======> σταμάτησε η κίνηση κλπ κλπ Διαφωνούμε πάλι. :Ρ (Δεν πειράζει, καλό είναι αυτό). Εσύ παίρνεις δειγματοληψίες, αλλά θεωρείς ότι για 1s τα νούμερα μένουν ίδια. Αν από 1s έως 2s η επιτάχυνση μένει ίδια, τότε όντως, αυτό θα βγει άμα βάλουμε χρόνο, αλλά αν αλλάξει, θα βρούμε άλλα. Αν πχ. έχεις σταθερή επιτάχυνση 2m/s^2 και κάνεις αυτό που λες, δεν θα βρίσκεις σωστά αποτελέσματα.
kagelos Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 Μεταξύ των δειγματοληψιών δεν ξέρεις τι γίνεται, αλλά αν είναι αρκετά υψηλή η συχνότητα δειγματοληψίας σε σχέση με αυτό που μετράς, δεν θα έχεις απολύτως κανένα πρόβλημα. Ποιο θα ήταν το λάθος αν είχες σταθερή επιτάχυνση;
thanos713 Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 Ακριβώς! Άμα όμως έχει συχνότητα πολύ μεγάλη, θα πρέπει να βάλεις χρόνο Δt (στην πραγματικότητα dt, αλλά δεν είναι οριακός στους υπολογιστές). Πάρε το παράδειγμα που σου είπα και γράψε το σε χαρτί, στο 3ο δευτεόλεπτο, έχεις διανύσεις 9m κανονικά, με τον τρόπο που λες, βγάζω 12m, γιατί η ταχύτητα αλλάζει και ανάμεσα στα δευτερόλεπτα.
kagelos Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 Με σταθερή επιτάχυνση 2m^2/sec: t0: acc = 2m^2/sec, vel = 2m/sec, position = 2m t1: acc = 2m^2/sec, vel = 4m/sec, position = 6m t2: acc = 2m^2/sec, vel = 6m/sec, position = 12m Που είναι το λάθος;
thanos713 Δημοσ. 25 Νοεμβρίου 2012 Δημοσ. 25 Νοεμβρίου 2012 a = 2 v = ολοκλήρωμα 2dt = 2t x = ολοκλήρωμα vdt = (2t^2)/2 που βγάζει 9 για t =3. Τα ολοκληρώματα είναι αόριστα και θεωώ σταθερά c = 0 λόγω δεδομένων προβλήματος.
kagelos Δημοσ. 26 Νοεμβρίου 2012 Δημοσ. 26 Νοεμβρίου 2012 thanos713 καταρχάς δεν υπολογίζουμε το αόριστο ολοκλήρωμα, δλδ την αντιπαράγωγο. Η αντιπαράγωγος δεν δίνει τιμές και μας είναι τελείως αδιάφορη στον υπολογισμό. Το ορισμένο ολοκλήρωμα ψάχνουμε από το διάστημα [t0, t1], [t1, t2] κοκ. Επιπλέον ξεκινάς λάθος θεωρώντας πως η συνάρτηση της επιτάχυνσης είναι μια σταθερά και ότι μετά η ταχύτητα είναι 2t. Το ολοκλήρωμα μιας συνάρτησης σε ένα διάστημα είναι το άθροισμα όλων των τιμών της συνάρτησης στο διάστημα αυτό. Για αυτό και η ταχύτητα στο [t0, tn] είναι το άθροισμα όλων των τιμών της επιτάχυνσης από το t0 ως το tn. Επειδή στον ψηφιακό κόσμο έχουμε πεπερασμένο αριθμό δειγμάτων, το ολοκλήρωμα υπολογίζεται πολύ απλά αθροίζοντας τις τιμές των δειγμάτων. Προσπάθησε να καταλάβεις αυτά που σου λέω πριν δοκιμάσεις να απαντήσεις πάλι και θα καταλάβεις ότι είναι σωστό, για αυτό και ο τρόπος υπολογισμού που σου λέω βγάζει σωστές τιμές.
thanos713 Δημοσ. 26 Νοεμβρίου 2012 Δημοσ. 26 Νοεμβρίου 2012 Μα είναι λάθος! Δεν βγάζει σωστό αποτέλεσμα, τι να καταλάβω; Παίρνεις τιμές κάθε 0.1s και μετά όταν το εφαρμόζεις θεωρείς ότι σε ολόκληρο το 1s είναι σταθερό. Παίρνω παράδειγμα την σταθερή επιτάχυνση για να δείξω ότι δεν ισχύει με ένα απλό παράδειγμα. Συμφωνούμε ότι είναι ένα άθροισμα, αλλά εσύ δεν παίρνεις όλες τις ενδιάμεσες τιμές, παίρνεις μόνο αυτές κάθε 1 sec...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα