Вот задача довольно стандартная для разных соревнований (которые большей частью на лего): робот движется по чёрной линии, на пути препятствие (или другой робот), и его нужно обойти (или хотя бы остановиться и подождать). Используем аналоговые датчики линии (2 штуки) и ультразвуковой дальномер.
Проблема: без использования дальномера движение по линии идёт нормально. Но как только включаю функцию измерения расстояния - машинка начинает сильно сбиваться. Как я понимаю, проблема в том, что отслеживание линии критично к времени: чуть отвлёкся (на дальномер) - и сорвался. А УЗ дальномер измеряет не мгновенно. Может кто-то посоветовать алгоритм, свободный от этой проблемы? Хотя бы идеи. Наверняка эта задача имеет какое-то красивое решение.
Основа скетча у меня примерно такая:
- Код: Выделить всё
//сначала - цикл нормального движения по линии. в условии проверяется, что хотя бы один из датчиков не на белом и нет препятствия ближе 30 см.
while (((analogRead(A0) > WHITEL) || (analogRead(A1) > WHITER))&&(distance()>30)) {
float x = analogRead(A0) - analogRead(A1);
u = K1 * x + K2 * x * x * x;
//движение с поправкой
forward(70 - u, 70 + u);//эта функция включает движение с заданными скоростями для каждого колеса.
}
// дальше цикл обработки случайного ухода с линии. Оба датчика на белом, препятствия не видно.
while (((analogRead(A0) < WHITEL) && (analogRead(A1) < WHITER))&&(distance()>30)) {
if (u > 0) {
forward(-50, 50);
}
if (u < 0) {
forward(50, -50);
}
}
if(distance()<=30){
//тут какая-то обработка обнаружения препятствия: объезд или остановка
}
Если убрать проверку расстояния из циклов while - ездит по линии нормально.