hax писал(а):Имеется двухколёсный двухмоторный робот с оптическими энкодерами на каждом колесе. Управление скоростью вращения - через PWM.
Я хочу указывать скорость каждого колеса, чтобы робот двигался по определённой траектории или делал разворот на месте.
В теории можно использовать 2 отдельных ПИД контроллера, для каждого колеса
1) можно добиваться точности движения уровня CNC станка, но это сложно, дорого, работает только на однородной поверхности.
и строго говоря большого смысла не имеет, т.к. будет очень капризным.
Что делать если колесо проскальзнуло? вся программа на основе абсолютных координат летит к чёрту, робот попал в параллельную вселенную где шкаф стоит в другом месте а программа об этом не знает (энкодеры не врали колесо крутилось как нужно, но физическое перемещение не совпадает с программным ).
ввиду многих факторов даже если сделать обратную связь между левым и правым колесом строго прямо ехать не будет.
Причины уже назывались
1) проскальзывание колёс
2) разные диаметры колёс
3) люфт в редукторе
4) неровный момент двигателя
5) погрешность измерения энкодерами
6) задержки в самом алгоритме управления
Бороться с этим можно только повышением качества каждого элемента а значит увеличение стоимости и всё равно 100% гарантии не будет.
2) можно постоянно корректировать движение на основе внешних данных, например инерциальный датчик (гиро аксель компас), ультразвуковой дальномер, Lidar, kinect и т.п.
Поэтому есть вопрос на на основе каких данных вы управляете роботом?
Т.е. что является входными данными и как проверяете достигнутый результат?
В общем случае работает такой алгоритм
1) на основе последних известных данных (энкодеры,инерциальные датчики, УЗ датчики и т.п.), вычисляется скорость V и угол Q необходимый вектор движения платформы робота
2) вектор преобразуется в скорость (обороты) для левого колеса и скорость для правого
3) для каждого колеса работает пид регулятор который удерживает заданную на шаге 2 скорость в течение всего периода пока не поступит новый вектор
4) goto 1