Как построить робота – следование за линией

Добавлено 13 февраля 2018 в 22:31

Как построить робота (от Travis Fagerness)

Четвертая часть из серии статей о построении робота, который может следовать за линиями и стенами и избегать препятствий!

Обзор

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

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

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

Следовать за линией?

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

робот слева от линии?
  повернуть направо
робот справа от линии?
  повернуть налево
робот на линии?
  двигаться вперед

Поиск подходящей поверхности

Для тестирования роботов многие люди используют черную изоленту на полу. Это приводит к лишней головной боли и бардаку. Для тестирования следования за разными трассами идеально подходит белая маркерная доска. Я нашел доску 2x4 фута за 10 долларов. На нее можно легко добавлять разные трассы с помощью черного маркера. Белый фон и черный маркер дают достаточную контрастность, поэтому датчики могут легко распознать линию. Вместо того, чтобы калибровать датчики для каждой поверхности, я сделаю предположение, что все они выдают примерно одинаковые показания для заданного цвета. Затем я могу сравнить их относительно друг друга, чтобы определить, какой датчик в данный момент выдает самое "темное" значение. Пока линия, которую я нарисую, в любой момент покрывает только один датчик, этот алгоритм обеспечит надежный способ определения положения робота.

Тестовая поверхность
Тестовая поверхность

Написание программы

Код ниже начинается с инициализации драйвер, после чего идет задержка 5 секунд. Это дает мне достаточно времени, чтобы поставить робота на трек, прежде чем он начнет движение. После этого робот непрерывно проверяет датчики и определяет, как двигаться, используя вышеприведенный алгоритм. Скорость движения вперед может быть задана с помощью определения ROBOT_SPEED. Это число до 255. Если робот движется слишком быстро, у алгоритма может не хватить времени для внесения поправки в движение. Я также добавил проверку, не поднят ли робот, или он сбился с курса. Если все датчики выдают показания 1000, это означает, что робот, скорее всего, поднят с поверхности, так как свет ни одного датчика не отражается назад. Это полезно, если вы хотите, чтобы робот останавливался, пока вы его переносите.

Потенциальные улучшения

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

#include "robot.h"
#define ROBOT_SPEED  100

void setup()
{
  Serial.begin(38400);
  Serial.println("Boot");
  rbt_init();  
  delay(5000);
}

uint16_t lleft,lmid,lright;
boolean wleft,wmid,wright;

void loop()                     
{
  rbt_sns(&lleft,&lmid,&lright,&wleft,&wmid,&wright);
  Serial.print("Left: ");
  Serial.print(lleft);
  Serial.print("Mid: ");
  Serial.print(lmid);
  Serial.print("Right: ");
  Serial.println(lright);
  //не на линии
  if(lleft == 1000 && lmid == 1000 && lright == 1000)
  {
    rbt_move(BRAKE,0);
  }
  // следовать по треку
  else
  {
    if(lleft > lmid && lleft > lright)
    {
      rbt_move(LEFT,ROBOT_SPEED);
    }
    if(lmid > lleft && lmid > lright)
    {
      rbt_move(FWD,ROBOT_SPEED);
    }
    if(lright > lmid && lright > lleft)
    {
      rbt_move(RIGHT,ROBOT_SPEED);
    }
  }
}

Следуем за линией!

Заключение

В данной статье я показал процесс написания алгоритма управления для следования за линией. Следование за линией – это простой способ узнать о теории управления и следить за тем, чтобы робот проходил маршрут полностью автономно! В следующей статье я заставлю робота перемещаться по полу и избегать столкновений с препятствиями и стенами.


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


Сообщить об ошибке