В продолжение щаз вывалю черновики мыслей!
Идея такая: управлялка должна на ходу менять коэффициенты в законе регулирования.
Потому что на каждом этапе нужные коэффициенты могут отличаться на пару порядков.
Для этого надо знать, как меняются во времени механические параметры ракеты.
И какой момент создаст отклонение рулей.
Если рулить вектором тяги, то момент будет пропорционален тяге двигателя, которая легко измеряется бортовым акселерометром.
Так что всё можно легко посчитать.
Реальный момент инерции ракеты можно дома на столе померить. Во всех вариантах — полный двигатель топлива, наполовину сгоревший, совсем пустой. И т.д.
Повторюсь, это черновик, могут быть глюки:
===
Angular_Acceleration = k1 * Angular_Deviation + k2 * Angular_Velocity;
===
Коэффициент k1 зависит только от задержки в цепи управления.
Но не зависит от ускорений и инерций.
Точнее, он ограничен сверху, так как при достаточно большом значении начинаются
автоколебания — для выбранной задержки при k1 = 600 процесс идёт вразнос.
И есть значение, при котором отсутствует отрицательный выброс.
Для выбранной задержки это примерно k1 = 100, k2 = 16.
Надо из вычисленного желаемого углового ускорения и механических параметров получить
величину шима, который подаётся на рулевые машинки — Steering_Signal.
===
Нужно до старта знать, как будут меняться во времени (если точнее — от набранной скорости) эти параметры:
Масса m(t);
Момент инерции J(t);
Расстояние от сопла до центра масс z_m(t);
Угол вектора тяги от ШИМ k_pwm;
Момент силы будет:
M = a * m * z_m * k_pwm * PWM
Угловое ускорение:
aa = M / J = a * m * z_m * k_pwm * PWM / J
В проге считается, что оно должно быть:
aa = k1 * delta_angle
k1 * delta_angle = a * m * z_m * k_pwm * PWM / J
k_pwm = k1 * delta_angle * J / a / m / z_m / PWM
===
Вычисляем желаемое угловое ускорение и из него получаем ШИМ:
Steering_Signal = Steering_Coef * Angular_Acceleration;
ШИМ через механическую связь сервы с соплом даёт отклонение вектора тяги:
Thrust_Vector_Angle = Servo_Coefficient * Steering_Signal;
Из расстояния до центра масс и тяги получается момент силы:
Force_Moment = Centroidal_Distance * Thrust * Thrust_Vector_Angle;
Если его поделить на момент инерции, получится угловое ускорение:
Angular_Acceleration = Force_Moment / Moment_of_Inertia;
В результате получается, что произведение ШИМа и механической связи должно быть таким:
Servo_Coefficient * Steering_Coef = Moment_of_Inertia / Centroidal_Distance / Thrust
Так как механический коэффициент = константа, то остаётся только регулировать
коэффициент ШИМа:
Steering_Coef = Moment_of_Inertia / Centroidal_Distance / Thrust / Servo_Coefficient
Так как ускорение измеряется, а масса, расстояние до центра масс и момент инерции
зависят от интеграла ускорения, который скорость, то их можно собрать в одну величину:
JJ(v) = J(v) / m(v) / z_m(v)
Тогда получится:
Steering_Coef(v) = JJ(v) / Servo_Coefficient / a;
===