Skip to main content

Теория управления

Теория управления для робототехники

Системы автоматического управления обеспечивают точное выполнение задач роботом в условиях неопределённости и возмущений.


Принцип обратной связи

Открытый контур (Open-Loop)

r(t) ──► [Controller] ──► [Plant] ──► y(t)

Характеристики:

  • Нет коррекции ошибок
  • Чувствителен к возмущениям
  • Прост в реализации

Замкнутый контур (Closed-Loop)

r(t) ──►(+)──► [Controller] ──► [Plant] ──► y(t)
         ▲                              │
         │                              │
         └────── [Sensor] ◄─────────────┘
              e(t) = r(t) - y(t)

Характеристики:

  • Компенсация ошибок
  • Устойчивость к возмущениям
  • Требует датчиков

PID-регулятор

Передаточная функция

$$G_{PID}(s) = K_p + \frac{K_i}{s} + K_d s = K_p \left(1 + \frac{1}{T_i s} + T_d s\right)$$

Временная область

$$u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de(t)}{dt}$$

Компоненты

КомпонентВлияние на переходный процесс
P (пропорциональный)Уменьшает время нарастания, увеличивает перерегулирование
I (интегральный)Устраняет статическую ошибку, может вызвать колебания
D (дифференциальный)Уменьшает перерегулирование и время установления

Дискретная реализация

$$u[k] = K_p e[k] + K_i T_s \sum_{j=0}^{k} e[j] + K_d \frac{e[k] - e[k-1]}{T_s}$$

Реализация с anti-windup:

class PID {
private:
    float Kp, Ki, Kd;
    float integral = 0;
    float prev_error = 0;
    float integral_limit;
    float output_limit;
    float dt;
    
public:
    PID(float kp, float ki, float kd, float ts, 
        float i_limit = 100, float out_limit = 255)
        : Kp(kp), Ki(ki), Kd(kd), dt(ts),
          integral_limit(i_limit), output_limit(out_limit) {}
    
    float compute(float setpoint, float measurement) {
        float error = setpoint - measurement;
        
        // Proportional
        float P = Kp * error;
        
        // Integral with anti-windup
        integral += error * dt;
        integral = constrain(integral, -integral_limit, integral_limit);
        float I = Ki * integral;
        
        // Derivative (on measurement to avoid derivative kick)
        float derivative = (prev_error - error) / dt;
        float D = Kd * derivative;
        prev_error = error;
        
        // Output
        float output = P + I + D;
        return constrain(output, -output_limit, output_limit);
    }
    
    void reset() {
        integral = 0;
        prev_error = 0;
    }
};

Методы настройки

Ziegler-Nichols (реакция на ступеньку):

  1. Разомкнуть контур
  2. Подать ступенчатое воздействие
  3. Определить $K$, $L$, $T$ из переходной характеристики
Тип$K_p$$T_i$$T_d$
P$T/(KL)$
PI$0.9T/(KL)$$L/0.3$
PID$1.2T/(KL)$$2L$$0.5L$

Ziegler-Nichols (предельное усиление):

  1. Ki = 0, Kd = 0
  2. Увеличивать Kp до автоколебаний
  3. Зафиксировать $K_u$ (критическое усиление) и $T_u$ (период)
Тип$K_p$$T_i$$T_d$
P$0.5K_u$
PI$0.45K_u$$T_u/1.2$
PID$0.6K_u$$T_u/2$$T_u/8$

Пространство состояний

Модель

$$\dot{\mathbf{x}} = A\mathbf{x} + B\mathbf{u}$$$$\mathbf{y} = C\mathbf{x} + D\mathbf{u}$$

Где:

  • $\mathbf{x}$ — вектор состояния
  • $\mathbf{u}$ — вектор управления
  • $\mathbf{y}$ — вектор выхода
  • $A, B, C, D$ — матрицы системы

Управляемость

Система управляема, если ранг матрицы управляемости равен $n$:

$$\mathcal{C} = [B \quad AB \quad A^2B \quad ... \quad A^{n-1}B]$$$$\text{rank}(\mathcal{C}) = n$$

Наблюдаемость

Система наблюдаема, если ранг матрицы наблюдаемости равен $n$:

$$\mathcal{O} = \begin{bmatrix} C \\ CA \\ CA^2 \\ \vdots \\ CA^{n-1} \end{bmatrix}$$

Управление с обратной связью по состоянию

$$\mathbf{u} = -K\mathbf{x}$$$$\dot{\mathbf{x}} = (A - BK)\mathbf{x}$$

Размещение полюсов: Выбор $K$ для заданного расположения собственных значений $(A-BK)$.


Устойчивость

Определение

Система устойчива, если при ограниченном входе выход остаётся ограниченным (BIBO-устойчивость).

Критерий Рауса-Гурвица

$$a_0 s^n + a_1 s^{n-1} + ... + a_n = 0$$

Система устойчива, если все элементы первого столбца таблицы Рауса положительны.

Критерий Найквиста

Система с разомкнутой передаточной функцией $G(s)H(s)$ устойчива, если годограф Найквиста не охватывает точку $(-1, 0)$.

Запасы устойчивости

ПараметрОписаниеТипичное значение
Запас по усилению$G_m = 1/G(j\omega_\pi)
Запас по фазе$\phi_m = 180° + \angle G(j\omega_c)$> 45°

Влияние задержки

$$G_{delay}(s) = e^{-\tau s}$$$$\angle e^{-j\omega\tau} = -\omega\tau \text{ рад}$$

Важно: Большая задержка уменьшает запас по фазе!


Каскадное управление

r ──►(+)──► [Outer] ──►(+)──► [Inner] ──► [Plant] ──► y
      ▲                 ▲                        │
      │                 │                        │
      └─────────────────┼────────────────────────┘
                        └── [Inner Sensor]

Применение:

  • Позиция → Скорость → Момент
  • Внутренний контур быстрее внешнего (5-10×)

Feedforward (упреждающее управление)

      ┌──────────────────────┐
      │      [Model^-1]      │──────┐
      └──────────────────────┘      │
               ▲                    ▼
r ─────────────┼───►(+)──► [Controller] ──► [Plant] ──► y
               │     ▲                              │
               │     │                              │
               │     └──────────────────────────────┘

Идея: Компенсировать известную динамику до того, как возникнет ошибка.


Реализация в ROS 2

ros2_control

# config/controllers.yaml
controller_manager:
  ros__parameters:
    update_rate: 100
    
    joint_state_broadcaster:
      type: joint_state_broadcaster/JointStateBroadcaster
    
    position_controller:
      type: position_controllers/JointGroupPositionController
      
position_controller:
  ros__parameters:
    joints:
      - joint1
      - joint2
    command_interfaces:
      - position
    state_interfaces:
      - position
      - velocity

PID в ros2_control

pid_controller:
  ros__parameters:
    joints:
      - joint1
    gains:
      joint1:
        p: 100.0
        i: 10.0
        d: 5.0
        i_clamp: 50.0

Типичные проблемы

ПроблемаПричинаРешение
ПеререгулированиеKp, Ki великиУменьшить Kp, добавить Kd
Статическая ошибкаНет KiДобавить Ki
КолебанияKi велик, задержкаУменьшить Ki, увеличить Kd
Шум на выходеKd великФильтр на производной
Integral windupНет ограниченияAnti-windup

Ссылки