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

Добавлено 20 февраля 2018 в 08:02

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

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

Обзор

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

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

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

Избегание препятствий

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

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

Избегание препятствий
Избегание препятствий

Программирование

Скетч выполняет следующую логику:

  1. запустить драйвер робота и ждать 5 секунд. Это дает вам время, чтобы поставить робота туда, куда хотите, прежде чем он начнет движение;
  2. двигаться вперед;
  3. если средний датчик сработал, возвращаться назад в течение 1 секунды;
  4. произвольно выбрать направление направо или налево;
  5. поворачиваться в течение 1 секунды, пока средний датчик не сработает;
  6. если средний датчик сработает, перейти к шагу 3;
  7. если датчик не сработал, перейти к шагу 2.

Примечание: в каталог со скетчем программы необходимо поместить файлы библиотеки Robot (robot.ino и robot.h), исходный текст которых приведен в третье статье из данной серии.

#include "robot.h"

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

uint16_t lleft, lmid, lright;
boolean wleft, wmid, wright;
uint16_t avoid_count = 0;

void loop()
{
  rbt_sns(&lleft, &lmid, &lright, &wleft, &wmid, &wright);
  
  /* вернуться назад, если что-то было обнаружено на пути, и попытаться изменить направление */
  if(wmid)
  {
    rbt_move(REV, 100);
    delay(1000);
    /* выбрать случайное направление, чтобы обойти препятствие */
    if(random(10) > 5)
    {
      rbt_move(LEFT, 100);
      avoid_count = 1000;
      while(avoid_count)
      {
        delay(1);
        rbt_sns(&lleft, &lmid, &lright, &wleft, &wmid, &wright);
        if(wmid) 
          break;
      }
    }
    else
    {
      rbt_move(RIGHT, 100);
      avoid_count = 1000;
      while(avoid_count)
      {
        avoid_count--;
        rbt_sns(&lleft, &lmid, &lright, &wleft, &wmid, &wright);
        if(wmid) 
          break;
      }
    }
    rbt_move(FWD, 100);
  }
}

Избегание препятствий

Заключение

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


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


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