MPU6050 Lageerfassung

  • Hallo!
    Ich habe einen MPU6050 über I2C an meinem Pi. Mit diesem möchte ich ermitteln, wie schräg gerade die Platine ist, auf der das Modul fest gelötet ist.
    Dazu habe ich folgende Anleitung genutzt: http://blog.bitify.co.uk/2013/…pu-6050-on-raspberry.html


    Wenn ich mir die gyro_ Werte anschaue, ändern diese sich bei mir nur, wenn ich die Platine bewege. Da die Beschleunigung für mich uninteressant ist, habe ich den entsprechenden Code gleich wieder raus genommen.
    Die accel_ Werte ändern sich, wenn ich die Platine in eine Schräglage bringe und bleiben dann auch (in etwa) so stehen, wenn ich die Platine in der Schräglage behalte.


    Ich habe mal 50 Messwerte (im Abstand von 0,5Sekunden) aufgenommen und dabei die Platine mehrmals um die X-Achse auf und ab bewegt.
    Aus den Werten habe ich mir auch ein schönes Diagramm gemacht. (siehe Anhang)


    Mein Problem ist jetzt nur, dass ich keinen wirklichen Zusammenhang aus dem Diagramm schließen kann.
    Kann mir jemand weiter helfen, wie ich auf die Schräglage der Platine komme?

  • Die drei Werte bilden einen Vektor, der entgegen dem Erdmittelpunkt steht. So wie ich das sehe hast du also deine Platine deutlich um die X-Achse (dadurch den Y-Achsen-Vektor nach oben), und etwa halb so stark um die Y-Achse gedreht - fuer den ersten "Hubbel".


    Danach eine Reihe aehnliche, schnellere, aber nicht so weite Bewegungungen.
    Automatisch zusammengefügt:[hr]
    Achso, um das noch mal nachzutragen: eine Formel, um den Winkel um jeweils eine Achse zu erhalten sollte eigentlich atan2 sein - fuer deinen Fall (in Python):


    Code
    >>>  import math
    >>> math.atan2(.8, 0.4) / math.pi * 180.0
    63.43494882292201


    Du hast also bei t ~= 12 auf 63 Grad gedreht, also von 90 Grad Ruheposition um 27 Grad gegen den Uhrzeigersinn.

  • Ok. Das hilft schonmal weiter.
    Wie kommst du auf [font="monospace"]math.atan2(.8, 0.4) / math.pi * 180.0[/font]?
    Also woher kommen die 0,8 und 0,4?


    Würde das auch gehen? (Aus der oben genannten Seite):
    def dist(a,b):
    return math.sqrt((a*a)+(b*b))


    def get_x_rotation(x,y,z):
    radians = math.atan(x / dist(y,z))
    return math.degrees(radians)


    def get_y_rotation(x,y,z):
    radians = math.atan(y / dist(x,z))
    return math.degrees(radians)
    Automatisch zusammengefügt:[hr]


    Ok. Das hilft schonmal weiter.
    Wie kommst du auf [font="monospace"]math.atan2(.8, 0.4) / math.pi * 180.0[/font]?
    Also woher kommen die 0,8 und 0,4?


    Würde das auch gehen? (Aus der oben genannten Seite):



    Automatisch zusammengefügt:[hr]


    Ok. Das hilft schonmal weiter.
    Wie kommst du auf [font="monospace"]math.atan2(.8, 0.4) / math.pi * 180.0[/font]?
    Also woher kommen die 0,8 und 0,4?


    Würde das auch gehen? (Aus der oben genannten Seite):


    Edited once, last by solve42 ().

  • Die 0.8 und 0.4 lese ich aus deinem Graphen an der Stelle t ~= 12, fuer y und z.. Und atan2 ist halt eine Funktion, die fuer eine Gerade, gegeben durch einen Punkt im Koordinatensystem und dem Ursprung, den Winkel zurueckliefert. Das kann man aber auch googeln...


    Und die Umrechnung Radians->Degrees ist halt rad/pi * 180.0. Oder rad/ (2 * pi) * 360.0, falls das klarer wird - ein Einheitskreis hat halt 2 PI, und 360 Grad. Dreisatz macht den Rest :) Du darfst auch math.degrees benutzen.


    Die Funktionen aus deinem Link finde ich irgendwie komisch, die erschliessen sich mir ueber kurzes nachdenken nicht - aber wenn sie die richtigen Werte ausspucken...