Б.г.> Разберёшься - поделись!
Ну вот, проверяй, критикуй:
Как и положено в случае, когда техник лезет в математику, надо принять за аксиому какую-нибудь лютую бредятину, очевидно противоречащую математике.
В данном случае это будет аксиома, что повороты коммутативны.
Экспериментальная проверка на логарифмической линейке показывает, что на малых углах это выполняется с большой точностью, значит это действительно так, а математики опять ошибаются!!!
Обозначим большими буквами единичные векторы, параллельные осям гироскопов: X, Y, Z.
(В МК это будут девять 16-битных чисел с фиксированной точкой.)
Гироскопы выдают угловые скорости: wx, wy, wz.
Углы, на которые повернулись гироскопы за очередной квант времени dt:
x = Mx * wx * dt
y = My * wy * dt
z = Mz * wz * dt
(Mi — коэффициент для правильного масштаба)
Вот берём z-гиро, он поворачивает векторы X и Y.
Чтоб повернуть вектор X, надо его немного укоротить, умножив на косинус угла поворота, и, чтоб изменить направление, надо прибавить к нему перпендикулярный ему вектор.
В качестве такого вектора можно использовать вектор Y, умноженный на синус угла поворота, он (Y) как раз единичный и перпендикулярный.
Аналогично и для вектора Y, только у него синус с минусом будет.
Вот в векторной форме:
X_new = cos(x) * X + sin(x) * Y
Y_new =-sin(x) * X + cos(x) * Y
Аналогично и для двух других гироскопов.
В результате трёх поворотов получится такое:
code text
X_new = cos(y)*cos(z) * X + sin(z) * Y - sin(y) * Z
Y_new = -sin(z) * X + cos(x)*cos(z) * Y + sin(x) * Z
Z_new = sin(y) * X - sin(x) * Y + cos(x)*cos(y) * Z
Всё, получилась новая ориентация ракеты.
Чтоб направить ось ракеты в нужную сторону, надо вектор должного направления из программы полёта векторно умножить на вектор Z. Получится вектор, вокруг которого надо вращать ракету, чтоб она стала правильно ориентированной.
Если этот вектор скалярно умножить на X и Y, то получатся две величины, которые надо прямо подавать в управлялки тангажом и курсом.
Это всё работает независимо от текущего крена.
Может оно и громоздко, но лично мне в этом всё кристально ясно.
И никаких складываний рамок.
И наверняка это всё открыто ещё до меня, в шестнадцатом веке.
Ну, за счёт дискретности арифметики векторы гироскопов будут стараться стать взаимно неперпендикулярными и не единичными. Это надо будет временами подправлять.
А косинусы и синусы можно либо брать из таблицы, либо считать из рядов:
cos(x) = 1 - x
2 / 2
sin(x) = x - x
3 / 6