Jump to content

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


Recommended Posts

Posted

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

Posted

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)

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...