Теория управления
Теория управления для робототехники
Системы автоматического управления обеспечивают точное выполнение задач роботом в условиях неопределённости и возмущений.
Принцип обратной связи
Открытый контур (Open-Loop)
r(t) ──► [Controller] ──► [Plant] ──► y(t)
Характеристики:
- Нет коррекции ошибок
- Чувствителен к возмущениям
- Прост в реализации
Замкнутый контур (Closed-Loop)
r(t) ──►(+)──► [Controller] ──► [Plant] ──► y(t)
▲ │
│ │
└────── [Sensor] ◄─────────────┘
e(t) = r(t) - y(t)
Характеристики:
- Компенсация ошибок
- Устойчивость к возмущениям
- Требует датчиков
PID-регулятор
Передаточная функция
Временная область
Компоненты
| Компонент | Влияние на переходный процесс |
|---|---|
| P (пропорциональный) | Уменьшает время нарастания, увеличивает перерегулирование |
| I (интегральный) | Устраняет статическую ошибку, может вызвать колебания |
| D (дифференциальный) | Уменьшает перерегулирование и время установления |
Дискретная реализация
Реализация с 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 (реакция на ступеньку):
- Разомкнуть контур
- Подать ступенчатое воздействие
- Определить $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 (предельное усиление):
- Ki = 0, Kd = 0
- Увеличивать Kp до автоколебаний
- Зафиксировать $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$ |
Пространство состояний
Модель
Где:
- $\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}$$Управление с обратной связью по состоянию
Размещение полюсов: Выбор $K$ для заданного расположения собственных значений $(A-BK)$.
Устойчивость
Определение
Система устойчива, если при ограниченном входе выход остаётся ограниченным (BIBO-устойчивость).
Критерий Рауса-Гурвица
Система устойчива, если все элементы первого столбца таблицы Рауса положительны.
Критерий Найквиста
Система с разомкнутой передаточной функцией $G(s)H(s)$ устойчива, если годограф Найквиста не охватывает точку $(-1, 0)$.
Запасы устойчивости
| Параметр | Описание | Типичное значение |
|---|---|---|
| Запас по усилению | $G_m = 1/ | G(j\omega_\pi) |
| Запас по фазе | $\phi_m = 180° + \angle G(j\omega_c)$ | > 45° |
Влияние задержки
Важно: Большая задержка уменьшает запас по фазе!
Каскадное управление
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 |
