Использование Sympy для решения обратной кинематики

#sympy #inverse-kinematics

#sympy #обратная кинематика

Вопрос:

Я хочу решить простую 2D обратную кинематическую задачу с помощью Sympy. Я знаю прямое кинематическое уравнение положения x и y.

 x = l1*cos(theta1)   l2*cos(theta1 theta2)
y = l1*sin(theta1)   l2*sin(theta1 theta2)
  

Как решить значения theta1 и theta2 с помощью Sympy, если я знаю эти два уравнения?

Ответ №1:

Я не думаю, что существует решение этих уравнений, но если бы оно было, вы могли бы использовать следующий метод:

 import sympy as sp

# Define symbols
theta1, theta2, l1, l2, x, y = sp.symbols("theta1 theta2 l1 l2 x y")

# Define equations, rearranged so expressions equal 0
eq1 = l1 * sp.cos(theta1)   l2 * sp.cos(theta1   theta2) - x
eq2 = l1 * sp.sin(theta1)   l2 * sp.sin(theta1   theta2) - y

# Solve for theta1 amp; theta2
solution = sp.solve([eq1, eq2], [theta1, theta2], dict=True)
print(solution)
  

Я пытался использовать решатель sympy nonlinsolve для аналогичной задачи обратной кинематики, но заметил этот комментарий в документах:

В настоящее время nonlinsolve не способен должным образом решать систему уравнений, имеющих тригонометрические функции. решение может быть использовано для таких случаев (но не дает полного решения)