Роботизированное управление крутящим моментом на C++
Для программирования манипулятора для перемещения по определенной геометрической траектории (линии, окружности и т. д.) требуется инверсная кинематика. Сигналы управления приводом вырабатываются, когда кинематика соединения заменяется уравнениями движения. В идеале выполнение приказов перемещает рабочий орган робота по соответствующему маршруту. Тем не менее робот не выйдет на запланированную траекторию из-за возмущений, трения, упругости, люфта и возникновения немоделируемых физических явлений. Управление движением робота — это метод, который сводит к минимуму или уменьшает эти различия (между фактической и запланированной траекторией робота).
Приводы, которые воздействуют силой или крутящим моментом на каждый сустав, обычно используются для перемещения роботы. В результате для точного управления роботом требуется знание взаимосвязи между совместными усилиями и крутящими моментами и движением робота — динамикой робота. Уравнения динамики роботов сложны и требуют точной информации о массе и инерции каждого звена, которую может быть нелегко получить даже для простых роботов.
В большинстве реалистичных стратегий управления для учета этих неопределенностей используется управление с обратной связью. Мы изучаем методы управления движением, такие как управление вычисляемым крутящим моментом (или контроллер обратной динамики), которые объединяют приближенное динамическое моделирование с управлением с обратной связью.
В следующей статье я подробно покажу, как смоделировать вычисляемый контроллер крутящего момента для управления движением робота по траектории. Для моделирования я буду использовать простого робота 2R (чтобы дать вам интуицию) и PD-контроллер, который очень эффективен, если известны все параметры руки и нет помех.
Исходный код этой статьи на C++ вы найдете на моем GitHub.
Вывод контура управления с прямой связью
Робота, взятого на следующий анализ, можно изобразить на рисунке,
Динамику в нашем примере (для простоты я не рассматриваю трение и возмущения) можно сформулировать следующим образом:
где M — матрица инерции, V — вектор Кориолиса/центростремительного, G — матрица силы тяжести, а 𝜏 — управляющий момент.
Рассматривая нашего робота, мы можем написать следующее уравнение в матричной форме следующим образом:
Принимая закон управления,
где e — ошибка Kv, Kp — скоростной и пропорциональный коэффициенты соответственно.
Мы можем записать наш управляющий сигнал в робот.
Обратите внимание, что робот в моделировании описывается динамикой робота, которая принимает в качестве входных данных крутящие моменты контроллера робота. Результатом работы робота является робот (положение и скорость).
Контур управления, используемый в нашем моделировании, можно изобразить следующим образом. Конечный эффектор нашего робота должен двигаться (в нашем случае) по кругу. Из-за эффекта, о котором я упоминал выше, существует отклонение между желаемым путем и путем, который выполняет робот. Мы вводим PD-контроллер, который на основе разницы существующей ошибки (разница между желаемым путем и фактическим путем) будет генерировать управляющий сигнал (крутящий момент) для компенсации существующего отклонения (ошибки).
Имейте в виду, что мы отправляем не прямой сигнал крутящего момента на серводвигатель робота, а ток. Вычисленные сигналы крутящего момента находятся внутри драйверов двигателя и сопоставляются с током двигателя.
Искомую траекторию можно изобразить следующим образом:
и углы робота,
Вычисленные крутящие моменты можно изобразить следующим образом:
Для построения графика требуется включить заголовочный файл, который должен находиться в той же папке, что и ваш cpp (файл, который вы можете клонировать из моего репозитория).
Ваша программа может быть скомпилирована следующим образом:
//compile g++ my_prog.cpp -o my_prog -I/usr/include/python3.8 -lpython3.8// //run ./my_prog //folder tree ├── my_prog ├── my_prog.cpp ├── matplotlibcpp.h
Спасибо за чтение.