Хотя ответ matteo верен, он не дает полного, полного решения:
Формулы верны:
Roll = atan2(Y, Z) * 180/M_PI;
Pitch = atan2(-X, sqrt(Y*Y + Z*Z)) * 180/M_PI;
Однако, когда угол наклона равен + 90 / -90 градусов, а ось X направлена вертикально вверх / вниз, идеальный нормированный выходной сигнал акселерометра должен составлять:
accX = -1 / accX = 1
accY = 0
accZ = 0
Что означает roll angle of 0 degrees
; правильный.
Но на практике выходной сигнал акселерометра зашумлен, и вы получите что-то ближе к:
accX = -1 / accX = 1
accY = 0.003
accZ = 0.004
Это может показаться небольшим, но из-за этого угол крена составит ~ 30 градусов, что не правильно.
Очевидным инстинктом было бы отфильтровывать последние цифры, но это влияло бы на точность, что не всегда приемлемо.
Компромисс, который очень хорошо объяснен в примечании к справочному приложению, состоит в том, чтобы включить в формулу для крена очень маленький процент показаний оси X акселерометра:
Roll = atan2( Y, sign* sqrt(Z*Z+ miu*X*X));
sign = 1 if accZ>0, -1 otherwise
miu = 0.001
Ошибка, вносимая таким образом, значительно меньше, чем в предыдущем случае: 2-3 градуса при измерении крена при тех же условиях, которые описаны выше.