Управление реальным роботом c обратной связью в ROS (часть 5): различия между версиями

Материал из RoboWiki
Перейти к навигации Перейти к поиску
Строка 68: Строка 68:
  
 
2. '''Контроллер GoPiGo''' с ПИД-регулятором
 
2. '''Контроллер GoPiGo''' с ПИД-регулятором
 +
 +
Получив измеренную угловую скорость колеса, мы можем применить ПИД-регулятор для минимизации ошибки (она находится вычитанием из целевой угловой скорости колеса измеренной угловой скорости). Напомним, что целевая угловая скорость для каждого колеса задается узлом diffdrive_controller. Интуитивно понятна идея, что если наши двигатели не движутся с требуемой целевой скоростью (а движутся слишком медленно или слишком быстро), то мы должны скорректировать наши команды управления двигателями (наоборот сделав их быстрее или медленнее), чтобы устранить эти различия. Например, если трение о пол заставляет колеса вращаться медленнее, чем ожидалось, тогда нам нужно дать двигателям команду вращаться еще быстрее для компенсации.
 +
 +
ПИД-регуляторы хорошо изучены, поэтому можно понять принцип их работы интуитивно. Довольно просто можно это понять на примере круиз-контроля автомобиля. '''Состояние''' системы - текущая скорость робота. Круиз-контроль устанавливает '''целевую''' скорость. '''Управляющая команда''' регулирует педаль газа. Если вы двигаетесь слишком медленно, то вы нажмете на педаль газа сильнее (и наоборот). Аналогично за вас контролирует скоросто движения и круиз-контроль. '''Измерение''' - это одометр, который сообщает нам скорость автомобиля. '''Ошибка''' - это разница между измерением и целью. Если ошибка равна 0, то это означает, что мы достигли нашей целевой скорости. В большинстве физических систем мы не хотим мгновенно переходить от 0 до 100 км/ч, поэтому нам нужно вычислить управляющие команды, которые постепенно регулируют скорость автомобиля. ПИД-регулятор в основном представляет собой совокупность трех отдельных методов (составляющих) настройки управления, которые охватывают различные ситуации:
 +
 +
# '''(П)ропорциональная'''
 +
# '''(И)нтегральная'''
 +
# '''(Д)ифференциальная'''

Версия 16:29, 18 июля 2019

В этом разделе мы сосредоточимся на использовании данных, поступающих с колесных энкодеров, с двумя целями:

1. Создание замкнутой системы управления с использованием ПИД-регулятора

Хотя управление с разомкнутым контуром простое в реализации, оно не всегда работает надежно при работе на реальном роботе, потому что комбинация факторов окружающей среды (например есть трение от пола) и внутренних факторов (то есть различий между левым и правым двигателями) играет роль.

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

2. Одометрия с точным расчетом

Одометрия ценна тем, что она:

1) является необходимой информацией для использования стека навигации ROS в будущем

2) позволяет нам видеть траекторию робота

Мы объединим показания энкодеров с обоих колес (точный расчет), чтобы оценить положение робота во времени (одометрия).

1. Обзор: Управление роботом c обратной связью

Цели: 1. Использование данных колесного энкодера для управления с обратной связью и ПИД-регулятором, и для оценки одометрии робота

2. Обучение использованию обратной связи с данными датчиков для усовершенствования управления роботом и для оценки состояния

План:

  1. Прочитать данные с колесных энкодеров
  2. Ввести ПИД-регулирование в управление на обоих колесах
  3. Организовать точный расчет для оценки одометрии робота

Код репозитория (хранилища):

git clone -b closedloop https://github.com/richardw05/gopigo_ws.git

Видео-мануал

2. Архитектура

И опять, у нас есть хост-машина и робот, подключенный через WiFi. Как показано ниже, мы добавляем два узла ROS. gopigo_state_updater запускается на роботе и преобразует данные энкодера колеса в оценки угловой скорости колеса. Мы расширяем gopigo_controller, чтобы использовать эти показания с энкодера для управления с помощью PID. diffdrive_odom запускается на хост-машине и использует оценки энкодера для проведения точного расчета одометрии.

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

Ниже показаны сообщения ROS, передаваемые между нодами ROS.

Поток сообщений ROS от колесных энкодеров до вычисления одометрии.

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

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

3. Реализация

Мы превратим наш контроллер без обратной связьи в контроллер с обратной связью, создав новую ноду gopigo_state_updater и отредактировав ноду gopigo_controller. Затем мы выполним расчеты в новой ноде diffdrive_odom.

1. GoPiGo State Updater

Колесные энкодеры измеряют, на сколько реально повернулось каждое колесо, и оценивают реальные угловые скорости колес. В дальнейшем наш ПИД-регулятор исправит несоответствия между заданной и измеряемой (реальной) скоростью вращения колеса. Но прежде всего, нода gopigo_state_updater должна преобразовать показания колесного энкодера в угловую скорость.

Интересно, что колесные энкодеры GoPiGo возвращают количество пройденных сантиметров; в то время как большинство кодировщиков возвращает количество пройденных тактов (Следует пояснить, что при повороте на фиксированный малый угол энкодер генерирует некий сигнал . Подсчитывая количество этих сигналов, т.е. количество тактов, мы можем получить угол поворота и скорость поворота колеса). Тем не менее, измеряемые сигналы любого типа можгут быть преобразованы в угловые скорости. Для данных с нашего колесного энкодера мы можем вычислить угол поворота колеса в радианах, как величину, пропорциональную пройденному расстоянию, получаемому с энкодера. Затем мы вычисляем угловую скорость путем деления на время, за которое проводилось измерение (т.е. время, за которое робот преодолел расстояние, полученное с энкодеров).

Используются следующие сокращения:

  • d: изменения в расстоянии, полученные от энкодеров
  • R: радиус колеса робота
  • Δt: время перемещения на расстояние, полученное от энкодера
  • w: угловая скорость колеса

Для вычисления угловой скорости, мы сначала используем расстояние с энкодера, чтобы вычислить, какую часть от длины окружности колеса представляет это расстояние. А значит можно и вычислить угол поворота колеса, умножая это (ту самую часть, долю) на количество радиан за один оборот (очевидно, 2π). Наконец, мы делим на время, необходимое для перемещения на текущее расстояние, полученное с энкодера.

Eqa1.png

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

2. Контроллер GoPiGo с ПИД-регулятором

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

ПИД-регуляторы хорошо изучены, поэтому можно понять принцип их работы интуитивно. Довольно просто можно это понять на примере круиз-контроля автомобиля. Состояние системы - текущая скорость робота. Круиз-контроль устанавливает целевую скорость. Управляющая команда регулирует педаль газа. Если вы двигаетесь слишком медленно, то вы нажмете на педаль газа сильнее (и наоборот). Аналогично за вас контролирует скоросто движения и круиз-контроль. Измерение - это одометр, который сообщает нам скорость автомобиля. Ошибка - это разница между измерением и целью. Если ошибка равна 0, то это означает, что мы достигли нашей целевой скорости. В большинстве физических систем мы не хотим мгновенно переходить от 0 до 100 км/ч, поэтому нам нужно вычислить управляющие команды, которые постепенно регулируют скорость автомобиля. ПИД-регулятор в основном представляет собой совокупность трех отдельных методов (составляющих) настройки управления, которые охватывают различные ситуации:

  1. (П)ропорциональная
  2. (И)нтегральная
  3. (Д)ифференциальная