Во-первых, нам нужно определить оптимальный . Поскольку вы не говорите, что считаете оптимальным, большинство людей выбирают квадратное выражение. Например, предположим, что ваши текущие углы соединения задаются вектором . Мы можем рассмотреть сведение к минимуму движение , необходимое - с ошибкой → х = → & alpha ; - → & alpha ; s т г т , можно определить функцию стоимости J = → х Т Q → х для некоторой матрицы Q . Обычно мы используем диагональную матрицу, но подойдет любая положительно определенная матрица.α⃗ x⃗ =α⃗ −α⃗ startJ=x⃗ TQx⃗ Q
В упрощенном примере с двумя углами соединения, если у соединения был более дешевый двигатель (возможно, ближе к конечному эффектору), мы могли бы иметь функцию стоимостиa
, т.е. движение сустава b в два раза дороже, чем сустав a .J=[xaxb][1002][xaxb]ba
Теперь кинематическое уравнение является матричной формулой, и в обозначениях Денавита-Хартенберга это может быть:
, где правая часть представляет положение ( х , у , г ) и ориентации (настоящее время устанавливаетсякачестве нулевого вращения), учитывая совместные углы.∏Ti=⎡⎣⎢⎢⎢100001000010xyz1⎤⎦⎥⎥⎥(x,y,z)
Поскольку нам не важна ориентация, а только положение, мы можем обрезать первые 3 столбца последней матрицы преобразования и последнюю строку первой матрицы преобразования. Мы можем эквивалентно выразить эту формулу как:
⎡⎣⎢100010001000⎤⎦⎥∏Ti⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥=⎡⎣⎢xyz⎤⎦⎥
Умножив левую часть, мы получим три уравнения. Если бы параметры были линейными, это было бы просто решить. Это тот случай, если все исполнительные механизмы являются линейными исполнительными механизмами. В этом случае проблема на самом деле является квадратичной программой . Мы можем переставить левую часть, чтобы получить уравнение:
, для некоторой матрицы K .КИкс⃗ = ⎡⎣⎢ИксYZ⎤⎦⎥К
Квадратичная программа - это проблема, которая может быть выражена в виде:
Минимизировать J= 12Икс⃗ TQ x⃗ + с⃗ TИкс⃗
Подлежит , E → x = → dх⃗ ≤ б⃗ ЕИкс⃗ = д⃗
Чтобы решить эту проблему, есть ряд алгоритмов, которые вы можете использовать, например, внутренняя точка, активный набор, .... Просто найдите подходящую библиотеку, и она решит ее за вас.
Нелинейную систему уравнений сложнее решить. Это называется нелинейным программированием , но это то, что у вас есть, если у вас есть вращающиеся соединения.
По сути, вместо матричных уравнений у вас есть нелинейные функции.
Минимизируйте условии → h ( x ) = 0 , → g ( x ) ≤ 0 (при необходимости переставьте, чтобы RHS ограничений был равен нулю)е( х )час⃗ ( х ) = 0г⃗ ( х ) ≤ 0
Алгоритмы, используемые для решения этой проблемы, являются еще более сложными, но включают в себя внутренние точки, последовательное квадратичное программирование (SQP), активные наборы, отражающие алгоритмы доверительной области. Очевидно, что объяснение того, как работают эти алгоритмы, очень длинное, и я оставлю его за рамками этого ответа. Достаточно сказать, что количество контента по алгоритмам, используемым только для квадратичного программирования, само по себе может быть целым курсом.
Вам просто нужно найти библиотеку для решения проблемы, потребуется много времени, чтобы написать эффективную реализацию, и эффективные реализации могут обрабатывать 100 (или более) переменных одновременно. Например, если вы используете MATLAB, то есть документация по использованию функции fmincon из панели инструментов оптимизации.
Чтобы решить эту проблему онлайн, вам может потребоваться C ++ или другая нативная реализация, например, NLopt. Обратите внимание, что это может быть не то, что микроконтроллер может решить быстро, и многие библиотеки могут иметь другие зависимости, которые нелегко использовать на микроконтроллере (так как они предназначены для компьютера).
Если вы не беспокоитесь об эффективности и просто хотите что-то, что можете написать самостоятельно, тогда, если есть функция, которую вы можете вызвать для решения обратной кинематической задачи , вы можете просто сделать метод градиентного спуска. Например, произвольно выбирая случайную начальную ориентацию, решите обратную задачу, затем проверьте функцию стоимости. Затем вы можете использовать анализ возмущений, чтобы проверить, как вы должны изменить ориентацию. Например, если вы проверяете подобные ориентации вокруг вашей текущей ориентации (т.е. 8 точек в кубической сетке), вы можете получить приближение второго порядка того, как функция стоимости изменяется в каждом направлении.
Используя приближение второго порядка (известное как матрица Гессе, поскольку оно многомерно - 3-мерное для ориентации), вы можете найти пересечение нуля градиента функции стоимости (т. Е. Предсказанных локальных минимумов).
С новой прогнозируемой ориентацией просто пропустите ее через обратный решатель и повторяйте, пока точность не станет достаточной.
Обратите внимание, что это, вероятно, будет не столь эффективно, потому что сама обратная кинематическая задача должна решаться итеративно (так что вы постоянно используете функцию, решение которой требует времени). Кроме того, используемый код может быть меньше, чем полноценный алгоритм оптимизации, но он все еще довольно существенен и не является незначительным вложением времени.
Используя любой метод (формальное решение как нелинейную программу или итеративное использование функции для решения обратной задачи), решение может быть неоптимальным, если существует несколько локальных минимумов. В этом случае вы можете попытаться найти глобальные минимумы, используя различные подходы. Даже с решателем нелинейного программирования вы должны будете заполнить его начальными значениями (например, углами соединения). Вы можете многократно запускать любой метод с начальным числом, сгенерированным различными способами:
- случайный перезапуск (генерируется случайным образом)
- основанный на сетке
или другие пользовательские методы.
Однако учтите, что если существует много минимумов, нет хорошего способа гарантировать, что вы найдете глобальные минимумы. Вы можете только улучшить свои шансы.