Start · Sprachen · JavaScript · Referenz · AbsoluteOrientationSensor

AbsoluteOrientationSensor

Schnittstelle

Liefert die Ausrichtung des Geräts relativ zum Erdkoordinatensystem als Quaternion oder Rotationsmatrix, berechnet aus Beschleunigungssensor, Gyroskop und Magnetometer.

seit JavaScript Generic Sensor API – Chromium 67+ (Chrome, Edge, O Kategorie: webapi

Signatur

interface AbsoluteOrientationSensor extends OrientationSensor

Beschreibung

AbsoluteOrientationSensor ist ein Fusionssensor aus der Generic Sensor API. Er verrechnet die Messwerte von Beschleunigungssensor, Gyroskop und Magnetometer zu einer Ausrichtung des Geräts relativ zum Erdkoordinatensystem. Die X-Achse zeigt dabei nach Osten, die Y-Achse nach magnetisch Nord und die Z-Achse senkrecht zum Boden nach oben.

Die Schnittstelle erbt von OrientationSensor und damit von Sensor und EventTarget. Die Ausrichtung steht als Quaternion in der Eigenschaft quaternion (Array [x, y, z, w]) zur Verfügung. Alternativ schreibt populateMatrix() sie als 4×4-Rotationsmatrix in ein Float32Array, ein Float64Array oder ein DOMMatrix-Objekt. Das eignet sich direkt für WebGL oder Three.js.

Typische Einsatzfälle sind Kompass-Anwendungen, Augmented Reality, 360°-Panoramen und Himmelskarten, also alles, was eine absolute Himmelsrichtung braucht. Wenn nur relative Drehungen zählen, etwa bei Spielen, ist RelativeOrientationSensor die bessere Wahl. Er kommt ohne Magnetometer aus und wird deshalb nicht durch magnetische Störungen verfälscht.

Der Sensor arbeitet nur in einem sicheren Kontext (HTTPS). Außerdem braucht er die Berechtigungen accelerometer, gyroscope und magnetometer, die eine Permissions Policy auch sperren kann. Die Messung beginnt erst nach start(). Neue Werte werden über das Event reading gemeldet, Fehler über error.

Parameter

Name Typ Default Beschreibung
$options Object {} Optionales Konfigurationsobjekt für den Konstruktor new AbsoluteOrientationSensor(options).
$options.frequency number gerätespezifisch Gewünschte Anzahl Messungen pro Sekunde (Hz). Der Browser kann den Wert nach unten begrenzen.
$options.referenceFrame "device" | "screen" "device" Bezugssystem der Achsen. Bei "screen" werden die Achsen an die aktuelle Bildschirmausrichtung (Hoch- oder Querformat) angepasst.

Rückgabewert

Typ
AbsoluteOrientationSensor
Beschreibung
Eine neue, noch nicht aktive Sensor-Instanz. Die Messung startet erst mit start(). Die wichtigsten Mitglieder sind quaternion, populateMatrix(), activated, hasReading, timestamp, start() und stop().

Beispiele

Sensor erzeugen und Quaternion auslesen

// Funktioniert nur über HTTPS und in Chromium-Browsern
if ('AbsoluteOrientationSensor' in window) {
  const sensor = new AbsoluteOrientationSensor({ frequency: 30, referenceFrame: 'device' });

  sensor.addEventListener('reading', () => {
    const [x, y, z, w] = sensor.quaternion;
    console.log(`Quaternion: x=${x.toFixed(3)} y=${y.toFixed(3)} z=${z.toFixed(3)} w=${w.toFixed(3)}`);
  });

  sensor.addEventListener('error', (event) => {
    console.error(`${event.error.name}: ${event.error.message}`);
  });

  sensor.start();
} else {
  console.warn('AbsoluteOrientationSensor wird nicht unterstützt.');
}
Quaternion: x=0.012 y=-0.034 z=0.701 w=0.712

Berechtigungen prüfen und Fehler behandeln

const startOrientation = async () => {
  const names = ['accelerometer', 'gyroscope', 'magnetometer'];
  const results = await Promise.all(
    names.map((name) => navigator.permissions.query({ name }))
  );

  if (results.some((r) => r.state === 'denied')) {
    console.warn('Mindestens eine Sensor-Berechtigung wurde verweigert.');
    return null;
  }

  try {
    const sensor = new AbsoluteOrientationSensor({ frequency: 60 });
    sensor.onerror = (e) => {
      if (e.error.name === 'NotReadableError') {
        console.error('Sensor ist nicht verfügbar.');
      }
    };
    sensor.start();
    return sensor;
  } catch (err) {
    // SecurityError (Permissions Policy) oder ReferenceError (nicht unterstützt)
    console.error('Sensor konnte nicht erzeugt werden:', err.name);
    return null;
  }
};

startOrientation();

Rotationsmatrix für ein 3D-Modell (z. B. WebGL/Three.js)

const sensor = new AbsoluteOrientationSensor({ frequency: 60, referenceFrame: 'screen' });
const rotationMatrix = new Float32Array(16);

sensor.onreading = () => {
  sensor.populateMatrix(rotationMatrix);
  // Bei Three.js zum Beispiel:
  // model.quaternion.fromArray(sensor.quaternion).invert();
  console.log('Matrix-Zeile 1:', Array.from(rotationMatrix.slice(0, 4)).map((v) => v.toFixed(2)));
};

sensor.start();

// Sensor anhalten, wenn der Tab im Hintergrund ist (spart Akku)
document.addEventListener('visibilitychange', () => {
  document.hidden ? sensor.stop() : sensor.start();
});
Matrix-Zeile 1: ["0.99", "-0.05", "0.02", "0.00"]

Einfacher Kompass: Himmelsrichtung aus dem Quaternion

const sensor = new AbsoluteOrientationSensor();

sensor.addEventListener('reading', () => {
  const [x, y, z, w] = sensor.quaternion;
  // Gierwinkel (Drehung um die Z-Achse) in Grad
  const yaw = Math.atan2(2 * (w * z + x * y), 1 - 2 * (y * y + z * z));
  const heading = (360 - (yaw * 180) / Math.PI) % 360;
  console.log(`Richtung: ${Math.round(heading)}°`);
});

sensor.start();
Richtung: 87°

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Schnittstelle wird nur von Chromium-Browsern unterstützt (Chrome, Edge, Opera, Samsung Internet), und zwar vor allem auf Mobilgeräten mit passender Hardware. Firefox und Safari unterstützen sie nicht. Prüfen Sie die Unterstützung vorher mit 'AbsoluteOrientationSensor' in window. Als Rückfallebene bietet sich das Event deviceorientationabsolute an bzw. deviceorientation mit webkitCompassHeading in iOS-Safari.
  • Sicherer Kontext: Die API steht nur über HTTPS (oder localhost) zur Verfügung.
  • Permissions Policy: In iframes müssen accelerometer, gyroscope und magnetometer freigegeben sein, sonst wirft der Konstruktor einen SecurityError.
  • Fehlende Hardware: Hat das Gerät keinen Magnetometer, wird kein Fehler im Konstruktor geworfen. Stattdessen löst start() ein error-Event mit NotReadableError aus. Registrieren Sie deshalb immer einen error-Handler.
  • Magnetische Störungen: Metall, Magnete und Elektronik in der Nähe können die Nordrichtung deutlich verfälschen. Außerdem bezieht sich „Nord“ auf den magnetischen und nicht auf den geografischen Nordpol.
  • Datenschutz und Akku: Hohe Frequenzen verbrauchen Energie und können theoretisch für Fingerprinting oder Seitenkanalangriffe missbraucht werden. Browser drosseln die Frequenz deshalb und liefern im Hintergrund-Tab keine Werte. Rufen Sie stop() auf, wenn der Sensor nicht gebraucht wird.
  • quaternion ist null, bis die erste Messung vorliegt. Das lässt sich über hasReading prüfen.