Автор Тема: Следваме линия [Принцип на алгоритма]  (Прочетена 22042 пъти)

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Следваме линия [Принцип на алгоритма]
« -: Август 24, 2007, 11:47:50 am »
Следене на линия - как да разпознаваме линията и да я следваме?

Има много начини за следене на линия, но при всички се използват датчици, които я "виждат". Хайде да поговорим за това как числото на датчиците влияе върху по-доброто следване на линията.

Малко отклонение от темата:
За следване се използват, по правило, датчици за осветеност на полето. Те биват 2 вида:

* фотодатчик, реагиращ само на самия факт, че има линия, или няма (фотодиод, фотоелемент, фоторезистор);
* датчик на изображение, показващ линията като изображение пред робота (цифрова камера, уеб-камера).

Сега ще разгледаме използването на първия вид датчици, тъй като те са по-разпространени, по-лесни за направа и изискващи по-лесен алгоритъм!

Един датчик (търсещ края на линията) - Само 1 датчик ни е необходим за следене на линията. Фактически, роботът върви зигзагообразно, от светло към тъмно. При използване на 2 двигателя от робота, единият се задейства, когато вижда линията, а другият се задейства когато не я вижда. Този способ е лесен за използване, когато роботът се движи бавно. Но когато той се движи бързо, този метод е непригодим!
Конструкция с един датчик рядко се използва при електроника, съдържаща микроконтролер. Ако запишем в двоичната система, такъв датчик има само 2 състояния, които изразяват следните състояния на робота:

0 - върви от линията
1 - върви към линията

Графиката изглежда така:



Два датчика (избягващ линията) - Използването на 2 датчика е почти същото, както с един, само разликата се състои в това, че всеки датчик управлява отделния двигател. Датчиците се колебаят между краищата на линията и по същество, роботът се стреми да я избягва. Този вариант работи по-добре от единичният, но ако роботът "изпусне" линията, намирането и е невъзможно! Това е защото роботът не може да разлечи колебанията на линията с това, дали я няма.
Ако се използва микроконтролер и този вариант на датчик, проблемът може да се компенсира на софтуерно ниво. Ако поместите датчиците достатъчно близко един до друг, може да се различи фактическото следване на линията, от загубата и, но как да се върне на нея, ако това се случи?
Възможните комбинациите на състоянието на датчика са:

00 - колебание между краищата на линията или "загуба" на линията
01 - намерена е дясната страна на линията
10 - намерена е лявата страна на линията
11 - не се използва, ако датчиците са разположени по-далече от ширината на линията

Графиката изглежда по този начин:



Три датчика (виждащ линията) - добавяйки трети датчик към предния вариант, даваме възможност на робота да разпознае линията и краищата и. Роботът вече може да различи къде е линията, къде са границите и, къде е загубена линията. Това дава възможност за приспособяване към такива ситуации, като например криви и завои по линията. Това увеличава драстично скоростта на робота на правите и по-тънко регулиране на скоростта при изменения на ситуацията. Това е един от най-разпространени варианти за следене на линия, особено с микроконтролери!
Възможните варианти за сигнал и значението им:

001 - отклоняване от линията наляво
010 - следене на линията
011 - малко сместване наляво
100 - отклоняване от линията надясно
101 - не се използва
110 - малко сместване надясно
111 - не се използва (но може да се използва при следене на линия с пресечени или в лабиринт, по решение на организацията на състезанието)

Графиката изглежда така:



Пет датчика (танцуващ по линията) - Щом 3 датчика са напълно достатъчни, за да следваме линията, защо да добавяме към тях още 2? Отговорът се свежда до това, че по този начин постигаме практическият резултат за всяко едно състезание - скоростта! Добавянето на още 2 датчика увеличават чувствителността, датчиците определят по-точно местоположението на линията. Когато роботът се движи бавно, той има повече време, за да измени скоростта си и същевременно да се задържа на линията. Какво ще се случи, ако скоростта рязко нарастне? Вместо изящно движение по линията, роботът ще започне да я губи, и да прескача завои.



Този проблем с изтърването на линията и пропускането на завои може да реши по два начина:

* Да се намали скоростта, когато това е възможно.
* Предвиждане и компенсиране на прескачането предварително

В точно определен момент, скоростта на робота превишава способността му да се управлява сам. Отчитайки тези ситуации, можем да накараме роботът да поправя прескачанията и да се връща на линията.



В примера, изображението по-горе, роботът е загубил линията, тъй като тя прави рязък завой. Тъй като линията завива наляво преди момента, в който роботът я губи, значи, трябва той да завива наляво, докато датчикът отново не я намери. Крайният ляв датчик ще намери линията (под доста остър ъгъл), по-рано от който и да е друг. Обикновената логика ни подсказва, че при намерена линия от най-крайния ляв датчик означава, че тя рязко е минала най-вляво. Затова и трябва да го компенсиране.
Но в този случай, връщайки се на линията, роботът може да я пресече, а не само да се "докосне" до нея. Но ние знаем, че роботът се връща наляво, затова ние можем да променим логиката на движението при сработването на "само един датчик", с помощта на рязък завой надясно, след докосването на линията от левия датчик. Именно така гарантираме това, че роботът ще се върне назад, на линията, вместо да я пресече. Описаното тук действие обяснява това, колко важни са тези 2 допълнителни датчика, при повишаването на скоростта на робота! Те осигуряват по-високо качество на управление, високо ниво на контрол, и по-бърза реакция, което решава проблема с изпускането на завои и със загубването на линията.

Както с другите варианти, и тук ще разгледаме възможните комбинации за сигнали с пет датчика (от всички възможни в списъка са внесени само полезните!):

00000 - Линията е загубена заради прескачане на завой или прекъсване на линията
00001 - Почти загубихме линията, рязък завой надясно и намаляване на скоростта
00011 - Почти достигна десния край, трябва да завие надясно
00010 - Почти в центъра на линията, трябва да се завие малко вдясно
00110 - Малко по-надясно от центъра на линията, трябва малък завой надясно
00100 - Център на линията, може да се увеличи скоростта и да върви напред
01100 - Малко завихме наляво от центъра на линията, трябва да се направи малък завой наляво
01000 - Вляво от центъра на линията, трябва да направи малък завой наляво
11000 - Около левия край на линията, трябва рязко да завие наляво
10000 - Почти загубихме линията, рязък завой наляво и намаляване на скоростта
11111 - Перпендикулятно пресичане на линията или е достигнат кръгът в края на лабиринт

Както сами можете да забележите от вариантите, при използване на 5 датчика се достига много по-точен контрол над движението на робота. Разглеждайки показанията на датчиците под формата на двоични числа, може лесно да се програмират логически решения при преминаването на една или друга комбинация от сигнали.

Сега ще разгледаме вариант на програма, разработен на Bascom AVR. Това е приведена логическа верига, която управлява включването и скоростта на двигателите, отчита прескачането, движението напред и компенсира пресичането. Примерът е написан на език Бейсик в програмата Bascom AVR за контролера DevBoard-M8 на базата на ATmega8.

Lineflag - променлива, която съдържа двойното представяне на всичките 5 датчика
Servo (1) - движение на сервомотор (електромотор), канал PWM
Servo (2) - движение на двигателя, канал PWM, с който управляваме ESC
Owershoot (прескачане) - флаг, който указва това, загубили ли сме линията, или не

Част от кода на Bascom AVR:

Select Case Lineflag

Case &B00000 'Няма линия
'Ако линията е загубена се опитваме да се върнем на нея
Servo(2) = Slow - Progspeed
If Lastlineflag < 4 Then
Overshoot = 1 'Рязък завой надясно
Elseif Lastlineflag > 4 Then
Overshoot = 1 'Рязък завой наляво
End If

Case &B00100 'Линията е в центъра на датчика
Overshoot = 0
Servo(1) = Center
Servo(2) = Mediumfast - Progspeed

Case &B00110
Overshoot = 0
Servo(1) = Smallright
Servo(2) = Mediumfast - Progspeed

Case &B00010
Overshoot = 0 'Линията се е отклонила встрани
Servo(1) = Mediumright
Servo(2) = Mediumfast - Progspeed

Case &B00011 'Линията отива на десния край на датчика
If Overshoot = 0 Then
Servo(1) = Largeright
Servo(2) = Medium - Progspeed
Else
Servo(1) = Mediumright
Servo(2) = Medium - Progspeed
End If

Case &B00001 'Линията отива зад дясната граница на датчика
If Overshoot = 0 Then
Servo(1) = Hardright
Servo(2) = Mediumslow - Progspeed
Else
Servo(1) = Largeright
Servo(2) = Mediumslow - Progspeed
End If

Case &B01100 'Линията се е отклонила към левия край на датчика
Overshoot = 0
Servo(1) = Smallleft
Servo(2) = Mediumfast - Progspeed

Case &B01000 'Линията се е отклонила от центъра на датчика
Overshoot = 0
Servo(1) = Mediumleft
Servo(2) = Mediumfast - Progspeed

Case &B11000 'Линията е почти на левия край на датчика
If Overshoot = 0 Then
Servo(1) = Largeleft
Servo(2) = Medium - Progspeed
Else
Servo(1) = Center
Servo(2) = Medium - Progspeed
End If

Case &B10000 'Линията отива зад левия край на датчика
If Overshoot = 0 Then
Servo(1) = Hardleft
Servo(2) = Mediumslow - Progspeed
Else
Servo(1) = Largeleft
Servo(2) = Mediumslow - Progspeed
End If

End Select


И така...виждаме, че 5 датчика осигуряват по-висока степен на контрол, което ни позволява да увеличим скоростта на робота и да компенсираме малките отклонения, докато не се наложи да смаляваме скоростта, заради нарастването на отклонението.

Заключение
Какъв вариант ще изберете за Вашия line follower е ваш избор! Бързите и ефективни СПЛ-и използват няколко датчика. Повече датчици - повече контрол, но по всяка вероятност ще ви потрябва микроконтролер за обработка на увеличения обем информация от датчиците и сложността на управление. Използвайте този метод, който съответства на Вашите нужди и според вашите знания - всеки проект има поне някакви приемущества!

П.с. СПЛ-ите с малко количество датчици често нямат микроконтролер и са устроени максимално просто, приближавайки се към клас BEAM-роботи: датчиците почти директно са свързани с двигателите. Датчикът от 5 светлочувствителни елемента вече изисква употребата на микроконтролер! В противен случай схемата би била прекалено сложна!

Пожелавам ви успех!
Роботиката не е хоби - тя е начин на живот!

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Следваме линия [Принцип на алгоритма]
« Отговор #1 -: Август 25, 2007, 06:18:14 pm »
Статията е завършена! Ако е възможно някой, който е по-добре запознат с програмните езици (Basic, Assembler, C# и т.н.) да се помъчи да "преведе" кода на по-достъпен за останалите... Примерно, на C! :)
Успех на всички, желаещи да построят Line Tracer!
Роботиката не е хоби - тя е начин на живот!

vasilvalchev

  • Новодошъл
  • *****
  • Публикации: 9
    • Профил
Следваме линия [Принцип на алгоритма]
« Отговор #2 -: Септември 16, 2008, 10:38:25 pm »
откъде е взета статията и къде мога да намеря самия алгоритъм за да ми е по отчетливо ? в момента строя лайн трейсър за състезания. предавката му е 1:26  :lol:  и ми трябват доста добри реакции  ;)

Borislav

  • Administrator
  • *****
  • Публикации: 1010
    • Профил
    • http://robotics-bg.com
Следваме линия [Принцип на алгоритма]
« Отговор #3 -: Септември 18, 2008, 06:32:39 pm »
Цитат на: "vasilvalchev"
откъде е взета статията и къде мога да намеря самия алгоритъм за да ми е по отчетливо ? в момента строя лайн трейсър за състезания. предавката му е 1:26  :lol:  и ми трябват доста добри реакции  ;)


Ето, в случай, че ти потрябва. :) Важното е да го накараш да е повратлив на завоите, защото те са по-трудната част от трасето. Разположението на датчиците също е много важно в случая!
Поздрави!
Роботиката не е хоби - тя е начин на живот!