для начала предупреждение!
эта статья является адаптацией вот этой англоязычной статьи!
Собственно сама статья является логическим продолжением вот этой статьи, но вполне может восприниматься отдельно. Там мы калибровали сенсор линии, а тут уже будем ориентироваться, благодаря нему, в пространстве. В статье УМЫШЛЕННО ничего не будет адаптироваться для сенсора QTR-8A о котором уже есть статья на канале. Почему? Чтобы повторить нашего робота, вам придется потрудиться и получить опыт и знания. В общем, учитесь думать, а не копировать.
Для чего нам это нужно? Да все просто, скорость робота напрямую зависит от точности позиционирования. Когда у вас "робот по линии" с одним сенсором - о скорости и говорить не приходится, 2 - лучше, 3, 4, 5 - уже хорошо, а у нас аж целых 8! Но что если я вам скажу, что мы из наших 8 сенсоров можем при помощи кода сделать линейку из (условно) бесконечного количества сенсоров?
Для этого нам и нужна "интерполяция"! Что это и как читайте сами, а вот как это применить в роботе, расскажу я.
Поехали!
У нас с вами есть массив сенсоров в виде модуля из 6 аналоговых сенсоров линии. Цель робота ехать ровно по линии, то есть наш робот должен стремиться к тому чтобы центр линии был между 2-м и 3-м сенсором. Отклонение от сенсора мы будем называть - ошибка! Отклонение в одну сторону - это положительная ошибка, отклонение в другую сторону - это отрицательная ошибка. (смотри рисунок №1) При этом, чем больше отклонение, тем больше ошибка. Ошибка выражается в условных единицах, но для понимания я буду выражать ее в миллиметрах!
К примеру, на рисунке, у сенсора №0 ошибка = +20.
Таким образом, если середина линии находится ровно между 2-м и 3-м сенсором то ошибка будет 0, если середина линии находится ровно под центром сенсором №1 то ошибка будет равна +12. А теперь вопрос, какая ошибка будет если середина линии будет ровно посередине между 3-м и 4-м сенсором? Правильный ответ -8, если вы посчитали так же, то поздравляю, вы интерполировали ошибку! Только это была линейная интерполяция, а у нас будет интерполяция методом средневзвешенного.
Давайте представим что сенсоры на черное передают нам сигнал 0, а на белое 1023. При этом сенсоры 0, 1, 2, 5 передают нам сигнал 0, а 3-й и 4-й по 512. Где находится центр линии? Верно все там же, но тут мы поняли это только при помощи логики! А если так: 0-й = 0, 1-й = 0, 2-й = 100, 3-й = 1023, 4-й = 500, 5-й = 0. Где центр линии? Вот тут то нам и нужно интерполировать при помощи метода "средневзвешенное". И как не удивительно тут есть формула, которая нам поможет =)
Для сенсора с шестью аналоговыми датчиками формула будет выглядеть так:
в данной формуле: "X" - ошибка сенсора, а точнее расстояние от центра робота до середины сенсора. Для сенсора №5 на нашей схеме X = -20. А "Y" - это значение, передаваемое аналоговым сенсором. Тот же 5-й сенсор по последнему условию возвращает нам сигнал "0".
Далее все просто, подставляем все в формулу и считаем ошибку. Я совмещу приятное с полезным, напишу код на Python и посчитаю ошибку (рис. №3)
Итог!
В итоге мы с вами имеем "ошибку" или отклонение робота от траектории, а это уже то что можно легко и просто скормить PID-регулятору, о котором, с вашего позволения, я писать не буду, уж и так про него информации в сети уйма.
Если есть вопросы, милости прошу в комментарии.
Другие интересные статьи вы можете найти тут!