Роботизированное управление крутящим моментом на 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

Спасибо за чтение.