конкретика
Глядя на базовый пример PID, я думаю, что вам просто нужно создать две копии контроллера PID, по одной для каждого колеса, датчика и pwm:
PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);
Затем, в вашем loop()
эквиваленте, вы просто читаете оба датчика, передаете каждое значение датчика соответствующему PID
и, наконец, записываете оба значения ШИМ.
На данный момент SetpointLeft
и SetpointRight
может фактически указывать на одно и то же значение, но определяя их отдельно, как это позволяет добавить возможность поворота позже.
Концепции
Хотя это может работать для основного случая, на самом ли деле этого достаточно, зависит от того, насколько точной должна быть ваша прямая линия.
Учитывая, что у вас есть датчики на каждом колесе, если вы запустите две петли ПИД-регулятора и сравните следующую ошибку каждого колеса , вы можете рассчитать максимальную ошибку abbe на расстоянии, предполагая, что ваши колеса не проскальзывают. Если эта ошибка меньше ваших требований, то все, что вам нужно, - это полный расчет .
Однако, если ваши колеса склонны к проскальзыванию, то вы можете скрыть следующую ошибку, которую ваша система управления не может обнаружить, и вам потребуется какой-либо способ обнаружить проскальзывание или рассчитать положение независимо от ваших колесных датчиков, а затем использовать программное обеспечение более высокого уровня для исправления требуемые положения колес / скорости для поддержания прямой линии.
Определение относительной позиции
Как предполагает Джон , вы можете использовать акселерометр для определения положения, но, учитывая их точность и влияние накопленных ошибок с течением времени, вам лучше использовать данные акселерометра для обнаружения и корректировки проскальзывания колеса.
В мобильной робототехнике методы фильтрации Калмана обычно используются для объединения данных из нескольких источников, таких как акселерометр и колесные датчики, для лучшего определения текущего положения.
Однако, что бы вы ни делали с определением относительного положения, с течением времени положение, в котором вы считаете себя , смещается от вашего реального физического положения.
Абсолютное определение позиции
Единственный способ обойти это - иметь точку отсчета за пределами системы отсчета вашего транспортного средства.
Например, roomba, как правило, использует мертвые расчеты для перемещения по комнате, но всякий раз, когда ей нужно стыковаться, она ищет луч инфракрасного света, излучаемый зарядным доком. По мере того, как румба случайно перемещается через этот луч, она обнаруживает его, фиксирует на луче и следует за ним обратно к своему источнику. В сочетании с датчиками удара он может точно позиционироваться на зарядных контактах.
Для вашего робота у него может быть домашняя позиция, куда он может вернуться и обнаружить, что находится в этом известном месте. В этот момент он точно знает, где он находится, и может сообщить, насколько далеко находится его расчетная позиция от фактической позиции.
Другим вариантом, если вам нужно, чтобы ваш робот путешествовал по прямой линии на сотни метров, было бы переключение на другую технику, например, добавление щита Arduino GPS .
Сочетание техник
В конечном итоге, в зависимости от ваших требований к точности, вам может потребоваться использовать комбинацию этих методов.
Если возможен направляющий луч, вы можете очень просто делать то, что хотите, с помощью техники невидимой линии . Если вам нужно перемещаться по любой произвольной прямой линии в ограниченной области, то, как и в случае комнаты, вы можете использовать пару направляющих (под прямым углом друг к другу), чтобы вы могли скорректировать свое синтезированное положение по одной декартовой оси. каждый раз, когда робот проходит один из лучей.
Здесь есть много вариантов, и то, что вы выберете, будет зависеть от того, что вам нужно.