← На главную

Дрон на ArduPilot: 12 переменных, Transport theorem и каскадный PID

30.06.2026 19:57 · hackernews

Дрон — это система с шестью степенями свободы: три линейные оси (x, y, z) и три угловые (крен φ, тангаж θ, рысканье ψ). Для отсчёта используют систему North-East-Down (NED): ось X — на север, Y — на восток, Z — вниз. Есть два базиса: инерциальный (неподвижный) и связанный (body frame), который движется и вращается вместе с дроном. Положение — смещение body frame от инерциального, скорость — скорость body относительно инерциальной, но измеренная в координатах body.

Угловая ориентация задаётся тремя последовательными поворотами Tait-Bryan: сначала рысканье ψ вокруг Z, потом тангаж θ вокруг новой Y, потом крен φ вокруг новой X. Угловая скорость ω = [ω_x, ω_y, ω_z] — мгновенная скорость вращения body frame вокруг себя. Связь между угловыми скоростями и производными углов даётся матричным уравнением: ω_x = φ̇ + ψ̇ sinθ, ω_y = θ̇ - ψ̇ sinφ cosθ, ω_z = ψ̇ cosφ cosθ.

Чтобы перевести вектор из body в инерциальную систему, используют матрицу поворота R_n^b, которая зависит от sin/cos φ, θ, ψ. Для векторов, меняющихся во вращающейся системе, нужна Transport theorem: производная в инерциальной = производная в body + ω × вектор. Это даёт фиктивные силы в неинерциальной системе.

Состояние дрона описывается 12 переменными: r_n (позиция в инерциальной), v_b (скорость в body), Φ = [φ, θ, ψ], ω. Динамика делится на линейную и угловую. На тело действуют сила тяжести mg (в инерциальной, пересчитывается в body) и суммарная тяга пропеллеров T = [0,0, ΣT_i]. Второй закон Ньютона в body с учётом Transport theorem даёт ускорение: v̇_b = (T + R_n^b F_g)/m - ω × v_b. Аналогично для момента: τ = I ω̇ + ω × I ω, где I — тензор инерции. Моменты складываются из моментов тяги (τ_T) и моментов двигателей (τ_τ). Угловое ускорение: ω̇ = I⁻¹(τ - ω × I ω). Производные углов через ω уже известны.

Пропеллеры создают тягу T = k_T · Ω² и момент сопротивления τ = k_d · Ω². Двигатели — brushless DC (BLDC): ток i_BLDC = (v_BLDC - k_e·Ω)/R, момент двигателя τ_BLDC = k_τ·i, чистый момент с учётом трения и аэродинамики, затем Ω̇ = τ/J.

Управление: control allocation — матрица A связывает квадраты скоростей пропеллеров Ω² с желаемыми силами и моментами D. Для несимметричной матрицы используют псевдоинверсию A⁺ = Aᵁ(A Aᵁ)⁻¹. Каскадный PID-регулятор: ошибка по позиции → желаемая скорость → угол атаки → угловая скорость → момент. Параллельно по Z — вертикальная скорость и тяга. Выход — заданные тяга и моменты, которые allocation переводит в скорости моторов.

Для планирования траекторий используют S-Curves и B-Splines. Практические фреймворки: ArduPilot (открытый код). Всё это — основа симуляции мультироторных дронов.

Читать оригинал →