Взможные причины такого поведения вращающегося тела:
1. Вращение абсолютно жесткого тела устойчиво относительно осей как наибольшего так и наименьшего главного момента инерции. Пример устойчивого вращения вокруг оси наименьшего момента инерции, используемый на практике – стабилизация летящей пули. Пулю можно считать абсолютно твердым телом для получения достаточно устойчивой стабилизации в течение времени её полёта.
2. Вращение вокруг оси наибольшего момента инерции устойчиво для любого тела в течение неограниченного времени. В том числе и не абсолютно жесткого. По этому такая и только такая закрутка используется для полностью пассивной (при выключенной системе ориентации) стабилизации спутников со значительной нежёсткостью констркуции (развитые панели СБ, антенны, топливо в баках и т. п.).
3. Вращение вокруг оси со средним моментом инерции неустойчиво всегда. И вращение действительно будет стремиться перейти к уменьшению энергии вращения. При этом, различные точки тела начнут испытывать переменные ускорения. Если эти ускорения будут приводить к переменным деформациям (не абс. жесткое тело) с рассеянием энергии, то в итоге ось вращения совместиться с осью максимального момента инерции. Если же деформации не происходит и/или не происходит рассеяния энергии (идеальная упругость), то получается энергетически консервативная система. Образно говоря, тело будет кувыркаться, вечно пытаясь найти себе “комфортное” положение, но всякий раз будет его проскакивать и искать заново . Простейший пример – идеальный маятник. Нижнее положение – энергетически оптимальное. Но он никогда не остановится в нем. Таким образом, ось вращения абсолютно жесткого и/или идеально упругого тела никогда не совместится с осью макс. момента инерции, если изначально она не совпадала с ним. Тело будет вечно совершать сложные техмерные колебания, зависящие от параметров и нач. условий. Нужно ставить ‘вязкий’ демпфер или активно гасить колебания системой управления, если речь идет о КА.
4. При равенстве всех главных моментов инерции вектор угловой скорости вращения тела не будет меняться ни по величине ни по направлению. Грубо говоря, во круг какого направления закрутил, во круг того направления и будет вращаться.
Модель гайки Джанибекова
Программа демонстрирующая эффект Джанибекова.
Скачать программу: djanibek.zip,
Для запуска программы нажмите на кнопочку (Start). Гайку можно вращать и масштабировать кнопками мышки и роликом.
Эффект Джанибекова заключается в том, что тело свободно вращающееся в невесомости и имеющее определённые моменты инерции и начальные скорости вращения, ведёт себя следующим образом: сначала оно вращается вокруг одной оси, потом эта ось вдруг неожиданно переворачивается в противоположенную сторону, после чего тело продолжает вращаться как и до переворота, потом ось опять переворачивается в противоположенную сторону, возвращаясь в исходное положение, и тело опять вращаться как в начале, а потом опять ось переворачивается и так далее.
Поскольку в земных условиях посмотреть на эффект Джанибекова сложно, из-за отсутствия невесомости, то как это происходит можно посмотреть в приведённой программе, которая эффект Джанибекова неплохо моделирует. Делается это так:
Методика моделирования эффекта Джанибекова
В качестве начальных условий нужно задать три момента инерции (Iteration moments) тела. Вместо них можно задать размеры условного параллелепипеда который будем вращать (Cube sides) и плотность его материала (density), тогда его моменты инерции вычисляются по следующим формулам:
Ix = density * x * y * z * (y2 + z2) / 12
Iy = density * x * y * z * (x2 + z2) / 12
Iz = density * x * y * z * (x2 + y2) / 12
Также задаются три начальные скорости вращения по осям (wx, wy, wz) в оборотах в секунду. Чтобы превратить их в углы поворотов (OmegaX, OmegaY, OmegaZ), их надо домножить на 2*Pi.
Далее вычисляются комплексы моментов из формулы Эйлера:
Dix = (Iz - Iy) / Ix
Diy = (Iz - Iy) / Ix
Diz = (Iy - Ix) / Iz
После чего начинается итерирование, то есть последовательное вычисление новых углов поворота, по ним находятся положения осей гайки, по положениям осей рисуется на экране сама гайка, и так продолжается по кругу. Углы поворотов (OmegaX, OmegaY, OmegaZ) вычисляются по таким формулам:
DeltaOmegaX = -Dix * OmegaY * OmegaZ * Speed * deltaTime
DeltaOmegaY = -Dix * OmegaX * OmegaZ * Speed * deltaTime
DeltaOmegaZ = -Dix *OmegaX * OmegaY * Speed * deltaTime
OmegaX = OmegaX +DeltaOmegaX
OmegaY = OmegaY +DeltaOmegaY
OmegaZ = OmegaZ +DeltaOmegaZ
Здесь deltaTime - время прошедшее с предыдущей итерации, Speed - это параметр в окошке программы, чтобы просто регулировать скорость работы. Если возникают глюки в работе, то надо сделать его поменьше.
Далее надо повернуть объект на указанные углы. Ротации (то куда повёрнут объект в пространстве) в OpenGL задаются матрицами 3x3. Матрица - это три вектора задающие направления трёх взаимно-перпендикулярные осей объекта. Называются они Right (право, тангаж), Direction (вперёд, крен), Up (вверх, рысканье). Матрица по-умолчанию из этих трёх векторов выглядит так:
Матрица
[ 1 0 0 ] - вектор Right
[ 0 1 0 ] - вектор Direction
[ 0 0 1 ] - вектор Up
Чтобы повернуть эту матрицу на найденные нами углы (OmegaX, OmegaY, OmegaZ), нужно создать три матрицы вращений вокруг осей X Y и Z и домножить её на них.
Матрицы вращений выглядят так:
Вокруг оси X:
[ 1 0 0 ]
[ 0 cos(OmegaX) -sin(OmegaX) ]
[ 0 sin(OmegaX) cos(OmegaX) ]
Вокруг оси Y:
[ cos(OmegaY) 0 sin(OmegaY) ]
[ 0 1 0 ]
[ -sin(OmegaY) 0 cos(OmegaY) ]
Вокруг оси Z:
[ cos(OmegaZ) -sin(OmegaZ) 0 ]
[ sin(OmegaZ) cos(OmegaZ) 1 ]
[ 0 0 0 ]
<!--
Угол alfa здесь - это соответственно углы (OmegaX, OmegaY, OmegaZ).
-->
Получив три матрицы вращений последовательно умножаем их на матрицу гайки. Делается это по следующим формулам.
ResultMatrix[0, 0] = M1[0, 0] * M2[0, 0] + M1[0, 1] * M2[1, 0] + M1[0, 2] * M2[2, 0]
ResultMatrix[0, 1] = M1[0, 0] * M2[0, 1] + M1[0, 1] * M2[1, 1] + M1[0, 2] * M2[2, 1]
ResultMatrix[0, 2] = M1[0, 0] * M2[0, 2] + M1[0, 1] * M2[1, 2] + M1[0, 2] * M2[2, 2]
ResultMatrix[1, 0] = M1[1, 0] * M2[0, 0] + M1[1, 1] * M2[1, 0] + M1[1, 2] * M2[2, 0]
ResultMatrix[1, 1] = M1[1, 0] * M2[0, 1] + M1[1, 1] * M2[1, 1] + M1[1, 2] * M2[2, 1]
ResultMatrix[1, 2] = M1[1, 0] * M2[0, 2] + M1[1, 1] * M2[1, 2] + M1[1, 2] * M2[2, 2]
ResultMatrix[2, 0] = M1[2, 0] * M2[0, 0] + M1[2, 1] * M2[1, 0] + M1[2, 2] * M2[2, 0]
ResultMatrix[2, 1] = M1[2, 0] * M2[0, 1] + M1[2, 1] * M2[1, 1] + M1[2, 2] * M2[2, 1]
ResultMatrix[2, 2] = M1[2, 0] * M2[0, 2] + M1[2, 1] * M2[1, 2] + M1[2, 2] * M2[2, 2]
Здесь M1 - это исходная матрица, а М2 - матрицы вращений, сначала первая, потом вторая, потом третья. Получив результат, мы получаем новые положения осей гайки в пространстве.