Vom Rohsignal zur Produktfunktion

Wie aus Sensordaten eine Funktion wird, auf die sich Nutzer verlassen.

Jedes Smartphone hat Sensoren, die Lage und Bewegung erfassen. Wer sie anspricht, bekommt schnell Zahlen. Eine Funktion, auf die sich Menschen verlassen, ist das aber noch nicht. Bei LEVEL9 misst die App mit dem Smartphone die Schräglage eines Wohnmobils und sagt dem Nutzer, welche Keilstufe unter welches Rad gehört. Dafür braucht es im Kern nur zwei Winkel: die Neigung in Längs- und in Querrichtung. Wie aus diesen zwei Winkeln eine verlässliche Empfehlung wird, zeigen wir in diesem Beitrag.

Ausgangslage: Rohdaten sind noch keine Funktion

iOS und Android stellen Lagedaten auf ganz unterschiedliche Weise bereit. Die Wertebereiche unterscheiden sich, die Vorzeichen auch, und nicht jedes Gerät hat dieselben Sensoren. Manche Android-Geräte liefern direkt nach dem Start unplausible Werte, weil die Sensorfusion erst einschwingen muss. Hinzu kommt eine mathematische Eigenheit: Winkel sind keine gewöhnlichen Zahlen. Ein Wert knapp unter 360 Grad und einer knapp darüber liegen dicht beieinander. Ein einfacher Mittelwert ergäbe dagegen 180 Grad, also das Gegenteil.

Deshalb haben wir für LEVEL9 ein eigenes Sensor-Plugin entwickelt, statt eine fertige Bibliothek zu nutzen. Es kapselt alle Plattformunterschiede und liefert der App einen einheitlichen Datenstrom aus Längs- und Querneigung. Ist kein geeigneter Sensor vorhanden, meldet es das auf beiden Plattformen auf dieselbe Weise. Die App muss nur einen Fall behandeln und kann dem Nutzer ehrlich sagen, dass sein Gerät nicht geeignet ist.

Ein Sensorwert ist eine Messung. Eine Produktfunktion ist ein Versprechen an den Nutzer.

Filtern, Glätten, Auswerten

Zwischen Sensor und Empfehlung liegen drei Schritte. Jeder davon ist im Code eine eigene Schicht:

  • Filtern: Unbrauchbare Daten werden aussortiert, bevor sie weiterverarbeitet werden. Die ersten Werte nach dem Start verwirft das Plugin grundsätzlich. Unter iOS und Android nutzen wir Sensorfusionen, die ohne Magnetometer arbeiten. Zum Schluss bringt das Plugin alle Winkel auf einen gemeinsamen Wertebereich, damit die App plattformunabhängig rechnen kann.
  • Glätten: Für die Messung nimmt die App eine ganze Reihe von Werten auf und mittelt sie. Weil Winkel umspringen, mittelt sie nicht die Winkel selbst, sondern deren Sinus- und Kosinusanteile (zirkuläre Statistik). Daraus ergibt sich zusätzlich eine Streuung, die angibt, wie ruhig das Gerät während der Messung lag.
  • Auswerten: Erst jetzt entsteht eine Aussage für den Nutzer. Die App prüft die Streuung. Hat sich das Gerät bewegt, verwirft sie die Messung und fordert eine neue an. Zeigt das Display nach unten oder ist die Lage sonst unplausibel, gibt sie keine Empfehlung. Anschließend zieht die App die Kalibrierung ab und dreht mit einer Rotationsmatrix die vier Radpositionen des Fahrzeugs, berechnet aus Radstand und Spurweite. So weiß sie, wie hoch jedes Rad steht. Die Höhenunterschiede übersetzt sie in Keilstufen. Dabei berücksichtigt sie Sicherheitsgrenzen und die Antriebsachse, denn ein Rad ohne Antrieb lässt sich nicht beliebig weit auf einen Keil schieben.

Ein Beispiel aus der Praxis

Nicht jedes Android-Gerät bietet eine fertige Sensorfusion. Damit LEVEL9 auch auf diesen Geräten funktioniert, fällt das Plugin auf den reinen Beschleunigungssensor zurück. Der misst allerdings alles: die Erdbeschleunigung, aus der sich die Neigung ergibt, aber auch jede Erschütterung und jede Bewegung des Geräts.

Ein normaler Tiefpassfilter steckt hier im Zielkonflikt: Filtert er stark, reagiert die Anzeige träge. Filtert er schwach, zittert sie. Wir haben deshalb einen adaptiven Filter gebaut. Zuerst lernt er, wie groß die Erdbeschleunigung auf genau diesem Gerät gemessen wird, denn auch das unterscheidet sich von Modell zu Modell. Danach prüft er bei jedem Messwert, ob die Beschleunigung davon abweicht, ob das Gerät also gerade bewegt wird. Ist das der Fall, gewichtet er neue Werte schwächer. Liegt das Gerät ruhig, reagiert er schneller. Die Parameter haben wir vorab mit aufgezeichneten Daten in Octave ausgewertet und mit einem Kalman-Filter verglichen. Für den Nutzer ist davon nichts zu sehen. Er sieht nur eine Anzeige, die ruhig bleibt und trotzdem schnell reagiert.

Typische Fehler in der Praxis

Aus diesem und ähnlichen Projekten kennen wir einige Muster, die Sensorfunktionen regelmäßig ausbremsen:

  1. Winkel wie normale Zahlen behandeln. Mittelwerte, Differenzen und Grenzwerte gehen am Übergang von 360 auf 0 Grad schief. Das fällt im Test oft nicht auf, weil die Testgeräte zufällig nie in diesem Bereich liegen.
  2. Jeden Messwert für gültig halten. Eine Funktion braucht klare Kriterien, wann sie keine Aussage treffen darf: bei Bewegung, unplausibler Lage, abgebrochener Messung oder fehlenden Sensoren. Lieber eine ehrliche Meldung als eine falsche Empfehlung.
  3. Plattformunterschiede in der App verstreuen. Wenn jede Stelle im Code eigene Sonderfälle für iOS und Android kennt, wird jedes Betriebssystem-Update zum Risiko. Eine saubere Schnittstelle zum Sensor und Analysedaten aus dem Feld machen Abweichungen sichtbar, bevor Nutzer sie bemerken.

Mehr dazu, wie wir solche Projekte angehen, finden Sie auf der Seite Über uns.

Mehr zu diesem Thema?

Wir besprechen es gern an Ihrem konkreten Produkt.