Jump to content

ROSEDOLA

Members
  • Gesamte Inhalte

    7
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von ROSEDOLA

  1. Wieso, wer ein Kompass braucht kann die Werte für das Magnetfeld auslesen und entsprechend berechnen:

     

    
    def CalcHeadingNoCompensation(x,y)
      
      headingRadians = Math.atan2(y, x)
      
      if headingRadians < 0
        headingRadians += 2 * Math::PI
      end  
        
      heading = headingRadians * 180 / Math::PI
      heading.round()
    end
    
    

     

    Funktioniert wunderbar und synchron mit meinem Yak (+/- 2°-3°, da ist akzeptabel). Aber Vorsicht, bei Roll und Pitch ändert sich das Heading, da

    muss noch eine sw-seitige Kompensation rein, die braucht Roll und Pitch -

    und die gibt es ja nun...

     

    Gruss,

     

    Dirk

  2. Also, nachdem ich nun wieder mal Zeit gefunden habe, mit der IMU zu "spielen"

    komme ich nun "scheinbar" zu einem "ersten" brauchbaren Ergebnis.

     

    Zielsetzung war: Erkennen von Roll, Pitch und Yaw (in einem Flugzeug) - getestet habe ich bisher nur am Schreibtisch mit Drehen, usw.... Der

    Kurs, errechnet aus dem Magnetfeld, ist noch nicht "Tilt-Compensated", was

    aber zwingend notwendig ist:

     

    Init der IMU

    imu.set_convergence_speed 250
      sleep 5
      imu.set_convergence_speed 5
      
      q = []
      q = imu.get_quaternion
    
      base_x = q[0]
      base_y = q[1]
      base_z = q[2]
      base_w = q[3]
    
    

     

    Konjugation

    x = -x
    y = -y
    z = -z
    

     

    Und die Winkel:

     

      x_angle = Math.atan2(2*y*z - 2*x*w, w*w + z*z - x*x - y*y)*180/Math::PI + 180
      y_angle = Math.atan2(2*w*y + 2*x*z, w*w + z*z  -x*x - y*y)*180/Math::PI + 180
      z_angle = Math.atan2(-w*y + x*y + y*x - w*w, w*w + y*y - z*y -  
                            x*x)*180/Math::PI + 180
    

     

    Diese Formeln stammen aus dem Forum, nicht von mir.... Ich werde am WE oder

    Anfang der Woche mal einen Flug machen und es testen.

     

    Das Brick liegt mit LED's nach oben auf einem MasterBrick gesteckt. Das IMU

    Brick hängt sich des öfteren auf, wenn ich dort ein lCD Prickelt einstöpsle...

     

    Code ist Ruby - wenn das nun klappt, werde ich mal nach IOS wechseln...

     

     

    Gruss, Dirk

  3. Also, ich glaube ich verstehe ich etwas grundlegendes nicht....

     

    Wenn ich den IMU Brick bei hochfahren sich seine Position finden lasse, für 5 Sekunden (über convergence speed gesteuert) und nur mit Quaternion auslese, welche ich dann später umrechne, erwarte ich irgendwie ein anderes verhalten.

     

    Ich habe mein Vorgehen mir aus verschiedenen Beiträgen "zusammen gesammelt"....

     

    Ich speichere eine "Orientation und lese dann Quaternions aus...

    Danach konjugieren und ich durch entsprechende Formeln in die einzelnen Winkel

    (x/y/z, bzw. roll/pitch/yaw) umrechnen.

     

    Wenn ich aus einer "Nullposition" um genau eine Achse "kippe / drehe" dann würde ich erwarten, dass auch nur ein Winkel sich ändert. Und da isst nicht immer der Fall. Und der Z_Angle verhält sich völlig sonderbar, zeigt aber keinesfalls die Rotation um die entsprechende Achse in Grad an ...

     

    Ändere ich den Pitch, dann bitte nur Pitch-Winkel ändern, Selbiges für Roll oder Yaw. Solange ich aber diese Werte nicht auf die Reihe bekomme brauche ich gar nicht an einen "Tilt Compensated" Compass zu denken :(

     

    Dies hier sind die Formeln, die ich verwende (Ruby)

     

    wn = w * rel_w - x * rel_x - y * rel_y - z * rel_z
    xn = w * rel_x + x * rel_w + y * rel_z - z * rel_y
    yn = w * rel_y - x * rel_z + y * rel_w + z * rel_x
    zn = w * rel_z + x * rel_y - y * rel_x + z * rel_w
      
      x_angle = Math.atan2(2*yn*zn - 2*xn*wn, wn*wn + zn*zn - xn*xn - yn*yn)*180/Math::PI
      y_angle = Math.atan2(2*wn*yn + 2*xn*zn, wn*wn + zn*zn  -xn*xn - yn*yn)*180/Math::PI
      z_angle = Math.atan2(-wn*yn + xn*yn + yn*xn - wn*wn, wn*wn + yn*yn - zn*yn - xn*xn)*180/Math::PI
    
    

     

    Was ist nun mein Denkfehler....?

     

    Vielen Dank im Voraus, Dirk

     

×
×
  • Neu erstellen...