Jump to content

Für Acceleromter Bricklet 2.0 Pitch and Roll berechnen in openHAB


Bunker72

Recommended Posts

Hallo,

ich habe den Accelerometer Bricklet 2.0.
Im BrickViewer werden zusätzlich zu den 3 Beschleunigungswerten auch die Werte für Pitch and Roll angezeigt.

In openHAB sind jedoch nur die 3 Beschleunigungswerte als Items verfügbar.

Nach Recherchen im Internet habe ich dann Formeln (Eulersche Winkel) zur Berechnung der Werte Pitch and Roll gefunden.

Auch einen Codeschnipsel zur Berechnung habe ich unter https://wiki.dfrobot.com/How_to_Use_a_T ... lt_Sensing gefunden:

int x, y, z;                        //three axis acceleration data
double roll = 0.00, pitch = 0.00;       //Roll & Pitch are the angles which rotate by the axis X and y

void RP_calculate(){
  double x_Buff = float(x);
  double y_Buff = float(y);
  double z_Buff = float(z);
  roll = atan2(y_Buff , z_Buff) * 57.3;
  pitch = atan2((- x_Buff) , sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3;
}

Dies könnte die richtige Berechnung sein.

Nur leider lässt sich dieser Code nicht in eine Rule unter openHAB einbauen, da es offensichtlich unterschiedliche Sprachen sind.
Hat jemand eine Lösung, wie ich den Code auf openHAB umschreiben könnte bzw. wie ich die Werte Pitch and Roll berechnen lassen kann?

Vielen Dank 
Thomas

Link zu diesem Kommentar
Share on other sites

Moin,

Wenn du dir Items für die drei Beschleunigungswerte anlegst kannst du dann diese Rule benutzen:

import java.lang.Math

rule "calc pitch"
when
    Item JpE_AccelerationX changed
then
    val x = (JpE_AccelerationX.state as Number).doubleValue
    val y = (JpE_AccelerationY.state as Number).doubleValue
    val z = (JpE_AccelerationZ.state as Number).doubleValue

    val pitch = Math.round(Math.atan(x / Math.sqrt(y * y + z * z)) * 180 / Math.PI)
    val roll =  Math.round(Math.atan(y / Math.sqrt(x * x + z * z)) * 180 / Math.PI)
    logInfo("calc pitch", "pitch: " + pitch + "°")
    logInfo("calc pitch", "roll: " + roll + "°")
end

(JpE musst du durch die UID von deinem Bricklet ersetzen, wenn du die Standard-Itemnamen verwendest, wenn du eigene Itemnamen benutzt, dann musst du JpE_AccelerationX,Y und Z komplett ersetzen)

Die Umrechnung habe ich aus dem Brick-Viewer-Quellcode entnommen, das ist ja aber bis auf Vorzeichen identisch zu dem C-Code den du gefunden hast.

Die Regel schreibt den Pitch- und Roll-Wert in das Log, du kannst aber auch ein Item dafür anlegen und die logInfo-Zeile durch

Pitch.setState(new DecimalType(pitch))

ersetzen (Pitch mit großem P ist der Item-Name)

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...