Android erhalten normalisierte Beschleunigung

Ich möchte den Beschleunigungsvektor eines Android-Telefons bekommen. Das Problem ist, dass die Beschleunigungsmesser-Koordinaten relativ zu der Rotation des Telefons sind. Was ich will, ist die "absolute" Beschleunigung, dh es sollte die gleichen Werte zurückgeben, auf welche Weise das Telefon steht. (Ich möchte erkennen, ob ein Benutzer, der Skifahren ist, einen Hang hinuntergleitet, ohne GPS zu benutzen. Ich muss auch in der Lage sein, das Schieben zu differenzieren und die Sesselbahn hinaufzusteigen.)

Ich kann diese Werte wohl durch die Kombination des Beschleunigungsmessers mit dem Gyroskop bekommen, aber ich habe keine Ahnung, wie ich die Geschwindigkeit des Beschleunigungsmessers mit dem Gyroskop ausgleichen könnte.

  • Wie bekomme ich Runde in Android
  • Fehler beim Erhalten des Antwortstroms (ReadDone1): ReceiveFailure
  • Wie finde ich heraus, wie viel freie Haufengröße für Bitmap für Android verfügbar ist 2. *?
  • Übergeben von ArrayList mit Objekten zu neuer Aktivität?
  • Was ist AttributeSet und wie kann ich es verwenden?
  • Time Picker Dialog Absturz auf Samsung S4 OS 4.3
  • Ist das möglich, und wenn ja, wie?

  • TextToSpeech.OnInitListener.onInit (int) wird kontinuierlich aufgerufen
  • Android-Klasse mit ArrayList verpackbar
  • Android App stürzt auf Lollipop ab
  • Konvertieren Sie Java-Projekt in Android-Projekt auf Eclipse
  • So ändern Sie Alert-Dialog Header-Teiler Farbe Android
  • Neue Jack-Toolchain stürzt beim Einsatz von android-apt-Plugin ab
  • 4 Solutions collect form web for “Android erhalten normalisierte Beschleunigung”

    Was Sie beschreiben, kann nicht getan werden, es sei denn, Sie neu definieren das Problem ein bisschen. Um Ihnen zu helfen, neu zu definieren, werde ich die wichtigsten Fragen skizzieren:

    Zuerst vermute ich, dass das, was Sie unter "absolute Beschleunigung" meinen, die Beschleunigung in Bezug auf die geographische Referenz ist. Das kann nicht mit dem Beschleunigungsmesser allein gemacht werden, da es keine Ahnung von geographischen Bezügen hat. Wenn du weit genug für den GPS fährst oder den Kompass nimmst, kannst du das vielleicht umgehen, aber jeder von ihnen hat seine eigenen Probleme (obwohl zumindest das Problem löslich ist).

    Die zweite Frage ist, dass Schwerkraft und Beschleunigung mit einem Beschleunigungsmesser allein (nicht als "Äquivalenzprinzip" bezeichnet) völlig ununterscheidbar sind. Daher ist jede gemessene Beschleunigung immer die Vektorsumme der Schwerkraft und die Beschleunigung, aber es gibt immer mehrere Lösungen für diese Gleichungen, und in den üblichen Fällen, wo die Beschleunigung kleiner als die Schwerkraft ist, kann man wirklich nichts über die Beschleunigung bestimmen . Da die Schwerkraft zwar etwas konstant ist, gibt es hier auch Möglichkeiten, mit einem Gyroskop zu arbeiten, oder vielleicht könnte dein Benutzer das Telefon in einer festen Orientierung halten (zB durch das Betrachten von externen Cues wie dem Horizont) und einer von diesen Ansätze können Sie den Einfluss der Schwerkraft subtrahieren lassen, aber es ist im Allgemeinen ein nicht-triviales Problem.

    Der letzte Punkt zu nicht ist, dass Sie scheinen, in einem Erde-festen Koordinatensystem denken und der Telefon-Beschleunigungsmesser ist nur telefonisch fixiert. Das ist die z-Achse des Beschleunigers, viele haben nichts mit auf und ab auf der Erde zu tun – und die Beziehung hängt von der Orientierung des Telefons ab. Wirklich, viele Leute würden lieber ein erdfestes System, aber das Telefon weiß das einfach nicht. Sie können externe Cues (GPS, Magnetfeld, Gyroskop, Schwerkraft, Horizont, etc.) verwenden, um zu versuchen, sie auszurichten, aber gegeben nur eine einzige willkürliche Lesung Form der Beschleunigungsmesser, die Informationen ist einfach nicht da.

    Definitionen:
    Beschleunigungsvektor : Dies ist das x, y, z, das aus dem Beschleunigungsmesser liest (und jedes Lesen hängt von der Telefonorientierung ab), manchmal geschrieben als A = (a x , a y , a z ).
    Beschleunigungsgröße : Dies ist a = sqrt (a x 2 + a y 2 + a z 2 ), und dies sollte nicht von der Telefonorientierung abhängen (wenn die verschiedenen Achsen gleich kalibriert sind). Wenn das Telefon stationär ist, wird dies im Grunde nur eine Lektüre der Schwerkraft sein. Beachten Sie auch, dass eine Menge der Informationen im Beschleunigungsvektor mit dieser Maßnahme verloren geht.
    Normalisierte Beschleunigung : Die Beschleunigungsrichtung, die Magnitude 1 hat, dh A / a
    Beschleunigung in den Erdkoordinaten: Ich denke, das ist es, was du wirklich willst, es gibt einfach keinen einfachen Weg, um es zu bekommen, und wirklich auch wenn du es könnte, ich glaube nicht, dass es so nützlich wäre, wie es vielleicht zuerst erscheinen mag.

    Skifahren :
    Ich denke, Sie haben einen guten Schuss bei der Bestimmung, wann jemand Skifahren auf der Grundlage der Messungen aus dem Beschleunigungsmesser. Dinge wie Stöße und Wendungen sollten alle mit dem Beschleunigungsmesser ganz unverwechselbar sein. Für diese würde ich den vollen Beschleunigungsvektor verwenden. Zum Beispiel würde die Beschleunigungsgröße in etwa abwechselnd konstant bleiben und die Richtung würde fegen. Beachten Sie auch, dass Free-Fall (dh im Grunde immer dann, wenn der Skifahrer hat nicht ihren Himmel / Füße / Hintern / etc auf dem Boden, ob sie nach oben gehen, wenn Starten eines Stoßes / Sprung, oder fallen aus der Sesselbahn) , Wird die Beschleunigungsgröße im Freifall null sein. Für den Sessellift scheint es, dass es wahrscheinlich eine unverwechselbare rhythmische Herrschaft meistens in einer einzigen Ebene haben wird.

    All diese Dinge könnten herausgefunden werden. Ich würde empfehlen, wenn Sie wirklich wollen, um dieses Problem zu lösen, ist es, Daten von Ihrem Beschleunigungsmesser während Skifahren aufzeichnen, und sehen, ob Sie bestimmen können, wenn Sie Skifahren auf der Grundlage der Eigenschaften der Daten. (Meine Vermutung ist, dass Ihr großer Stolperstein mit diesem Mathe sein wird, weil es ein bisschen schwierig sein könnte, mit einem Algorithmus zu kommen, der die Unterschriften des Skifahrens unterscheiden kann, also scheint es, dass es eine gute Idee wäre, den Vektor zu überprüfen Mathe und Sachen wie Dot-Produkte und Cross-Produkte, und auch, ich vermute, dass ein bisschen auf ein anderes Thema wie FFTs oder Fourier-Transformationen nützlich sein könnte bei der Sortierung der Zeit und Frequenz Unterschriften des Skifahrens vs Schwingen in der Sesselbahn nützlich sein .)

    Du könntest auch GPS-Messungen falten, was nicht so zuverlässig wäre oder eine gute Zeitauflösung gibt, aber zumindest dazu verwendet werden könnte, deinen Algorithmus zu verdoppeln.

    Sie können die Beschleunigung unabhängig von der Ausrichtung des Telefons berechnen:

    a = sqrt(x*x + y*y + z*z) 

    Wo a die absolute Beschleunigung und x , y und z sind Beschleunigungsmesser Werte für jede der 3 Achsen des Telefons.

    Einige Telefone haben einen Barometer (Luftdrucksensor) eingebaut. Nach dem Anlegen eines gleitenden Durchschnitts habe ich festgestellt, dass es schreibbereit ist, um festzustellen, ob der Benutzer nach oben oder nach unten – vielleicht nützlich für Ihr Problem ist. Auf der Galaxie s4 und 5 bekomme ich eine Auflösung, die gut genug ist, um festzustellen, ob das Gerät gerade vom Tisch auf den Boden gezogen ist.

    Anmerkung, allmähliche Änderungen im Wetter beeinflussen Ihre Lesungen, also müssen Sie das Delta über einem angemessenen Zeitintervall betrachten und ignorieren Änderungen um einige Schwelle.

    Betrachten Sie das GPS. In einer Flight Logging App verwende ich die Beschleunigung (wenn auch den absoluten Wert, nicht den Vektor), um laute GPS-Daten zu filtern (ich lösche Orte, an denen die Beschleunigung für die Geschwindigkeitsänderung nicht plausibel ist):

     /** * Remove noise from the measurement of the location. * @param loc a location * @return Answer <code>false</code> iff the location should not be used. */ private boolean filterNoise(final Location loc) { if( ! loc.hasSpeed() ) return true; if( this.recentSpeeds.isEmpty() ) { // rescentSpeeds is a queue of locations this.recentSpeeds.add(loc); return true; } final Location lastFix = this.recentSpeeds.getHead(); final long delta_t = (loc.getTime() - lastFix.getTime()) / 1000; if( delta_t == 0 ) return false; final float delta_v = loc.getSpeed() - lastFix.getSpeed(); final float a = delta_v / delta_t; if( Math.abs(a) <= AccelThreshold ) { this.recentSpeeds.add(loc); return true; } return false; } 

    Wenn Sie die Geschwindigkeit mit den Koordinaten aus dem letzten Update und der aktuellen Fixierung berechnen, erhalten Sie die Beschleunigung als Vektor.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.