По-перше, нам потрібно визначити оптимальний . Оскільки ви не кажете те, що вважаєте оптимальним, більшість людей вибирають квадратичний вираз. Наприклад, припустимо, що ваші поточні кути суглоба задані векторомα⃗ . Ми можемо розглянути можливість мінімізації необхідного руху - з помилкоюх⃗ =α⃗ -α⃗ s t a r t, Ви можете визначити функцію витрат J=х⃗ ТQх⃗ для деякої матриці Q. Ми зазвичай використовуємо діагональну матрицю, але будь-яка матриця, що визначається позитивом, буде робити.
На спрощеному прикладі з двома суглобами кута, якщо спільними а був дешевший мотор (можливо, ближче до кінцевого ефектора), ми можемо мати функцію витрат
J= [хахб] [1002] [хахб], тобто. рух суглобаб вдвічі дорожче, ніж спільне а.
Тепер кінематичне рівняння є матричною формулою, і в позначенні Денавіт-Гартенберга може бути:
∏Тi=⎡⎣⎢⎢⎢100001000010хуz1⎤⎦⎥⎥⎥, де права рука представляє положення ( х , у, z) та орієнтація (в даний час встановлена нульовим обертанням), враховуючи кути з'єднання.
Оскільки нас не хвилює орієнтація, а лише положення, ми можемо усікати перші 3 стовпчики останньої матриці перетворення та останній рядок першої матриці перетворення. Ми можемо так само виразити цю формулу:
⎡⎣⎢100010001000⎤⎦⎥∏Тi⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥=⎡⎣⎢хуz⎤⎦⎥
Помноживши ліву частину, отримаємо три рівняння. Якби параметри були лінійними, вирішити їх було б просто. Це так, якщо всі приводи є лінійними приводами. У цьому випадку проблема насправді є квадратичною програмою . Ми можемо переставити ліву частину, щоб отримати рівняння:
Кх⃗ =⎡⎣⎢хуz⎤⎦⎥, для деякої матриці К.
Квадратична програма - це проблема, яка може бути виражена у вигляді:
Мінімізуйте J=12х⃗ ТQх⃗ +c⃗ Тх⃗
На тему Ах⃗ ≤б⃗ , Ех⃗ =г⃗
Для вирішення цього питання існує ряд алгоритмів, якими ви можете скористатися, наприклад, внутрішня точка, активний набір, .... Просто знайдіть підходящу бібліотеку, і вона вирішить її для вас.
Нелінійну систему рівнянь вирішити важче. Це називається нелінійним програмуванням , але це те, що у вас є, якщо у вас є обертові суглоби.
По суті, замість матричних рівнянь у вас є нелінійні функції.
Мінімізуйте f( х ) на тему год⃗ ( x ) = 0, г⃗ ( x ) ≤ 0 (переупорядкуйте, якщо необхідно, щоб РЗС обмежень було нульовим)
Алгоритми, що використовуються для вирішення цього питання, ще складніші, але включають внутрішню точку, послідовне квадратичне програмування (SQP), активний набір, відображаючі алгоритми довіреної області. Очевидно, що пояснення того, як працюють ці алгоритми, є дуже тривалим, і я не залишатиму його поза рамками цієї відповіді. Досить сказати, що кількість вмісту в алгоритмах, що використовуються для просто квадратичного програмування, може скласти сам курс.
Вам слід просто знайти бібліотеку, щоб вирішити проблему, для кодування ефективної реалізації знадобиться багато часу, і ефективні реалізації можуть обробляти 100 (або більше) змінних одночасно. Наприклад, якщо ви використовуєте MATLAB, то є документація щодо використання функції fmincon з Панелі оптимізації.
Щоб вирішити це в Інтернеті, вам може знадобитися C ++ або інша власна реалізація, наприклад, NLopt. Зверніть увагу, що це може бути не те, що мікроконтролер може швидко вирішити, і багато бібліотек можуть мати інші залежності, які не просто використовувати у мікроконтролері (оскільки вони призначені для комп'ютера).
Якщо ви не переживаєте за ефективність, а просто хочете щось, що ви можете кодувати самостійно, то припускаючи, що є функція, яку ви можете зателефонувати для вирішення зворотної кінематичної проблеми , ви можете просто скористатися методом градієнтного спуску. Наприклад, довільно вибираючи випадкову початкову орієнтацію, вирішують зворотну задачу, а потім перевіряють функцію витрат. Потім ви можете скористатися аналізом збурень, щоб перевірити, як слід змінювати орієнтацію. Наприклад, якщо ви перевіряєте подібні орієнтації навколо вашої поточної орієнтації (наприклад, 8 балів у кубічній сітці), ви можете отримати приблизне наближення другого порядку до того, як змінюється функція витрат у кожному напрямку.
Використовуючи наближення другого порядку (відоме як матриця Гессі, оскільки вона є багатоваріантною - тривимірною для орієнтації), можна знайти нульове перетин градієнта функції витрат (тобто передбачувані локальні мінімуми).
З новою передбачуваною орієнтацією просто перенесіть її через інверсну розв'язку і повторіть, поки точність не буде достатньою.
Зверніть увагу, що це, ймовірно, не буде настільки ефективним, оскільки сама зворотна кінематична задача повинна бути ітеративно вирішена (тому ви неодноразово використовуєте функцію, яка сама потребує певного часу для вирішення). Також код може бути меншим, ніж повноцінний алгоритм оптимізації, але це все-таки досить вагомий і не незначний вкладення часу.
Використовуючи будь-який метод (формально розв’язуючи як нелінійну програму або використовуючи ітераційне використання функції для вирішення зворотної задачі), рішення може бути не оптимальним, якщо є кілька локальних мінімумів. У цьому випадку ви можете спробувати знайти глобальні мінімуми, використовуючи різні підходи. Навіть із нелінійним розв'язувачем програмування, від вас очікується засідання початкових значень (наприклад, кути з'єднання). Ви можете неодноразово запускати будь-який метод із створеним насінням різними способами:
- випадковий перезапуск (генерується випадковим чином)
- на основі сітки
або інші користувацькі методи.
Однак зауважте, що якщо мінімумів багато, не існує хорошого способу гарантувати, що ви знайдете глобальні мінімуми. Ви можете лише поліпшити свої шанси.