Вот что пробовал симулировать.
Датчик даёт величину угла отклонения (x) и скорость вращения (dx/dt).
У управлялки есть два коэффициента:
первый — "возвращающая сила" или "жёсткость пружинки";
второй — "сила трения" или "вязкость".
Угловое ускорение, которое должно получиться, вычисляется так:
a_x = - k1 * x - k2 * dx/dt
Если взять k2 = 0, то получится маятник с периодом:
T = 2 * pi * sqrt(1 / k1)
Если k2 > 0, то колебания получаются затухающие.
При любых ненулевых коэффициентах через некоторое время после возмущающего воздействия система успокаивается в нуле.
Теперь добавил задержку, которую даёт рулевая машинка (задержки в датчике и мозгах на порядок меньше, чем в машинке).
Предположил, что машинка, получив команду, половину времени разгоняется к новому положению, а вторую — тормозится. То есть переходит в новое положение по S-образной кривой.
Ну и предположил, что это время равно обещаному в рекламе = 65 мс.
И теперь уже не всякие коэффициенты стали одинаково полезны!
Например, при k1 = 600 время четверти периода колебаний (90 градусов) должно получиться 64 мс.
И, таки да! — амплитуда колебаний росла со временем, и никакие кручения k2 не помогали.
При k1 = 550 (67 мс) и k2 = 35 колебания затухали, но медленно. Причём период колебаний получился 178 мс.
Вот нарисовал картинки для разных значений коэффициентов.
(Ракете придаётся скорость вращения = 20, длительность картинок = 1 секунда.)
Верхняя картинка — разные k1 и подобранные к ним "лучшие" k2:
k1 = 50, k2 = 11 (коричневый)
k1 = 100, k2 = 15
k1 = 200, k2 = 22
k1 = 400, k2 = 32
k1 = 500, k2 = 36 (синий)
Нижняя картинка — при k1 = 200 разные k2:
k2 = 11
k2 = 16
k2 = 22
k2 = 32
k2 = 45
Желтые графики на обеих картинках одинаковые.
На нижней картинке видно, что слишком большое трение (k2) — тоже плохо бывает.
Ну и получается, что коэффициенты надо постоянно менять в процессе изменения параметров ракеты.