Основные методы управления — Управление роботами

Д-р Джеймс Ф. Йонг
Университет Райс, Хьюстон, штат Техас
Источник: http://www.owlnet.rice.edu/~elec201/Book/control.html
Автор перевода: Степаненко С. В.


Управление роботом

Наиболее распространенным видом сбоев робота являются не механические или электронные сбои, а сбои программного обеспечения, которое управляет роботом. Например, если робот был направлен в стену, и его передние датчики не срабатывали, робот застрянет (только если робот не танк), пытаясь проехать через стену. Этот робот физически не застрял, но она «застряли умственно»: его управляющая программа не в состоянии обработать эту ситуацию и не дает возможности роботу выбраться. Многие роботы не могут преодолевать такие сложности. В этой главе мы обсудим некоторые из проблем, обычно возникающих при использовании датчиков робота, а также представить основы для осмысления контроля, которые могут помочь в предотвращении сбоев программ управления роботами ELEC 201.

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

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

Основные методы контроля

Позиционное управление

Движение вдоль края стены
Рисунок 1 — Движение вдоль края стены

Пусть робот должен быть запрограммирован на диске с левой стороны у стены, после края стены (рис. 1). Существует несколько вариантов решения этой задачи:

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

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

Использование двух датчиков Холла для наблюдения стены
Рисунок 2 — Использование двух датчиков Холла для наблюдения стены

Несколько датчиков, предоставленных в комплекте ELEC 201 может быть использовано для контроля расстояния между роботом и стеной. Например, два датчика Холла может быть установлены на робота, как показано на рисунке 2. В этом примере стена содержит магнитную полосу (как это сделано на тестовом поле ELEC 201). Два магнитные датчика установлены на робота, как показано на рисунке. Поскольку датчик А ближе к стене, это вызовет его срабатывание первым, когда робот движется к стене, а затем сработает B, если робот продолжает движение к стене. Когда робот движется от стенки, B отключится первым, а затем, если робот продолжает отходить от стены отключится датчик А. Процесс принятия решений использования этой информации изображен в таблице 1.

A B Результат
On On Очень близко
On Off Правильно
Off On Ошибка датчика
Off Off Далеко
Таблица 1 — Управление процессом движения с двумя датчиками Холла

Обратите внимание, что ситуация, когда датчик А не сработал, а датчик В сработал, указывает на сбой датчиков или ошибки в их монтаже.

Использование датчика для измерения расстояния до стены
Рисунок 3 — Использование датчика для измерения расстояния до стены

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

Пусть функции были написаны с использованием двух датчиков Холла, чтобы различить 4 состояния: TOO_CLOSE, TOO_FAR, JUST_RIGHT (от стены), и SENSOR_ERROR. Здесь возможно определение функции, называемой wall_distance ():

int TOO_CLOSE= -1;
int JUST_RIGHT= 0;
int TOO_FAR= 1;
int SENSOR_ERROR= -99;

int wall_distance()
{

    /* get reading on A & B sensors */
    int A_value= digital(A_SENSOR);
    int B_value= digital(B_SENSOR);

    /* assume "ON" means the sensor reads zero */
    if ((A_value == 0) && (B_value == 0)) return TOO_CLOSE;
    if ((A_value == 0) && (B_value == 1)) return JUST_RIGHT;
    if ((A_value == 1) && (B_value == 0)) return SENSOR_ERROR;
    /* if ((A_value == 1) && (B_value == 1)) */ return TOO_FAR;

}

Также можно написать функцию с использованием датчика расстояния, она должна различать три состояния: TOO_CLOSE, TOO_FAR и JUST_RIGHT. Ниже приведен возможный вариант этой функции, названной wall_dist_prox ():

int TOO_CLOSE= -1;
int JUST_RIGHT= 0;
int TOO_FAR= 1;
int TOO_CLOSE_THRESHOLD= 50;  /* Embedding threshold constants in this */
int TOO_FAR_THRESHOLD= 150;   /* manner in a real program is not good */
                              /* programming practice.  Instead, they */
                              /* should be placed in a separate file. */

int wall_dist_prox()
{

    /* get reading on proximity sensor */
    int prox_value= analog(PROXIMITY_SENSOR);

    /* assume smaller values mean closer to wall */
    if (prox_value < TOO_CLOSE_THRESHOLD) return TOO_CLOSE;
    if (prox_value > TOO_FAR_THRESHOLD) return TOO_FAR;
    return JUST_RIGHT;

}

Теперь в функцию управления движением робота можно добавить обратную связь, благодаря использованию wall_distance() функции. В этом примере функции veer_away_from_wall(), veer_toward_wall(), и drive_straight() используются для перемещения робота.

void follow_wall()
{
	while (1) {
		int state = wall_distance();
		
		if (state == TOO_CLOSE) veer_away_from_wall();
		else if (state == TOO_FAR) veer_toward_wall();
		else drive_straight();
	}
}

Даже если функция движения прямо робота не точная (возможно, одно из колес робота работает лучше, чем другие), эта функция должна выполнять свою задачу. Предположим, что drive_straight() процедура фактически немного повернула робота в сторону стены. Затем, проехав немного прямо, задача follow_wall() замечает, что робот находится слишком близко к стене, и выполняет функцию veer_away_from_wall().

Фактическое исполнение этого алгоритма будет находиться под воздействием многих факторов, в том числе:

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

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

Программное управление с открытым контуром (Open-loop Control) — без обратной связи

Преодоление угла
Рисунок 4 — Преодоление угла

Предположим теперь, робот движется около стены, и датчики показывают, что он достиг дальнего края. Робот необходимо повернуть по часовой стрелке на 90 градусов и продолжать следовать около края стены (рис. 4). Как это сделать?

Одним из самых простых способов будет отъехать немного назад и затем выполнить команда, которая поворачивает робота на 90 градусов. Следующий фрагмент кода иллюстрирует эту мысль:

....
robot_backward(); sleep(.25); /* go backward for 1/4 second */
robot_spin_clockwise(); sleep(1.5); /* 1.5 sec = 90 degrees */
....

Этот метод будет работать надежно только тогда, когда робот очень предсказуем. Например, нельзя считать, что свою очередь командование поворачивать в течение 1,5 сек всегда будет производить вращение на 90 градусов. Многие факторы влияют на производительность, в том числе уровень зарядки аккумулятора, сцепление с поверхностью, и трения в исполнительных механизмах.

Этот метод называется открытым контуром (open-loop, по сравнению с замкнутым контуром), потому что нет обратной связи о влиянии управляющей команды на состояние системы. Если команда настроена правильно и система является очень предсказуемой, команды системы с открытым контуром могут работать нормально, но в целом системы с замкнутым контуром намного более устойчивы.

Преодоление угла с обратной связью от датчика прикосновения
Рисунок 5 — Преодоление угла с обратной связью от датчика прикосновения

Как можно реализовать преодоление угла с обратной связью от датчика прикосновения? Один подход заключается в том, чтобы сделать небольшую очередь команд робота: ехать прямо, врезаться в стену, отъехать немного назад, повернуть и повторить (рисунок 5), тогда поворот будет выполняться как серия маленьких шагов.

Прогнозируемое управление (Feed-Forward Control)

Есть определенные преимущества программного управления без обратной связи, в первую очередь это скорость. Очевидно, что один поворот будет быстрее, чем серия малых поворотов, столкновения и отъезды назад

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

Для этого, например, уровень заряда аккумулятора можно измерить или рассчитать на основе времени использования после последней зарядки.

Заключение

Для видов деятельности, обычно выполняемые ELEC 201 роботами, управление с обратной связью оказывается очень полезным в:

  • следовании вдоль стены, как было описано в этой статье;
  • следовании вдоль линии, используя датчики отражения ELEC 201;
  • нахождении источников ИК света, используя ИК-датчики.

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

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