Множественность решений и ограничения
У обратной задачи часто несколько ответов — или ни одного. Как с этим жить на практике.
В отличие от прямой задачи (один вход — один выход), обратная кинематика может иметь несколько решений, бесконечно много (у избыточных роботов) или вовсе ни одного.
Это фундаментальная асимметрия: FK — функция, IK — отношение. Управляющая программа обязана выбрать конкретное решение разумно.
Сколько решений
- Одно — цель ровно на границе зоны (рука вытянута).
- Два — типичный двухзвенник: локоть вверх/вниз.
- Бесконечно много — избыточный робот ($\gt$ DOF задачи): остаётся свобода, которой пользуются для обхода препятствий.
- Ноль — цель вне рабочей зоны.
Как выбирают решение
Критерии: ближе к текущей позе (меньше движения), без столкновений, внутри пределов углов суставов, подальше от сингулярностей. Часто берут решение, минимизирующее сумму перемещений суставов.
Ограничения углов
Реальный сустав не крутится на $360^\circ$: есть пределы $\theta_{\min} \le \theta \le \theta_{\max}$. Решение IK, выходящее за них, отбрасывают. Проверим достижимость и фильтрацию по пределам.
import math
L1, L2 = 1.0, 0.7
def ik_both(x, y):
r2 = x*x + y*y
cos2 = (r2 - L1*L1 - L2*L2) / (2*L1*L2)
if cos2 < -1 or cos2 > 1:
return [] # вне зоны
sols = []
for sign in (1, -1):
s2 = sign * math.sqrt(1 - cos2*cos2)
t2 = math.atan2(s2, cos2)
t1 = math.atan2(y, x) - math.atan2(L2*math.sin(t2), L1 + L2*math.cos(t2))
sols.append((math.degrees(t1), math.degrees(t2)))
return sols
for sol in ik_both(1.2, 0.5):
t1, t2 = sol
ok = -150 <= t1 <= 150 and -150 <= t2 <= 150
print(f"theta1={t1:7.2f} theta2={t2:7.2f} -> {'в пределах' if ok else 'нарушает лимит'}")
print("вне зоны:", ik_both(1.75, 0.0))Вывод:
theta1= -9.58 theta2= 81.79 -> в пределах theta1= 54.82 theta2= -81.79 -> в пределах вне зоны: []
Как работает под капотом
Для избыточных роботов «лишнюю» свободу формализуют как нуль-пространство якобиана: движения суставов, которые не двигают схват. По нему оптимизируют вторичную цель — например, держаться подальше от пределов суставов, не нарушая основную задачу.
Частые ошибки
- Брать первое попавшееся решение IK, игнорируя пределы суставов — робот «дёрнется» или упрётся в упор.
- Не обрабатывать случай «нет решения» (цель вне зоны) — программа падает на
sqrtот отрицательного. - Прыгать между решениями локоть-вверх/вниз между кадрами — траектория получается рваной.
Итог
- IK может иметь несколько решений, бесконечно много или ни одного.
- Решение выбирают по близости, отсутствию столкновений и пределам суставов.
- Реальные суставы ограничены диапазоном — решения вне него отбрасывают.
- У избыточных роботов лишнюю свободу используют для вторичных целей через нуль-пространство.