Интерактивный симуляторСредний

Симулятор балансирующего робота: ПИД (PID) маятника

Удерживайте двухколёсного робота в браузере: отклоните и толкните его, измените коэффициенты каскадного ПИД-регулятора и посмотрите, как он падает.

Категория
Системы управления
Время
2–4 hours
Платформа
Браузер · Arduino
Техническая схема: Симулятор балансирующего робота: ПИД (PID) маятникаθTILT → PID → DRIVE UNDER IT

01 / Начните здесь

Введение

Самобалансирующийся робот — это перевёрнутый маятник: центр масс находится выше оси, поэтому неподвижное равновесие неустойчиво, и удержать его может только активный контур. Наклоните корпус и отпустите, толкните робота или установите коэффициент производной в ноль, чтобы увидеть рост колебаний до удара о пол. График показывает наклон и отмечает угол, за пределами которого момент двигателя уже не может спасти робота.

Live lab / Inverted pendulum & cascaded PID

Self-balancing robot simulator

A two-wheeled robot with its centre of mass above the axle — an inverted pendulum that falls the moment the loop stops. Drag the body over and let go, shove it, or detune the gains and watch exactly how it fails.

Browser native
A self-balancing robot lab. A two-wheeled robot stands on a floor with its mass above the axle. The control loop reads the tilt angle and drives the wheels to stay under the body. A rolling chart above the robot plots tilt over the last few seconds against the fall threshold. Use the controls below to shove it, drag it off balance, change the PID gains, or switch the loop off and watch it fall.

Drag the robot to lean it over and let go — the loop takes it from wherever you leave it. The dashed line is the tilt target the outer loop is asking for; the bar at the axle is the motor command. The trace above plots tilt against the ±35° fall threshold.

  • Measured tilt
  • Tilt target (outer loop)
  • Motor command
  • Fall threshold
Simulation

Ready. Press Start, then drag the robot over and let go.

Inner loop — tilt to motors
Outer loop & hardware
Tilt
0.0°
Tilt target
0.0°
Motor
0%
Position
0 cm
Upright for
0.0 s
Worst tilt
0.0°

Keyboard: focus the robot, then use Space to run/pause, S to shove it, L to switch the loop on or off, R to reset, and F for full screen.

Управление

Пуск, Пауза и Сброс запускают контур. Толчок подаёт импульс так, как это сделал бы палец, а Контур вкл./выкл. отключает оба регулятора, чтобы увидеть, как падает сам объект без управления.

Самый прямой способ управления — сам робот: перетащите корпус на любой угол и отпустите. Поза, в которой вы его оставили, — это поза, которую подхватит регулятор; отдельного шага повторного взведения нет, а ползунки коэффициентов применяются к работающей симуляции сразу. Установите коэффициент производной в ноль во время балансировки, и он начнёт колебаться в ту же секунду.

Меню Настройка загружает четыре пресета: один рабочий и три, которые дают три типичных для реальных балансирующих роботов отказа.

Установите фокус на холсте и используйте Space, S, L, R и F для тех же элементов управления с клавиатуры.

Теория

Удержание робота на двух колёсах означает удержание перевёрнутого маятника в вертикальном положении. Центр масс находится выше оси, поэтому вертикальное положение является равновесием в том же смысле, что и карандаш, стоящий на острие: математически реальное, физически невозможное без постоянной коррекции. Наклоните его на любой угол, и гравитация создаст момент, который наклонит ещё сильнее. Чем дальше он уходит, тем быстрее движется.

У робота есть ровно один способ противостоять этому моменту — переместить ось. Ускорение колёс вперёд возвращает основание под центр масс, поворачивая корпус обратно к вертикали. Поэтому коррекция поначалу кажется перевёрнутой: чтобы остановить падение вперёд, нужно ехать вперёд, точно как вы подводите руку под удерживаемую метлу, а не убираете её.

Двухпанельная схема. Слева двухколёсный робот наклоняется вперёд на угол theta от вертикали, стрелка показывает, как гравитация наклоняет его дальше. Справа тот же робот: стрелка показывает движение колёс вперёд в направлении наклона, а изогнутая стрелка — как корпус возвращается в вертикальное положение из предыдущей наклонной позы.
Падение — это вход, а не отказ: θ — величина, которую читает регулятор, а движение колёс под наклоном — единственный способ его отменить. Скачать SVG

Это задаёт роботу жёсткий предел. При угле примерно больше 35° необходимое горизонтальное ускорение превышает то, что колёса могут обеспечить до удара корпуса о пол, и никакое увеличение коэффициентов не помогает. Пунктирные линии на графике отмечают эту границу.

Алгоритм

Регулятор каскадный — два контура ПИД-регулятора, один задаёт уставку другому.

Блок-схема. Внешний блок ПИД-регулятора с подписью position to lean передаёт целевой наклон во внутренний блок ПИД-регулятора с подписью tilt to motors, который отправляет PWM в блок с подписью robot. Измеренный наклон возвращается от робота во внутренний контур на частоте 200 hertz, а положение колёс — во внешний контур на частоте 20 hertz.
Два контура, а не один. Внешний решает, насколько наклониться; внутренний обеспечивает этот наклон. Настраивать сначала внутренний контур — единственный рабочий порядок. Скачать SVG

Внутренний контур работает быстро и удерживает угол наклона. Он сравнивает измеренный угол с целью и формирует команду приводу:

error   = measured_angle − target_angle
motor   = Kp·error + Ki·∫error + Kd·d(measured)/dt

Обратите внимание: ошибка измеряется как измеренная минус целевая, а не наоборот, как в учебнике. Чтобы поймать падение вперёд, нужно двигать колёса вперёд, поэтому положительный наклон должен давать положительную команду приводу. Этот знак — самая частая причина того, что первый балансирующий робот с включением падает на пол.

Внешний контур работает медленнее и удерживает положение. Он не может управлять двигателями — они уже заняты внутренним контуром, — поэтому задаёт целевой наклон для внутреннего контура:

target_angle = Kp_pos·(desired_position − position) − Kd_pos·velocity

Когда робот отстаёт от желаемого положения, внешний контур запрашивает небольшой наклон вперёд; внутренний затем движет колёса, чтобы удержать этот наклон, и робот перемещается вперёд. Наклон намеренно ограничен несколькими градусами. Внешний контур, которому разрешено требовать большой угол, передаст внутреннему цель, которую тот не может удержать, и оба контура сразу потеряют устойчивость.

Интегральная составляющая здесь важнее, чем во многих контурах, потому что именно она поглощает разницу между тем, где IMU считает вертикаль, и тем, где вертикаль находится на самом деле. Поэтому интегральная составляющая также должна прекращать накопление при насыщении двигателей, иначе она накапливается во время падения, которое не может предотвратить, а затем начинает бороться с восстановлением.

Исходный код

// Inner loop: tilt → motors. Runs every 5 ms off a timer, not in loop().
float angleError = angle - tiltTarget;          // measured minus target
angleIntegral   = constrain(angleIntegral + angleError * dt, -3, 3);
float command   = Kp * angleError
                + Ki * angleIntegral
                + Kd * gyroRate;                // rate straight from the gyro

command = constrain(command, -255, 255);
if (fabs(angle) > FALL_ANGLE) command = 0;      // past saving; cut the motors
driveMotors(command, command);

// Outer loop: position → tilt target. Runs ten times slower, and may only
// ever ask for a small lean.
if (++slowTick >= 10) {
  slowTick = 0;
  float positionError = 0 - wheelPosition;
  tiltTarget = constrain(KpPos * positionError - KdPos * wheelVelocity,
                         -0.12, 0.12);          // radians, about ±7°
}

Две детали напрямую переносятся из этого симулятора. Берите производную от угловой скорости по данным гироскопа, а не вычисляйте разность углов: гироскоп измеряет эту скорость напрямую и без шума, который усиливает дифференцирование. И отключайте двигатели за пределом угла восстановления, а не заставляйте регулятор продолжать прилагать усилие, — так вы сохраните редукторы и сделаете отказ очевидным, а не насильственным.

Оборудование

Датчик — MPU6050, содержащий одновременно акселерометр и гироскоп, потому что по отдельности ни один из них непригоден. Акселерометр знает, где находится низ, но его сигнал подавляется собственным движением робота; гироскоп чисто отслеживает вращение, но дрейфует за секунды. Комплементарный фильтр формирует на их основе стабильный и быстрый сигнал угла.

Для двигателей нужно достаточно низкое передаточное число, чтобы получить момент, и достаточно быстрые, чтобы поймать падение, — редукторные двигатели N20 около 200 RPM часто выбирают именно поэтому; ими управляет TB6612FNG, низкое падение напряжения которого важно, когда контур тысячи раз в секунду запрашивает небольшие коррекции.

Соберите настоящую версию в проекте самобалансирующегося робота или начните с руководства по чтению наклона, если IMU для вас нов.

Допущения и отличия от реального оборудования

Модель представляет собой 2D-модель перевёрнутого маятника с одной осью наклона, жёсткими звеньями, без проскальзывания колёс и IMU, который сообщает истинный угол и скорость только с дрейфом и шумом, заданными параметрами модели. Настоящий балансирующий робот ощущает момент двигателя, меняющийся вместе с напряжением аккумулятора, квантование энкодера, смещение монтажа IMU и температурный дрейф, а также может упасть набок — степень свободы, которую эта лаборатория полностью убирает. Каскадная структура ПИД-регулятора и производная по угловой скорости гироскопа переносятся напрямую, но смещение при монтаже, настройку фильтра и отсечку по углу падения необходимо заново определить на физическом шасси.

Схема соединений

Блок-схема соединений. Arduino Nano подключается к IMU MPU6050 по I2C на линиях SDA A4 и SCL A5, а также к двойному драйверу TB6612FNG по сигналам PWM и направления. Драйвер подключается к двигателю N20 с энкодером. Канал энкодера A возвращается в Arduino на вывод прерывания D2, а аккумулятор с подписью motors only питает вывод VM драйвера.
Одна шина I²C ведёт к IMU, четыре сигнала идут к драйверу, а питание двигателей не подключено к логической шине. Скачать SVG

Два правила соединений определяют, заработает ли этот робот.

Аккумулятор двигателей подключается только к выводу VM драйвера и больше никуда. Ток двигателя никогда не должен проходить через Arduino, а все общие провода — плата, драйвер, IMU и отрицательный вывод аккумулятора — должны быть соединены, иначе управляющие сигналы не имеют общей точки отсчёта, а отказ будет незаметным.

Энкодер питается от логического питания, а не от шины двигателей. Питание энкодера от источника двигателя либо выводит его из строя, либо заполняет отсчёты коммутационными помехами. Канал A энкодера также подключите к выводу с поддержкой прерываний; опрос из loop() теряет отсчёты, а потерянные отсчёты означают, что внешний контур постепенно теряет положение робота.

Установите IMU как можно ближе к оси колёсной базы. Высокое расположение умножает линейное ускорение, которое он видит при каждой коррекции, и делает задачу объединения данных сложнее без какой-либо пользы.

Список оборудования

Компоненты

  • Arduino Nano или Uno
  • Акселерометр и гироскоп MPU6050
  • Двойной драйвер двигателей TB6612FNG
  • Два редукторных двигателя N20 с энкодерами
  • Литиевый аккумуляторный блок 2S

Исследуйте граф

Где используется этот симулятор

Проекты, учебные пути и руководства, которые опираются на эту лабораторию.

Продолжайте сборку

Материалы для загрузки

Пользуйтесь этими справочными материалами на странице, пока работаете над проектом. Загружаемые пакеты проекта появятся только после публикации их исходников и версии.

Частые вопросы

Часто задаваемые вопросы

Почему балансирующему роботу нужны два контура ПИД-регулятора, а не один?

Потому что состояние, которое нужно стабилизировать, и движение, которым можно воздействовать на робота, различаются. Двигатели изменяют скорость колёс, но устойчивость робота определяется углом наклона; изменить его можно только перемещением колёс под корпусом. Поэтому внутренний контур удерживает угол наклона, управляя двигателями, а внешний запрашивает небольшой наклон, чтобы направить робота туда, куда нужно. Один контур не может делать обе задачи: если управлять двигателями напрямую по ошибке положения, робот ускорится, оставляя центр масс позади, и сразу упадёт.

Почему мой робот медленно уезжает, хотя выглядит ровным?

Почти всегда из-за смещения IMU при монтаже. Если IMU стоит на один-два градуса не по вертикали, контур добросовестно удерживает неправильный угол, а постоянный наклон означает постоянное ускорение в этом направлении, пока не закончится пространство. Установите ползунок коррекции в этой лаборатории, и вы увидите это своими глазами. На реальном оборудовании исправление — измерить смещение при действительно вертикальном роботе и вычесть его, а затем позволить интегральной составляющей поглотить оставшийся дрейф.

Можно ли удерживать равновесие без интегральной составляющей?

Да, и симулятор покажет, что это работает — ровно до момента, когда что-то сместит измерение. Только P и D могут удержать робота, потому что D обеспечивает демпфирование, не дающее колебаниям расти. Но они не могут убрать постоянное отклонение: при любой ошибке монтажа робот установится в небольшом постоянном наклоне и будет медленно уезжать. Интегральная составляющая доводит эту последнюю ошибку до нуля.

Почему робот падает, когда я устанавливаю коэффициент производной в ноль?

Потому что его больше ничто не демпфирует. Пропорциональный коэффициент реагирует на то, насколько робот уже наклонился, но к моменту коррекции корпус уже проходит через вертикаль с большой скоростью. Без члена, реагирующего на скорость изменения угла, каждое колебание перекомпенсируется сильнее предыдущего, пока одно не превысит угол восстановления. Установите D в ноль в этой лаборатории, и вы сможете посчитать колебания.

Почему колёса едут вперёд, когда робот наклоняется вперёд?

В этом и состоит весь фокус, и именно знак чаще всего понимают наоборот при первой попытке. Чтобы удержать метлу на ладони, вы подводите руку под падающий конец, а не убираете её. Робот действует так же: наклон вперёд означает движение вперёд, чтобы вернуть колёса под центр масс. Смените знак, и регулятор будет активно толкать робота вниз, что выглядит как мгновенное и насильственное падение.

Чем это отличается от симулятора ПИД-регулятора?

В лаборатории ПИД-регулятора регулируется устойчивый объект: если его не трогать, он просто стоит, поэтому контур только улучшает скорость и чистоту достижения цели. Здесь объект неустойчив — если его не трогать, он каждый раз падает. Это превращает настройку из оптимизации в требование, и именно поэтому балансировке нужен второй внешний контур, который в лаборатории с одним контуром вводить никогда не приходится.

Дополнительные материалы

Источники

Авторитетные источники, чтобы пойти глубже ограниченной учебной модели этого симулятора.