Empezando con...
window.addEventListener("deviceorientation", handleDeviceTilt); function handleDeviceTilt(event){ // Here we can use event.beta, event.gamma // Note that we don't need event.alpha because that's just the compass as we // don't need to know which way is north to build a simple bubble-level app // or similar apps. } ...en este caso, los valores beta y gamma son agradables y utilizables siempre que el teléfono o la tableta se mantengan paralelos al suelo (como descansando sobre una mesa). Pero cuando el teléfono o la tableta se mantienen paralelos a una pared, no podemos obtener valores realistas. gamma se vuelve especialmente loco cuando el dispositivo se sostiene en posición vertical (es decir, en modo retrato), que es la forma más común de sostener un dispositivo móvil.
Necesitamos calcular los ángulos reales para poder usar la información de inclinación con precisión en la aplicación. La pregunta es,
¿Cuál sería la forma más sencilla de calcular los ángulos reales como
realBetayrealGamma(quizás usandoMath.cos()yMath.sin()o mediante algún otro método) para desbloquear el llamado bloqueo de cardán? ¿Se puede hacer esto sin matrices y/o cuaterniones? Mi conjetura es "sí" porque la "distorsión" en gamma es proporcional de alguna manera a beta. Si los cuaterniones son la única solución, entonces, ¿cómo obtenemos exactamenterealGammaoactualGammaofixedCorrectGammausándolos?
Nota 1: hay una aplicación de nivel de burbuja en PlayStore que muestra perfectamente los ángulos de inclinación reales del dispositivo. Así que hay pruebas de que es factible. Sin embargo, a partir de 2021 parece que no hay un código fuente abierto disponible para una aplicación de este tipo escrita en javascript.
Nota 2: este problema se ha mencionado aquí .
Nota 3: La precisión es necesaria. Cuanto más nos acerquemos a los ángulos exactos, mejor. alpha se puede omitir por simplicidad.
Al resolver este problema, podríamos usar la deviceorientation del dispositivo para hacer algo similar a esto, 
...o, por ejemplo, podríamos usar gamma para conducir un automóvil en un juego de carreras verticales. 
Puede observar el problema en acción visitando AQUÍ (o buscando algo similar) en su dispositivo móvil. Encienda el interruptor que dice [ Mostrar ángulos de orientación ] y observe γ ( gamma ) a medida que beta se acerca a 90 grados. También vea lo que le sucede al Gyro-Cube cuando intenta sostener su dispositivo en una posición perfectamente vertical.
Pensamiento final,
Es posible que necesitemos algunas matemáticas mágicas arcanas.
Me temo que obtener la información que está buscando solo a través del evento de deviceorientation del dispositivo no es posible precisamente por la razón que usted mismo dice: bloqueo de cardán .
Hay hordas de matemáticos estudiando en este sentido, el resultado que podemos aprender de sus estudios es que la única solución al problema del bloqueo del cardán es evitarlo: cuando comenzamos a acercarnos demasiado, tenemos que cambiar nuestro enfoque.
Una forma alternativa de obtener ese ángulo (que funciona solo cuando el teléfono está casi vertical , exactamente cuando necesitamos una alternativa) podría ser usar datos de devicemotion del dispositivo en lugar de datos de deviceorientation del dispositivo.
window.addEventListener("devicemotion", event => { const { x } = event.accelerationIncludingGravity; const radiantsRes = Math.asin(x / 9.80665); const degreesRes = (radiantsRes * 180) / Math.PI; console.log(degreesRes.toFixed(2), radiantsRes.toFixed(10)) });