Скоростная кинематика и матрица Якоби
1. Введение: почему это «мост»?
В предыдущих документах мы изучили положение (кинематика) и силы и моменты (динамика).
Матрица Якоби (Jacobian Matrix, ) называют «мостом», потому что она связывает эти две области на уровне дифференциалов:
-
Связь пространства суставов и декартова пространства: описывает, как скорости суставов () отображаются в линейную и угловую скорость концевого эффектора ().
-
Связь движения и силы (принцип виртуальной работы): это вход в динамику. Матрица описывает, как обобщённая сила на конце переходит в моменты, которые должны создать суставы ().
Для плоского манипулятора 2R при полной позе обобщённую силу на конце записывают как (двумерная сила и момент на конце).
Без матрицы Якоби нельзя по желаемой скорости конца вычислить скорости суставов или по весу захваченного груза — необходимый момент электродвигателей в суставах.
2. Основное определение
Для робота с степенями свободы переменные суставов — . Поза конца (положение и ориентация) записывается как .
Матрица Якоби определяется как матрица частных производных:
3. Схема процесса (Mermaid)
graph LR
subgraph Пространство суставов
q_dot["Скорость суставов (d_theta)"]
Tau["Момент в суставах (Torque)"]
end
subgraph Декартово пространство
v["Скорость конца (линейная/угловая)"]
F["Сила на конце (сила/момент)"]
end
J_block["Матрица Якоби J(q)"]
JT_block["Транспонированная матрица Якоби J^T(q)"]
q_dot -->|умножить на J| J_block --> v
F -->|умножить на J^T| JT_block --> Tau
style q_dot fill:#e1f5fe,stroke:#01579b
style v fill:#e1f5fe,stroke:#01579b
style Tau fill:#fff9c4,stroke:#fbc02d
style F fill:#fff9c4,stroke:#fbc02d
4. Проверка на Python: матрица Якоби двухзвенного манипулятора
Символьный вывод в sympy автоматически строит полную матрицу Якоби плоского манипулятора 2R размером .
import sympy as sp
import numpy as np
def calculate_jacobian_2link():
# 1. Задаём символы
theta1, theta2 = sp.symbols('theta1 theta2')
l1, l2 = sp.symbols('l1 l2')
# 2. Уравнения прямой кинематики (концевые x, y и угол ориентации phi)
# x = l1*c1 + l2*c12
# y = l1*s1 + l2*s12
x = l1 * sp.cos(theta1) + l2 * sp.cos(theta1 + theta2)
y = l1 * sp.sin(theta1) + l2 * sp.sin(theta1 + theta2)
phi = theta1 + theta2
# Вектор позы: [x, y, phi]^T
pose = sp.Matrix([x, y, phi])
# Вектор переменных суставов
q = sp.Matrix([theta1, theta2])
# 3. Матрица Якоби J = d(pose)/d(q), размер 3x2
J = pose.jacobian(q)
print("--- Полная символьная матрица Якоби J (3x2) ---")
sp.pprint(J)
# 4. Численная проверка (тест на сингулярность)
# Полная J — неквадратная матрица 3x2, поэтому определитель det(J) не берут.
# Для задачи позиционирования плоского 2R обычно используют верхнюю часть,
# линейную подматрицу Jv (первые две строки), чтобы проверить сингулярность.
# При theta2 = 0 (рука полностью вытянута) определитель Jv равен нулю.
J_func = sp.lambdify((theta1, theta2, l1, l2), J, 'numpy')
# Тест: l1=1, l2=1, theta1=0, theta2=0 (рука вытянута)
J_val = J_func(0, 0, 1, 1)
Jv_val = J_val[:2, :]
det_Jv = np.linalg.det(Jv_val)
rank_J = np.linalg.matrix_rank(J_val)
print("\n--- Численная проверка (рука вытянута, theta2=0) ---")
print(f"Полная матрица Якоби J:\n{J_val}")
print(f"Линейная подматрица Jv:\n{Jv_val}")
print(f"det(Jv) (близко к 0 означает позиционную сингулярность): {det_Jv}")
print(f"rank(J) = {rank_J} (показывает, упал ли ранг полного Якобиана; меньше 2 — ранг по столбцам снижен)")
print("Примечание: сингулярность для задачи позиционирования оценивается по Jv (например, близко ли det(Jv) к 0).")
# 5. Пример отображения силы: tau = J^T * F
# F = [fx, fy, mz]^T — плоская сила и момент на конце
F = np.array([10.0, 5.0, 1.0])
tau = J_val.T @ F
print("\n--- Пример отображения силы/момента ---")
print(f"Обобщённая сила на конце F = {F}")
print(f"Моменты в суставах tau = J^T F = {tau}")
calculate_jacobian_2link()